From 6c00b260fe28fb5b5b8437719606452cde314d56 Mon Sep 17 00:00:00 2001 From: MasonStation Date: Mon, 27 Apr 2026 14:58:02 -0400 Subject: [PATCH] feat(templates): add Vercel to Next.js + SaaS starters MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The site catalog (Templates.astro) already advertised Vercel under nextjs-supabase-posthog, but the underlying templates/.../stack.toml was missing the service — so `stack init --template nextjs-supabase- posthog` left users without a deploy target despite the marketing promise. This patch closes that gap and adds Vercel to the maximal SaaS starter as well, where it's the obvious deploy default. - nextjs-supabase-posthog: + [services.vercel] - supabase-posthog-sentry-resend: + [services.vercel] - nextjs-neon-vercel-sentry: unchanged (already had Vercel) - cloudflare-turso-clerk, claude-agent-openai-anthropic: unchanged (legitimately don't deploy to Vercel) Mirror updates so all surfaces stay consistent: templates-ref.ts, Templates.astro, llms.txt, llms-full.txt, CHANGELOG. Verified `stack init --template --noProvision` writes the expected [services.vercel] block for both edited templates. Assisted-By: ashlr-plugin --- CHANGELOG.md | 7 ++++++ packages/site/public/llms-full.txt | 4 ++-- packages/site/public/llms.txt | 4 ++-- packages/site/src/components/Templates.astro | 12 +++++----- packages/site/src/lib/templates-ref.ts | 22 ++++++++++++++----- templates/nextjs-supabase-posthog/stack.toml | 8 ++++++- .../supabase-posthog-sentry-resend/stack.toml | 10 +++++++-- 7 files changed, 48 insertions(+), 19 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 8784ad2..f78b345 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,13 @@ ## Unreleased +### Templates: Vercel added to Next.js / SaaS starters + +- **`nextjs-supabase-posthog`** now provisions Vercel alongside Supabase + PostHog. The site catalog already advertised Vercel under this template — the underlying `stack.toml` was missing the service, so `stack init --template nextjs-supabase-posthog` left users without a deploy target. Site copy and `stack.toml` now agree. +- **`supabase-posthog-sentry-resend`** (the maximal SaaS starter) gains Vercel as a deploy target. Anyone running this stack ships to Vercel or Cloudflare in practice; Cloudflare has its own template, so Vercel is the right default here. +- Other templates unchanged: `nextjs-neon-vercel-sentry` already had Vercel; `cloudflare-turso-clerk` and `claude-agent-openai-anthropic` legitimately don't deploy to Vercel. +- Updated surfaces: `templates/*/stack.toml`, `packages/site/src/lib/templates-ref.ts`, `packages/site/src/components/Templates.astro`, `packages/site/public/llms.txt`, `packages/site/public/llms-full.txt`. + ### SEO + GEO content surface (major) - **29 programmatic provider pages** — new dynamic route at `/providers/[slug]` driven by `packages/core/src/catalog.ts`. Adding a provider to catalog auto-mints a page at build time. Each page: hero with brand logo, auth-flow explainer, secret-slot breakdown, MCP wiring status, `stack add` snippet, `stack recommend` trigger, related providers, templates that include it, FAQ, outbound dashboard + docs links. JSON-LD: TechArticle + BreadcrumbList + FAQPage. diff --git a/packages/site/public/llms-full.txt b/packages/site/public/llms-full.txt index e195ff6..a5a0c8f 100644 --- a/packages/site/public/llms-full.txt +++ b/packages/site/public/llms-full.txt @@ -390,10 +390,10 @@ For providers needing an OAuth app, Ashlr registers a single "Ashlr Stack" app p Templates are TOML + shell recipes under `templates/` in the source repo. Run `stack templates` for the live list. -- **nextjs-supabase-posthog** — Next.js 15 + Supabase + PostHog + PostHog feature flags. App-router, server components, Tailwind. +- **nextjs-supabase-posthog** — Next.js 15 + Supabase + Vercel deploy + PostHog + PostHog feature flags. App-router, server components, Tailwind. - **nextjs-neon-vercel-sentry** — Next.js + Neon Postgres + Vercel deploy + Sentry error tracking + Drizzle ORM. - **cloudflare-turso-clerk** — Cloudflare Workers + Turso (libSQL) + Clerk auth. Edge-native, zero cold starts. -- **supabase-posthog-sentry-resend** — Full SaaS baseline: Supabase + PostHog + Sentry + Resend transactional email. +- **supabase-posthog-sentry-resend** — Full SaaS baseline: Supabase + Vercel deploy + PostHog + Sentry + Resend transactional email + Stripe billing. - **claude-agent-openai-anthropic** — Agent starter with both OpenAI + Anthropic SDKs wired, MCP-ready, Phantom-gated. Each template wires: diff --git a/packages/site/public/llms.txt b/packages/site/public/llms.txt index 8830904..d1a4ca9 100644 --- a/packages/site/public/llms.txt +++ b/packages/site/public/llms.txt @@ -123,10 +123,10 @@ Full CLI reference: https://stack.ashlr.ai/llms-full.txt ## Templates -- `nextjs-supabase-posthog` — Next.js + Supabase + PostHog +- `nextjs-supabase-posthog` — Next.js + Supabase + Vercel + PostHog - `nextjs-neon-vercel-sentry` — Next.js + Neon + Vercel + Sentry - `cloudflare-turso-clerk` — Cloudflare Workers + Turso + Clerk -- `supabase-posthog-sentry-resend` — Supabase + PostHog + Sentry + Resend +- `supabase-posthog-sentry-resend` — Supabase + Vercel + PostHog + Sentry + Resend + Stripe - `claude-agent-openai-anthropic` — Agent starter with OpenAI + Anthropic Templates are TOML + shell recipes in `templates/` of the source repo. diff --git a/packages/site/src/components/Templates.astro b/packages/site/src/components/Templates.astro index ab9bf27..4860fd1 100644 --- a/packages/site/src/components/Templates.astro +++ b/packages/site/src/components/Templates.astro @@ -17,8 +17,8 @@ interface TemplateEntry { const TEMPLATES: TemplateEntry[] = [ { id: "nextjs-supabase-posthog", - title: "Next.js + Supabase + PostHog", - blurb: "App Router, Supabase Auth + Postgres, PostHog events from server actions.", + title: "Next.js + Supabase + Vercel + PostHog", + blurb: "App Router, Supabase Auth + Postgres, deployed to Vercel, PostHog events from server actions.", stack: ["Vercel", "Supabase", "PostHog"], refNames: ["vercel", "supabase", "posthog"], accent: "3ECF8E", @@ -41,10 +41,10 @@ const TEMPLATES: TemplateEntry[] = [ }, { id: "supabase-posthog-sentry-resend", - title: "SaaS starter — Supabase · PostHog · Sentry · Resend", - blurb: "Auth, analytics, errors, and transactional email — wired from day one.", - stack: ["Supabase", "PostHog", "Sentry", "Resend"], - refNames: ["supabase", "posthog", "sentry", "resend"], + title: "SaaS starter — Supabase · Vercel · PostHog · Sentry · Resend", + blurb: "Auth, deploy, analytics, errors, and transactional email — wired from day one.", + stack: ["Supabase", "Vercel", "PostHog", "Sentry", "Resend"], + refNames: ["supabase", "vercel", "posthog", "sentry", "resend"], accent: "F54E00", }, { diff --git a/packages/site/src/lib/templates-ref.ts b/packages/site/src/lib/templates-ref.ts index a86aa86..c1c2031 100644 --- a/packages/site/src/lib/templates-ref.ts +++ b/packages/site/src/lib/templates-ref.ts @@ -32,10 +32,10 @@ export interface TemplateRef { export const TEMPLATES_REF: TemplateRef[] = [ { name: "nextjs-supabase-posthog", - displayName: "Next.js · Supabase · PostHog", - tagline: "Postgres + auth + product analytics.", + displayName: "Next.js · Supabase · Vercel · PostHog", + tagline: "Postgres + auth + deploy + product analytics.", blurb: - "The classic Next.js SaaS starting point. Supabase for data + auth, PostHog for analytics and feature flags. Two MCP servers wired (Supabase scoped to your project, PostHog SSE).", + "The classic Next.js SaaS starting point. Supabase for data + auth, Vercel as the deploy target, PostHog for analytics and feature flags. Two MCP servers wired (Supabase scoped to your project, PostHog SSE).", services: [ { name: "supabase", @@ -43,6 +43,11 @@ export const TEMPLATES_REF: TemplateRef[] = [ secrets: ["SUPABASE_URL", "SUPABASE_ANON_KEY", "SUPABASE_SERVICE_ROLE_KEY"], mcp: "supabase", }, + { + name: "vercel", + provider: "vercel", + secrets: ["VERCEL_TOKEN"], + }, { name: "posthog", provider: "posthog", @@ -51,7 +56,7 @@ export const TEMPLATES_REF: TemplateRef[] = [ }, ], environments: ["dev", "prod"], - goodFor: "Teams that want a full SaaS stack (DB + auth + analytics) in one command.", + goodFor: "Teams that want a full Next.js SaaS stack (DB + auth + deploy + analytics) in one command.", }, { name: "nextjs-neon-vercel-sentry", @@ -82,10 +87,10 @@ export const TEMPLATES_REF: TemplateRef[] = [ }, { name: "supabase-posthog-sentry-resend", - displayName: "Supabase · PostHog · Sentry · Resend · Stripe", + displayName: "Supabase · Vercel · PostHog · Sentry · Resend · Stripe", tagline: 'The "SaaS in a box" template.', blurb: - "The maximal SaaS starter — DB/auth, analytics, errors, transactional email, and billing all wired in one command. Three MCP servers (Supabase, PostHog, Sentry) come online alongside.", + "The maximal SaaS starter — DB/auth, deploy, analytics, errors, transactional email, and billing all wired in one command. Three MCP servers (Supabase, PostHog, Sentry) come online alongside.", services: [ { name: "supabase", @@ -93,6 +98,11 @@ export const TEMPLATES_REF: TemplateRef[] = [ secrets: ["SUPABASE_URL", "SUPABASE_ANON_KEY", "SUPABASE_SERVICE_ROLE_KEY"], mcp: "supabase", }, + { + name: "vercel", + provider: "vercel", + secrets: ["VERCEL_TOKEN"], + }, { name: "posthog", provider: "posthog", diff --git a/templates/nextjs-supabase-posthog/stack.toml b/templates/nextjs-supabase-posthog/stack.toml index 458744c..8e10086 100644 --- a/templates/nextjs-supabase-posthog/stack.toml +++ b/templates/nextjs-supabase-posthog/stack.toml @@ -1,4 +1,4 @@ -# Next.js + Supabase + PostHog starter. +# Next.js + Supabase + Vercel + PostHog starter. # # `stack init --template nextjs-supabase-posthog` copies this as .stack.toml. # Services are stubs (no resource_id yet); `stack add ` will provision @@ -16,6 +16,12 @@ mcp = "supabase" created_at = "1970-01-01T00:00:00Z" created_by = "template" +[services.vercel] +provider = "vercel" +secrets = ["VERCEL_TOKEN"] +created_at = "1970-01-01T00:00:00Z" +created_by = "template" + [services.posthog] provider = "posthog" secrets = ["POSTHOG_PROJECT_API_KEY", "POSTHOG_PERSONAL_API_KEY"] diff --git a/templates/supabase-posthog-sentry-resend/stack.toml b/templates/supabase-posthog-sentry-resend/stack.toml index 13a8841..76fa66f 100644 --- a/templates/supabase-posthog-sentry-resend/stack.toml +++ b/templates/supabase-posthog-sentry-resend/stack.toml @@ -1,5 +1,5 @@ -# SaaS starter — Supabase (DB + auth), PostHog (analytics), Sentry (errors), -# Resend (transactional email), Stripe (payments), Clerk (auth, optional). +# SaaS starter — Supabase (DB + auth), Vercel (deploy), PostHog (analytics), +# Sentry (errors), Resend (transactional email), Stripe (payments). [stack] version = "1" @@ -13,6 +13,12 @@ mcp = "supabase" created_at = "1970-01-01T00:00:00Z" created_by = "template" +[services.vercel] +provider = "vercel" +secrets = ["VERCEL_TOKEN"] +created_at = "1970-01-01T00:00:00Z" +created_by = "template" + [services.posthog] provider = "posthog" secrets = ["POSTHOG_PERSONAL_API_KEY"]