Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
16 changes: 13 additions & 3 deletions app/app/a/page.tsx
Original file line number Diff line number Diff line change
@@ -1,12 +1,22 @@
import type { Metadata } from 'next'
import VersionA from '@/components/version-a'
import SiteJsonLd from '@/components/site/site-json-ld'

// A/B test variant — canonical to the homepage so Google consolidates ranking
// signals to / rather than treating these as duplicate homepages.
export const metadata: Metadata = { alternates: { canonical: 'https://knowcap.ai/' } }
// signals to / rather than treating these as duplicate homepages. Unique title
// avoids duplicate-<title> dilution; site entity schema for AI search.
export const metadata: Metadata = {
title: 'How Knowcap Works — Verified Meeting Intelligence for AI Agents',
alternates: { canonical: 'https://knowcap.ai/' },
}

// /a — Version A (control / mechanism-first), themed impeccable design.
// Reachable directly for review; not part of the live / rotation.
export default function PageA() {
return <VersionA />
return (
<>
<SiteJsonLd />
<VersionA />
</>
)
}
16 changes: 13 additions & 3 deletions app/app/b/page.tsx
Original file line number Diff line number Diff line change
@@ -1,12 +1,22 @@
import type { Metadata } from 'next'
import VersionB from '@/components/version-b'
import SiteJsonLd from '@/components/site/site-json-ld'

// A/B test variant — canonical to the homepage so Google consolidates ranking
// signals to / rather than treating these as duplicate homepages.
export const metadata: Metadata = { alternates: { canonical: 'https://knowcap.ai/' } }
// signals to / rather than treating these as duplicate homepages. Unique title
// avoids duplicate-<title> dilution; site entity schema for AI search.
export const metadata: Metadata = {
title: 'Stop Re-Explaining Meetings — Knowcap Acts on Verified Decisions',
alternates: { canonical: 'https://knowcap.ai/' },
}

// /b — Version B (outcome-first), themed impeccable design.
// In the live / rotation (outcome arm of the B-vs-D copy test).
export default function PageB() {
return <VersionB />
return (
<>
<SiteJsonLd />
<VersionB />
</>
)
}
17 changes: 16 additions & 1 deletion app/app/book/layout.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,21 @@ export const metadata: Metadata = {
alternates: { canonical: 'https://knowcap.ai/book' },
}

const JSONLD = {
'@context': 'https://schema.org',
'@type': 'WebPage',
name: 'Book a Knowcap Demo',
url: 'https://knowcap.ai/book',
about: 'Book a 20-minute Knowcap demo.',
isPartOf: { '@type': 'WebSite', name: 'Knowcap', url: 'https://knowcap.ai' },
publisher: { '@type': 'Organization', name: 'Knowcap', url: 'https://knowcap.ai' },
}

export default function BookLayout({ children }: { children: React.ReactNode }) {
return children
return (
<>
<script type="application/ld+json" dangerouslySetInnerHTML={{ __html: JSON.stringify(JSONLD) }} />
{children}
</>
)
}
16 changes: 13 additions & 3 deletions app/app/c/page.tsx
Original file line number Diff line number Diff line change
@@ -1,12 +1,22 @@
import type { Metadata } from 'next'
import VersionC from '@/components/version-c'
import SiteJsonLd from '@/components/site/site-json-ld'

// A/B test variant — canonical to the homepage so Google consolidates ranking
// signals to / rather than treating these as duplicate homepages.
export const metadata: Metadata = { alternates: { canonical: 'https://knowcap.ai/' } }
// signals to / rather than treating these as duplicate homepages. Unique title
// avoids duplicate-<title> dilution; site entity schema for AI search.
export const metadata: Metadata = {
title: 'Knowcap for Teams — Meeting Intelligence Agents Can Act On',
alternates: { canonical: 'https://knowcap.ai/' },
}

// /c — Version C (role-first), themed impeccable design.
// Reachable directly for review; not part of the live / rotation.
export default function PageC() {
return <VersionC />
return (
<>
<SiteJsonLd />
<VersionC />
</>
)
}
17 changes: 16 additions & 1 deletion app/app/careers/layout.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,21 @@ export const metadata: Metadata = {
alternates: { canonical: 'https://knowcap.ai/careers' },
}

const JSONLD = {
'@context': 'https://schema.org',
'@type': 'WebPage',
name: 'Careers at Knowcap',
url: 'https://knowcap.ai/careers',
about: 'Open roles at Knowcap.',
isPartOf: { '@type': 'WebSite', name: 'Knowcap', url: 'https://knowcap.ai' },
publisher: { '@type': 'Organization', name: 'Knowcap', url: 'https://knowcap.ai' },
}

export default function CareersLayout({ children }: { children: React.ReactNode }) {
return children
return (
<>
<script type="application/ld+json" dangerouslySetInnerHTML={{ __html: JSON.stringify(JSONLD) }} />
{children}
</>
)
}
26 changes: 25 additions & 1 deletion app/app/contact-us/layout.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,30 @@ export const metadata: Metadata = {
alternates: { canonical: 'https://knowcap.ai/contact-us' },
}

const JSONLD = {
'@context': 'https://schema.org',
'@type': 'ContactPage',
name: 'Contact Knowcap',
url: 'https://knowcap.ai/contact-us',
isPartOf: { '@type': 'WebSite', name: 'Knowcap', url: 'https://knowcap.ai' },
about: {
'@type': 'Organization',
name: 'Knowcap',
url: 'https://knowcap.ai',
contactPoint: {
'@type': 'ContactPoint',
contactType: 'sales',
email: 'hsa@knowcap.ai',
availableLanguage: ['English', 'Arabic'],
},
},
}

export default function ContactLayout({ children }: { children: React.ReactNode }) {
return children
return (
<>
<script type="application/ld+json" dangerouslySetInnerHTML={{ __html: JSON.stringify(JSONLD) }} />
{children}
</>
)
}
16 changes: 13 additions & 3 deletions app/app/d/page.tsx
Original file line number Diff line number Diff line change
@@ -1,12 +1,22 @@
import type { Metadata } from 'next'
import VersionD from '@/components/version-d'
import SiteJsonLd from '@/components/site/site-json-ld'

// A/B test variant — canonical to the homepage so Google consolidates ranking
// signals to / rather than treating these as duplicate homepages.
export const metadata: Metadata = { alternates: { canonical: 'https://knowcap.ai/' } }
// signals to / rather than treating these as duplicate homepages. Unique title
// avoids duplicate-<title> dilution; site entity schema for AI search.
export const metadata: Metadata = {
title: 'Watch Knowcap Turn a Meeting Into Action — Verified by a Human',
alternates: { canonical: 'https://knowcap.ai/' },
}

// /d — Version D (show-the-magic), themed impeccable design.
// In the live / rotation (magic arm of the B-vs-D copy test).
export default function PageD() {
return <VersionD />
return (
<>
<SiteJsonLd />
<VersionD />
</>
)
}
11 changes: 9 additions & 2 deletions app/app/for/odoo-partners/page.tsx
Original file line number Diff line number Diff line change
@@ -1,15 +1,22 @@
import VersionOdooPartners from '@/components/version-odoo-partners'
import SiteJsonLd from '@/components/site/site-json-ld'
import { ODOO_FAQ } from '@/lib/site-schema'

// /for/odoo-partners — Phase 1 beachhead conversion page.
// Audience: Odoo implementation partners (StratDev Meta-Ads target).
// Tracks variant "odoo-partners".
export const metadata = {
title: 'Knowcap for Odoo implementation partners — From client meeting to Odoo SH PR before the meeting ends',
description:
'Your client mentions a bug or asks for a feature mid-meeting. Knowcap captures it, classifies it, and waits for one tap. Then an Odoo SH ticket opens, a GitHub PR appears, and your tracker advances — before the call wraps.',
'Your client mentions a bug mid-meeting. Knowcap captures it, waits for one human tap, then opens an Odoo SH ticket and drafts a GitHub PR — before the call ends.',
alternates: { canonical: 'https://knowcap.ai/for/odoo-partners' },
}

export default function PageForOdooPartners() {
return <VersionOdooPartners />
return (
<>
<SiteJsonLd faqs={ODOO_FAQ} />
<VersionOdooPartners />
</>
)
}
2 changes: 1 addition & 1 deletion app/app/layout.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@ const ebGaramond = EB_Garamond({ subsets: ['latin'], variable: '--font-serif' })
export const metadata: Metadata = {
metadataBase: new URL('https://knowcap.ai'),
title: 'Knowcap — The Trust Layer for AI Agents',
description: 'Turn human claims into evidence your AI agents can learn from. Capture meetings, messages, and recordings. Promote the durable parts to evidence. Let agents act on what\'s verified.',
description: 'The trust layer for AI agents. Capture meetings, messages, and recordings; a named human verifies each claim; agents act only on what\'s confirmed.',
icons: {
icon: '/favicon.ico',
},
Expand Down
38 changes: 5 additions & 33 deletions app/app/page.tsx
Original file line number Diff line number Diff line change
@@ -1,6 +1,8 @@
import HomeCommitment from '@/components/home-commitment'
import { getAllPosts } from '@/lib/blog'
import type { Metadata } from 'next'
import SiteJsonLd from '@/components/site/site-json-ld'
import { HOME_FAQ } from '@/lib/site-schema'

// Homepage — Commitment Ledger edition (full replacement, 2026-06-10).
// The B-vs-D middleware rotation is retired; /a /b /c /d remain reachable
Expand All @@ -16,35 +18,6 @@ export const metadata: Metadata = {
},
}

// Organization + WebSite + SoftwareApplication schema for the homepage —
// gives crawlers and AI search the brand entity, site identity, and product
// facts that were missing before the 2026-06-14 SEO audit.
const HOME_JSON_LD = [
{
'@context': 'https://schema.org',
'@type': 'Organization',
name: 'Knowcap',
url: 'https://knowcap.ai',
logo: 'https://knowcap.ai/knowcap-logo.png',
description: 'The trust layer for AI agents — human-verified meeting and message intelligence.',
},
{
'@context': 'https://schema.org',
'@type': 'WebSite',
name: 'Knowcap',
url: 'https://knowcap.ai',
},
{
'@context': 'https://schema.org',
'@type': 'SoftwareApplication',
name: 'Knowcap',
applicationCategory: 'BusinessApplication',
operatingSystem: 'Web',
url: 'https://knowcap.ai',
offers: { '@type': 'Offer', price: '0', priceCurrency: 'USD' },
},
]

export default function Home() {
const recentPosts = getAllPosts()
.slice(0, 3)
Expand All @@ -57,10 +30,9 @@ export default function Home() {
}))
return (
<>
<script
type="application/ld+json"
dangerouslySetInnerHTML={{ __html: JSON.stringify(HOME_JSON_LD) }}
/>
{/* Organization + WebSite + SoftwareApplication + FAQ + Speakable —
the entity, product facts, and citable Q&A that AI search lifts. */}
<SiteJsonLd faqs={HOME_FAQ} speakable />
<HomeCommitment recentPosts={recentPosts} />
</>
)
Expand Down
17 changes: 16 additions & 1 deletion app/app/policy/layout.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,21 @@ export const metadata: Metadata = {
alternates: { canonical: 'https://knowcap.ai/policy' },
}

const JSONLD = {
'@context': 'https://schema.org',
'@type': 'WebPage',
name: 'Privacy Policy — Knowcap',
url: 'https://knowcap.ai/policy',
about: 'How Knowcap collects, uses, and protects your data.',
isPartOf: { '@type': 'WebSite', name: 'Knowcap', url: 'https://knowcap.ai' },
publisher: { '@type': 'Organization', name: 'Knowcap', url: 'https://knowcap.ai' },
}

export default function PolicyLayout({ children }: { children: React.ReactNode }) {
return children
return (
<>
<script type="application/ld+json" dangerouslySetInnerHTML={{ __html: JSON.stringify(JSONLD) }} />
{children}
</>
)
}
17 changes: 16 additions & 1 deletion app/app/terms/layout.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,21 @@ export const metadata: Metadata = {
alternates: { canonical: 'https://knowcap.ai/terms' },
}

const JSONLD = {
'@context': 'https://schema.org',
'@type': 'WebPage',
name: 'Terms of Service — Knowcap',
url: 'https://knowcap.ai/terms',
about: 'The terms that govern your use of Knowcap.',
isPartOf: { '@type': 'WebSite', name: 'Knowcap', url: 'https://knowcap.ai' },
publisher: { '@type': 'Organization', name: 'Knowcap', url: 'https://knowcap.ai' },
}

export default function TermsLayout({ children }: { children: React.ReactNode }) {
return children
return (
<>
<script type="application/ld+json" dangerouslySetInnerHTML={{ __html: JSON.stringify(JSONLD) }} />
{children}
</>
)
}
36 changes: 36 additions & 0 deletions app/components/site/site-json-ld.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@
import {
ORGANIZATION_JSONLD,
WEBSITE_JSONLD,
SOFTWAREAPP_JSONLD,
SPEAKABLE_JSONLD,
faqJsonLd,
type Faq,
} from '@/lib/site-schema'

/**
* Renders the site-wide entity JSON-LD (Organization + WebSite +
* SoftwareApplication), optionally with FAQPage and Speakable blocks.
* One script tag, server-rendered into the initial HTML where AI crawlers read it.
*/
export default function SiteJsonLd({
faqs,
speakable = false,
}: {
faqs?: Faq[]
speakable?: boolean
}) {
const blocks: Record<string, unknown>[] = [
ORGANIZATION_JSONLD,
WEBSITE_JSONLD,
SOFTWAREAPP_JSONLD,
]
if (speakable) blocks.push(SPEAKABLE_JSONLD)
if (faqs && faqs.length > 0) blocks.push(faqJsonLd(faqs))

return (
<script
type="application/ld+json"
dangerouslySetInnerHTML={{ __html: JSON.stringify(blocks) }}
/>
)
}
Loading