[{"data":1,"prerenderedAt":1473},["ShallowReactive",2],{"blog-shipfast-tutorial":3,"related-shipfast-tutorial":477},{"id":4,"title":5,"author":6,"body":7,"category":6,"date":462,"description":463,"draft":464,"extension":465,"image":6,"meta":466,"navigation":467,"path":468,"seo":469,"stem":470,"tags":471,"__hash__":476},"blog\u002Fblog\u002Fshipfast-tutorial.md","ShipFast Tutorial: Build Production-Ready Startups Faster",null,{"type":8,"value":9,"toc":439},"minimark",[10,14,19,30,33,37,40,55,59,62,91,94,98,107,116,120,129,132,141,145,148,151,155,164,167,171,209,213,228,232,235,239,245,251,257,272,278,282,302,305,309,341,345,358,364,370,374,377,381,384,388,391,395,424],[11,12,13],"p",{},"If you searched for a \"shipfast tutorial,\" you already know the pitch: launch your startup in days, not weeks, from an easy-to-follow boilerplate. The pitch is right about one thing — the framework is not what slows you down. But most tutorials stop exactly where the real work begins: wiring Stripe webhooks, writing row-level security, and making billing state survive a retry. BoiledPlate is built around that gap. Here's what it is, how it works, and where it beats the \"ship in five minutes\" promise that quietly leaves you debugging in production.",[15,16,18],"h2",{"id":17},"what-is-boiledplate","What is BoiledPlate?",[11,20,21,22,29],{},"BoiledPlate is an AI-native Nuxt + Supabase starter kit that sets itself up. Instead of cloning a template and manually connecting services, your coding agent interviews you, then provisions the stack: ",[23,24,28],"a",{"href":25,"rel":26},"https:\u002F\u002Fboiledplate.ai",[27],"nofollow","Stripe products and webhooks, a Supabase database with RLS, and Google sign-in"," — in a single session.",[11,31,32],{},"It's not just boilerplate code. Generic Next.js templates hand you files and a tutorial; you're still the integration engineer. BoiledPlate ships an agent contract and deterministic patches so the setup is a conversation, not a checklist. You answer questions about pricing tiers, languages, and theme; the agent reshapes the codebase to match.",[15,34,36],{"id":35},"the-real-problem-boiledplate-solves","The Real Problem BoiledPlate Solves",[11,38,39],{},"Picking a stack is trivial. Nuxt or Next, Postgres or hosted — decide over coffee and move on. What eats four to six weeks is the plumbing between the pieces: idempotent webhooks, RLS policies, refund handling, transactional email that sends exactly once, and EU consent flows.",[11,41,42,43,48,49,54],{},"\"Easy to follow\" tutorials skip this because it's the hard, unglamorous part. They get you to a checkout redirect and a success page, then leave you to discover that ",[23,44,47],{"href":45,"rel":46},"https:\u002F\u002Fboiledplate.ai\u002Fblog\u002Fstripe-webhooks-source-of-truth",[27],"your success page should never be the source of billing truth",". We wrote about this at length in ",[23,50,53],{"href":51,"rel":52},"https:\u002F\u002Fboiledplate.ai\u002Fblog\u002Fhow-to-ship-saas-fast",[27],"why the stack is easy and the plumbing is the project"," — it's the thesis the whole product is built on.",[15,56,58],{"id":57},"how-boiledplate-actually-works","How BoiledPlate Actually Works",[11,60,61],{},"The flow is concrete, not marketing:",[63,64,65,73,79,85],"ol",{},[66,67,68,72],"li",{},[69,70,71],"strong",{},"The agent interviews you."," Name, languages, theme, billing model, user roles, consent requirements.",[66,74,75,78],{},[69,76,77],{},"The agent reads the AGENTS.md contract and applies deterministic patches."," These are repeatable, idempotent code changes — not vibes.",[66,80,81,84],{},[69,82,83],{},"Services auto-provision."," Supabase (cloud or local Docker) with RLS policies, Stripe products and webhooks, Google OAuth.",[66,86,87,90],{},[69,88,89],{},"A webhook proves billing state landed."," The source of truth is the webhook hitting your database, not client-side confetti.",[11,92,93],{},"That fourth step is the difference between a demo and a product. A five-minute tutorial that ends at the redirect hasn't shipped billing; it's shown you the happy path, which is maybe a fifth of the work.",[15,95,97],{"id":96},"the-anti-plumbing-stack-why-nuxt-supabase-stripe","The Anti-Plumbing Stack: Why Nuxt + Supabase + Stripe",[11,99,100,101,106],{},"These three aren't arbitrary. Nuxt's server middleware, composables, and auto-imports give an agent predictable places to write code, which is what makes consistent patches possible. Supabase enforces ",[23,102,105],{"href":103,"rel":104},"https:\u002F\u002Fsupabase.com\u002Fdocs\u002Fguides\u002Fdatabase\u002Fpostgres\u002Frow-level-security",[27],"RLS at query time",", so access logic can't quietly leak through an application-layer mistake. Stripe's webhooks, when handled idempotently, mean refunds and retries don't double-charge.",[11,108,109,110,115],{},"The trap is mixing them carelessly — trusting a checkout redirect for access, or checking auth in middleware and calling it security. ",[23,111,114],{"href":112,"rel":113},"https:\u002F\u002Fboiledplate.ai\u002Fblog\u002Fnuxt-supabase-stripe-saas-boilerplate",[27],"Wiring these four services correctly"," is precisely the multi-week task BoiledPlate collapses.",[15,117,119],{"id":118},"billing-architecture-that-survives-reality","Billing Architecture That Survives Reality",[11,121,122,123,128],{},"Stripe and Supabase have a clean division of labor: Stripe owns payment and subscription lifecycle; your database owns access. The ",[23,124,127],{"href":125,"rel":126},"https:\u002F\u002Fboiledplate.ai\u002Fblog\u002Fstripe-subscriptions-nuxt-supabase",[27],"webhook is where subscriptions actually live",". BoiledPlate ships multi-plan subscriptions with signature-verified, idempotent webhook handlers.",[11,130,131],{},"Consider the retry case. Stripe re-delivers events on any non-2xx or timeout. If your handler credits the customer without an idempotency key, a retry double-credits. BoiledPlate's handlers key on the event ID so repeated delivery is a no-op.",[11,133,134,135,140],{},"Refunds are harder than the docs admit, especially in the EU. German law requires an explicit withdrawal waiver before a digital product is delivered — we encoded that directly into the pay button using ",[23,136,139],{"href":137,"rel":138},"https:\u002F\u002Fboiledplate.ai\u002Fblog\u002Fstripe-checkout-consent-collection-german-withdrawal-waiver",[27],"Stripe Checkout's consent_collection",". No five-minute tutorial touches this.",[15,142,144],{"id":143},"auth-done-right-rls-without-footguns","Auth Done Right: RLS Without Footguns",[11,146,147],{},"RLS enforces policies at query time, in the database, not in your handler code. That's the point: you can't forget to check, because the check is the query. But it demands discipline. The classic footgun is a policy that forgets a tenant ID and exposes other customers' rows. BoiledPlate generates policies that match your declared user roles and pricing tiers, so access maps to billing state rather than to hope.",[11,149,150],{},"The other footgun is skipping signature verification on webhooks. An unverified endpoint accepts forged events. BoiledPlate verifies signatures before anything touches the database.",[15,152,154],{"id":153},"agent-consistency-the-agentsmd-contract","Agent Consistency: The AGENTS.md Contract",[11,156,157,158,163],{},"Coding agents drift when there's no single source of truth for conventions. Ask an agent to add a billing event today and a role tomorrow, and you get two incompatible styles. AGENTS.md fixes this: one documented way to access data, manage secrets, and structure API handlers. We explain the reasoning in ",[23,159,162],{"href":160,"rel":161},"https:\u002F\u002Fboiledplate.ai\u002Fblog\u002Fconventions-for-ai-coding-agents",[27],"write your conventions for the agent, not the next hire",".",[11,165,166],{},"Because patches are deterministic and idempotent, they stay safe even after you customize. Adding a new billing event type doesn't break the agent's model of your codebase — it extends it.",[15,168,170],{"id":169},"features-that-ship-out-of-the-box","Features That Ship Out of the Box",[172,173,174,180,186,192,198],"ul",{},[66,175,176,179],{},[69,177,178],{},"Transactional email (Resend):"," onboarding, receipts, and cancellations wired, not left as an exercise.",[66,181,182,185],{},[69,183,184],{},"i18n from day one:"," four languages preloaded; the agent respects translation keys in every patch.",[66,187,188,191],{},[69,189,190],{},"A blog ready to write:"," prerendered Markdown with SEO — JSON-LD and canonical URLs — built in.",[66,193,194,197],{},[69,195,196],{},"Dashboard theming:"," pick a preset or describe your own; the agent maps it onto the component library. These are real previews every buyer gets.",[66,199,200,203,204,208],{},[69,201,202],{},"TypeScript strict mode:"," no ",[205,206,207],"code",{},"any"," escape hatches, which makes agent-readable types and safer patches.",[15,210,212],{"id":211},"the-seo-foundation-tutorials-usually-miss","The SEO Foundation Tutorials Usually Miss",[11,214,215,216,221,222,227],{},"\"SEO out of the box\" is lazy marketing unless the canonical URL doesn't drift per language or route. We learned this the embarrassing way when ",[23,217,220],{"href":218,"rel":219},"https:\u002F\u002Fboiledplate.ai\u002Fblog\u002Four-blog-canonically-pointed-at-localhost",[27],"our blog told Google its canonical was localhost:3000",". JSON-LD matters too — and it can bite you. A ",[23,223,226],{"href":224,"rel":225},"https:\u002F\u002Fboiledplate.ai\u002Fblog\u002Fthe-page-that-returned-200-on-the-server-and-500-in-the-browser-a-json-ld-tempor",[27],"JSON-LD script in the wrong source order returned 200 from curl and 500 in Chrome",". Those SSR patterns are documented so you don't rediscover them in production.",[15,229,231],{"id":230},"shipping-without-merge-hell","Shipping Without Merge Hell",[11,233,234],{},"BoiledPlate ships semantic, agent-readable release notes that describe what changed and why. Updates are opt-in: you pull patches, the agent shows diffs before applying. That's how you upgrade six months later without rewinding your own customizations — the update respects the code you wrote on top.",[15,236,238],{"id":237},"setup-walkthrough-zero-to-stripe-webhook-in-one-session","Setup Walkthrough: Zero to Stripe Webhook in One Session",[11,240,241,244],{},[69,242,243],{},"Prerequisites:"," a Stripe account, a Supabase org, and a Google OAuth app.",[11,246,247,250],{},[69,248,249],{},"Run the interview."," The agent asks about plans, roles, languages, theme, and consent. Answer plainly; there's no framework debate to have.",[11,252,253,256],{},[69,254,255],{},"What it provisions:"," database schema, RLS policies, webhook endpoints, and environment variables. The agent writes what it can and tells you which secrets to paste.",[11,258,259,262,263,271],{},[69,260,261],{},"Deploy to Vercel or Netlify."," After the agent finishes, deployment is minutes because the wiring is already done. (One note if you add Vercel Web Analytics: the ",[23,264,267,268],{"href":265,"rel":266},"https:\u002F\u002Fboiledplate.ai\u002Fblog\u002Fvercel-web-analytics-nuxt-4-analytics-package-breaks-typecheck",[27],"package can break ",[205,269,270],{},"nuxt typecheck"," — we documented the fix.)",[11,273,274,277],{},[69,275,276],{},"Verify the first webhook."," Trigger a test event and confirm the row landed in Supabase. That's proof billing state actually arrived — the thing tutorials never make you check.",[15,279,281],{"id":280},"boiledplate-lite-vs-pro","BoiledPlate Lite vs. Pro",[172,283,284,296],{},[66,285,286,289,290,295],{},[69,287,288],{},"Lite (MIT, free):"," clone the repo and ",[23,291,294],{"href":292,"rel":293},"https:\u002F\u002Fboiledplate.ai\u002Fblog\u002Ffree-nuxt-supabase-saas-boilerplate",[27],"wire services yourself",". Good for learning the patterns or a custom stack.",[66,297,298,301],{},[69,299,300],{},"Pro (€159 one-time, lifetime updates):"," agent-driven setup, instant delivery via GitHub, semantic opt-in updates.",[11,303,304],{},"Honest trade-off: Pro is faster; Lite is more flexible if you don't use Nuxt or want to understand every wire yourself.",[15,306,308],{"id":307},"common-pitfalls-boiledplate-prevents","Common Pitfalls BoiledPlate Prevents",[172,310,311,317,323,329,335],{},[66,312,313,316],{},[69,314,315],{},"Retry loops that double-charge"," — idempotency keys make repeated events safe.",[66,318,319,322],{},[69,320,321],{},"RLS policies that expose other tenants"," — generated policies carry the tenant ID.",[66,324,325,328],{},[69,326,327],{},"Canonical URL drift"," — prerendering plus verification, born from real pain.",[66,330,331,334],{},[69,332,333],{},"JSON-LD hydration crashes"," — documented Nuxt SSR source-order patterns.",[66,336,337,340],{},[69,338,339],{},"Peer dependency hell"," — Stripe, Supabase, and Resend versions pinned and tested together.",[15,342,344],{"id":343},"real-debugging-youll-actually-hit","Real Debugging You'll Actually Hit",[11,346,347,351,352,357],{},[348,349,350],"em",{},"\"Webhook arrived but didn't update my database.\""," Run the signature-verification checklist; the ",[23,353,356],{"href":354,"rel":355},"https:\u002F\u002Fboiledplate.ai\u002Fblog\u002Fthe-github-invite-is-the-product-building-a-stripe-webhook-where-delivery-throws",[27],"GitHub-invite webhook post"," explains which failures should throw and which should never.",[11,359,360,363],{},[348,361,362],{},"\"RLS is blocking my own query.\""," Test policies against a non-production role; check that your policy references the right claim.",[11,365,366,369],{},[348,367,368],{},"\"Refund went through but the UI still shows active.\""," That's eventual consistency — the webhook is the source of truth, and the UI follows it, not the other way around.",[15,371,373],{"id":372},"why-agent-driven-setup-changes-the-game","Why Agent-Driven Setup Changes the Game",[11,375,376],{},"Manual tutorials scale linearly: you redo the plumbing for every SaaS. Agent-driven setup scales better because the agent learns your conventions and applies them consistently. Add a user role and the agent updates RLS, UI, and API in one coherent patch — respecting the naming scheme your team already uses.",[15,378,380],{"id":379},"when-boiledplate-isnt-the-right-fit","When BoiledPlate Isn't the Right Fit",[11,382,383],{},"If you're married to Next.js and won't learn Nuxt, Pro needs buy-in (Lite still teaches the patterns). If your billing is too complex for standard SaaS tiers, or you need a GraphQL API, expect custom work — BoiledPlate ships server middleware and assumes conventional subscription models.",[15,385,387],{"id":386},"the-philosophy","The Philosophy",[11,389,390],{},"The framework is not what slows you down; the integration is. BoiledPlate respects your time by automating the boring wiring without hiding the complexity, and it's built for AI agents because they'll be writing your SaaS tomorrow — you might as well design for consistency now.",[15,392,394],{"id":393},"getting-started","Getting Started",[172,396,397,403,414],{},[66,398,399,402],{},[69,400,401],{},"30 minutes:"," skim the conventions and decide if agent-driven setup appeals to you.",[66,404,405,408,409,413],{},[69,406,407],{},"2 hours:"," ",[23,410,412],{"href":292,"rel":411},[27],"clone Lite",", wire one service by hand, and feel where the weeks go.",[66,415,416,408,419,423],{},[69,417,418],{},"Ready to ship:",[23,420,422],{"href":25,"rel":421},[27],"get Pro",", run the interview, deploy, and write your first real feature instead of your fortieth webhook handler.",[11,425,426,427,432,433,438],{},"For deeper reading, the ",[23,428,431],{"href":429,"rel":430},"https:\u002F\u002Fboiledplate.ai\u002Fblog",[27],"BoiledPlate blog"," documents each edge case with the real bug and the real fix — and Stripe's own ",[23,434,437],{"href":435,"rel":436},"https:\u002F\u002Fdocs.stripe.com\u002Fwebhooks",[27],"webhook best practices"," are essential even when a starter handles the hard parts for you.",{"title":440,"searchDepth":441,"depth":441,"links":442},"",3,[443,445,446,447,448,449,450,451,452,453,454,455,456,457,458,459,460,461],{"id":17,"depth":444,"text":18},2,{"id":35,"depth":444,"text":36},{"id":57,"depth":444,"text":58},{"id":96,"depth":444,"text":97},{"id":118,"depth":444,"text":119},{"id":143,"depth":444,"text":144},{"id":153,"depth":444,"text":154},{"id":169,"depth":444,"text":170},{"id":211,"depth":444,"text":212},{"id":230,"depth":444,"text":231},{"id":237,"depth":444,"text":238},{"id":280,"depth":444,"text":281},{"id":307,"depth":444,"text":308},{"id":343,"depth":444,"text":344},{"id":372,"depth":444,"text":373},{"id":379,"depth":444,"text":380},{"id":386,"depth":444,"text":387},{"id":393,"depth":444,"text":394},"2026-09-11","Learn how BoiledPlate goes beyond ShipFast templates with AI-native setup, Stripe integration, and production-ready infrastructure for startups.",false,"md",{},true,"\u002Fblog\u002Fshipfast-tutorial",{"title":5,"description":463},"blog\u002Fshipfast-tutorial",[472,473,474,475],"shipfast","tutorial","startup-boilerplate","stripe-integration","tDZYFFDL49lAdCZJNAP9-tOsrJ4PCoW-berk9aTYAg0",[478,798,1145],{"id":479,"title":480,"author":6,"body":481,"category":6,"date":787,"description":788,"draft":464,"extension":465,"image":6,"meta":789,"navigation":467,"path":790,"seo":791,"stem":792,"tags":793,"__hash__":797},"blog\u002Fblog\u002Fshipfast-template-boilerplate-quality.md","ShipFast Template: Why Boilerplate Quality Beats Framework Choice",{"type":8,"value":482,"toc":768},[483,490,494,497,504,508,516,519,523,529,540,543,547,554,562,570,574,577,589,593,596,599,603,606,614,618,625,628,632,644,651,655,658,671,675,682,686,689,692,696,699,703,715,719,731,734,738,746,750,756],[11,484,485,486,489],{},"If you searched for a ",[69,487,488],{},"shipfast template",", you already made the easy decision. You picked a stack — or you're about to. What you haven't priced in yet is the part that actually eats your calendar: wiring those services together so they don't corrupt each other in production. This article compares the boilerplate landscape honestly, and explains why service integration quality matters more than which framework logo sits on the box.",[15,491,493],{"id":492},"why-just-pick-a-framework-misses-the-point","Why \"Just Pick a Framework\" Misses the Point",[11,495,496],{},"Ask ten founders how to ship fast and you get ten stack arguments. Next.js vs. Nuxt vs. Remix. Postgres vs. a hosted DB. Stripe vs. Paddle. Pick whatever you already know and the debate is over in an afternoon.",[11,498,499,500,163],{},"The framework is not what slows you down. What slows you down is the plumbing between the pieces: Stripe webhooks that have to agree with your database, row-level security policies you forgot until a user saw someone else's data, email that sends but never arrives, refund flows that quietly desync your billing state. As we've written before, ",[23,501,503],{"href":51,"rel":502},[27],"the stack is easy — the plumbing is the project",[15,505,507],{"id":506},"the-boilerplate-gap-what-starter-kits-usually-forget","The Boilerplate Gap: What Starter Kits Usually Forget",[11,509,510,511,163],{},"Most templates ship a box of parts: auth scaffolding, a database client, a Stripe integration, a landing page with a hero section. The parts were never the problem. Bolting them to each other is ",[23,512,515],{"href":513,"rel":514},"https:\u002F\u002Fboiledplate.ai\u002Fblog\u002Fnuxt-saas-boilerplate-for-ai-agents",[27],"what ate our weekends",[11,517,518],{},"What starters routinely skip is the unglamorous middle layer: idempotent webhook architecture, production-grade billing state management, EU consent flows, subscription edge cases. \"Battle-tested UI components\" is a real thing. It does not mean \"battle-tested billing.\" Those are separate audits, and the second one is where the money lives.",[15,520,522],{"id":521},"boiledplate-vs-shipfast-stack-philosophy-and-trade-offs","BoiledPlate vs. ShipFast: Stack, Philosophy, and Trade-offs",[11,524,525,528],{},[69,526,527],{},"ShipFast"," is a Next.js boilerplate (Supabase, Stripe, Tailwind) with the largest ecosystem and fastest adoption in this category. If your team lives in React and you want a well-trodden path, it's a reasonable default.",[11,530,531,534,535,539],{},[69,532,533],{},"BoiledPlate"," is a Nuxt + Supabase + Stripe starter with a different center of gravity: it's ",[23,536,538],{"href":25,"rel":537},[27],"AI-native and its setup runs itself",". Your coding agent interviews you, then provisions Stripe products and webhooks, a Supabase database with RLS, and Google sign-in — in one session, using deterministic patches.",[11,541,542],{},"The honest take: stack matters less than service integration quality. Choose based on where your expertise already is, whether you build with coding agents like Claude, and how much update-maintenance burden you're willing to carry. React shop with no agent workflow? ShipFast fits. Nuxt-comfortable, agent-driven, allergic to merge hell? Keep reading.",[15,544,546],{"id":545},"the-webhook-problem-nobody-talks-about","The Webhook Problem Nobody Talks About",[11,548,549,550,553],{},"Here is the thing every marketing page glosses over: ",[69,551,552],{},"delivery matters more than docs."," A webhook that fires but doesn't reliably land is worse than no webhook, because now your billing state lies to you.",[11,555,556,557,561],{},"Idempotency is a requirement, not a feature. Stripe retries. Networks time out mid-write. Two events race. If your handler runs twice and grants access twice, or charges twice, you've built a bug generator. The ",[23,558,560],{"href":45,"rel":559},[27],"checkout success page should never touch your billing state"," — the Stripe webhook is the source of truth, not the client redirect the user happened to see.",[11,563,564,565,569],{},"Refunds are where this gets sharp. We wrote a whole post on ",[23,566,568],{"href":354,"rel":567},[27],"a Stripe webhook where some failures must throw and some must never do",", because getting that distinction wrong either drops paying customers or floods your logs with false alarms.",[15,571,573],{"id":572},"agent-driven-setup-the-automation-layer-boilerplates-miss","Agent-Driven Setup: The Automation Layer Boilerplates Miss",[11,575,576],{},"Coding agents can do more than autocomplete templates — they can provision services. In BoiledPlate, the agent's first session interviews you (name, languages, theme, billing model), then reshapes the codebase to your answers with deterministic patches: automated, repeatable changes rather than copy-paste guesswork.",[11,578,579,580,583,584,588],{},"The glue that keeps this consistent is a shipped ",[69,581,582],{},"AGENTS.md"," contract — one documented way to do data access and secrets — so agent output doesn't drift. If you've watched an agent invent three different patterns for the same task, you understand why ",[23,585,587],{"href":160,"rel":586},[27],"writing conventions for the agent, not the next hire"," is the real unlock. This closes the gap between \"generated a file\" and \"wired a working service.\"",[15,590,592],{"id":591},"database-security-that-doesnt-require-a-security-audit","Database Security That Doesn't Require a Security Audit",[11,594,595],{},"Supabase auth is the fast part. RLS is the part you forget — until someone reads a row they shouldn't. Row-level security enforced at query time should be the default, not an afterthought bolted on before launch.",[11,597,598],{},"The trap is that RLS looks simple and behaves subtly: a policy that works for the owner can silently over-share on a join, and it survives your first refactor only if you wrote it deliberately. A solid pattern isolates tenants at the database, not just in application code, and gets tested against real query paths before production — not discovered by a customer.",[15,600,602],{"id":601},"billing-edge-cases-the-unglamorous-reality","Billing Edge Cases: The Unglamorous Reality",[11,604,605],{},"Multi-plan subscriptions mean state transitions: upgrades, downgrades, cancellations, grace periods. Each one is a chance to corrupt state if the webhook and database disagree.",[11,607,608,609,613],{},"Then there's compliance. EU consent law isn't optional decoration — for digital goods, German law requires an explicit withdrawal waiver, and we documented exactly how to ",[23,610,612],{"href":137,"rel":611},[27],"encode that waiver into the pay button with Stripe Checkout consent_collection",". Refunds must reverse access without corrupting subscription state. Proration needs a deliberate policy. And webhook signature verification is your defense against forged events — the cheap line of code that prevents an expensive incident.",[15,615,617],{"id":616},"transactional-email-that-actually-arrives","Transactional Email That Actually Arrives",[11,619,620,621,624],{},"Resend paired with Supabase is a clean setup: simple to send, annoying to send ",[348,622,623],{},"exactly once",". Verification flows fail silently more often than teams admit — the email \"sent,\" the user never got it, and support inherits the mystery.",[11,626,627],{},"Templates need to survive both theming and localization, which means your copy and your markup can't be hard-coupled. Receipts and invoices should generate from your billing events without a fourth external service in the mix.",[15,629,631],{"id":630},"seo-and-canonicals-why-these-matter-for-shipped-products","SEO and Canonicals: Why These Matter for Shipped Products",[11,633,634,635,639,640,163],{},"SEO-out-of-the-box saves weeks of debugging you didn't budget for. Two real bugs from our own build: a ",[23,636,638],{"href":224,"rel":637},[27],"JSON-LD block that returned 200 from curl and 500 in the browser"," because of source order, and a blog that ",[23,641,643],{"href":218,"rel":642},[27],"told Google its canonical URL was localhost:3000",[11,645,646,647,650],{},"Canonicals get harder with multi-language routes, ",[205,648,649],{},"og:url"," needs to be correct for social sharing, and prerendered Markdown gives you a fast, indexable content foundation from day one. None of it is clever. All of it is the kind of thing that quietly tanks your launch if it ships broken.",[15,652,654],{"id":653},"typescript-end-to-end-what-strict-mode-actually-gives-you","TypeScript End-to-End: What \"Strict Mode\" Actually Gives You",[11,656,657],{},"Strict mode is worth the friction because billing bugs are the expensive kind, and catching them at compile time beats catching them in a chargeback. Type safety that spans API routes, database queries, and client state means a wrong shape fails your build, not your customer.",[11,659,660,661,670],{},"Typing Stripe webhooks correctly is the part nobody covers — event payloads are unions, and narrowing them properly is where most integrations get loose. And peer-dependency hell is real: we hit a case where ",[23,662,664,667,668],{"href":265,"rel":663},[27],[205,665,666],{},"@vercel\u002Fanalytics"," broke ",[205,669,270],{},". A boilerplate earns its price partly by having already absorbed those fights.",[15,672,674],{"id":673},"deployment-in-minutes-github-as-product-delivery","Deployment in Minutes: GitHub as Product Delivery",[11,676,677,678,681],{},"BoiledPlate ships via instant GitHub delivery — the invite ",[348,679,680],{},"is"," the product — rather than a download-and-configure ZIP. Service provisioning happens during onboarding, not as a scavenger hunt after. Environment variables, Docker for local Supabase, and Vercel\u002FNetlify deployment are part of the path, so getting to a live URL is a small number of decisions, not a weekend.",[15,683,685],{"id":684},"theming-and-customization-without-the-maintenance-tax","Theming and Customization Without the Maintenance Tax",[11,687,688],{},"You pick a dashboard theme in the setup interview — Warm Studio, Clean SaaS, Midnight Pro, Sharp Enterprise — or describe your own, and the agent maps it onto the codebase. These are real previews every buyer gets, not stock screenshots.",[11,690,691],{},"The harder problem is updating after you've customized. Semantic, agent-readable release notes make updates opt-in on code you've already changed — which is the actual answer to merge hell, not a promise that you'll never touch the source.",[15,693,695],{"id":694},"four-languages-from-day-one-i18n-that-doesnt-feel-bolted-on","Four Languages from Day One: i18n That Doesn't Feel Bolted On",[11,697,698],{},"Shipping with translation infrastructure beats retrofitting it, because a new locale string has to land in several places before the build stops complaining. BoiledPlate ships four languages with message management, component- and route-level switching, and copy structured so it survives A\u002FB testing instead of hard-coding English into your markup.",[15,700,702],{"id":701},"the-anti-plumbing-stack-why-these-tools-work-together","The Anti-Plumbing Stack: Why These Tools Work Together",[11,704,705,706,709,710,714],{},"Nuxt's ",[205,707,708],{},"server\u002F"," directory sits naturally next to Supabase RLS. Stripe's webhook model beats polling — and you genuinely can't cheat it; delivery is the contract. TypeScript strict mode plus agent-driven, convention-bound code means fewer surprises reach production. It's composition over configuration: fewer decisions to get wrong, more defaults that are already correct. We broke down ",[23,711,713],{"href":112,"rel":712},[27],"what each piece really demands"," if you want the wiring in detail.",[15,716,718],{"id":717},"the-hidden-cost-of-faster-setup","The Hidden Cost of \"Faster Setup\"",[11,720,721,722,726,727,730],{},"Free tier or paid? ",[23,723,725],{"href":292,"rel":724},[27],"BoiledPlate Lite is MIT-licensed"," — clone it and wire manually if you enjoy the plumbing or want to inspect every seam. ",[69,728,729],{},"Pro"," is €159 one-time with lifetime updates and instant GitHub delivery.",[11,732,733],{},"\"Lifetime updates\" means something specific here: semantic versioning with agent-readable changes, so upgrades are legible rather than a diff you fear. Deterministic patches reduce forking risk by keeping customization structured. Open source buys transparency and trust; paid buys the absorbed edge cases.",[15,735,737],{"id":736},"metrics-that-matter-after-launch","Metrics That Matter After Launch",[11,739,740,741,745],{},"Track webhook delivery success rate and retry behavior. Watch RLS query performance under load. Monitor email delivery and bounce rates. Verify billing-state consistency across refunds and cancellations. And review which agent-driven customizations held up — that feedback loop is how your setup stays trustworthy. Stripe's own ",[23,742,437],{"href":743,"rel":744},"https:\u002F\u002Fdocs.stripe.com\u002Fwebhooks\u002Fbest-practices",[27]," are worth bookmarking here.",[15,747,749],{"id":748},"the-decision-framework-is-a-boilerplate-worth-your-time","The Decision Framework: Is a Boilerplate Worth Your Time?",[11,751,752,753,755],{},"DIY plumbing is faster than a good boilerplate roughly never — and when it ",[348,754,680],{},", it's because your requirements are so unusual that no template fits. Evaluate any starter by three things: the quality of its billing implementation, whether security is default or afterthought, and how its agent design handles drift.",[11,757,758,759,762,763,767],{},"Refactoring a bad foundation costs more than the upfront investment in a good one. Before you commit to any ",[69,760,761],{},"shipfast-style template",", ask: How does it handle webhook idempotency? Are RLS policies tested? What happens to billing state on a refund? If the answers are vague, the plumbing is still yours to build. Skim ",[23,764,766],{"href":429,"rel":765},[27],"the blog"," — the questions worth asking are the ones we kept a running log of.",{"title":440,"searchDepth":441,"depth":441,"links":769},[770,771,772,773,774,775,776,777,778,779,780,781,782,783,784,785,786],{"id":492,"depth":444,"text":493},{"id":506,"depth":444,"text":507},{"id":521,"depth":444,"text":522},{"id":545,"depth":444,"text":546},{"id":572,"depth":444,"text":573},{"id":591,"depth":444,"text":592},{"id":601,"depth":444,"text":602},{"id":616,"depth":444,"text":617},{"id":630,"depth":444,"text":631},{"id":653,"depth":444,"text":654},{"id":673,"depth":444,"text":674},{"id":684,"depth":444,"text":685},{"id":694,"depth":444,"text":695},{"id":701,"depth":444,"text":702},{"id":717,"depth":444,"text":718},{"id":736,"depth":444,"text":737},{"id":748,"depth":444,"text":749},"2026-09-10","Discover why a quality shipfast template matters more than your framework. Learn how service integration and plumbing separate fast shipping from slow debugging.",{},"\u002Fblog\u002Fshipfast-template-boilerplate-quality",{"title":480,"description":788},"blog\u002Fshipfast-template-boilerplate-quality",[472,794,795,796],"boilerplate","saas-development","starter-templates","BzjDbCW8Cnp_xkO7YxbpPG3il5Bl8s0lq5G6DArHov4",{"id":799,"title":800,"author":6,"body":801,"category":6,"date":1134,"description":1135,"draft":464,"extension":465,"image":6,"meta":1136,"navigation":467,"path":1137,"seo":1138,"stem":1139,"tags":1140,"__hash__":1144},"blog\u002Fblog\u002Fshipfast-tech-vs-boiledplate-saas-boilerplate.md","ShipFast Tech vs BoiledPlate: SaaS Boilerplate Comparison",{"type":8,"value":802,"toc":1108},[803,806,810,813,816,820,828,833,849,857,861,864,867,871,875,883,887,894,897,901,905,912,916,919,923,935,939,943,946,950,960,964,967,1011,1017,1023,1027,1040,1043,1047,1050,1053,1056,1060,1076,1080,1086,1092,1098,1102,1105],[11,804,805],{},"When people search for \"shipfast tech,\" they're usually asking one question: which SaaS boilerplate gets me to production fastest? ShipFast, Marc Lou's Next.js template, popularized the \"days not weeks\" pitch. BoiledPlate makes a similar promise on a different stack. But most head-to-head comparisons stop at feature checklists and miss the part that actually eats your launch: the plumbing.",[15,807,809],{"id":808},"what-this-comparison-actually-covers","What This Comparison Actually Covers",[11,811,812],{},"This isn't a feature-parity table. Both products ship auth, Stripe, a database, and email. The interesting differences are architectural: ShipFast is a Next.js template you clone and customize by hand. BoiledPlate is a Nuxt + Supabase starter whose setup runs itself — your coding agent interviews you, then provisions services and patches the code.",[11,814,815],{},"\"Days not weeks\" means different things depending on which of those workflows you buy into. Let's look at where the weeks actually hide.",[15,817,819],{"id":818},"the-plumbing-layer-where-weeks-actually-hide","The Plumbing Layer: Where Weeks Actually Hide",[11,821,822,823,827],{},"Picking Next.js or Nuxt takes an afternoon. Wiring Stripe webhooks, writing row-level security policies, handling refunds, and encoding EU consent takes weeks. We've argued this at length in ",[23,824,826],{"href":51,"rel":825},[27],"how to ship SaaS fast: the stack is easy, the plumbing is the project",". The framework is not what slows you down.",[829,830,832],"h3",{"id":831},"webhook-architecture-the-invisible-complexity","Webhook Architecture: The Invisible Complexity",[11,834,835,836,839,840,843,844,848],{},"The Stripe checkout redirect is the easy 20%. The webhook is where subscriptions actually live. You need signature verification, idempotent handling so duplicate deliveries don't double-grant access, and logic that survives events arriving out of order — Stripe can deliver ",[205,837,838],{},"subscription.updated"," before ",[205,841,842],{},"subscription.created",". Stripe's own ",[23,845,847],{"href":435,"rel":846},[27],"webhook documentation"," warns you to respond within seconds and process asynchronously.",[11,850,851,852,856],{},"Most boilerplates ship a happy-path handler and call it done. BoiledPlate treats ",[23,853,855],{"href":45,"rel":854},[27],"Stripe webhooks as the source of truth"," — your checkout success page should never touch billing state — and documents the webhook contract so it stays consistent when an agent modifies it later.",[829,858,860],{"id":859},"deterministic-patches-vs-manual-wiring","Deterministic Patches vs Manual Wiring",[11,862,863],{},"Here's the workflow fork. ShipFast: clone the template, customize by hand, and when an update lands, work through merge conflicts. BoiledPlate: the agent interviews you (name, languages, theme, billing model), then reshapes the codebase with deterministic patches — automated, repeatable changes applied to match your answers. Updates arrive as opt-in semantic release notes rather than a git merge you have to referee.",[11,865,866],{},"If a coding agent is part of your daily workflow, that difference compounds over the life of the project.",[15,868,870],{"id":869},"billing-edge-cases-that-swallow-weeks","Billing Edge Cases That Swallow Weeks",[829,872,874],{"id":873},"subscription-state-management","Subscription State Management",[11,876,877,878,882],{},"Multi-plan billing is harder than single-tier: downgrades, proration, refunds, and cancellations all have to reconcile against Stripe without race conditions. The pattern that works is documented in ",[23,879,881],{"href":125,"rel":880},[27],"how to set up Stripe subscriptions in a Nuxt + Supabase app"," — plans defined in one place, checkout as a redirect, webhooks as the store of record, and subscription state turned into access at query time.",[829,884,886],{"id":885},"eu-compliance-and-refund-flows","EU Compliance and Refund Flows",[11,888,889,890,893],{},"US-first boilerplates routinely miss EU requirements. German law, for example, requires a specific digital-goods withdrawal waiver before you can charge — we encoded it directly into the pay button using ",[23,891,139],{"href":137,"rel":892},[27],". Refunds carry their own trap: process one twice and you've made a financial error. Stripe deduplicates with idempotency keys, but your application layer still needs to mark a refund as processing before it fires.",[11,895,896],{},"This is where Supabase RLS earns its place: billing boundaries are enforced at the database layer, not in application code that an agent might accidentally drift away from.",[15,898,900],{"id":899},"architecture-comparison-nextjs-vs-nuxt-supabase","Architecture Comparison: Next.js vs Nuxt + Supabase",[829,902,904],{"id":903},"why-boiledplate-chose-nuxt-supabase","Why BoiledPlate Chose Nuxt + Supabase",[11,906,907,908,163],{},"Nuxt's file-based routing and server routes give agents predictable conventions to read and extend. Supabase pushes security into the database with row-level security, so a leaked query can't return another tenant's rows. These tools work well together — and each demands something in return, which we break down in ",[23,909,911],{"href":112,"rel":910},[27],"what it actually takes to wire up a Nuxt, Supabase and Stripe SaaS",[829,913,915],{"id":914},"shipfasts-nextjs-stack","ShipFast's Next.js Stack",[11,917,918],{},"Next.js brings a larger ecosystem and more database flexibility. That flexibility is a genuine strength if you already live in that world — but it comes with fewer opinions on RLS, which means security is more your responsibility than the framework's.",[829,920,922],{"id":921},"the-anti-plumbing-stack-question","The Anti-Plumbing Stack Question",[11,924,925,926,929,930,934],{},"Do these tools prevent plumbing, or just hide it? Honestly, neither eliminates it. The difference is ",[348,927,928],{},"where"," it's hidden. BoiledPlate hides it in agent-driven setup, deterministic patches, and an ",[23,931,933],{"href":160,"rel":932},[27],"AGENTS.md convention contract"," that keeps agent output consistent. ShipFast hides it in battle-tested code you clone and customize by hand.",[15,936,938],{"id":937},"agent-driven-setup-the-overlooked-differentiator","Agent-Driven Setup: The Overlooked Differentiator",[829,940,942],{"id":941},"the-interview-model","The Interview Model",[11,944,945],{},"BoiledPlate's setup is a conversation: the agent asks questions, patches code, and provisions Stripe products, a Supabase database with RLS, and Google sign-in in one session. ShipFast is the traditional model — clone the template, run manual setup, keep a spreadsheet of secrets, click through provider consoles.",[829,947,949],{"id":948},"agentsmd-a-data-access-contract","AGENTS.md: A Data Access Contract",[11,951,952,955,956,163],{},[23,953,582],{"href":160,"rel":954},[27]," documents one way to access data and handle secrets. That single source of convention is why an agent can handle, say, a subscription downgrade months later without inventing a second, inconsistent data-access pattern. Most existing boilerplates weren't designed for agent co-authorship, so they don't ship anything like it. We covered this shift in ",[23,957,959],{"href":513,"rel":958},[27],"every boilerplate ships the stack — that was never the hard part",[15,961,963],{"id":962},"feature-parity-what-both-ship","Feature Parity: What Both Ship",[11,965,966],{},"On the checklist, they overlap more than they differ:",[172,968,969,975,981,987,993,999,1005],{},[66,970,971,974],{},[69,972,973],{},"Auth",": both ship it; quality differs on RLS enforcement.",[66,976,977,980],{},[69,978,979],{},"Stripe",": both ship it; webhook robustness varies.",[66,982,983,986],{},[69,984,985],{},"Database",": ShipFast flexible; BoiledPlate opinionated on Supabase.",[66,988,989,992],{},[69,990,991],{},"Transactional email",": both; BoiledPlate defaults to Resend.",[66,994,995,998],{},[69,996,997],{},"i18n",": BoiledPlate ships four languages by default; ShipFast optional.",[66,1000,1001,1004],{},[69,1002,1003],{},"Blog",": BoiledPlate prerenders Markdown; ShipFast is ecosystem-dependent.",[66,1006,1007,1010],{},[69,1008,1009],{},"Theming",": both; BoiledPlate lets you pick a preset or describe a custom theme in the setup interview.",[11,1012,1013,1016],{},[69,1014,1015],{},"BoiledPlate-specific:"," deterministic patch system, agent-driven interview, AGENTS.md in the repo, opt-in semantic release notes, TypeScript strict mode, JSON-LD and canonical-URL SEO, RLS as a first-class concern.",[11,1018,1019,1022],{},[69,1020,1021],{},"ShipFast-specific:"," larger ecosystem, more third-party integrations, a longer track record, more community templates, and freedom over database and backend choice.",[15,1024,1026],{"id":1025},"pricing-and-delivery","Pricing and Delivery",[11,1028,1029,1030,1034,1035,1039],{},"BoiledPlate is €159 one-time with lifetime updates and instant ",[23,1031,1033],{"href":25,"rel":1032},[27],"GitHub delivery"," — the repo is cloned into your account via webhook — plus a free, MIT-licensed ",[23,1036,1038],{"href":292,"rel":1037},[27],"Lite tier"," you can wire up manually. ShipFast runs roughly $129–$199 one-time depending on tier, with traditional download-and-clone delivery.",[11,1041,1042],{},"Both are one-time purchases at a similar price. The real cost difference is update friction over the project's lifetime: merge conflicts versus semantic release notes.",[15,1044,1046],{"id":1045},"real-world-shipping-time-an-honest-breakdown","Real-World Shipping Time: An Honest Breakdown",[11,1048,1049],{},"ShipFast's \"5 minutes to production\" claim is true for scaffolding and a first deploy. It is not true for webhook testing, RLS policies, multi-plan billing, consent flows, and edge-case refunds. Those are the hidden weeks.",[11,1051,1052],{},"BoiledPlate's claim is narrower and, we think, more honest. The interview runs 15–30 minutes. Service provisioning happens while you watch, roughly 10–15 minutes. Deterministic patches customize the code during the interview. Then you still need to verify billing and webhooks work — hours, not weeks. The agent handles the wiring; it does not replace thinking about your product's UX.",[11,1054,1055],{},"Per phase: auth setup saves days on both. Billing is where the agent saves the most — idempotent webhooks, RLS, and multi-plan handling are pre-solved. Email and notifications are similar. The biggest long-term saving is maintenance: semantic versioning saves weeks over a customized codebase's lifetime.",[15,1057,1059],{"id":1058},"common-bugs-both-stacks-hit","Common Bugs Both Stacks Hit",[11,1061,1062,1063,1067,1068,1071,1072,163],{},"Real launches trip on real bugs. Incorrect JSON-LD can crash hydration — we shipped a page that ",[23,1064,1066],{"href":224,"rel":1065},[27],"returned 200 from curl and 500 in Chrome"," because of source order. Canonical URLs are easy to break in multilingual sites; our blog once ",[23,1069,643],{"href":218,"rel":1070},[27],". And delivery-critical webhooks need careful failure semantics — some failures must throw, some never should, which we unpack in ",[23,1073,1075],{"href":354,"rel":1074},[27],"the GitHub invite is the product",[15,1077,1079],{"id":1078},"who-should-pick-which","Who Should Pick Which",[11,1081,1082,1085],{},[69,1083,1084],{},"Pick BoiledPlate if"," you're comfortable with Nuxt, you use a coding agent like Claude as part of your workflow, your billing is complex (multi-plan, refunds, EU compliance), and you value database-layer security.",[11,1087,1088,1091],{},[69,1089,1090],{},"Pick ShipFast if"," you're Next.js-first, you prefer manual control over interview-driven setup, your billing is simple, you don't use agents, and you want maximum integration flexibility.",[11,1093,1094,1097],{},[69,1095,1096],{},"Don't decide on"," framework popularity or \"faster shipping\" alone. Both hit the same plumbing wall.",[15,1099,1101],{"id":1100},"the-real-lesson","The Real Lesson",[11,1103,1104],{},"Neither boilerplate eliminates plumbing — they hide it differently. BoiledPlate hides it in agent-driven setup, deterministic patches, and an AGENTS.md contract. ShipFast hides it in battle-tested code you clone by hand.",[11,1106,1107],{},"So \"shipfast tech\" isn't really a framework question. It's a workflow question. If your coding agent is going to be a regular co-author, an architecture built for agent consistency and safe, semantic updates is worth more than ecosystem size. If it isn't, a proven Next.js template you customize by hand is a perfectly reasonable bet. Pick based on how you actually work — not on the marketing copy on either landing page.",{"title":440,"searchDepth":441,"depth":441,"links":1109},[1110,1111,1115,1119,1124,1128,1129,1130,1131,1132,1133],{"id":808,"depth":444,"text":809},{"id":818,"depth":444,"text":819,"children":1112},[1113,1114],{"id":831,"depth":441,"text":832},{"id":859,"depth":441,"text":860},{"id":869,"depth":444,"text":870,"children":1116},[1117,1118],{"id":873,"depth":441,"text":874},{"id":885,"depth":441,"text":886},{"id":899,"depth":444,"text":900,"children":1120},[1121,1122,1123],{"id":903,"depth":441,"text":904},{"id":914,"depth":441,"text":915},{"id":921,"depth":441,"text":922},{"id":937,"depth":444,"text":938,"children":1125},[1126,1127],{"id":941,"depth":441,"text":942},{"id":948,"depth":441,"text":949},{"id":962,"depth":444,"text":963},{"id":1025,"depth":444,"text":1026},{"id":1045,"depth":444,"text":1046},{"id":1058,"depth":444,"text":1059},{"id":1078,"depth":444,"text":1079},{"id":1100,"depth":444,"text":1101},"2026-09-09","Compare ShipFast and BoiledPlate SaaS boilerplates. Learn which Next.js or Nuxt template gets you to production fastest with minimal plumbing headaches.",{},"\u002Fblog\u002Fshipfast-tech-vs-boiledplate-saas-boilerplate",{"title":800,"description":1135},"blog\u002Fshipfast-tech-vs-boiledplate-saas-boilerplate",[1141,472,1142,1143],"saas-boilerplate","nuxt","next.js","JOhPGmMdHqpb4AXq6DZI6kqDMsQ47_s_iUq70C7tQ14",{"id":1146,"title":1147,"author":6,"body":1148,"category":6,"date":1465,"description":1466,"draft":464,"extension":465,"image":6,"meta":1467,"navigation":467,"path":1468,"seo":1469,"stem":1470,"tags":1471,"__hash__":1472},"blog\u002Fblog\u002Fshipfast-source-code-analysis.md","ShipFast Source Code: A Real Developer's Analysis",{"type":8,"value":1149,"toc":1444},[1150,1153,1157,1160,1167,1170,1174,1185,1188,1196,1199,1211,1215,1218,1227,1231,1234,1266,1269,1273,1280,1283,1287,1295,1299,1302,1319,1322,1326,1345,1349,1355,1359,1369,1373,1376,1380,1383,1387,1393,1397,1400,1402,1405,1409,1420,1424,1435],[11,1151,1152],{},"Search \"shipfast source code\" and you find the same story repeated: a Next.js boilerplate that's closed until you pay, a handful of forks trying to recreate it, and threads of developers asking whether any of it is worth the money. The honest answer buried in those threads is worth pulling out: the code was never the hard part. This is a comparison for developers who already know that — and who want a Nuxt + Supabase alternative built around it.",[15,1154,1156],{"id":1155},"the-saas-starter-problem-nobody-talks-about","The SaaS Starter Problem Nobody Talks About",[11,1158,1159],{},"Every boilerplate sells you a feature checklist. Auth, payments, email, a landing page. Those features are real, but choosing them is roughly 10% of the work. The other 90% is wiring the services into something that survives a real customer: idempotent webhooks, row-level security, refunds, EU consent flows. \"Production-ready code\" claims quietly skip that part, because the plumbing is where launches actually stall.",[11,1161,1162,1163,1166],{},"We wrote about this at length in ",[23,1164,826],{"href":51,"rel":1165},[27],". The framework picks itself in an afternoon. The wiring is the project.",[11,1168,1169],{},"So when you compare boilerplates, look past the feature grid. Ask how each one handles webhook retries, how it configures RLS, and what happens when Stripe sends the same event twice.",[15,1171,1173],{"id":1172},"what-shipfast-does-and-doesnt","What ShipFast Does (And Doesn't)",[11,1175,1176,1177,1180,1181,1184],{},"ShipFast is a Next.js boilerplate that ships a complete codebase after purchase. Its pitch — \"launch in days, not weeks,\" and now \"give your AI editor real context to build features\" — is well-earned marketing. You do get full source code after buying, and the community forks (like ",[205,1178,1179],{},"vietanhdev\u002Fshipfast"," and ",[205,1182,1183],{},"krishna-praveen\u002Fshipfast-template-1",") show people rebuilding the pattern in the open.",[11,1186,1187],{},"Two things it doesn't do. First, it's closed until you pay, which is why \"honest review\" threads keep pointing at open-source alternatives. Second, it's Next.js-locked. If your workflow, deployment target, or team lives in Nuxt, a Next.js boilerplate is a permanent tax, not a head start. And \"time to first customer\" claims of five minutes describe running the template locally — not billing that survives production.",[15,1189,1191,1192],{"id":1190},"why-nuxt-supabase-stripe-beats-nextjs-alternative-stack","Why Nuxt + Supabase + Stripe Beats Next.js + ",[1193,1194,1195],"span",{},"Alternative Stack",[11,1197,1198],{},"Framework compatibility matters more than any marketing bullet. If you're already productive in Nuxt, its SSR\u002FSSG defaults and edge-friendly runtime are a better fit than fighting a different framework's conventions.",[11,1200,1201,1202,1206,1207,163],{},"The rest of the stack earns its place too. Supabase gives you Postgres with ",[23,1203,1205],{"href":112,"rel":1204},[27],"row-level security"," enforced at query time — application security that isn't bolted on afterward. And Stripe webhooks, not client-side success pages, are the source of truth for billing state. We made that argument in full in ",[23,1208,1210],{"href":45,"rel":1209},[27],"your checkout success page should not touch your billing state",[15,1212,1214],{"id":1213},"boiledplates-agent-first-architecture","BoiledPlate's Agent-First Architecture",[11,1216,1217],{},"\"AI-native\" gets thrown around loosely. Here it has a specific meaning: your coding agent's first session interviews you — name, languages, theme, billing model — then reshapes the entire codebase to your answers using deterministic patches. Not a plugin. A setup that runs itself.",[11,1219,1220,1221,1223,1224,163],{},"Deterministic patches matter because they're repeatable. Manual wiring drifts; automated, testable changes don't. And to keep an agent consistent across sessions, BoiledPlate ships an ",[205,1222,582],{}," contract: one documented way to do data access and secrets, so the agent doesn't reinvent conventions each time. We explain why that file matters in ",[23,1225,162],{"href":160,"rel":1226},[27],[15,1228,1230],{"id":1229},"the-plumbing-nobody-enjoys","The Plumbing Nobody Enjoys",[11,1232,1233],{},"This is the 90%, and it's what BoiledPlate automates.",[172,1235,1236,1242,1248,1254,1260],{},[66,1237,1238,1241],{},[69,1239,1240],{},"Webhook idempotency"," is the line between \"deployed\" and \"in production.\" Stripe will retry; your handler has to process each event exactly once.",[66,1243,1244,1247],{},[69,1245,1246],{},"Row-level security"," is easier to get wrong than right. Auth is the fast part; the RLS policies are the part people forget until data leaks.",[66,1249,1250,1253],{},[69,1251,1252],{},"Multi-plan subscriptions and refunds"," need real state management, not a single price ID.",[66,1255,1256,1259],{},[69,1257,1258],{},"Google sign-in plus email auth"," without disappearing down the OAuth rabbit hole.",[66,1261,1262,1265],{},[69,1263,1264],{},"Resend"," for transactional mail — simple to send, genuinely annoying to send exactly once.",[11,1267,1268],{},"BoiledPlate provisions Supabase, Stripe products and webhooks, and Google sign-in in one session, so this list stops being your first two weeks.",[15,1270,1272],{"id":1271},"billing-edge-cases-that-sink-founders","Billing Edge Cases That Sink Founders",[11,1274,1275,1276,163],{},"The edge cases are where founders bleed. EU consent law is a good example: selling a digital product in Germany often means encoding a withdrawal-right waiver into the pay button itself. We documented that exact implementation in ",[23,1277,1279],{"href":137,"rel":1278},[27],"Stripe Checkout consent_collection",[11,1281,1282],{},"Then there's refund idempotency and state reconciliation, cancellation timing and proration, and the quiet lie of client-side success pages — which happily tell a user they're subscribed while your database says nothing happened. Billing state has to be reconciled from webhooks, not from the browser.",[15,1284,1286],{"id":1285},"customization-without-merge-hell","Customization Without Merge Hell",[11,1288,1289,1290,1294],{},"Most starters rot the moment you customize them: the next update becomes a merge fight. BoiledPlate ships semantic, agent-readable release notes and opt-in updates to your already-customized code. Delivery is Git-based — GitHub invites are literally the distribution mechanism, which we unpack in ",[23,1291,1293],{"href":354,"rel":1292},[27],"the GitHub invite IS the product",". At some point cloning a static template stops making sense, and a maintained, updatable codebase wins.",[15,1296,1298],{"id":1297},"open-source-vs-paid-the-boiledplate-tiers","Open Source vs. Paid: The BoiledPlate Tiers",[11,1300,1301],{},"There are two tiers.",[172,1303,1304,1314],{},[66,1305,1306,1309,1310,163],{},[69,1307,1308],{},"Lite"," is free and MIT-licensed: Supabase auth, Stripe billing, transactional email, a blog, and i18n on Nuxt 4. You clone it and wire it up by hand. Full details in ",[23,1311,1313],{"href":292,"rel":1312},[27],"the free Nuxt + Supabase SaaS boilerplate post",[66,1315,1316,1318],{},[69,1317,729],{}," is €159 one-time, with lifetime updates and instant delivery via GitHub. It's the same app plus the AI tooling that makes setup run itself.",[11,1320,1321],{},"\"Instant GitHub delivery\" means a webhook adds you to the repository on purchase. And €159 once, versus recurring SaaS tooling costs, is easy math for a solo builder.",[15,1323,1325],{"id":1324},"real-world-bugs-and-lessons-learned","Real-World Bugs and Lessons Learned",[11,1327,1328,1329,1333,1334,1337,1338,1344],{},"Shipping fast means debugging faster, and BoiledPlate's blog is a running log of the bugs it took to make the plumbing trustworthy. A JSON-LD block returned ",[23,1330,1332],{"href":224,"rel":1331},[27],"200 from curl and 500 in Chrome"," because of SSR source order. The blog once ",[23,1335,643],{"href":218,"rel":1336},[27],". And a peer-dependency conflict from ",[23,1339,1341,1343],{"href":265,"rel":1340},[27],[205,1342,666],{}," broke Nuxt typecheck",". These aren't hypotheticals — they're the edge cases a boilerplate should have already absorbed.",[15,1346,1348],{"id":1347},"language-and-localization-from-day-one","Language and Localization from Day One",[11,1350,1351,1352,1354],{},"BoiledPlate ships four languages prebuilt. i18n done late fractures your codebase; strings scattered everywhere, routes duplicated, canonicals misfiring. Done early — with proper ",[205,1353,649],{}," canonicals per locale — it's an SEO asset instead of a liability. Nuxt's i18n is the tax on doing this right, and it's paid up front here.",[15,1356,1358],{"id":1357},"the-blog-thats-actually-ready-to-write","The Blog That's Actually Ready to Write",[11,1360,1361,1362,1364,1365,1368],{},"Content is organic reach, and blogging shouldn't require yet another tool. BoiledPlate's blog is prerendered Markdown with TypeScript frontmatter, wired with JSON-LD and ",[205,1363,649],{}," canonicals out of the box. You write a file; it ships. The ",[23,1366,431],{"href":429,"rel":1367},[27]," itself runs on exactly this.",[15,1370,1372],{"id":1371},"typed-end-to-end","Typed End to End",[11,1374,1375],{},"TypeScript strict mode isn't decoration. Type safety flows across Supabase queries, Stripe webhook payloads, and API routes, which means a mismatched billing field is a compile error, not a 2 a.m. production incident. A starter that enforces correctness is a better developer experience than one that trusts you to remember everything.",[15,1377,1379],{"id":1378},"dashboard-theming-and-white-label","Dashboard Theming and White-Label",[11,1381,1382],{},"Theming shouldn't spawn a CSS-in-JS debate. Pick a preset in the setup interview — Warm Studio, Clean SaaS, Midnight Pro, Sharp Enterprise — or describe your brand and the agent maps it onto the codebase. Every buyer gets real previews of the dashboard they'll ship. Template to product in minutes, without a styling detour.",[15,1384,1386],{"id":1385},"deployment-reality-check","Deployment Reality Check",[11,1388,1389,1390,1392],{},"\"Deploy in minutes\" is honest only if you separate it from \"running locally.\" Real deployment means Supabase migrations applied in the right order, RLS policies live, environment variables mapped correctly, and secrets handled per the ",[205,1391,582],{}," contract. Nuxt's edge runtime keeps cold starts and time-to-first-byte reasonable, but the migration and secrets step is where careless setups break. BoiledPlate's provisioning handles the parts people skip.",[15,1394,1396],{"id":1395},"when-to-choose-boiledplate-over-alternatives","When to Choose BoiledPlate Over Alternatives",[11,1398,1399],{},"Choose it if you're already comfortable in Nuxt and Supabase, if you work with Claude or a similar coding agent, if billing complexity matters more to you than a longer feature list, and if you'd rather pay once for lifetime updates than rent your tooling monthly.",[15,1401,380],{"id":379},[11,1403,1404],{},"Be honest about the trade-offs. If your ecosystem is Next.js-locked, a Next.js boilerplate like ShipFast is the lower-friction choice. If your team is married to Auth0 or Clerk, BoiledPlate's Supabase-first auth is a poor match. And if you're building a headless-first or pure API architecture, a full-stack SaaS starter isn't your shape. No tool wins every fit.",[15,1406,1408],{"id":1407},"getting-started-lite-vs-pro","Getting Started: Lite vs. Pro",[11,1410,1411,1412,1415,1416,1419],{},"With ",[23,1413,1308],{"href":292,"rel":1414},[27]," you clone and wire manually — a good way to learn the seams. With ",[23,1417,729],{"href":25,"rel":1418},[27],", the €159 buys an agent-driven, one-session setup: the interview, the deterministic patches, provisioned services, and instant GitHub delivery. Common first-week mistakes are the usual suspects — trusting the success page over the webhook, or forgetting an RLS policy — and the codebase is built to steer you away from both.",[15,1421,1423],{"id":1422},"the-coding-agent-advantage-nobody-mentions","The Coding Agent Advantage Nobody Mentions",[11,1425,1426,1427,1429,1430,1434],{},"Agents are powerful and forgetful. Without conventions they drift, reinventing your data-access pattern every session. ",[205,1428,582],{}," is the guardrail. The ",[23,1431,1433],{"href":125,"rel":1432},[27],"Stripe subscriptions guide"," shows the kind of decision an interview-driven setup makes for you instead of leaving it to chance. Once the plumbing is contracted and consistent, the agent's real job begins: building your actual features on a foundation that already works.",[11,1436,1437,1438,1443],{},"For a deeper reference on how Stripe expects webhooks to be verified and made idempotent, the ",[23,1439,1442],{"href":1440,"rel":1441},"https:\u002F\u002Fstripe.com\u002Fdocs\u002Fwebhooks",[27],"official Stripe webhooks documentation"," is worth reading alongside this — because whichever boilerplate you pick, that's the part that has to be right.",{"title":440,"searchDepth":441,"depth":441,"links":1445},[1446,1447,1448,1450,1451,1452,1453,1454,1455,1456,1457,1458,1459,1460,1461,1462,1463,1464],{"id":1155,"depth":444,"text":1156},{"id":1172,"depth":444,"text":1173},{"id":1190,"depth":444,"text":1449},"Why Nuxt + Supabase + Stripe Beats Next.js + Alternative Stack",{"id":1213,"depth":444,"text":1214},{"id":1229,"depth":444,"text":1230},{"id":1271,"depth":444,"text":1272},{"id":1285,"depth":444,"text":1286},{"id":1297,"depth":444,"text":1298},{"id":1324,"depth":444,"text":1325},{"id":1347,"depth":444,"text":1348},{"id":1357,"depth":444,"text":1358},{"id":1371,"depth":444,"text":1372},{"id":1378,"depth":444,"text":1379},{"id":1385,"depth":444,"text":1386},{"id":1395,"depth":444,"text":1396},{"id":379,"depth":444,"text":380},{"id":1407,"depth":444,"text":1408},{"id":1422,"depth":444,"text":1423},"2026-09-08","Explore ShipFast source code alternatives. Compare Next.js and Nuxt boilerplates for SaaS—beyond the feature checklist to production-ready plumbing.",{},"\u002Fblog\u002Fshipfast-source-code-analysis",{"title":1147,"description":1466},"blog\u002Fshipfast-source-code-analysis",[472,1141,1143,1142],"K4qljmp3ZHCA3PVMZfWVXde90eBZ0TxzUNzj2pi5JA8",1789087944769]