[ia-fix] Reachable blog + 4-column footer sitemap + gate /book + SEO hygiene - #57
Conversation
… hygiene Information-architecture audit (docs/ia-audit-2026-06-14.html) found the blog, all 5 compare pages, and the Odoo LP had ZERO links from the homepage — invisible to visitors and starved of internal link equity. Navigation: - Footer (EditorialShell + the homepage's own footer) rebuilt into a 4-column sitemap: Product · Compare · Company (Blog, Team, Careers, Meet us, Contact) · Get started. Every public page now reachable + crawlable from every page. - Homepage: added a "Latest writing" section surfacing the 3 newest posts (the equity-bearing home→blog edge) — the founder's literal "no way to reach the blog". - Footer tagline aligned to "verified work intelligence". Gate /book (founder: "only sent on request"): - Removed every public /book link — footer, both CTAs on all 5 compare pages, and both homepage CTAs (→ "Talk to us"/"Contact us" → /contact-us). /book stays live, unlinked; demo requests route through Contact. - Removed /book from the sitemap. SEO hygiene: - /a /b /c /d: added canonical → https://knowcap.ai/ (were duplicate homepages with none) and removed them from the sitemap (index-bloat / duplicate-content). - New /compare hub (app/app/compare/page.tsx): card grid linking all 5 vs-pages; each leaf now links back ("See all comparisons →") → hub-and-spoke. Added to sitemap. Blog stays OUT of the top nav per founder call (footer-only). Verified: npm run build green (60 static pages incl. /compare); homepage footer Blog link + Latest writing render; /book count 0 sitewide. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
|
The latest updates on your projects. Learn more about Vercel for GitHub.
|
📝 WalkthroughWalkthroughThis PR implements an information-architecture overhaul: adds a ChangesIA & Navigation Overhaul
Estimated code review effort🎯 3 (Moderate) | ⏱️ ~25 minutes Possibly related PRs
Poem
🚥 Pre-merge checks | ✅ 4 | ❌ 1❌ Failed checks (1 warning)
✅ Passed checks (4 passed)
✏️ Tip: You can configure your own custom pre-merge checks in the settings. ✨ Finishing Touches📝 Generate docstrings
🧪 Generate unit tests (beta)
Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out. Comment |
There was a problem hiding this comment.
Actionable comments posted: 3
🧹 Nitpick comments (1)
app/components/home-commitment.tsx (1)
421-442: 🏗️ Heavy liftExtract the footer sitemap into a shared source to prevent drift.
The same footer CSS + IA link structure is duplicated across two components, which makes future link/copy updates easy to miss in one place.
app/components/home-commitment.tsx#L421-L442: move footer-specific styles to a shared stylesheet/string token source consumed by both shells.app/components/home-commitment.tsx#L1115-L1161: replace inline footer markup with a shared footer component driven by shared column data.app/components/editorial/shell.tsx#L110-L131: consume the same shared footer style source used byapp/components/home-commitment.tsx.app/components/editorial/shell.tsx#L166-L212: render the same shared footer component/data to keep sitemap links and copy synchronized.🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the rest with a brief reason, keep changes minimal, and validate. In `@app/components/home-commitment.tsx` around lines 421 - 442, Extract the footer CSS and footer column data structure into a shared source file (e.g., a constants file or dedicated footer module) to eliminate duplication. In app/components/home-commitment.tsx at lines 421-442, replace the inline footer CSS with an import from the shared source. In app/components/home-commitment.tsx at lines 1115-1161, replace the inline footer markup with a reusable footer component that consumes the shared column data. In app/components/editorial/shell.tsx at lines 110-131, import and use the same shared footer CSS source. In app/components/editorial/shell.tsx at lines 166-212, replace the inline footer markup with the same shared footer component using the shared column data. This ensures all footer styling and link structure remains synchronized across both components.
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
Inline comments:
In `@app/app/compare/knowcap-vs-fellow/page.tsx`:
- Line 130: Replace all plain HTML `<a>` tags with Next.js `<Link>` components
for the "See all comparisons →" back-link across five comparison pages to enable
client-side navigation instead of full page reloads. In
`app/app/compare/knowcap-vs-fellow/page.tsx` at lines 130-130, replace the `<a
className="cm-close-link" href="/compare">` tag with a `<Link>` component while
keeping the same className and href. In
`app/app/compare/knowcap-vs-fireflies/page.tsx` at lines 128-128, apply the same
`<a>` to `<Link>` replacement. In `app/app/compare/knowcap-vs-granola/page.tsx`
at lines 127-129, remove the entire `<div>` wrapper and styled `<a>` tag and
replace it with `<p><Link className="cm-close-link" href="/compare">See all
comparisons →</Link></p>` to match the standard format and remove inline style
overrides. In `app/app/compare/knowcap-vs-otter/page.tsx` at lines 127-127,
replace the `<a className="cm-close-link" href="/compare">` tag with a `<Link>`
component. In `app/app/compare/knowcap-vs-read-ai/page.tsx` at lines 128-136,
replace the entire styled `<p>` and `<a>` section with `<p><Link
className="cm-close-link" href="/compare">See all comparisons →</Link></p>` to
remove the inline style overrides and match the standard format used in other
pages. Remember to import the Link component from Next.js if it is not already
imported in each file.
In `@docs/ia-audit-2026-06-14.html`:
- Around line 89-95: The audit document in docs/ia-audit-2026-06-14.html
contains sections that recommend adding the Blog link to the top navigation, but
this contradicts the actual final decision where the Blog remains excluded from
top navigation and only appears in the footer. Update the recommendations in
both locations (lines 89-95 and lines 155-164) to accurately reflect that the
Blog was not added to the top menu and remains in the footer to keep the
navigation lean. Remove or revise any language suggesting Blog should be added
to the top navigation to align the document with the actual implemented
decision.
- Line 7: The <link> tag loading Google Fonts from googleapis.com creates an
external third-party dependency and requires network access, making the audit
document non-portable. Replace the external Google Fonts link with either a
system font stack (using locally available fonts like system-ui, -apple-system,
Arial, sans-serif for body text and monospace fonts) in the stylesheet, or
inline the font files directly into the HTML using `@font-face` with embedded font
data if the specific Fraunces, Inter, and JetBrains Mono fonts must be
preserved. This ensures the HTML audit document remains self-contained and
functional without network connectivity.
---
Nitpick comments:
In `@app/components/home-commitment.tsx`:
- Around line 421-442: Extract the footer CSS and footer column data structure
into a shared source file (e.g., a constants file or dedicated footer module) to
eliminate duplication. In app/components/home-commitment.tsx at lines 421-442,
replace the inline footer CSS with an import from the shared source. In
app/components/home-commitment.tsx at lines 1115-1161, replace the inline footer
markup with a reusable footer component that consumes the shared column data. In
app/components/editorial/shell.tsx at lines 110-131, import and use the same
shared footer CSS source. In app/components/editorial/shell.tsx at lines
166-212, replace the inline footer markup with the same shared footer component
using the shared column data. This ensures all footer styling and link structure
remains synchronized across both components.
🪄 Autofix (Beta)
Fix all unresolved CodeRabbit comments on this PR:
- Push a commit to this branch (recommended)
- Create a new PR with the fixes
ℹ️ Review info
⚙️ Run configuration
Configuration used: defaults
Review profile: CHILL
Plan: Pro Plus
Run ID: 8fa33c6b-5175-4c19-8f31-f2529b796636
📒 Files selected for processing (16)
app/app/a/page.tsxapp/app/b/page.tsxapp/app/c/page.tsxapp/app/compare/compare-styles.tsapp/app/compare/knowcap-vs-fellow/page.tsxapp/app/compare/knowcap-vs-fireflies/page.tsxapp/app/compare/knowcap-vs-granola/page.tsxapp/app/compare/knowcap-vs-otter/page.tsxapp/app/compare/knowcap-vs-read-ai/page.tsxapp/app/compare/page.tsxapp/app/d/page.tsxapp/app/page.tsxapp/app/sitemap.tsapp/components/editorial/shell.tsxapp/components/home-commitment.tsxdocs/ia-audit-2026-06-14.html
| <h2>Stop trusting raw AI summaries.<br />Ship only what a human confirmed.</h2> | ||
| <p>Knowcap is verified work intelligence — the trust layer for your AI agents, under human-confirmed control.</p> | ||
| <a className="cl-btn cl-btn--solid" href={REGISTER_URL}>Get Started Free →</a> | ||
| <p><a className="cm-close-link" href="/compare">See all comparisons →</a></p> |
There was a problem hiding this comment.
Use Next.js <Link> for the /compare back-link in all five comparison pages. All five pages use plain <a> tags for the "See all comparisons →" link, causing full page reloads instead of client-side navigation. Additionally, two pages (granola and read-ai) add inline styles that override the .cm-close-link CSS class, creating visual inconsistency.
app/app/compare/knowcap-vs-fellow/page.tsx#L130: Replace<a className="cm-close-link" href="/compare">with<Link className="cm-close-link" href="/compare">.app/app/compare/knowcap-vs-fireflies/page.tsx#L128: Replace<a className="cm-close-link" href="/compare">with<Link className="cm-close-link" href="/compare">.app/app/compare/knowcap-vs-granola/page.tsx#L127-L129: Replace the<div>wrapper and styled<a>with<p><Link className="cm-close-link" href="/compare">See all comparisons →</Link></p>to match the other pages and remove the inline style overrides.app/app/compare/knowcap-vs-otter/page.tsx#L127: Replace<a className="cm-close-link" href="/compare">with<Link className="cm-close-link" href="/compare">.app/app/compare/knowcap-vs-read-ai/page.tsx#L128-L136: Replace the styled<p>and<a>with<p><Link className="cm-close-link" href="/compare">See all comparisons →</Link></p>to match the other pages and remove the inline style overrides.
📍 Affects 5 files
app/app/compare/knowcap-vs-fellow/page.tsx#L130-L130(this comment)app/app/compare/knowcap-vs-fireflies/page.tsx#L128-L128app/app/compare/knowcap-vs-granola/page.tsx#L127-L129app/app/compare/knowcap-vs-otter/page.tsx#L127-L127app/app/compare/knowcap-vs-read-ai/page.tsx#L128-L136
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
In `@app/app/compare/knowcap-vs-fellow/page.tsx` at line 130, Replace all plain
HTML `<a>` tags with Next.js `<Link>` components for the "See all comparisons →"
back-link across five comparison pages to enable client-side navigation instead
of full page reloads. In `app/app/compare/knowcap-vs-fellow/page.tsx` at lines
130-130, replace the `<a className="cm-close-link" href="/compare">` tag with a
`<Link>` component while keeping the same className and href. In
`app/app/compare/knowcap-vs-fireflies/page.tsx` at lines 128-128, apply the same
`<a>` to `<Link>` replacement. In `app/app/compare/knowcap-vs-granola/page.tsx`
at lines 127-129, remove the entire `<div>` wrapper and styled `<a>` tag and
replace it with `<p><Link className="cm-close-link" href="/compare">See all
comparisons →</Link></p>` to match the standard format and remove inline style
overrides. In `app/app/compare/knowcap-vs-otter/page.tsx` at lines 127-127,
replace the `<a className="cm-close-link" href="/compare">` tag with a `<Link>`
component. In `app/app/compare/knowcap-vs-read-ai/page.tsx` at lines 128-136,
replace the entire styled `<p>` and `<a>` section with `<p><Link
className="cm-close-link" href="/compare">See all comparisons →</Link></p>` to
remove the inline style overrides and match the standard format used in other
pages. Remember to import the Link component from Next.js if it is not already
imported in each file.
| <meta charset="utf-8"/> | ||
| <meta name="viewport" content="width=device-width,initial-scale=1"/> | ||
| <title>knowcap.ai — information-architecture audit · 2026-06-14</title> | ||
| <link href="https://fonts.googleapis.com/css2?family=Fraunces:ital,opsz,wght,SOFT,WONK@0,9..144,300..700,0..100,0..1;1,9..144,300..700,0..100,0..1&family=Inter:wght@400;500;600&family=JetBrains+Mono:wght@400;500&display=swap" rel="stylesheet"> |
There was a problem hiding this comment.
Inline the fonts if this is meant to stay self-contained.
Loading Google Fonts adds a third-party dependency and makes the audit page dependent on network access; a local/system font stack would keep the HTML portable.
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
In `@docs/ia-audit-2026-06-14.html` at line 7, The <link> tag loading Google Fonts
from googleapis.com creates an external third-party dependency and requires
network access, making the audit document non-portable. Replace the external
Google Fonts link with either a system font stack (using locally available fonts
like system-ui, -apple-system, Arial, sans-serif for body text and monospace
fonts) in the stylesheet, or inline the font files directly into the HTML using
`@font-face` with embedded font data if the specific Fraunces, Inter, and
JetBrains Mono fonts must be preserved. This ensures the HTML audit document
remains self-contained and functional without network connectivity.
| <div class="panel rec"><h3>Recommended — add one link</h3><div class="body"> | ||
| <div class="navbar"> | ||
| <span class="brand">Know<span class="g">cap</span></span> | ||
| <span class="item">How it works</span><span class="item">For your agents</span><span class="item">FAQ</span><span class="new">Blog</span><span class="item">Contact</span> | ||
| <span class="spacer"></span><span class="muted">Log in</span><span class="btn">Get Started Free</span> | ||
| </div> | ||
| <p style="font-size:13px;color:var(--sec);margin:12px 0 0"><b>Blog</b> added as a plain text link (never a button — nothing competes with the one green CTA). Answers "no way to reach the blog" head-on. Compare stays in the footer to keep the nav lean.</p> |
There was a problem hiding this comment.
Align the audit copy with the final nav decision.
These sections still tell readers to add Blog to the top menu, but the PR objective says the blog remains excluded from top navigation. As written, the document records the opposite policy and will confuse anyone using it as the source of truth.
Also applies to: 155-164
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
In `@docs/ia-audit-2026-06-14.html` around lines 89 - 95, The audit document in
docs/ia-audit-2026-06-14.html contains sections that recommend adding the Blog
link to the top navigation, but this contradicts the actual final decision where
the Blog remains excluded from top navigation and only appears in the footer.
Update the recommendations in both locations (lines 89-95 and lines 155-164) to
accurately reflect that the Blog was not added to the top menu and remains in
the footer to keep the navigation lean. Remove or revise any language suggesting
Blog should be added to the top navigation to align the document with the actual
implemented decision.
…ges (#58) 2026-06-14 SEO audit (overall 67.4/100) found everything outside the blog tier sharing the root layout's default <title>, missing rel=canonical, and carrying no JSON-LD. Root cause: the /compare/* and legal pages are client components (can't export metadata) and the homepage had no metadata export. Fixes: - /compare/* (otter, read-ai, fireflies, fellow, granola): add a server layout.tsx per route with a unique title, description, and self-referential canonical (lib/compare-seo.ts), plus FAQPage + SoftwareApplication + BreadcrumbList JSON-LD (components/compare/compare-json-ld.tsx). - Homepage: add canonical + OpenGraph and Organization / WebSite / SoftwareApplication JSON-LD. - Legal/utility (policy, terms, contact-us, book, careers): server layout.tsx with unique title + description + canonical. - /for/odoo-partners: add canonical to existing metadata. - Root layout: add metadataBase + default OpenGraph siteName. - Blog index: add Blog (BlogPosting list) JSON-LD. (/a /b /c /d already canonical→home on main via #57, left untouched.) Verified: tsc --noEmit 0 errors; next build green; built HTML confirms unique title + canonical + schema on /compare/knowcap-vs-otter, home, and /policy. Co-authored-by: Claude Opus 4.8 <noreply@anthropic.com>
Implements the IA audit (
docs/ia-audit-2026-06-14.html). Your decisions: Blog → footer only, pull all /book public links, full scope.The problem
The blog, all 5 compare pages, and the Odoo LP had zero links from the homepage — invisible to visitors, starved of internal link equity. The footer was a 5-link CTA strip.
Navigation
/book gated (your "only sent on request")
SEO hygiene
canonical → knowcap.ai/(they were duplicate homepages with none) + removed from sitemap — kills the index-bloat/duplicate-content risk./compare): card grid linking all 5 vs-pages; each leaf links back ("See all comparisons →") = hub-and-spoke. Added to sitemap.Verification
npm run buildgreen — 60 static pages incl. the new/compare. Render-checked: homepage footer Blog link + Latest-writing block present;/bookcount 0 sitewide; hub + back-links render.🤖 Generated with Claude Code
Summary by CodeRabbit
New Features
Improvements
Chores