Skip to content
Merged
20 changes: 17 additions & 3 deletions apps/website/src/components/landing/HomeFAQ.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@ import { FAQ, type FAQItem } from '../ui/FAQ';
const ITEMS: FAQItem[] = [
{
q: 'How is this different from CopilotKit or AG-UI directly?',
a: 'CopilotKit ports React patterns to Angular. AG-UI is a protocol — you still build the Angular side. Angular Agent Framework is Angular-native: signals, DI, and adapters that hide the protocol so you can swap LangGraph for AG-UI without rewriting your UI.',
a: 'CopilotKit has an Angular SDK; ours is built around signals and DI as the substrate, not a port. AG-UI is a protocol, not a UI library — you still build the Angular side. Angular Agent Framework gives you signal-native primitives plus adapters that hide the protocol, so you can swap LangGraph for AG-UI without rewriting your UI.',
},
{
q: 'Does it work with my existing Angular app?',
Expand All @@ -27,20 +27,34 @@ const ITEMS: FAQItem[] = [
},
{
q: 'Is this production-ready today?',
a: 'Yes — the Cockpit reference app runs the full stack. We support Angular’s current and previous LTS versions.',
a: 'It runs the full stack in our reference deployment (cockpit.cacheplane.ai), and breaking changes are called out in release notes. We support Angular’s current and previous LTS versions.',
},
{
q: 'Where do I report issues?',
a: 'GitHub Issues. Pilot customers also get a private channel.',
},
{
q: 'I’m using CopilotKit today — how hard is the migration?',
a: 'Component-by-component. CopilotKit’s chat hooks have rough equivalents in our agent() signal API, and CopilotKit actions map to LangGraph/AG-UI tool calls. Thread state lives in a service (not the component tree), so plan a session to port that. There isn’t a one-shot codemod.',
},
{
q: 'Does it work with Angular Universal / SSR?',
a: 'Streaming is client-side by design — agents are stateful and signal-based. If your shell is SSR’d, the agent-talking parts stay client-only; render fallbacks during hydration via standard Angular SSR patterns.',
},
{
q: 'How do I test agent-driven components?',
a: 'The agent is provided through Angular DI, so test doubles work the way you’re used to — supply a stub agent in your test module, drive it with signals, assert on the rendered output. See /docs/agent/guides/testing.',
},
];

export function HomeFAQ() {
return (
<Section surface="white" ariaLabelledBy="faq-heading">
<Container>
<div style={{ textAlign: 'center', marginBottom: 48 }}>
<Eyebrow tone="accent" style={{ marginBottom: 16 }}>Questions</Eyebrow>
<Eyebrow tone="accent" style={{ marginBottom: 16 }}>
Questions
</Eyebrow>
<h2
id="faq-heading"
style={{
Expand Down
29 changes: 23 additions & 6 deletions apps/website/src/components/landing/Promises.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -5,19 +5,36 @@ import { Eyebrow } from '../ui/Eyebrow';
import { Card } from '../ui/Card';

const PROMISES = [
{ title: 'No vendor lock-in', body: 'MIT today, MIT tomorrow. Use without us.' },
{ title: 'No paid Angular tier', body: 'The libraries stay open. Pilot-to-Prod is the only paid offering.' },
{ title: 'No abandoned majors', body: 'We support Angular’s current and previous LTS versions.' },
{ title: 'No closed primitives', body: 'Headless primitives stay in the open repo.' },
{ title: 'No required cloud', body: 'Self-host LangGraph + your Angular app. No phone-home.' },
{
title: 'No closed core',
body: 'MIT today, MIT tomorrow. Primitives and compositions both stay in the open repo. Pilot-to-Prod is the only paid thing.',
},
{
title: 'No abandoned majors',
body: 'We support Angular’s current and previous LTS versions.',
},
{
title: 'No required cloud',
body: 'Self-host LangGraph + your Angular app. Run it all in your VPC.',
},
{
title: 'No telemetry',
body: 'We don’t collect anything from your app. Not at install, not at runtime.',
},
{
title: 'No model lock-in',
body: 'Adapters work with any LLM your runtime supports. Swap providers without changing Angular code.',
},
];

export function Promises() {
return (
<Section surface="canvas" ariaLabelledBy="promises-heading">
<Container>
<div style={{ textAlign: 'center', marginBottom: 56 }}>
<Eyebrow tone="accent" style={{ marginBottom: 16 }}>Built on principles</Eyebrow>
<Eyebrow tone="accent" style={{ marginBottom: 16 }}>
Built on principles
</Eyebrow>
<h2
id="promises-heading"
style={{
Expand Down
42 changes: 36 additions & 6 deletions apps/website/src/components/landing/ProofStrip.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -11,11 +11,27 @@ interface Signal {
}

const SIGNALS: Signal[] = [
{ label: 'MIT licensed', value: 'Open source', href: 'https://github.com/cacheplane/angular-agent-framework/blob/main/LICENSE' },
{
label: 'MIT licensed',
value: 'Open source',
href: 'https://github.com/cacheplane/angular-agent-framework/blob/main/LICENSE',
},
{ label: 'Built for', value: 'Angular 20+', href: null },
{ label: 'LangGraph + AG-UI', value: 'Two adapters', href: null },
{ label: 'Reference app', value: 'cockpit.cacheplane.ai', href: 'https://cockpit.cacheplane.ai' },
{ label: 'On npm', value: '@ngaf/chat', href: 'https://www.npmjs.com/package/@ngaf/chat' },
{
label: 'Adapter contract',
value: 'LangGraph + AG-UI + your own',
href: null,
},
{
label: 'Reference app',
value: 'cockpit.cacheplane.ai',
href: 'https://cockpit.cacheplane.ai',
},
{
label: 'On npm',
value: '@ngaf/* — 7 packages',
href: 'https://www.npmjs.com/search?q=%40ngaf',
},
];

function SignalCard({ s }: { s: Signal }) {
Expand Down Expand Up @@ -51,9 +67,23 @@ export function ProofStrip() {
return (
<Section surface="canvas" tight>
<Container>
<Eyebrow style={{ textAlign: 'center', marginBottom: 20 }}>
<Eyebrow style={{ textAlign: 'center', marginBottom: 12 }}>
Built in the open
</Eyebrow>
<p
style={{
fontFamily: tokens.typography.bodyLg.family,
fontSize: tokens.typography.bodyLg.size,
lineHeight: tokens.typography.bodyLg.line,
fontWeight: 600,
color: tokens.colors.textPrimary,
textAlign: 'center',
margin: 0,
marginBottom: 20,
}}
>
Open code, open packages, a live reference app.
</p>
<div
style={{
display: 'grid',
Expand All @@ -78,7 +108,7 @@ export function ProofStrip() {
<div key={s.label}>
<SignalCard s={s} />
</div>
),
)
)}
</div>
</Container>
Expand Down
Loading
Loading