export interface Template { name: string description: string keywords: string[] serverTs: string clientTsx: string envExtra?: string } // Shared house style for every template: // - bg-black background (not zinc-950) // - neutral-* palette (truer grays) // - square corners — no rounded-* except round avatars // - wireframe buttons (border-white outline) for primary actions // - display headings (text-5xl tracking-tight) — confident, not timid // - mono small text for metadata (timestamps, indices, source tags) // - max-w-2xl centered column unless the template's signature breaks it // // Each template adds one signature move so they don't blur into the same // silhouette: todo uses numbered newspaper rows, blog goes serif for the // post body, chat is full-bleed bottom-anchored terminal-style, dashboard // uses oversized tabular-nums numbers, webhook is pure mono log lines. const TODO: Template = { name: "todo", description: "Default starter — single-column todo list with numbered newspaper rows.", keywords: [ "todo", "tasks", "list", "items", "checklist", "log", "diary", "notes", "tracker", "habit", "journal", "expense", "weight", "mood", "default", ], serverTs: `import { capsule, mutation, query, string, table } from "pond/server"; export default capsule({ schema: { messages: table({ body: string(), }), }, queries: { messages: query((ctx) => ctx.db.messages.orderBy("createdAt", "desc").all() ), }, mutations: { sendMessage: mutation((ctx, body: string) => ctx.db.messages.insert({ body }) ), }, }); `, clientTsx: `import { useMutation, useQuery } from "pond/client"; type Message = { id: string; body: string; createdAt: string; }; export function App() { const { data: messages, isLoading } = useQuery("messages"); const [sendMessage, { isLoading: isSending }] = useMutation<[body: string], void>("sendMessage"); return (

pond / todo

Things to do.

{ e.preventDefault(); const input = e.currentTarget.elements.namedItem("body") as HTMLInputElement; if (input.value.trim()) { void sendMessage(input.value.trim()); input.value = ""; } }} >
{isLoading ?

loading…

: null}
    {messages?.map((m, i) => (
  • {String(i + 1).padStart(2, "0")} {m.body}
  • ))}
); } `, } const AUTH_APP: Template = { name: "auth-app", description: "Authenticated app — Google sign-in + per-user notes. Requires GOOGLE_CLIENT_ID/SECRET.", keywords: ["auth", "login", "signin", "google", "user", "users", "account", "profile", "private"], envExtra: `GOOGLE_CLIENT_ID= GOOGLE_CLIENT_SECRET= `, serverTs: `import { capsule, mutation, query, string, table } from "pond/server"; export default capsule({ schema: { notes: table({ ownerId: string(), body: string(), }), }, queries: { myNotes: query((ctx) => { if (ctx.auth.isGuest) return []; return ctx.db.notes.where("ownerId", ctx.auth.userId).orderBy("createdAt", "desc").all(); }), }, mutations: { addNote: mutation((ctx, body: string) => { if (ctx.auth.isGuest) throw new Error("Sign in to add notes"); return ctx.db.notes.insert({ ownerId: ctx.auth.userId, body }); }), }, }); `, clientTsx: `import { SignInWithGoogle, signOut, useAuth, useMutation, useQuery } from "pond/client"; type Note = { id: string; body: string; createdAt: string }; function ts(iso: string) { const d = new Date(iso); return d.toLocaleString(undefined, { month: "short", day: "2-digit", hour: "2-digit", minute: "2-digit" }); } export function App() { const auth = useAuth(); const { data: notes } = useQuery("myNotes"); const [addNote, { isLoading }] = useMutation<[body: string], void>("addNote"); if (auth.isLoading) { return (

checking session…

); } if (auth.isGuest) { return (

pond / notes

Your notes.
Only yours.

Private to your Google account. Sign in to write something down.

); } return (

{auth.displayName ?? auth.email}

{ e.preventDefault(); const input = e.currentTarget.elements.namedItem("body") as HTMLInputElement; if (input.value.trim()) { void addNote(input.value.trim()); input.value = ""; } }} >
    {notes?.map((n) => (
  • {ts(n.createdAt)}

    {n.body}

  • ))}
{notes && notes.length === 0 ? (

no notes yet.

) : null}
); } `, } const BLOG: Template = { name: "blog", description: "Editorial blog — serif body type, mono bylines, no card chrome.", keywords: ["blog", "post", "posts", "article", "writing", "markdown", "cms"], serverTs: `import { capsule, mutation, query, string, table } from "pond/server"; export default capsule({ schema: { posts: table({ title: string(), body: string(), authorId: string(), }), }, queries: { posts: query((ctx) => ctx.db.posts.orderBy("createdAt", "desc").all()), }, mutations: { publish: mutation((ctx, title: string, body: string) => { if (ctx.auth.isGuest) throw new Error("Sign in to publish"); return ctx.db.posts.insert({ title, body, authorId: ctx.auth.userId }); }), deletePost: mutation((ctx, id: string) => { const row = ctx.db.posts.get(id); if (!row) return; if (row.authorId !== ctx.auth.userId) throw new Error("Not your post"); ctx.db.posts.delete(id); }), }, }); `, clientTsx: `import { SignInWithGoogle, useAuth, useMutation, useQuery } from "pond/client"; type Post = { id: string; title: string; body: string; authorId: string; createdAt: string }; function dateline(iso: string) { return new Date(iso).toLocaleDateString(undefined, { year: "numeric", month: "long", day: "numeric" }).toUpperCase(); } export function App() { const auth = useAuth(); const { data: posts } = useQuery("posts"); const [publish, { isLoading }] = useMutation<[string, string], void>("publish"); const [deletePost] = useMutation<[string], void>("deletePost"); return (

pond / journal

Field notes.

{auth.isGuest ? ( ) : ( {auth.displayName ?? auth.email} )}
{!auth.isGuest ? (
{ e.preventDefault(); const form = e.currentTarget as HTMLFormElement; const title = (form.elements.namedItem("title") as HTMLInputElement).value.trim(); const body = (form.elements.namedItem("body") as HTMLTextAreaElement).value.trim(); if (title && body) { void publish(title, body); form.reset(); } }} >