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
15 changes: 15 additions & 0 deletions apps/website/emails/angular-download.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
import { wrapEmail, esc } from './email-wrapper';

const DOWNLOAD_URL = 'https://cacheplane.ai/whitepapers/angular.pdf';

export function angularDownloadHtml(name?: string): string {
return wrapEmail({
body: `
<p style="font-size:20px;font-weight:700;color:#1a1a2e;margin:0 0 8px;line-height:1.3">Your Enterprise Guide to Agent Streaming</p>
<p style="font-size:14px;color:#555770;line-height:1.7;margin:0 0 24px">${name ? `Hi ${esc(name)}, t` : 'T'}he guide covers six chapters: the last-mile problem, the agent() API, thread persistence, interrupt flows, full LangGraph feature coverage, and deterministic testing.</p>
<div style="text-align:center;margin:0 0 4px">
<a href="${DOWNLOAD_URL}" style="display:inline-block;background-color:#004090;color:#fff;padding:12px 32px;border-radius:8px;font-size:14px;font-weight:700;text-decoration:none">Download the Guide</a>
</div>
`,
});
}
15 changes: 15 additions & 0 deletions apps/website/emails/chat-download.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
import { wrapEmail, esc } from './email-wrapper';

const DOWNLOAD_URL = 'https://cacheplane.ai/whitepapers/chat.pdf';

export function chatDownloadHtml(name?: string): string {
return wrapEmail({
body: `
<p style="font-size:20px;font-weight:700;color:#1a1a2e;margin:0 0 8px;line-height:1.3">Your Enterprise Guide to Agent Chat Interfaces</p>
<p style="font-size:14px;color:#555770;line-height:1.7;margin:0 0 24px">${name ? `Hi ${esc(name)}, t` : 'T'}he guide covers five chapters: the sprint tax, batteries-included components, theming and design system integration, generative UI in chat, and debug tooling.</p>
<div style="text-align:center;margin:0 0 4px">
<a href="${DOWNLOAD_URL}" style="display:inline-block;background-color:#5a00c8;color:#fff;padding:12px 32px;border-radius:8px;font-size:14px;font-weight:700;text-decoration:none">Download the Guide</a>
</div>
`,
});
}
66 changes: 66 additions & 0 deletions apps/website/emails/drip-angular-followup.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,66 @@
import { wrapEmail } from './email-wrapper';

export function dripAngularFollowupHtml(day: number): { subject: string; html: string } {
if (day === 2) {
return {
subject: 'Did you read Chapter 2 on the agent() API?',
html: wrapEmail({
body: `
<p style="font-size:11px;font-family:monospace;text-transform:uppercase;letter-spacing:0.08em;color:#004090;font-weight:700;margin:0 0 8px">Angular Guide Follow-up</p>
<p style="font-size:20px;font-weight:700;color:#1a1a2e;margin:0 0 14px;line-height:1.3">Did you read Chapter 2 on the agent() API?</p>
<p style="font-size:14px;color:#555770;line-height:1.7;margin:0 0 24px">Chapter 2 dives into the <strong>agent() API</strong> — the signal-native primitive that connects your Angular component directly to a LangGraph streaming run. It's the chapter most teams bookmark first when they see how little boilerplate is required.</p>
<a href="https://cacheplane.ai/docs" style="display:inline-block;background-color:#004090;color:#fff;padding:12px 28px;border-radius:8px;font-size:14px;font-weight:700;text-decoration:none">Read the Docs →</a>
`,
showUnsubscribe: true,
}),
};
}

if (day === 5) {
return {
subject: 'LangGraph Angular SDK vs @cacheplane/angular',
html: wrapEmail({
body: `
<p style="font-size:11px;font-family:monospace;text-transform:uppercase;letter-spacing:0.08em;color:#004090;font-weight:700;margin:0 0 8px">Comparison</p>
<p style="font-size:20px;font-weight:700;color:#1a1a2e;margin:0 0 14px;line-height:1.3">LangGraph Angular SDK vs @cacheplane/angular</p>
<p style="font-size:14px;color:#555770;line-height:1.7;margin:0 0 24px">The LangGraph JS SDK gives you a streaming client. <strong>@cacheplane/angular</strong> gives you signal-native state, thread persistence, interrupt flows, and a full test harness — all wired together and optimized for Angular's change detection model. See the full comparison on our product page.</p>
<a href="https://cacheplane.ai/angular" style="display:inline-block;background-color:#004090;color:#fff;padding:12px 28px;border-radius:8px;font-size:14px;font-weight:700;text-decoration:none">See the Comparison →</a>
`,
showUnsubscribe: true,
}),
};
}

if (day === 10) {
return {
subject: 'The pilot program includes hands-on integration',
html: wrapEmail({
body: `
<p style="font-size:11px;font-family:monospace;text-transform:uppercase;letter-spacing:0.08em;color:#004090;font-weight:700;margin:0 0 8px">Pilot Program</p>
<p style="font-size:20px;font-weight:700;color:#1a1a2e;margin:0 0 14px;line-height:1.3">The pilot program includes hands-on integration</p>
<p style="font-size:14px;color:#555770;line-height:1.7;margin:0 0 14px">Every app deployment license includes a <strong>3-month co-pilot engagement</strong> — we work alongside your Angular team to ship your first agent to production.</p>
<div style="background:#f8f9fc;border-radius:8px;padding:16px 18px;margin:0 0 24px;border:1px solid rgba(0,64,144,0.08)">
<p style="font-size:13px;color:#555770;margin:0 0 4px;line-height:1.6"><strong style="color:#004090">Week 1</strong> · Integration &amp; first stream</p>
<p style="font-size:13px;color:#555770;margin:0 0 4px;line-height:1.6"><strong style="color:#004090">Month 1</strong> · First agent in staging</p>
<p style="font-size:13px;color:#555770;margin:0;line-height:1.6"><strong style="color:#004090">Month 3</strong> · Production deployment</p>
</div>
<a href="https://cacheplane.ai/pilot-to-prod" style="display:inline-block;background-color:#004090;color:#fff;padding:12px 28px;border-radius:8px;font-size:14px;font-weight:700;text-decoration:none">Learn About the Pilot →</a>
`,
showUnsubscribe: true,
}),
};
}

// day === 20
return {
subject: "Ready to ship your LangGraph agent? Let's talk.",
html: wrapEmail({
body: `
<p style="font-size:11px;font-family:monospace;text-transform:uppercase;letter-spacing:0.08em;color:#004090;font-weight:700;margin:0 0 8px">Let's Connect</p>
<p style="font-size:20px;font-weight:700;color:#1a1a2e;margin:0 0 14px;line-height:1.3">Ready to ship your LangGraph agent? Let's talk.</p>
<p style="font-size:14px;color:#555770;line-height:1.7;margin:0 0 24px">If your team is evaluating how to take an Angular + LangGraph agent to production, I'd love to hear what you're building. Reply to this email or <a href="mailto:hello@cacheplane.ai" style="color:#004090;text-decoration:underline">schedule a conversation</a> — no pitch, just a technical discussion about your use case.</p>
`,
showUnsubscribe: true,
}),
};
}
66 changes: 66 additions & 0 deletions apps/website/emails/drip-chat-followup.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,66 @@
import { wrapEmail } from './email-wrapper';

export function dripChatFollowupHtml(day: number): { subject: string; html: string } {
if (day === 2) {
return {
subject: 'Did you read Chapter 2 on batteries-included components?',
html: wrapEmail({
body: `
<p style="font-size:11px;font-family:monospace;text-transform:uppercase;letter-spacing:0.08em;color:#5a00c8;font-weight:700;margin:0 0 8px">Chat Guide Follow-up</p>
<p style="font-size:20px;font-weight:700;color:#1a1a2e;margin:0 0 14px;line-height:1.3">Did you read Chapter 2 on batteries-included components?</p>
<p style="font-size:14px;color:#555770;line-height:1.7;margin:0 0 24px">Chapter 2 covers the <strong>batteries-included component library</strong> — message bubbles, streaming indicators, thread lists, and input controls that are pre-wired to LangGraph state. Drop them in and your chat UI works on day one.</p>
<a href="https://cacheplane.ai/docs" style="display:inline-block;background-color:#5a00c8;color:#fff;padding:12px 28px;border-radius:8px;font-size:14px;font-weight:700;text-decoration:none">Read the Docs →</a>
`,
showUnsubscribe: true,
}),
};
}

if (day === 5) {
return {
subject: 'The sprint tax: why every team rebuilds chat from scratch',
html: wrapEmail({
body: `
<p style="font-size:11px;font-family:monospace;text-transform:uppercase;letter-spacing:0.08em;color:#5a00c8;font-weight:700;margin:0 0 8px">The Sprint Tax</p>
<p style="font-size:20px;font-weight:700;color:#1a1a2e;margin:0 0 14px;line-height:1.3">The sprint tax: why every team rebuilds chat from scratch</p>
<p style="font-size:14px;color:#555770;line-height:1.7;margin:0 0 24px">Most teams spend 2–4 sprints building a chat UI before a single agent feature lands. Streaming state management, optimistic updates, thread history, error recovery — it's the same work every time. @cacheplane/chat eliminates the sprint tax so your team ships features from day one.</p>
<a href="https://cacheplane.ai/chat" style="display:inline-block;background-color:#5a00c8;color:#fff;padding:12px 28px;border-radius:8px;font-size:14px;font-weight:700;text-decoration:none">See How It Works →</a>
`,
showUnsubscribe: true,
}),
};
}

if (day === 10) {
return {
subject: 'The pilot program includes hands-on integration',
html: wrapEmail({
body: `
<p style="font-size:11px;font-family:monospace;text-transform:uppercase;letter-spacing:0.08em;color:#5a00c8;font-weight:700;margin:0 0 8px">Pilot Program</p>
<p style="font-size:20px;font-weight:700;color:#1a1a2e;margin:0 0 14px;line-height:1.3">The pilot program includes hands-on integration</p>
<p style="font-size:14px;color:#555770;line-height:1.7;margin:0 0 14px">Every app deployment license includes a <strong>3-month co-pilot engagement</strong> — we work alongside your Angular team to ship your first agent to production.</p>
<div style="background:#f8f9fc;border-radius:8px;padding:16px 18px;margin:0 0 24px;border:1px solid rgba(90,0,200,0.08)">
<p style="font-size:13px;color:#555770;margin:0 0 4px;line-height:1.6"><strong style="color:#5a00c8">Week 1</strong> · Integration &amp; first stream</p>
<p style="font-size:13px;color:#555770;margin:0 0 4px;line-height:1.6"><strong style="color:#5a00c8">Month 1</strong> · First agent in staging</p>
<p style="font-size:13px;color:#555770;margin:0;line-height:1.6"><strong style="color:#5a00c8">Month 3</strong> · Production deployment</p>
</div>
<a href="https://cacheplane.ai/pilot-to-prod" style="display:inline-block;background-color:#5a00c8;color:#fff;padding:12px 28px;border-radius:8px;font-size:14px;font-weight:700;text-decoration:none">Learn About the Pilot →</a>
`,
showUnsubscribe: true,
}),
};
}

// day === 20
return {
subject: "Ready to ship your agent chat? Let's talk.",
html: wrapEmail({
body: `
<p style="font-size:11px;font-family:monospace;text-transform:uppercase;letter-spacing:0.08em;color:#5a00c8;font-weight:700;margin:0 0 8px">Let's Connect</p>
<p style="font-size:20px;font-weight:700;color:#1a1a2e;margin:0 0 14px;line-height:1.3">Ready to ship your agent chat? Let's talk.</p>
<p style="font-size:14px;color:#555770;line-height:1.7;margin:0 0 24px">If your team is building an agent chat interface and wants to skip the sprint tax, I'd love to hear what you're working on. Reply to this email or <a href="mailto:hello@cacheplane.ai" style="color:#5a00c8;text-decoration:underline">schedule a conversation</a> — no pitch, just a technical discussion about your use case.</p>
`,
showUnsubscribe: true,
}),
};
}
66 changes: 66 additions & 0 deletions apps/website/emails/drip-render-followup.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,66 @@
import { wrapEmail } from './email-wrapper';

export function dripRenderFollowupHtml(day: number): { subject: string; html: string } {
if (day === 2) {
return {
subject: 'Did you read Chapter 2 on declarative UI specs?',
html: wrapEmail({
body: `
<p style="font-size:11px;font-family:monospace;text-transform:uppercase;letter-spacing:0.08em;color:#1a7a40;font-weight:700;margin:0 0 8px">Render Guide Follow-up</p>
<p style="font-size:20px;font-weight:700;color:#1a1a2e;margin:0 0 14px;line-height:1.3">Did you read Chapter 2 on declarative UI specs?</p>
<p style="font-size:14px;color:#555770;line-height:1.7;margin:0 0 24px">Chapter 2 covers <strong>declarative UI specs</strong> — how agents emit structured JSON that maps directly to your component registry instead of generating raw HTML. It's the foundation that makes generative UI predictable and testable.</p>
<a href="https://cacheplane.ai/docs" style="display:inline-block;background-color:#1a7a40;color:#fff;padding:12px 28px;border-radius:8px;font-size:14px;font-weight:700;text-decoration:none">Read the Docs →</a>
`,
showUnsubscribe: true,
}),
};
}

if (day === 5) {
return {
subject: 'Why tight coupling between agents and UI kills iteration speed',
html: wrapEmail({
body: `
<p style="font-size:11px;font-family:monospace;text-transform:uppercase;letter-spacing:0.08em;color:#1a7a40;font-weight:700;margin:0 0 8px">Architecture</p>
<p style="font-size:20px;font-weight:700;color:#1a1a2e;margin:0 0 14px;line-height:1.3">Why tight coupling between agents and UI kills iteration speed</p>
<p style="font-size:14px;color:#555770;line-height:1.7;margin:0 0 24px">When an agent generates UI directly — raw HTML, string templates, hardcoded component names — every model change breaks the frontend and every UI change breaks the prompt. Decoupling via a declarative spec layer means agents and UI teams can iterate independently. See how @cacheplane/render makes this the default.</p>
<a href="https://cacheplane.ai/render" style="display:inline-block;background-color:#1a7a40;color:#fff;padding:12px 28px;border-radius:8px;font-size:14px;font-weight:700;text-decoration:none">See How It Works →</a>
`,
showUnsubscribe: true,
}),
};
}

if (day === 10) {
return {
subject: 'The pilot program includes hands-on integration',
html: wrapEmail({
body: `
<p style="font-size:11px;font-family:monospace;text-transform:uppercase;letter-spacing:0.08em;color:#1a7a40;font-weight:700;margin:0 0 8px">Pilot Program</p>
<p style="font-size:20px;font-weight:700;color:#1a1a2e;margin:0 0 14px;line-height:1.3">The pilot program includes hands-on integration</p>
<p style="font-size:14px;color:#555770;line-height:1.7;margin:0 0 14px">Every app deployment license includes a <strong>3-month co-pilot engagement</strong> — we work alongside your Angular team to ship your first agent to production.</p>
<div style="background:#f8f9fc;border-radius:8px;padding:16px 18px;margin:0 0 24px;border:1px solid rgba(26,122,64,0.08)">
<p style="font-size:13px;color:#555770;margin:0 0 4px;line-height:1.6"><strong style="color:#1a7a40">Week 1</strong> · Integration &amp; first stream</p>
<p style="font-size:13px;color:#555770;margin:0 0 4px;line-height:1.6"><strong style="color:#1a7a40">Month 1</strong> · First agent in staging</p>
<p style="font-size:13px;color:#555770;margin:0;line-height:1.6"><strong style="color:#1a7a40">Month 3</strong> · Production deployment</p>
</div>
<a href="https://cacheplane.ai/pilot-to-prod" style="display:inline-block;background-color:#1a7a40;color:#fff;padding:12px 28px;border-radius:8px;font-size:14px;font-weight:700;text-decoration:none">Learn About the Pilot →</a>
`,
showUnsubscribe: true,
}),
};
}

// day === 20
return {
subject: "Ready to decouple your agent UI? Let's talk.",
html: wrapEmail({
body: `
<p style="font-size:11px;font-family:monospace;text-transform:uppercase;letter-spacing:0.08em;color:#1a7a40;font-weight:700;margin:0 0 8px">Let's Connect</p>
<p style="font-size:20px;font-weight:700;color:#1a1a2e;margin:0 0 14px;line-height:1.3">Ready to decouple your agent UI? Let's talk.</p>
<p style="font-size:14px;color:#555770;line-height:1.7;margin:0 0 24px">If your team is evaluating how to make generative UI predictable and maintainable in production, I'd love to hear what you're building. Reply to this email or <a href="mailto:hello@cacheplane.ai" style="color:#1a7a40;text-decoration:underline">schedule a conversation</a> — no pitch, just a technical discussion about your use case.</p>
`,
showUnsubscribe: true,
}),
};
}
15 changes: 15 additions & 0 deletions apps/website/emails/render-download.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
import { wrapEmail, esc } from './email-wrapper';

const DOWNLOAD_URL = 'https://cacheplane.ai/whitepapers/render.pdf';

export function renderDownloadHtml(name?: string): string {
return wrapEmail({
body: `
<p style="font-size:20px;font-weight:700;color:#1a1a2e;margin:0 0 8px;line-height:1.3">Your Enterprise Guide to Generative UI</p>
<p style="font-size:14px;color:#555770;line-height:1.7;margin:0 0 24px">${name ? `Hi ${esc(name)}, t` : 'T'}he guide covers five chapters: the coupling problem, declarative UI specs with Vercel's json-render standard, the component registry, streaming JSON patches, and state management.</p>
<div style="text-align:center;margin:0 0 4px">
<a href="${DOWNLOAD_URL}" style="display:inline-block;background-color:#1a7a40;color:#fff;padding:12px 32px;border-radius:8px;font-size:14px;font-weight:700;text-decoration:none">Download the Guide</a>
</div>
`,
});
}
2 changes: 1 addition & 1 deletion apps/website/next-env.d.ts
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
/// <reference types="next" />
/// <reference types="next/image-types/global" />
import "./.next/dev/types/routes.d.ts";
import "./.next/types/routes.d.ts";

// NOTE: This file should not be edited
// see https://nextjs.org/docs/app/api-reference/config/typescript for more information.
Loading
Loading