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
1 change: 1 addition & 0 deletions public/llms.txt
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@ Statewave stores immutable episodes, compiles them into typed memories with prov
- [Use Cases](https://www.statewave.ai/use-cases) — support agents, coding copilots, account intelligence, voice continuity, and multi-agent systems.
- [Connectors](https://www.statewave.ai/connectors) — GitHub, Markdown/ADRs, MCP, Slack, Discord, Zendesk, Intercom, Freshdesk, Notion, Gmail, n8n, Zapier.
- [Developers](https://www.statewave.ai/developers) — SDKs, docs, API reference, and examples.
- [About](https://www.statewave.ai/about) — what Statewave is, who it's for, the repos that ship it, and how to get in touch.

## Documentation

Expand Down
5 changes: 5 additions & 0 deletions public/sitemap.xml
Original file line number Diff line number Diff line change
Expand Up @@ -30,4 +30,9 @@
<changefreq>monthly</changefreq>
<priority>0.8</priority>
</url>
<url>
<loc>https://www.statewave.ai/about</loc>
<changefreq>monthly</changefreq>
<priority>0.6</priority>
</url>
</urlset>
2 changes: 2 additions & 0 deletions src/App.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@ const DemoPage = lazy(() => import('./pages/DemoPage').then(m => ({ default: m.D
const PrivacyPage = lazy(() => import('./pages/PrivacyPage').then(m => ({ default: m.PrivacyPage })))
const TermsPage = lazy(() => import('./pages/TermsPage').then(m => ({ default: m.TermsPage })))
const ImpressumPage = lazy(() => import('./pages/ImpressumPage').then(m => ({ default: m.ImpressumPage })))
const AboutPage = lazy(() => import('./pages/AboutPage').then(m => ({ default: m.AboutPage })))
const NotFoundPage = lazy(() => import('./pages/NotFoundPage').then(m => ({ default: m.NotFoundPage })))

export default function App() {
Expand All @@ -35,6 +36,7 @@ export default function App() {
<Route path="/terms" element={<TermsPage />} />
<Route path="/impressum" element={<ImpressumPage />} />
<Route path="/cookies" element={<CookiesPage />} />
<Route path="/about" element={<AboutPage />} />
<Route path="*" element={<NotFoundPage />} />
</Route>
</Routes>
Expand Down
1 change: 1 addition & 0 deletions src/components/Footer.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -60,6 +60,7 @@ export function Footer() {
<li><a href="https://github.com/smaramwbc/statewave" target="_blank" rel="noopener noreferrer" className="text-sm text-theme-muted hover:text-theme-primary transition-colors">GitHub</a></li>
<li><a href="https://github.com/smaramwbc/statewave-examples" target="_blank" rel="noopener noreferrer" className="text-sm text-theme-muted hover:text-theme-primary transition-colors">Examples</a></li>
<li><a href="https://github.com/smaramwbc/statewave-docs/blob/main/roadmap.md" target="_blank" rel="noopener noreferrer" className="text-sm text-theme-muted hover:text-theme-primary transition-colors">Roadmap</a></li>
<li><Link to="/about" className="text-sm text-theme-muted hover:text-theme-primary transition-colors">About</Link></li>
<li><Link to="/launch" className="text-sm text-theme-muted hover:text-theme-primary transition-colors">Launch waitlist</Link></li>
<li><Link to="/press" className="text-sm text-theme-muted hover:text-theme-primary transition-colors">Press kit</Link></li>
</ul>
Expand Down
1 change: 1 addition & 0 deletions src/components/Navbar.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@ const links = [
{ to: '/use-cases', label: 'Use Cases' },
{ to: '/connectors', label: 'Connectors' },
{ to: '/developers', label: 'Developers' },
{ to: '/about', label: 'About' },
]

/**
Expand Down
14 changes: 14 additions & 0 deletions src/lib/proof-stats.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
/**
* Single source of truth for the Statewave credibility figures surfaced
* across the marketing site. Mirrored on the homepage (hero credibility
* row, prerendered into dist/index.html, and the below-the-fold
* ProofSection) and on the /about page. Recompute together when the
* eval suite or the support workflow benchmark changes — drift between
* surfaces makes us look sloppy, and the benchmark is 8/8 (not 9/9).
*/
export const PROOF_STATS = [
{ value: '680', label: 'Unit tests' },
{ value: '55', label: 'Eval assertions' },
{ value: '8/8', label: 'Support workflow score' },
{ value: '2/8', label: 'Naive approach score' },
] as const
11 changes: 11 additions & 0 deletions src/lib/seo-meta.ts
Original file line number Diff line number Diff line change
Expand Up @@ -44,6 +44,7 @@ export type RouteKey =
| '/use-cases'
| '/connectors'
| '/developers'
| '/about'

/** Canonical, indexable public routes. Order matters — used to render the
* sitemap and the llms.txt index. */
Expand All @@ -54,6 +55,7 @@ export const PUBLIC_ROUTES: readonly RouteKey[] = [
'/use-cases',
'/connectors',
'/developers',
'/about',
] as const

export interface PageMeta {
Expand Down Expand Up @@ -132,6 +134,15 @@ export const PAGE_META: Record<RouteKey, PageMeta> = {
priority: 0.8,
changefreq: 'monthly',
},
'/about': {
title: 'About Statewave — Open-Source Memory Runtime for AI Agents',
description:
'Statewave is an open-source, self-hosted memory runtime for AI agents — durable episodic and semantic memory with provenance, deterministic ranking, and token-bounded context bundles. Apache-2.0, framework-neutral, no managed cloud.',
breadcrumbLabel: 'About',
ogType: 'website',
priority: 0.6,
changefreq: 'monthly',
},
}

/** Look up metadata for an arbitrary path. Falls back to home metadata if the
Expand Down
259 changes: 259 additions & 0 deletions src/pages/AboutPage.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,259 @@
import { Section } from '../components/Section'
import { Heading } from '../components/Heading'
import { usePageSEO } from '../lib/seo'
import { PROOF_STATS } from '../lib/proof-stats'

/* About page.
*
* Neutral brand voice — no founder names. The Statewave project speaks for
* itself; individual contributors are visible on GitHub. The audience is
* developers and ops teams evaluating an open-source memory runtime for
* their own infrastructure, plus AI quality raters and answer engines
* looking for the EEAT signals the external SEO audit asked for (Section
* 3 #7). All claims here are backed by the same ground truth surfaced on
* the homepage (PROOF_STATS) and the source repositories below.
*/

const PRINCIPLES = [
{
title: 'Open source under Apache 2.0',
body: 'Server, SDKs, connectors, and this website are public on GitHub. Apache-2.0 is permissive and includes an explicit patent grant, so teams can use, fork, modify, distribute, and ship commercial products on Statewave without a separate agreement.',
},
{
title: 'Self-hosted, no managed cloud',
body: 'Statewave runs on your infrastructure. Episodes, compiled memories, and the embeddings that index them stay in your Postgres. There is no Statewave-hosted backend the SDK secretly phones home to — the demo on the homepage talks to a Statewave instance we operate transparently.',
},
{
title: 'Provenance first',
body: 'Every compiled memory carries the IDs of the episodes it was derived from, with confidence scores and validity windows. Context bundles can be traced back to the raw events that produced them, so an agent’s answer is always explainable to a human.',
},
{
title: 'Framework-neutral',
body: 'Compilation goes through LiteLLM (100+ providers, including locally-hosted Ollama / vLLM). Retrieval and context assembly are provider-agnostic. Statewave is an HTTP service plus two thin SDKs — nothing on the agent side is locked to a specific LLM, framework, or vendor.',
},
] as const

const REPOS = [
{ name: 'statewave', desc: 'Core server — REST API, compiler, ranking, storage layer.', url: 'https://github.com/smaramwbc/statewave' },
{ name: 'statewave-py', desc: 'Python SDK.', url: 'https://github.com/smaramwbc/statewave-py' },
{ name: 'statewave-ts', desc: 'TypeScript SDK.', url: 'https://github.com/smaramwbc/statewave-ts' },
{ name: 'statewave-docs', desc: 'Architecture, API contracts, ADRs, deployment guides.', url: 'https://github.com/smaramwbc/statewave-docs' },
{ name: 'statewave-examples', desc: 'Runnable examples and end-to-end agent flows.', url: 'https://github.com/smaramwbc/statewave-examples' },
{ name: 'statewave-connectors', desc: 'GitHub, Markdown/ADRs, MCP, Slack, Discord, Zendesk, Intercom, Freshdesk, Notion, Gmail, n8n, Zapier connectors.', url: 'https://github.com/smaramwbc/statewave-connectors' },
{ name: 'statewave-admin', desc: 'Read-only operator console for inspecting subjects, episodes, memories, and bundles in a running instance.', url: 'https://github.com/smaramwbc/statewave-admin' },
{ name: 'statewave-bench', desc: 'Open evaluation harness — every published proof figure is reproducible by running these scripts.', url: 'https://github.com/smaramwbc/statewave-bench' },
{ name: 'statewave-web', desc: 'This marketing site.', url: 'https://github.com/smaramwbc/statewave-web' },
] as const

export function AboutPage() {
usePageSEO({
title: 'About Statewave — Open-Source Memory Runtime for AI Agents',
description:
'Statewave is an open-source, self-hosted memory runtime for AI agents — durable episodic and semantic memory with provenance, deterministic ranking, and token-bounded context bundles. Apache-2.0, framework-neutral, no managed cloud.',
})

return (
<>
<section className="relative pt-24 sm:pt-28 md:pt-32 pb-8 sm:pb-12">
<div className="mx-auto max-w-3xl px-5 sm:px-6">
<p className="text-[11px] font-medium uppercase tracking-[0.22em] text-accent">
About
</p>
<h1 className="mt-5 text-[clamp(1.75rem,5vw,2.75rem)] font-semibold text-theme-primary tracking-[-0.02em] leading-[1.15]">
About Statewave
</h1>
<p className="mt-6 text-base sm:text-lg text-theme-secondary leading-relaxed">
Statewave is an open-source memory runtime for AI agents and LLM
applications. It records raw events as immutable episodes,
compiles them into typed semantic and episodic memories with
provenance, and returns ranked, token-bounded context bundles
that drop straight into a prompt.
</p>
<p className="mt-4 text-base text-theme-secondary leading-relaxed">
We built Statewave because the problem most LLM apps spend
engineering time on isn&rsquo;t which model to call — it&rsquo;s
remembering what was already said, decided, or learned. Prompt
stuffing breaks at scale, naive RAG returns embedding-nearest
instead of decision-relevant, and chat-history replay drowns
agents in noise. A memory layer with structure, ranking, and
provenance is infrastructure, not a feature, and it deserves to
be open and self-hostable.
</p>
</div>
</section>

<Section>
<div className="mx-auto max-w-3xl">
<Heading
id="principles"
className="text-2xl font-bold text-theme-primary mb-6"
>
What we&rsquo;re committed to
</Heading>
<ul className="space-y-6">
{PRINCIPLES.map((p) => (
<li
key={p.title}
className="rounded-2xl border border-theme-border bg-surface-1 p-6"
>
<h3 className="text-base font-semibold text-theme-primary">
{p.title}
</h3>
<p className="mt-2 text-sm text-theme-secondary leading-relaxed">
{p.body}
</p>
</li>
))}
</ul>
</div>
</Section>

<Section className="bg-surface-1/50">
<div className="mx-auto max-w-3xl">
<Heading
id="proven"
className="text-2xl font-bold text-theme-primary mb-3"
>
Proven, not promised
</Heading>
<p className="text-sm text-theme-muted leading-relaxed mb-6">
Every claim on this site is backed by automated evals and
benchmarks that run in CI. The figures below come from the
<a
href="https://github.com/smaramwbc/statewave-bench"
target="_blank"
rel="noopener noreferrer"
className="text-accent hover:underline"
>{' '}
statewave-bench
</a>{' '}
harness — anyone can clone it and reproduce them.
</p>
<div className="grid grid-cols-2 md:grid-cols-4 gap-4">
{PROOF_STATS.map((s) => (
<div
key={s.label}
className="text-center rounded-2xl border border-theme-border bg-surface-0 p-5"
>
<p className="text-2xl md:text-3xl font-bold text-theme-primary">
{s.value}
</p>
<p className="mt-2 text-xs text-theme-muted">{s.label}</p>
</div>
))}
</div>
</div>
</Section>

<Section>
<div className="mx-auto max-w-3xl">
<Heading
id="repos"
className="text-2xl font-bold text-theme-primary mb-3"
>
What we ship
</Heading>
<p className="text-sm text-theme-muted leading-relaxed mb-6">
Statewave is split across focused repositories so teams can
adopt only what they need. All are public on GitHub under
Apache-2.0.
</p>
<ul className="space-y-3">
{REPOS.map((r) => (
<li
key={r.name}
className="rounded-xl border border-theme-border bg-surface-1 p-4"
>
<a
href={r.url}
target="_blank"
rel="noopener noreferrer"
className="text-sm font-mono font-semibold text-accent hover:underline"
>
{r.name}
</a>
<p className="mt-1 text-sm text-theme-muted leading-relaxed">
{r.desc}
</p>
</li>
))}
</ul>
</div>
</Section>

<Section className="bg-surface-1/40">
<div className="mx-auto max-w-3xl">
<Heading
id="contact"
className="text-2xl font-bold text-theme-primary mb-6"
>
Get in touch
</Heading>
<ul className="space-y-3 text-sm text-theme-secondary">
<li>
<span className="font-semibold text-theme-primary">
Bugs, feature requests, integration questions:
</span>{' '}
open an issue on{' '}
<a
href="https://github.com/smaramwbc/statewave/issues"
target="_blank"
rel="noopener noreferrer"
className="text-accent hover:underline"
>
GitHub
</a>
. That&rsquo;s where the project is built in the open.
</li>
<li>
<span className="font-semibold text-theme-primary">
Commercial use, enterprise support, procurement:
</span>{' '}
<a
href="mailto:licensing@statewave.ai"
className="text-accent hover:underline"
>
licensing@statewave.ai
</a>
. Apache-2.0 is permissive — you don&rsquo;t need a contract
to use Statewave commercially. We offer optional SLA,
indemnity, architecture review, and managed hosting on
request.
</li>
<li>
<span className="font-semibold text-theme-primary">
Press, partnerships, brand assets:
</span>{' '}
<a
href="mailto:press@statewave.ai"
className="text-accent hover:underline"
>
press@statewave.ai
</a>
. Logos and a one-page fact sheet are on the{' '}
<a href="/press" className="text-accent hover:underline">
press
</a>{' '}
page.
</li>
<li>
<span className="font-semibold text-theme-primary">
Security disclosures:
</span>{' '}
<a
href="mailto:security@statewave.ai"
className="text-accent hover:underline"
>
security@statewave.ai
</a>
. Please don&rsquo;t open public issues for vulnerabilities.
</li>
</ul>
<p className="mt-8 text-xs text-theme-muted">
— the Statewave team
</p>
</div>
</Section>
</>
)
}
13 changes: 1 addition & 12 deletions src/pages/HomePage.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -26,21 +26,10 @@ import {
websiteJsonLd,
} from '../lib/seo-meta'
import { FAQ_ENTRIES } from '../lib/faq'
import { PROOF_STATS } from '../lib/proof-stats'
import { useChatWidget, useTrackDemoCta, DEMO_SUBJECTS } from '../lib/widget-context-api'
import { useRef, useState, useEffect, useCallback } from 'react'

/** Single source of truth for the credibility figures the homepage
* surfaces. Mirrored in both the prerendered HeroSection (so AI crawlers
* and answer engines see them in the initial HTML) and the below-the-fold
* ProofSection. Recompute together when the eval suite or benchmark
* changes — drift between surfaces makes us look sloppy. */
const PROOF_STATS = [
{ value: '680', label: 'Unit tests' },
{ value: '55', label: 'Eval assertions' },
{ value: '8/8', label: 'Support workflow score' },
{ value: '2/8', label: 'Naive approach score' },
] as const

export function HomePage() {
// The home page is the canonical landing for Organization, WebSite, and
// SoftwareApplication structured data — also baked into index.html for
Expand Down