Skip to content

[ia-fix] Reachable blog + 4-column footer sitemap + gate /book + SEO hygiene - #57

Merged
Smetools merged 1 commit into
mainfrom
hassan/ia-fix
Jun 14, 2026
Merged

[ia-fix] Reachable blog + 4-column footer sitemap + gate /book + SEO hygiene#57
Smetools merged 1 commit into
mainfrom
hassan/ia-fix

Conversation

@Smetools

@Smetools Smetools commented Jun 14, 2026

Copy link
Copy Markdown
Collaborator

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

  • Footer → 4-column sitemap (both EditorialShell and the homepage's own inline footer): Product · Compare · Company (Blog, Team, Careers, Meet us, Contact) · Get started. Every public page now reachable + crawlable from every page.
  • Homepage "Latest writing" block — the 3 newest posts, the equity-bearing home→blog edge (your literal "no way to reach the blog from the main page").
  • Footer tagline → "verified work intelligence".
  • Blog stays out of the top nav per your call.

/book gated (your "only sent on request")

  • Removed every public /book link: footer, both CTAs on all 5 compare pages, both homepage CTAs (→ "Talk to us"/"Contact us" → /contact-us). /book stays live but unlinked; demo requests route through Contact.
  • Removed /book from the sitemap.

SEO hygiene

  • /a /b /c /d: added canonical → knowcap.ai/ (they were duplicate homepages with none) + removed from sitemap — kills the index-bloat/duplicate-content risk.
  • New /compare hub (/compare): card grid linking all 5 vs-pages; each leaf links back ("See all comparisons →") = hub-and-spoke. Added to sitemap.

Verification

npm run build green — 60 static pages incl. the new /compare. Render-checked: homepage footer Blog link + Latest-writing block present; /book count 0 sitewide; hub + back-links render.

🤖 Generated with Claude Code

Summary by CodeRabbit

  • New Features

    • Launched Compare hub page with competitor comparison cards
    • Added "Latest writing" section to homepage displaying recent blog posts
    • Redesigned footer with 4-column sitemap navigation layout
  • Improvements

    • Updated CTA messaging from "Book a demo" to "Contact us" across comparison pages
    • Refreshed brand tagline in footer
  • Chores

    • Added SEO canonical URL metadata to pages
    • Updated sitemap to reflect current site structure

… 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>
@vercel

vercel Bot commented Jun 14, 2026

Copy link
Copy Markdown

The latest updates on your projects. Learn more about Vercel for GitHub.

Project Deployment Actions Updated (UTC)
knowcap-landing Ready Ready Preview, Comment Jun 14, 2026 12:32pm

Request Review

@coderabbitai

coderabbitai Bot commented Jun 14, 2026

Copy link
Copy Markdown

Review Change Stack

📝 Walkthrough

Walkthrough

This PR implements an information-architecture overhaul: adds a /compare hub page linking all competitor comparison pages, updates every comparison page's secondary CTA from "Book a demo" to "Contact us" and adds a "See all comparisons" close link, adds canonical metadata to A/B/C/D variant routes, introduces a "Latest writing" blog section on the homepage, redesigns the site footer as a 4-column sitemap in both shell components, updates the sitemap, and adds a static IA audit HTML document.

Changes

IA & Navigation Overhaul

Layer / File(s) Summary
A/B/C/D variant canonical metadata
app/app/a/page.tsx, app/app/b/page.tsx, app/app/c/page.tsx, app/app/d/page.tsx
Each variant route exports a metadata constant with alternates.canonical set to https://knowcap.ai/, consolidating search signals to the root homepage.
Compare hub page (new /compare route)
app/app/compare/page.tsx
New CompareHubPage component exports metadata with canonical and OpenGraph fields, renders a hero, a card grid mapped from COMPARISONS, and a "Get Started Free" CTA.
Compare page CTAs and close-link style
app/app/compare/compare-styles.ts, app/app/compare/knowcap-vs-fellow/page.tsx, app/app/compare/knowcap-vs-fireflies/page.tsx, app/app/compare/knowcap-vs-granola/page.tsx, app/app/compare/knowcap-vs-otter/page.tsx, app/app/compare/knowcap-vs-read-ai/page.tsx
Adds .cm-close-link CSS rule to COMPARE_CSS; across all five comparison pages replaces "Book a 20-min demo" ghost links with "Contact us" (/contact-us) in both CTA rows and adds a "See all comparisons →" close link in each page's closing section.
Homepage LatestWriting section and CTA updates
app/app/page.tsx, app/components/home-commitment.tsx
HomeCommitment gains a recentPosts?: PostMeta[] prop and a new LatestWriting component rendering a 3-column card grid. app/page.tsx fetches posts via getAllPosts(), slices to three, and passes them down. Hero and closer secondary CTAs change from /book to /contact-us. New CSS grid rules support the card layout.
4-column footer sitemap redesign
app/components/editorial/shell.tsx, app/components/home-commitment.tsx
Both shell and home-commitment replace their previous single-row footer layout with a 4-column sitemap grid (Product, Compare, Company, Get started) using new CSS classes .cl-footer-top, .cl-footer-cols, .cl-fcol. Footer brand copy updated; EditorialShell footer now includes comparison sub-links and updated auth URLs.
Sitemap update
app/app/sitemap.ts
Adds /compare and removes the /a, /b, /c, /d variant routes and /book from the exported sitemap URL list.
IA audit document
docs/ia-audit-2026-06-14.html
New static HTML document presenting the information-architecture audit: nav/footer before-and-after comparisons, URL disposition table, three surfaced issues, Q&A, and a method note.

Estimated code review effort

🎯 3 (Moderate) | ⏱️ ~25 minutes

Possibly related PRs

  • Knowcap-V2/knowcap-website#43: Refactored the same competitor comparison pages to use the shared compare-styles.ts and EditorialShell layout — the same files this PR further modifies with CTA changes and cm-close-link additions.

Poem

🐇 Hop, hop — the footer blooms in four neat rows,
Compare pages wave goodbye to demo shows.
Canonical tags tidy up the A-B-C-D trail,
Blog posts peek out from the homepage veil.
The sitemap shrank, the audit doc arrived,
The rabbit checked each link and map and thrived! ✨

🚥 Pre-merge checks | ✅ 4 | ❌ 1

❌ Failed checks (1 warning)

Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 50.00% which is insufficient. The required threshold is 80.00%. Write docstrings for the functions missing them to satisfy the coverage threshold.
✅ Passed checks (4 passed)
Check name Status Explanation
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check ✅ Passed The title directly describes the main changes: IA fixes including a reachable blog, 4-column footer sitemap, gating /book, and SEO hygiene. It accurately summarizes the primary objectives of the changeset.
Linked Issues check ✅ Passed Check skipped because no linked issues were found for this pull request.
Out of Scope Changes check ✅ Passed Check skipped because no linked issues were found for this pull request.

✏️ Tip: You can configure your own custom pre-merge checks in the settings.

✨ Finishing Touches
📝 Generate docstrings
  • Create stacked PR
  • Commit on current branch
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch hassan/ia-fix

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.

❤️ Share

Comment @coderabbitai help to get the list of available commands and usage tips.

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 3

🧹 Nitpick comments (1)
app/components/home-commitment.tsx (1)

421-442: 🏗️ Heavy lift

Extract 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 by app/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

📥 Commits

Reviewing files that changed from the base of the PR and between f69d994 and a572f07.

📒 Files selected for processing (16)
  • app/app/a/page.tsx
  • app/app/b/page.tsx
  • app/app/c/page.tsx
  • app/app/compare/compare-styles.ts
  • app/app/compare/knowcap-vs-fellow/page.tsx
  • app/app/compare/knowcap-vs-fireflies/page.tsx
  • app/app/compare/knowcap-vs-granola/page.tsx
  • app/app/compare/knowcap-vs-otter/page.tsx
  • app/app/compare/knowcap-vs-read-ai/page.tsx
  • app/app/compare/page.tsx
  • app/app/d/page.tsx
  • app/app/page.tsx
  • app/app/sitemap.ts
  • app/components/editorial/shell.tsx
  • app/components/home-commitment.tsx
  • docs/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>

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟡 Minor | ⚡ Quick win

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-L128
  • app/app/compare/knowcap-vs-granola/page.tsx#L127-L129
  • app/app/compare/knowcap-vs-otter/page.tsx#L127-L127
  • app/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">

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟡 Minor | ⚡ Quick win

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.

Comment on lines +89 to +95
<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>

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟡 Minor | ⚡ Quick win

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.

@Smetools
Smetools merged commit a9e7339 into main Jun 14, 2026
3 checks passed
Smetools added a commit that referenced this pull request Jun 14, 2026
…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>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant