Skip to main content
Sandbox demo — data resets on the hour. Try the admin at /admin, own the whole thing viathe template →
Get Template — $89

Search AI Directory

Search tools, categories, stacks, and pages

Codebase

Customization

Rebranding, extending, and where things live in the codebase.

Rebrand checklist

  1. /admin/settings — name, logo text, tagline, brand color, links, pricing copy. This is most of a rebrand and touches no code.
  2. .envNEXT_PUBLIC_SITE_URL and NEXT_PUBLIC_SITE_NAME (metadata identity), then rebuild.
  3. Replace the icon assets in apps/web/app/: icon.png, apple-icon.png, opengraph-image.png.
  4. The wordmark itself (the chevron SVG) lives in apps/web/app/(marketing)/components/header/index.tsx and apps/web/app/admin/components/brand-mark.tsx.

Codebase map

apps/web/app/(marketing)/   public site (pages + components)
apps/web/app/admin/         operations console
apps/web/app/api/           REST API + MCP + cron pipelines
apps/web/lib/               service layer (tools, news, posts, settings, audit)
packages/database/          Prisma schema + client + seed
packages/design-system/     shadcn/ui components + theme tokens (shared)
packages/auth/              better-auth configuration
packages/payments/          Stripe client + keys
packages/seo/               metadata, JSON-LD, build-time identity

Design language

Both the public site and the admin console share packages/design-system. The rules that keep it coherent: emerald --primary, warm-dark mode, hairline ring-1 ring-border borders, rounded-lg/rounded-xl only, lucide icons at strokeWidth={1.75}, transitions at duration-200 ease-out. Follow them and new pages look native.

Adding a content type

  1. Model in packages/database/prisma/schema.prismapnpm --filter @repo/database buildnpx prisma db push.
  2. Service functions in apps/web/lib/.
  3. Public page under app/(marketing)/.
  4. Admin page under app/admin/(dashboard)/ — copy an existing module (page + actions + client list); the shared kit (DataTable, PageHeader, StatusBadge, ConfirmButton, …) does most of the visual work.
  5. Server actions: guard with assertAdmin(), validate with zod, write, revalidatePath, logAudit.

Renaming or removing the sales pages

The template ships two pages for selling: app/(marketing)/template (the marketing pitch for the template itself) and app/(marketing)/pricing.

  • If you don't resell anything, delete app/(marketing)/template. The /pricing page keeps working as your own pricing page — repoint it or its Checkout URL setting at your product.
  • Nav entries for both live in app/(marketing)/components/header/nav-data.ts (the "Template" group) and app/(marketing)/components/footer.tsx. Remove the entries you don't want after deleting a page.
  • To sell your own copy or product, leave the pages and just set the Checkout URL in /admin/settings → Pricing — see Configuration.

Demo mode: a public sandbox of your admin

The console sells itself best when people can touch it. DEMO_MODE turns a deployment into a public sandbox: a one-click "Enter the demo console" button on /admin/login (using DEMO_EMAIL / DEMO_PASSWORD), a banner across the console, and a strip on the public site pointing visitors at /template. The demo owner has real write access — a scheduled snapshot restore is what keeps the sandbox clean.

Never set DEMO_MODE on your production site. The recipe:

  1. Deploy a second instance (e.g. demo.your-domain.com) from a separate checkout with its own database and DEMO_MODE=true, DEMO_EMAIL, DEMO_PASSWORD in its env. A separate checkout matters: two processes must not share one .next cache.
  2. Prepare it once — run the setup wizard with exactly the demo credentials, load the seed, adjust settings until it demos well.
  3. Snapshot it: pg_dump "$DEMO_DATABASE_URL" -F c -f demo-snapshot.dump
  4. Schedule scripts/reset-demo.sh hourly — it restores the snapshot, clears the Next cache, and restarts the process (a few seconds of downtime).
  5. Link it: set the Demo URL in /admin/settings on your production site and /template grows a "Try the admin demo" button.

Don't give the sandbox real API keys (DeepSeek, Stripe, R2) — without them the AI pipelines skip their editorial steps and the paid flows stay hidden, which is exactly right for a demo.

Monorepo notes

The single deploy unit is apps/web; apps/studio is a local Prisma Studio launcher for browsing the database. See Project structure for the full tour.