[{"data":1,"prerenderedAt":1510},["ShallowReactive",2],{"blog-shipfast-vs-boilerplate-comparison":3,"related-shipfast-vs-boilerplate-comparison":442},{"id":4,"title":5,"author":6,"body":7,"category":6,"date":427,"description":428,"draft":429,"extension":430,"image":6,"meta":431,"navigation":432,"path":433,"seo":434,"stem":435,"tags":436,"__hash__":441},"blog\u002Fblog\u002Fshipfast-vs-boilerplate-comparison.md","ShipFast vs BoiledPlate: Next.js Boilerplate Showdown",null,{"type":8,"value":9,"toc":404},"minimark",[10,14,17,22,25,28,32,35,38,42,53,65,69,78,87,91,104,118,122,125,134,138,141,150,154,157,160,164,172,176,297,301,304,307,311,314,318,321,351,354,358,361,365,368,372,378,384,388,397,401],[11,12,13],"p",{},"Search \"shipfast vs\" and you land in a familiar debate: which Next.js boilerplate ships fastest? ShipFast, LaunchFast, TurboStarter, IndieKit — they all sell the same promise of launching in days. BoiledPlate takes a different position entirely. It's not a faster template. It's an AI-native Nuxt + Supabase starter whose setup runs itself: a coding agent interviews you, then provisions Stripe, Supabase, and Google sign-in in one session.",[11,15,16],{},"This comparison is honest about where ShipFast wins and where an agent-driven, Nuxt-based approach pulls ahead.",[18,19,21],"h2",{"id":20},"shipfast-what-it-does-well","ShipFast: What It Does Well",[11,23,24],{},"ShipFast earned its reputation for good reasons. It's a well-polished Next.js boilerplate with Stripe integration out of the box, a large community, and an opinionated stack that kills decision fatigue. If you already live in the React and Next.js world, ShipFast lets you clone a repo and have a landing page, auth, and payments scaffolded quickly.",[11,26,27],{},"Its template ecosystem is genuinely large. For a non-technical founder or a solo dev who wants a proven path, that ecosystem is a real advantage.",[18,29,31],{"id":30},"where-shipfast-falls-short","Where ShipFast Falls Short",[11,33,34],{},"The cracks show once you customize. ShipFast means Next.js lock-in — customizing the framework means fighting its conventions. Services are wired manually; there's no agent-driven setup. Webhook handling doesn't guarantee idempotency, security often lives in your API layer rather than the database, and updates force merge conflicts into code you've already modified.",[11,36,37],{},"Most importantly for 2026: ShipFast has no agent-specific contract. When you point a coding agent at it, the agent has no documented conventions to follow, so its output drifts.",[18,39,41],{"id":40},"boiledplates-core-advantage-agent-native-architecture","BoiledPlate's Core Advantage: Agent-Native Architecture",[11,43,44,45,52],{},"BoiledPlate is built for the way people actually code now — with a coding agent in the loop. As the ",[46,47,51],"a",{"href":48,"rel":49},"https:\u002F\u002Fboiledplate.ai",[50],"nofollow","homepage"," puts it: your coding agent doesn't just write the code, it provisions the services. Stripe products and webhooks, a Supabase database with RLS, Google sign-in — the plumbing nobody enjoys, done in one session.",[11,54,55,56,60,61,64],{},"The agent's first session interviews you: name, languages, theme, billing model. Then it reshapes the entire codebase to your answers with ",[57,58,59],"strong",{},"deterministic patches"," — automated, repeatable changes rather than hand-edits. And it ships with an ",[57,62,63],{},"AGENTS.md"," contract so the agent stays consistent across generations, which is a problem ShipFast never solved because it wasn't designed for agents.",[18,66,68],{"id":67},"the-real-cost-of-saas-setup-plumbing-not-frameworks","The Real Cost of SaaS Setup: Plumbing, Not Frameworks",[11,70,71,72,77],{},"Here's the thing every boilerplate comparison misses. Ask ten founders how to ship fast and you get ten stack arguments — Next vs Nuxt, Postgres vs hosted, Stripe vs Paddle. Pick whatever you know and the debate is over in an afternoon. As we argue in ",[46,73,76],{"href":74,"rel":75},"https:\u002F\u002Fboiledplate.ai\u002Fblog\u002Fhow-to-ship-saas-fast",[50],"the stack is easy, the plumbing is the project",", the framework is not what slows you down.",[11,79,80,81,86],{},"What slows you down is the wiring between services: webhook idempotency, row-level security, refund flows, EU consent, transactional email that sends exactly once. Our breakdown of ",[46,82,85],{"href":83,"rel":84},"https:\u002F\u002Fboiledplate.ai\u002Fblog\u002Fnuxt-supabase-stripe-saas-boilerplate",[50],"what it actually takes to wire up a Nuxt, Supabase and Stripe SaaS"," walks through each service's hidden demands. This is the phase BoiledPlate automates — and the phase ShipFast leaves to you or to a paid done-for-you service.",[18,88,90],{"id":89},"billing-architecture-why-it-matters","Billing Architecture: Why It Matters",[11,92,93,94,99,100,103],{},"Billing is where corner-cutting hurts most. Stripe ",[46,95,98],{"href":96,"rel":97},"https:\u002F\u002Fboiledplate.ai\u002Fblog\u002Fstripe-webhooks-source-of-truth",[50],"webhooks must be the source of truth",", not the client-side success page — because users close tabs, networks drop, and Stripe retries. An ",[57,101,102],{},"idempotent webhook"," handles those retries without double-charging or losing a refund.",[11,105,106,107,112,113,117],{},"BoiledPlate ships a production-ready implementation: signature-verified, idempotent webhooks with real state management. It even handles EU-specific requirements like encoding a ",[46,108,111],{"href":109,"rel":110},"https:\u002F\u002Fboiledplate.ai\u002Fblog\u002Fstripe-checkout-consent-collection-german-withdrawal-waiver",[50],"German withdrawal waiver into the pay button"," via Stripe's ",[114,115,116],"code",{},"consent_collection",". These are the details that don't appear in a \"launch in days\" demo but absolutely appear in a chargeback dispute.",[18,119,121],{"id":120},"database-security-supabase-rls-vs-traditional-auth","Database Security: Supabase RLS vs Traditional Auth",[11,123,124],{},"Next.js boilerplates like ShipFast typically enforce permissions in the API layer — middleware checks before a query runs. Miss one route, and you've leaked data.",[11,126,127,128,133],{},"Supabase ",[46,129,132],{"href":130,"rel":131},"https:\u002F\u002Fsupabase.com\u002Fdocs\u002Fguides\u002Fdatabase\u002Fpostgres\u002Frow-level-security",[50],"row-level security"," enforces permissions at query time, in the database itself. Even if application code has a bug, the database refuses to return rows the user shouldn't see. That's a smaller attack surface and it scales better than scattering middleware checks across every endpoint. BoiledPlate ships RLS policies baked into its deterministic patches, so security isn't an afterthought you bolt on later.",[18,135,137],{"id":136},"ai-agent-consistency-why-agentsmd-exists","AI Agent Consistency: Why AGENTS.md Exists",[11,139,140],{},"Point two agents at the same vague task and you get two different implementations — different data-access patterns, different secret handling, different conventions. That drift is the enemy of a maintainable codebase.",[11,142,143,144,149],{},"AGENTS.md fixes this by documenting one documented way to access data and handle secrets. We cover the philosophy in ",[46,145,148],{"href":146,"rel":147},"https:\u002F\u002Fboiledplate.ai\u002Fblog\u002Fconventions-for-ai-coding-agents",[50],"write your conventions for the agent, not the next hire",": conventions used to be for onboarding humans; now they keep agents from reinventing your architecture every session. ShipFast has no such contract. BoiledPlate ships AGENTS.md from day one, which is what makes repeatable agent interviews and safe patches possible.",[18,151,153],{"id":152},"customization-philosophy-merges-vs-patches","Customization Philosophy: Merges vs Patches",[11,155,156],{},"Update a ShipFast project you've heavily modified, and you're in merge-conflict territory. Every upstream change collides with your changes.",[11,158,159],{},"BoiledPlate uses semantic, agent-readable release notes and deterministic patches. You opt into updates. You can skip a breaking change or cherry-pick a single feature, and the agent applies the patch consistently — no human line-by-line merging. This is the difference between owning a starter kit and being trapped by it.",[18,161,163],{"id":162},"the-anti-plumbing-stack-nuxt-supabase-stripe","The Anti-Plumbing Stack: Nuxt + Supabase + Stripe",[11,165,166,167,171],{},"Each tool pulls its weight. Nuxt is lightweight and composable and plays well with edge functions. Supabase folds RLS, real-time, and auth into one service, so you integrate fewer things. Stripe's explicit webhook requirements ",[168,169,170],"em",{},"force"," good architecture early — you can't fake billing state and hope. This trio demands you get billing right, and BoiledPlate enforces it rather than papering over it.",[18,173,175],{"id":174},"comparison-table-boiledplate-vs-shipfast","Comparison Table: BoiledPlate vs ShipFast",[177,178,179,194],"table",{},[180,181,182],"thead",{},[183,184,185,188,191],"tr",{},[186,187],"th",{},[186,189,190],{},"BoiledPlate",[186,192,193],{},"ShipFast",[195,196,197,209,220,231,242,253,264,275,286],"tbody",{},[183,198,199,203,206],{},[200,201,202],"td",{},"Framework \u002F language",[200,204,205],{},"Nuxt 4, TypeScript strict",[200,207,208],{},"Next.js",[183,210,211,214,217],{},[200,212,213],{},"Billing \u002F webhooks",[200,215,216],{},"Idempotent, signature-verified, source-of-truth",[200,218,219],{},"Stripe wired, no idempotency guarantee",[183,221,222,225,228],{},[200,223,224],{},"DB security",[200,226,227],{},"Supabase RLS at query time",[200,229,230],{},"API-layer auth",[183,232,233,236,239],{},[200,234,235],{},"Updates",[200,237,238],{},"Deterministic patches, opt-in",[200,240,241],{},"Manual merges",[183,243,244,247,250],{},[200,245,246],{},"Agent-native",[200,248,249],{},"AGENTS.md contract, agent setup",[200,251,252],{},"None",[183,254,255,258,261],{},[200,256,257],{},"Pricing \u002F delivery",[200,259,260],{},"€159 one-time, GitHub delivery",[200,262,263],{},"Paid, clone repo",[183,265,266,269,272],{},[200,267,268],{},"i18n",[200,270,271],{},"Four languages day one",[200,273,274],{},"Add yourself",[183,276,277,280,283],{},[200,278,279],{},"SEO",[200,281,282],{},"JSON-LD, og:url canonicals",[200,284,285],{},"Basic",[183,287,288,291,294],{},[200,289,290],{},"Blog",[200,292,293],{},"Prerendered Markdown, ready",[200,295,296],{},"Varies",[18,298,300],{"id":299},"common-objections-why-not-just-use-shipfast","Common Objections: \"Why Not Just Use ShipFast?\"",[11,302,303],{},"Fair question. ShipFast is faster for a non-technical founder with no coding agent in their workflow. Its template library is larger. BoiledPlate assumes comfort with Nuxt, Supabase, and agent-driven workflows — that's a real prerequisite.",[11,305,306],{},"The choice is honest: pick ShipFast if you want done-for-you UX and a big Next.js ecosystem. Pick BoiledPlate if you want deterministic, updatable plumbing you can regenerate across projects.",[18,308,310],{"id":309},"other-alternatives-worth-naming","Other Alternatives Worth Naming",[11,312,313],{},"LaunchFast is another Next.js boilerplate — same framework lock-in as ShipFast. TurboStarter is production-ready but has no agent-driven setup. CodeConductor plays a different game entirely (prompt-based workflow automation, not a plumbed starter). IndieKit is polished but light on B2B and complex billing. None of them are agent-native in BoiledPlate's sense: interview, provision, patch, repeat.",[18,315,317],{"id":316},"real-world-debugging-lessons-from-production","Real-World Debugging: Lessons from Production",[11,319,320],{},"BoiledPlate exists because we shipped this stack and kept a running log of every edge case. This site runs on it. Some of the bugs we solved so you don't have to:",[322,323,324,334,342],"ul",{},[325,326,327,328,333],"li",{},"A ",[46,329,332],{"href":330,"rel":331},"https:\u002F\u002Fboiledplate.ai\u002Fblog\u002Fthe-page-that-returned-200-on-the-server-and-500-in-the-browser-a-json-ld-tempor",[50],"JSON-LD hydration crash"," that returned 200 from curl and 500 in Chrome, caused by source order.",[325,335,327,336,341],{},[46,337,340],{"href":338,"rel":339},"https:\u002F\u002Fboiledplate.ai\u002Fblog\u002Four-blog-canonically-pointed-at-localhost",[50],"canonical URL pointing at localhost:3000",", quietly telling Google the wrong thing.",[325,343,344,345,350],{},"Webhook signature verification that prevents replay attacks — plus the subtle case of a ",[46,346,349],{"href":347,"rel":348},"https:\u002F\u002Fboiledplate.ai\u002Fblog\u002Fthe-github-invite-is-the-product-building-a-stripe-webhook-where-delivery-throws",[50],"GitHub-invite webhook where some failures must throw and some never should",".",[11,352,353],{},"These ship pre-solved.",[18,355,357],{"id":356},"the-hidden-cost-of-speed","The Hidden Cost of Speed",[11,359,360],{},"\"Launch in days\" often means debt in billing, security, and updates. Proper webhook handling and RLS take time upfront but pay off when real money moves. Agent-driven setup also forces you to document conventions, which prevents the \"custom boilerplate nobody understands\" trap. BoiledPlate amortizes that plumbing cost once, upfront.",[18,362,364],{"id":363},"delivery-model-github-invites-as-the-product","Delivery Model: GitHub Invites as the Product",[11,366,367],{},"ShipFast: clone the repo, wire it, or pay for setup. BoiledPlate Pro: the agent interviews you, provisions services, and delivers to your GitHub in one session — instant delivery via webhooks, no manual handoff. Lifetime updates included, and you choose which patches to accept.",[18,369,371],{"id":370},"when-to-choose-which","When to Choose Which",[11,373,374,377],{},[57,375,376],{},"Choose BoiledPlate"," if you're comfortable with Nuxt and Supabase, you work with Claude or a similar agent, you want billing and RLS done right from day one, and you're shipping multiple products where agents reuse AGENTS.md patterns.",[11,379,380,383],{},[57,381,382],{},"ShipFast still wins"," if you need Next.js specifically for ecosystem or hiring, you're non-technical, your product only needs simple one-time payments, you want the larger community, or you won't iterate on plumbing after launch.",[18,385,387],{"id":386},"getting-started-lite-vs-pro","Getting Started: Lite vs Pro",[11,389,390,391,396],{},"You can try the approach for free. ",[46,392,395],{"href":393,"rel":394},"https:\u002F\u002Fboiledplate.ai\u002Fblog\u002Ffree-nuxt-supabase-saas-boilerplate",[50],"BoiledPlate Lite"," is MIT-licensed — the same Nuxt 4, Supabase, Stripe, and Resend app, minus the AI tooling, that you clone and wire by hand. Pro is €159 one-time: the agent interviews you, delivers instantly, and includes lifetime updates. No subscription trap; pay once, own the code. If you're shipping more than one SaaS, the ROI compounds.",[18,398,400],{"id":399},"the-future-of-saas-setup-agents-not-frameworks","The Future of SaaS Setup: Agents, Not Frameworks",[11,402,403],{},"The \"shipfast vs\" debate is really a framework debate, and the framework was never the hard part. Agent-driven interviews, deterministic patches, and AGENTS.md-style contracts are becoming the standard way to customize a starter safely and repeatedly. BoiledPlate is built for that future rather than fighting it — which is the real reason to look past the Next.js template shelf.",{"title":405,"searchDepth":406,"depth":406,"links":407},"",3,[408,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426],{"id":20,"depth":409,"text":21},2,{"id":30,"depth":409,"text":31},{"id":40,"depth":409,"text":41},{"id":67,"depth":409,"text":68},{"id":89,"depth":409,"text":90},{"id":120,"depth":409,"text":121},{"id":136,"depth":409,"text":137},{"id":152,"depth":409,"text":153},{"id":162,"depth":409,"text":163},{"id":174,"depth":409,"text":175},{"id":299,"depth":409,"text":300},{"id":309,"depth":409,"text":310},{"id":316,"depth":409,"text":317},{"id":356,"depth":409,"text":357},{"id":363,"depth":409,"text":364},{"id":370,"depth":409,"text":371},{"id":386,"depth":409,"text":387},{"id":399,"depth":409,"text":400},"2026-09-13","Compare ShipFast and BoiledPlate boilerplates. Explore strengths, weaknesses, and which starter fits your indie hacking needs.",false,"md",{},true,"\u002Fblog\u002Fshipfast-vs-boilerplate-comparison",{"title":5,"description":428},"blog\u002Fshipfast-vs-boilerplate-comparison",[437,438,439,440],"boilerplate","nextjs","shipfast","indie-hacking","5EhTPEW-oQ1r4PJB_o14us70Q_4JQXatZUHZhu2cge0",[443,756,1195],{"id":444,"title":445,"author":6,"body":446,"category":6,"date":746,"description":747,"draft":429,"extension":430,"image":6,"meta":748,"navigation":432,"path":749,"seo":750,"stem":751,"tags":752,"__hash__":755},"blog\u002Fblog\u002Fshipfast-twitter-hype-reality.md","ShipFast Twitter Hype vs Reality: What the Template Actually Solves",{"type":8,"value":447,"toc":717},[448,451,455,458,463,466,470,473,477,484,488,495,499,508,512,515,519,525,529,537,541,544,548,551,555,563,567,575,579,588,592,595,597,600,604,612,616,629,633,641,645,656,662,666,669,673,687,690,694,697],[11,449,450],{},"Search \"shipfast twitter\" and you land in a familiar place: Marc Lou's timeline, screenshots of revenue, and a stream of indie builders debating whether a Next.js template is worth the money. The conversation is almost always about the same thing — which starter, which framework, which stack. That's the wrong debate. Stack choice is the easy part. The thing that actually eats your launch is the wiring between services, and no amount of Twitter hype changes that.",[18,452,454],{"id":453},"the-shipfast-phenomenon","The ShipFast Phenomenon",[11,456,457],{},"ShipFast is Marc Lou's Next.js boilerplate, and its story is genuinely impressive: a solo maker turned a single template into a seven-figure business, largely on the back of a 100k+ follower audience on X. It resonates because it sells a feeling every builder recognizes — \"launch in days, not weeks\" — and because Marc shipped it in public, proving the market with receipts instead of promises.",[459,460,462],"h3",{"id":461},"what-shipfast-does-right","What ShipFast Does Right",[11,464,465],{},"Credit where it's due. ShipFast validated that developers will pay for setup they could theoretically do themselves. It bundles a proven stack, a clean landing page, auth, and a payment integration into one clone-and-go package. For a Next.js builder who wants a head start, it removes real friction.",[459,467,469],{"id":468},"what-shipfast-doesnt-solve","What ShipFast Doesn't Solve",[11,471,472],{},"Here's the honest limitation, and it's the same limitation every template shares. ShipFast hands you code. It does not provision your services, keep an AI agent consistent across sessions, or ship production-grade billing that survives webhook retries and refunds. The parts arrive in a box. Bolting them together — the part that actually consumes your weekends — is still your job.",[18,474,476],{"id":475},"the-hidden-cost-of-saas-plumbing","The Hidden Cost of SaaS Plumbing",[11,478,479,480,350],{},"Ask ten founders how to ship fast and you get ten stack arguments. Pick whatever you already know and the debate is over in an afternoon. ",[46,481,483],{"href":74,"rel":482},[50],"The framework is not what slows you down",[459,485,487],{"id":486},"stack-choice-takes-hours-wiring-takes-weeks","Stack Choice Takes Hours; Wiring Takes Weeks",[11,489,490,491,494],{},"The real time sink isn't Next vs Nuxt. It's webhook idempotency, row-level security policies, refund flows, and EU consent law. As we documented in ",[46,492,85],{"href":83,"rel":493},[50],", auth is the fast part and RLS is the part you forget until a user sees someone else's data.",[459,496,498],{"id":497},"why-templates-stop-short","Why Templates Stop Short",[11,500,501,502,507],{},"Every SaaS starter hands you the same box of parts: auth, a database client, a Stripe integration, a pile of Tailwind. Then it ",[46,503,506],{"href":504,"rel":505},"https:\u002F\u002Fboiledplate.ai\u002Fblog\u002Fnuxt-saas-boilerplate-for-ai-agents",[50],"leaves you alone in a room with the box and a README",". None of the wiring is clever. It's hard in the sense of being endless and slightly different every time.",[18,509,511],{"id":510},"boiledplate-automation-beyond-the-template","BoiledPlate: Automation Beyond the Template",[11,513,514],{},"BoiledPlate is a different layer of the stack. It's an AI-native Nuxt + Supabase starter whose setup runs itself. Your coding agent doesn't just write code — it interviews you, then provisions Stripe products and webhooks, a Supabase database with RLS, and Google sign-in in a single session.",[459,516,518],{"id":517},"agent-driven-setup-the-interview-model","Agent-Driven Setup: The Interview Model",[11,520,521,522,524],{},"The agent's first session asks the questions a template can't: name, languages, theme, billing model. Then it reshapes the entire codebase to your answers using ",[57,523,59],{}," — repeatable, trackable changes rather than manual copy-paste. You describe your dashboard theme in plain language and the agent maps it onto real code.",[459,526,528],{"id":527},"agentsmd-the-consistency-contract","AGENTS.md: The Consistency Contract",[11,530,531,532,536],{},"Coding agents drift when conventions aren't written down. BoiledPlate ships an AGENTS.md contract: one documented way to do data access, secrets, and API calls, so ",[46,533,535],{"href":146,"rel":534},[50],"your agent's output stays predictable across sessions",". Write your conventions for the agent, not just the next hire.",[18,538,540],{"id":539},"billing-that-actually-works","Billing That Actually Works",[11,542,543],{},"This is where \"ship in days\" quietly breaks. Billing is complex because money is complex, and the complexity doesn't disappear because your template skipped it.",[459,545,547],{"id":546},"idempotent-webhooks-the-non-negotiable-foundation","Idempotent Webhooks: The Non-Negotiable Foundation",[11,549,550],{},"Stripe retries webhooks. If your handler isn't idempotent, a retry becomes a double-charge or a duplicated entitlement. Most naive implementations process the same event twice without noticing. BoiledPlate's billing is built on signature-verified, idempotent webhooks — the boring foundation that stops silent failures.",[459,552,554],{"id":553},"the-source-of-truth-isnt-your-ui","The Source of Truth Isn't Your UI",[11,556,557,558,562],{},"A checkout success page means the browser reached a URL. It does not mean payment settled. ",[46,559,561],{"href":96,"rel":560},[50],"Your success page should not touch your billing state",". Stripe webhooks are the source of truth; the UI is a courtesy. Skip this and you'll grant access to abandoned payments and deny it to successful ones.",[459,564,566],{"id":565},"the-consent-problem-german-withdrawal-waivers-and-gdpr","The Consent Problem: German Withdrawal Waivers and GDPR",[11,568,569,570,574],{},"EU law isn't optional, and it's exactly the kind of edge case templates punt on. Selling digital goods to German customers requires encoding a withdrawal waiver into the pay button itself. We wrote up ",[46,571,573],{"href":109,"rel":572},[50],"how to do this with Stripe Checkout's consent_collection"," — the sort of detail that fails audits when ignored.",[18,576,578],{"id":577},"multi-plan-subscriptions-and-real-complexity","Multi-Plan Subscriptions and Real Complexity",[11,580,581,582,587],{},"Simple templates break under feature-gated billing. Multi-plan Stripe subscriptions demand that you sync product data with your database without race conditions, handle mid-cycle downgrades, and verify that Stripe isn't lying via signature verification. ",[46,583,586],{"href":584,"rel":585},"https:\u002F\u002Fboiledplate.ai\u002Fblog\u002Fstripe-subscriptions-nuxt-supabase",[50],"The five decisions behind Stripe subscriptions"," — plans, entitlements, state, webhooks, and consent — are the ones that decide whether your billing survives contact with real customers.",[18,589,591],{"id":590},"auth-done-right-rls-and-row-level-security","Auth Done Right: RLS and Row-Level Security",[11,593,594],{},"Supabase policies aren't decorative. Client-side auth checks protect nothing; a determined user bypasses your UI and hits your database directly. Row-level security enforces isolation at query time, so a forgotten check in one component doesn't leak another tenant's data. Application-layer auth survives demos. RLS survives production.",[18,596,163],{"id":162},[11,598,599],{},"These three tools demand each other, and each is genuinely good at its job. Nuxt gives you server-side rendering that doesn't fight you: auto-imports, Nitro, built-in composables. Supabase gives you Postgres without the DevOps — RLS, real-time, and auth in one place. Stripe's complexity isn't bloat; it's the price of handling refunds, disputes, and tax correctly. And Google sign-in — OAuth flows, token validation, user mapping — is the integration nobody wants to wire by hand, which is exactly why automating it saves hours.",[18,601,603],{"id":602},"transactional-email-resend-and-the-idempotency-problem","Transactional Email: Resend and the Idempotency Problem",[11,605,606,607,611],{},"Email is simple to send and ",[46,608,610],{"href":83,"rel":609},[50],"annoying to send exactly once",". The order of operations matters: Stripe fires, your webhook processes, then email goes out. Get it backwards and a retried webhook sends three confirmation emails. Do it inside the idempotent handler and each customer gets one — in the right language, since BoiledPlate ships i18n across four languages from day one.",[18,613,615],{"id":614},"seo-and-real-debugging-stories","SEO and Real Debugging Stories",[11,617,618,619,623,624,628],{},"BoiledPlate ships JSON-LD, canonical URLs, and og:url meta tags so your blog actually gets indexed. We learned these the hard way. One JSON-LD source-order bug ",[46,620,622],{"href":330,"rel":621},[50],"returned 200 from curl and 500 in the browser",". Another time our ",[46,625,627],{"href":338,"rel":626},[50],"blog told Google its canonical URL was localhost:3000",". Blogs run on prerendered Markdown — static, fast, no headless CMS required.",[18,630,632],{"id":631},"deployment-the-github-invite-as-your-product","Deployment: The GitHub Invite as Your Product",[11,634,635,636,640],{},"Product delivery is a technical problem. Sending code via email or Slack is a support nightmare. BoiledPlate treats ",[46,637,639],{"href":347,"rel":638},[50],"the GitHub invite itself as the product",", delivered instantly via a Stripe webhook where some failures must throw and some must never — the kind of nuance that separates working delivery from silent data loss.",[18,642,644],{"id":643},"lite-vs-pro-free-or-lifetime-updates","Lite vs. Pro: Free or Lifetime Updates",[11,646,647,648,650,651,655],{},"There are two paths. ",[57,649,395],{}," is ",[46,652,654],{"href":393,"rel":653},[50],"free and MIT-licensed",": clone it, wire the services manually, own everything. It's the right call when you want to understand every line and have the time.",[11,657,658,661],{},[57,659,660],{},"BoiledPlate Pro"," is €159 one-time with lifetime updates and instant GitHub delivery. The value isn't just the initial setup — it's staying current. Stripe API versions change, Supabase schemas migrate, security patches land. Semantic, agent-readable release notes let you opt into updates without merge hell, even on customized code. Version drift is what quietly kills a SaaS long after launch.",[18,663,665],{"id":664},"real-world-failure-modes","Real-World Failure Modes",[11,667,668],{},"Shipping \"days not weeks\" doesn't prevent the disasters that show up in production: peer dependency conflicts and lock-file entropy, webhook handlers that crash mid-payment and lose data silently, the partial refund flow nobody shipped with, and schema migrations that break production at 2 a.m. These are the reasons ShipFast reviews on X and Reddit mention bugs and security concerns — not because Marc did anything uniquely wrong, but because plumbing is genuinely hard and templates leave it to you.",[18,670,672],{"id":671},"choosing-your-path","Choosing Your Path",[11,674,675,678,679,682,683,686],{},[57,676,677],{},"Clone and wire manually"," when you have strong stack opinions and time to spend. ",[57,680,681],{},"Use a standard template"," like ShipFast when you like the stack and are happy wiring services yourself. ",[57,684,685],{},"Choose automation"," when billing is critical to your business, you work with coding agents, and you value staying current without rewriting.",[11,688,689],{},"The distinction is honest: this isn't ShipFast versus BoiledPlate as competitors. Marc Lou proved the market. BoiledPlate automates the layer he punts — service provisioning, agent consistency, and billing that survives reality.",[18,691,693],{"id":692},"the-bottom-line","The Bottom Line",[11,695,696],{},"The Twitter conversation about ShipFast is really a conversation about wanting to ship faster. That instinct is correct. But the bottleneck was never the framework. It's the plumbing — webhook idempotency, RLS, refunds, consent, delivery — that no template automates and every successful SaaS eventually rebuilds. If your product succeeds, the first refactor is always the plumbing. Starting on a foundation that already solves it is the actual shortcut.",[11,698,699,700,704,705,710,711,716],{},"You can ",[46,701,703],{"href":48,"rel":702},[50],"start with BoiledPlate"," or read the ",[46,706,709],{"href":707,"rel":708},"https:\u002F\u002Fboiledplate.ai\u002Fblog",[50],"full blog"," on how each piece of the stack really fits together. For the deeper industry context on why webhook reliability matters, Stripe's own ",[46,712,715],{"href":713,"rel":714},"https:\u002F\u002Fdocs.stripe.com\u002Fwebhooks",[50],"webhook best practices"," documentation is worth the read — it explains, in Stripe's words, exactly why idempotency and signature verification aren't optional.",{"title":405,"searchDepth":406,"depth":406,"links":718},[719,723,727,731,736,737,738,739,740,741,742,743,744,745],{"id":453,"depth":409,"text":454,"children":720},[721,722],{"id":461,"depth":406,"text":462},{"id":468,"depth":406,"text":469},{"id":475,"depth":409,"text":476,"children":724},[725,726],{"id":486,"depth":406,"text":487},{"id":497,"depth":406,"text":498},{"id":510,"depth":409,"text":511,"children":728},[729,730],{"id":517,"depth":406,"text":518},{"id":527,"depth":406,"text":528},{"id":539,"depth":409,"text":540,"children":732},[733,734,735],{"id":546,"depth":406,"text":547},{"id":553,"depth":406,"text":554},{"id":565,"depth":406,"text":566},{"id":577,"depth":409,"text":578},{"id":590,"depth":409,"text":591},{"id":162,"depth":409,"text":163},{"id":602,"depth":409,"text":603},{"id":614,"depth":409,"text":615},{"id":631,"depth":409,"text":632},{"id":643,"depth":409,"text":644},{"id":664,"depth":409,"text":665},{"id":671,"depth":409,"text":672},{"id":692,"depth":409,"text":693},"2026-09-12","ShipFast Twitter buzz promises fast launches, but Marc Lou's Next.js template has real limitations. Here's what it actually does and doesn't solve.",{},"\u002Fblog\u002Fshipfast-twitter-hype-reality",{"title":445,"description":747},"blog\u002Fshipfast-twitter-hype-reality",[439,753,754,437],"next.js","indie hackers","Ke8c5Jf200Ucs7-Hf2CoelPnFMCo4kuAztgCccoNUEI",{"id":757,"title":758,"author":6,"body":759,"category":6,"date":1184,"description":1185,"draft":429,"extension":430,"image":6,"meta":1186,"navigation":432,"path":1187,"seo":1188,"stem":1189,"tags":1190,"__hash__":1194},"blog\u002Fblog\u002Fshipfast-tutorial.md","ShipFast Tutorial: Build Production-Ready Startups Faster",{"type":8,"value":760,"toc":1164},[761,764,768,776,779,783,786,799,803,806,833,836,840,848,856,860,868,871,879,883,886,889,893,899,902,906,942,946,959,963,966,970,976,982,988,1003,1009,1013,1032,1035,1039,1071,1075,1086,1092,1098,1102,1105,1109,1112,1116,1119,1123,1152],[11,762,763],{},"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.",[18,765,767],{"id":766},"what-is-boiledplate","What is BoiledPlate?",[11,769,770,771,775],{},"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: ",[46,772,774],{"href":48,"rel":773},[50],"Stripe products and webhooks, a Supabase database with RLS, and Google sign-in"," — in a single session.",[11,777,778],{},"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.",[18,780,782],{"id":781},"the-real-problem-boiledplate-solves","The Real Problem BoiledPlate Solves",[11,784,785],{},"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,787,788,789,793,794,798],{},"\"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 ",[46,790,792],{"href":96,"rel":791},[50],"your success page should never be the source of billing truth",". We wrote about this at length in ",[46,795,797],{"href":74,"rel":796},[50],"why the stack is easy and the plumbing is the project"," — it's the thesis the whole product is built on.",[18,800,802],{"id":801},"how-boiledplate-actually-works","How BoiledPlate Actually Works",[11,804,805],{},"The flow is concrete, not marketing:",[807,808,809,815,821,827],"ol",{},[325,810,811,814],{},[57,812,813],{},"The agent interviews you."," Name, languages, theme, billing model, user roles, consent requirements.",[325,816,817,820],{},[57,818,819],{},"The agent reads the AGENTS.md contract and applies deterministic patches."," These are repeatable, idempotent code changes — not vibes.",[325,822,823,826],{},[57,824,825],{},"Services auto-provision."," Supabase (cloud or local Docker) with RLS policies, Stripe products and webhooks, Google OAuth.",[325,828,829,832],{},[57,830,831],{},"A webhook proves billing state landed."," The source of truth is the webhook hitting your database, not client-side confetti.",[11,834,835],{},"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.",[18,837,839],{"id":838},"the-anti-plumbing-stack-why-nuxt-supabase-stripe","The Anti-Plumbing Stack: Why Nuxt + Supabase + Stripe",[11,841,842,843,847],{},"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 ",[46,844,846],{"href":130,"rel":845},[50],"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,849,850,851,855],{},"The trap is mixing them carelessly — trusting a checkout redirect for access, or checking auth in middleware and calling it security. ",[46,852,854],{"href":83,"rel":853},[50],"Wiring these four services correctly"," is precisely the multi-week task BoiledPlate collapses.",[18,857,859],{"id":858},"billing-architecture-that-survives-reality","Billing Architecture That Survives Reality",[11,861,862,863,867],{},"Stripe and Supabase have a clean division of labor: Stripe owns payment and subscription lifecycle; your database owns access. The ",[46,864,866],{"href":584,"rel":865},[50],"webhook is where subscriptions actually live",". BoiledPlate ships multi-plan subscriptions with signature-verified, idempotent webhook handlers.",[11,869,870],{},"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,872,873,874,878],{},"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 ",[46,875,877],{"href":109,"rel":876},[50],"Stripe Checkout's consent_collection",". No five-minute tutorial touches this.",[18,880,882],{"id":881},"auth-done-right-rls-without-footguns","Auth Done Right: RLS Without Footguns",[11,884,885],{},"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,887,888],{},"The other footgun is skipping signature verification on webhooks. An unverified endpoint accepts forged events. BoiledPlate verifies signatures before anything touches the database.",[18,890,892],{"id":891},"agent-consistency-the-agentsmd-contract","Agent Consistency: The AGENTS.md Contract",[11,894,895,896,350],{},"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 ",[46,897,148],{"href":146,"rel":898},[50],[11,900,901],{},"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.",[18,903,905],{"id":904},"features-that-ship-out-of-the-box","Features That Ship Out of the Box",[322,907,908,914,920,926,932],{},[325,909,910,913],{},[57,911,912],{},"Transactional email (Resend):"," onboarding, receipts, and cancellations wired, not left as an exercise.",[325,915,916,919],{},[57,917,918],{},"i18n from day one:"," four languages preloaded; the agent respects translation keys in every patch.",[325,921,922,925],{},[57,923,924],{},"A blog ready to write:"," prerendered Markdown with SEO — JSON-LD and canonical URLs — built in.",[325,927,928,931],{},[57,929,930],{},"Dashboard theming:"," pick a preset or describe your own; the agent maps it onto the component library. These are real previews every buyer gets.",[325,933,934,937,938,941],{},[57,935,936],{},"TypeScript strict mode:"," no ",[114,939,940],{},"any"," escape hatches, which makes agent-readable types and safer patches.",[18,943,945],{"id":944},"the-seo-foundation-tutorials-usually-miss","The SEO Foundation Tutorials Usually Miss",[11,947,948,949,953,954,958],{},"\"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 ",[46,950,952],{"href":338,"rel":951},[50],"our blog told Google its canonical was localhost:3000",". JSON-LD matters too — and it can bite you. A ",[46,955,957],{"href":330,"rel":956},[50],"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.",[18,960,962],{"id":961},"shipping-without-merge-hell","Shipping Without Merge Hell",[11,964,965],{},"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.",[18,967,969],{"id":968},"setup-walkthrough-zero-to-stripe-webhook-in-one-session","Setup Walkthrough: Zero to Stripe Webhook in One Session",[11,971,972,975],{},[57,973,974],{},"Prerequisites:"," a Stripe account, a Supabase org, and a Google OAuth app.",[11,977,978,981],{},[57,979,980],{},"Run the interview."," The agent asks about plans, roles, languages, theme, and consent. Answer plainly; there's no framework debate to have.",[11,983,984,987],{},[57,985,986],{},"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,989,990,993,994,1002],{},[57,991,992],{},"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 ",[46,995,998,999],{"href":996,"rel":997},"https:\u002F\u002Fboiledplate.ai\u002Fblog\u002Fvercel-web-analytics-nuxt-4-analytics-package-breaks-typecheck",[50],"package can break ",[114,1000,1001],{},"nuxt typecheck"," — we documented the fix.)",[11,1004,1005,1008],{},[57,1006,1007],{},"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.",[18,1010,1012],{"id":1011},"boiledplate-lite-vs-pro","BoiledPlate Lite vs. Pro",[322,1014,1015,1026],{},[325,1016,1017,1020,1021,1025],{},[57,1018,1019],{},"Lite (MIT, free):"," clone the repo and ",[46,1022,1024],{"href":393,"rel":1023},[50],"wire services yourself",". Good for learning the patterns or a custom stack.",[325,1027,1028,1031],{},[57,1029,1030],{},"Pro (€159 one-time, lifetime updates):"," agent-driven setup, instant delivery via GitHub, semantic opt-in updates.",[11,1033,1034],{},"Honest trade-off: Pro is faster; Lite is more flexible if you don't use Nuxt or want to understand every wire yourself.",[18,1036,1038],{"id":1037},"common-pitfalls-boiledplate-prevents","Common Pitfalls BoiledPlate Prevents",[322,1040,1041,1047,1053,1059,1065],{},[325,1042,1043,1046],{},[57,1044,1045],{},"Retry loops that double-charge"," — idempotency keys make repeated events safe.",[325,1048,1049,1052],{},[57,1050,1051],{},"RLS policies that expose other tenants"," — generated policies carry the tenant ID.",[325,1054,1055,1058],{},[57,1056,1057],{},"Canonical URL drift"," — prerendering plus verification, born from real pain.",[325,1060,1061,1064],{},[57,1062,1063],{},"JSON-LD hydration crashes"," — documented Nuxt SSR source-order patterns.",[325,1066,1067,1070],{},[57,1068,1069],{},"Peer dependency hell"," — Stripe, Supabase, and Resend versions pinned and tested together.",[18,1072,1074],{"id":1073},"real-debugging-youll-actually-hit","Real Debugging You'll Actually Hit",[11,1076,1077,1080,1081,1085],{},[168,1078,1079],{},"\"Webhook arrived but didn't update my database.\""," Run the signature-verification checklist; the ",[46,1082,1084],{"href":347,"rel":1083},[50],"GitHub-invite webhook post"," explains which failures should throw and which should never.",[11,1087,1088,1091],{},[168,1089,1090],{},"\"RLS is blocking my own query.\""," Test policies against a non-production role; check that your policy references the right claim.",[11,1093,1094,1097],{},[168,1095,1096],{},"\"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.",[18,1099,1101],{"id":1100},"why-agent-driven-setup-changes-the-game","Why Agent-Driven Setup Changes the Game",[11,1103,1104],{},"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.",[18,1106,1108],{"id":1107},"when-boiledplate-isnt-the-right-fit","When BoiledPlate Isn't the Right Fit",[11,1110,1111],{},"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.",[18,1113,1115],{"id":1114},"the-philosophy","The Philosophy",[11,1117,1118],{},"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.",[18,1120,1122],{"id":1121},"getting-started","Getting Started",[322,1124,1125,1131,1142],{},[325,1126,1127,1130],{},[57,1128,1129],{},"30 minutes:"," skim the conventions and decide if agent-driven setup appeals to you.",[325,1132,1133,1136,1137,1141],{},[57,1134,1135],{},"2 hours:"," ",[46,1138,1140],{"href":393,"rel":1139},[50],"clone Lite",", wire one service by hand, and feel where the weeks go.",[325,1143,1144,1136,1147,1151],{},[57,1145,1146],{},"Ready to ship:",[46,1148,1150],{"href":48,"rel":1149},[50],"get Pro",", run the interview, deploy, and write your first real feature instead of your fortieth webhook handler.",[11,1153,1154,1155,1159,1160,1163],{},"For deeper reading, the ",[46,1156,1158],{"href":707,"rel":1157},[50],"BoiledPlate blog"," documents each edge case with the real bug and the real fix — and Stripe's own ",[46,1161,715],{"href":713,"rel":1162},[50]," are essential even when a starter handles the hard parts for you.",{"title":405,"searchDepth":406,"depth":406,"links":1165},[1166,1167,1168,1169,1170,1171,1172,1173,1174,1175,1176,1177,1178,1179,1180,1181,1182,1183],{"id":766,"depth":409,"text":767},{"id":781,"depth":409,"text":782},{"id":801,"depth":409,"text":802},{"id":838,"depth":409,"text":839},{"id":858,"depth":409,"text":859},{"id":881,"depth":409,"text":882},{"id":891,"depth":409,"text":892},{"id":904,"depth":409,"text":905},{"id":944,"depth":409,"text":945},{"id":961,"depth":409,"text":962},{"id":968,"depth":409,"text":969},{"id":1011,"depth":409,"text":1012},{"id":1037,"depth":409,"text":1038},{"id":1073,"depth":409,"text":1074},{"id":1100,"depth":409,"text":1101},{"id":1107,"depth":409,"text":1108},{"id":1114,"depth":409,"text":1115},{"id":1121,"depth":409,"text":1122},"2026-09-11","Learn how BoiledPlate goes beyond ShipFast templates with AI-native setup, Stripe integration, and production-ready infrastructure for startups.",{},"\u002Fblog\u002Fshipfast-tutorial",{"title":758,"description":1185},"blog\u002Fshipfast-tutorial",[439,1191,1192,1193],"tutorial","startup-boilerplate","stripe-integration","tDZYFFDL49lAdCZJNAP9-tOsrJ4PCoW-berk9aTYAg0",{"id":1196,"title":1197,"author":6,"body":1198,"category":6,"date":1500,"description":1501,"draft":429,"extension":430,"image":6,"meta":1502,"navigation":432,"path":1503,"seo":1504,"stem":1505,"tags":1506,"__hash__":1509},"blog\u002Fblog\u002Fshipfast-template-boilerplate-quality.md","ShipFast Template: Why Boilerplate Quality Beats Framework Choice",{"type":8,"value":1199,"toc":1481},[1200,1207,1211,1214,1221,1225,1232,1235,1239,1244,1254,1257,1261,1268,1276,1284,1288,1291,1302,1306,1309,1312,1316,1319,1327,1331,1338,1341,1345,1357,1364,1368,1371,1384,1388,1395,1399,1402,1405,1409,1412,1416,1428,1432,1444,1447,1451,1459,1463,1469],[11,1201,1202,1203,1206],{},"If you searched for a ",[57,1204,1205],{},"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.",[18,1208,1210],{"id":1209},"why-just-pick-a-framework-misses-the-point","Why \"Just Pick a Framework\" Misses the Point",[11,1212,1213],{},"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,1215,1216,1217,350],{},"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, ",[46,1218,1220],{"href":74,"rel":1219},[50],"the stack is easy — the plumbing is the project",[18,1222,1224],{"id":1223},"the-boilerplate-gap-what-starter-kits-usually-forget","The Boilerplate Gap: What Starter Kits Usually Forget",[11,1226,1227,1228,350],{},"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 ",[46,1229,1231],{"href":504,"rel":1230},[50],"what ate our weekends",[11,1233,1234],{},"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.",[18,1236,1238],{"id":1237},"boiledplate-vs-shipfast-stack-philosophy-and-trade-offs","BoiledPlate vs. ShipFast: Stack, Philosophy, and Trade-offs",[11,1240,1241,1243],{},[57,1242,193],{}," 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,1245,1246,1248,1249,1253],{},[57,1247,190],{}," is a Nuxt + Supabase + Stripe starter with a different center of gravity: it's ",[46,1250,1252],{"href":48,"rel":1251},[50],"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,1255,1256],{},"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.",[18,1258,1260],{"id":1259},"the-webhook-problem-nobody-talks-about","The Webhook Problem Nobody Talks About",[11,1262,1263,1264,1267],{},"Here is the thing every marketing page glosses over: ",[57,1265,1266],{},"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,1269,1270,1271,1275],{},"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 ",[46,1272,1274],{"href":96,"rel":1273},[50],"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,1277,1278,1279,1283],{},"Refunds are where this gets sharp. We wrote a whole post on ",[46,1280,1282],{"href":347,"rel":1281},[50],"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.",[18,1285,1287],{"id":1286},"agent-driven-setup-the-automation-layer-boilerplates-miss","Agent-Driven Setup: The Automation Layer Boilerplates Miss",[11,1289,1290],{},"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,1292,1293,1294,1296,1297,1301],{},"The glue that keeps this consistent is a shipped ",[57,1295,63],{}," 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 ",[46,1298,1300],{"href":146,"rel":1299},[50],"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.\"",[18,1303,1305],{"id":1304},"database-security-that-doesnt-require-a-security-audit","Database Security That Doesn't Require a Security Audit",[11,1307,1308],{},"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,1310,1311],{},"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.",[18,1313,1315],{"id":1314},"billing-edge-cases-the-unglamorous-reality","Billing Edge Cases: The Unglamorous Reality",[11,1317,1318],{},"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,1320,1321,1322,1326],{},"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 ",[46,1323,1325],{"href":109,"rel":1324},[50],"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.",[18,1328,1330],{"id":1329},"transactional-email-that-actually-arrives","Transactional Email That Actually Arrives",[11,1332,1333,1334,1337],{},"Resend paired with Supabase is a clean setup: simple to send, annoying to send ",[168,1335,1336],{},"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,1339,1340],{},"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.",[18,1342,1344],{"id":1343},"seo-and-canonicals-why-these-matter-for-shipped-products","SEO and Canonicals: Why These Matter for Shipped Products",[11,1346,1347,1348,1352,1353,350],{},"SEO-out-of-the-box saves weeks of debugging you didn't budget for. Two real bugs from our own build: a ",[46,1349,1351],{"href":330,"rel":1350},[50],"JSON-LD block that returned 200 from curl and 500 in the browser"," because of source order, and a blog that ",[46,1354,1356],{"href":338,"rel":1355},[50],"told Google its canonical URL was localhost:3000",[11,1358,1359,1360,1363],{},"Canonicals get harder with multi-language routes, ",[114,1361,1362],{},"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.",[18,1365,1367],{"id":1366},"typescript-end-to-end-what-strict-mode-actually-gives-you","TypeScript End-to-End: What \"Strict Mode\" Actually Gives You",[11,1369,1370],{},"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,1372,1373,1374,1383],{},"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 ",[46,1375,1377,1380,1381],{"href":996,"rel":1376},[50],[114,1378,1379],{},"@vercel\u002Fanalytics"," broke ",[114,1382,1001],{},". A boilerplate earns its price partly by having already absorbed those fights.",[18,1385,1387],{"id":1386},"deployment-in-minutes-github-as-product-delivery","Deployment in Minutes: GitHub as Product Delivery",[11,1389,1390,1391,1394],{},"BoiledPlate ships via instant GitHub delivery — the invite ",[168,1392,1393],{},"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.",[18,1396,1398],{"id":1397},"theming-and-customization-without-the-maintenance-tax","Theming and Customization Without the Maintenance Tax",[11,1400,1401],{},"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,1403,1404],{},"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.",[18,1406,1408],{"id":1407},"four-languages-from-day-one-i18n-that-doesnt-feel-bolted-on","Four Languages from Day One: i18n That Doesn't Feel Bolted On",[11,1410,1411],{},"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.",[18,1413,1415],{"id":1414},"the-anti-plumbing-stack-why-these-tools-work-together","The Anti-Plumbing Stack: Why These Tools Work Together",[11,1417,1418,1419,1422,1423,1427],{},"Nuxt's ",[114,1420,1421],{},"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 ",[46,1424,1426],{"href":83,"rel":1425},[50],"what each piece really demands"," if you want the wiring in detail.",[18,1429,1431],{"id":1430},"the-hidden-cost-of-faster-setup","The Hidden Cost of \"Faster Setup\"",[11,1433,1434,1435,1439,1440,1443],{},"Free tier or paid? ",[46,1436,1438],{"href":393,"rel":1437},[50],"BoiledPlate Lite is MIT-licensed"," — clone it and wire manually if you enjoy the plumbing or want to inspect every seam. ",[57,1441,1442],{},"Pro"," is €159 one-time with lifetime updates and instant GitHub delivery.",[11,1445,1446],{},"\"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.",[18,1448,1450],{"id":1449},"metrics-that-matter-after-launch","Metrics That Matter After Launch",[11,1452,1453,1454,1458],{},"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 ",[46,1455,715],{"href":1456,"rel":1457},"https:\u002F\u002Fdocs.stripe.com\u002Fwebhooks\u002Fbest-practices",[50]," are worth bookmarking here.",[18,1460,1462],{"id":1461},"the-decision-framework-is-a-boilerplate-worth-your-time","The Decision Framework: Is a Boilerplate Worth Your Time?",[11,1464,1465,1466,1468],{},"DIY plumbing is faster than a good boilerplate roughly never — and when it ",[168,1467,1393],{},", 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,1470,1471,1472,1475,1476,1480],{},"Refactoring a bad foundation costs more than the upfront investment in a good one. Before you commit to any ",[57,1473,1474],{},"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 ",[46,1477,1479],{"href":707,"rel":1478},[50],"the blog"," — the questions worth asking are the ones we kept a running log of.",{"title":405,"searchDepth":406,"depth":406,"links":1482},[1483,1484,1485,1486,1487,1488,1489,1490,1491,1492,1493,1494,1495,1496,1497,1498,1499],{"id":1209,"depth":409,"text":1210},{"id":1223,"depth":409,"text":1224},{"id":1237,"depth":409,"text":1238},{"id":1259,"depth":409,"text":1260},{"id":1286,"depth":409,"text":1287},{"id":1304,"depth":409,"text":1305},{"id":1314,"depth":409,"text":1315},{"id":1329,"depth":409,"text":1330},{"id":1343,"depth":409,"text":1344},{"id":1366,"depth":409,"text":1367},{"id":1386,"depth":409,"text":1387},{"id":1397,"depth":409,"text":1398},{"id":1407,"depth":409,"text":1408},{"id":1414,"depth":409,"text":1415},{"id":1430,"depth":409,"text":1431},{"id":1449,"depth":409,"text":1450},{"id":1461,"depth":409,"text":1462},"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":1197,"description":1501},"blog\u002Fshipfast-template-boilerplate-quality",[439,437,1507,1508],"saas-development","starter-templates","BzjDbCW8Cnp_xkO7YxbpPG3il5Bl8s0lq5G6DArHov4",1789260713917]