[{"data":1,"prerenderedAt":1487},["ShallowReactive",2],{"blog-marc-lou-shipfast-business-breakdown":3,"related-marc-lou-shipfast-business-breakdown":434},{"id":4,"title":5,"author":6,"body":7,"category":6,"date":418,"description":419,"draft":420,"extension":421,"image":6,"meta":422,"navigation":423,"path":424,"seo":425,"stem":426,"tags":427,"__hash__":433},"blog\u002Fblog\u002Fmarc-lou-shipfast-business-breakdown.md","Marc Lou's ShipFast: From $0 to $90K Monthly",null,{"type":8,"value":9,"toc":397},"minimark",[10,14,19,22,25,33,37,45,56,59,63,66,82,91,95,98,101,113,125,139,143,146,153,157,160,169,173,176,185,189,192,222,231,235,238,267,270,274,281,284,288,295,304,308,315,318,322,325,339,342,346,359,362,366,373,376,380,383],[11,12,13],"p",{},"Marc Lou didn't invent the SaaS boilerplate. He turned it into a business that reportedly clears $90K in a good month. If you want to understand why a folder of Next.js code sells better than most funded startups, you have to look past the code and at the playbook: the launch, the pricing, the portfolio, and the marketing. Here's the full breakdown — and what it teaches anyone building on a different stack.",[15,16,18],"h2",{"id":17},"the-origin-story-from-broke-to-90k-monthly","The Origin Story: From Broke to $90K+ Monthly",[11,20,21],{},"Before ShipFast, Marc Lou was broke. He'd shipped a string of startups that didn't stick, and the desperation shows in how he built ShipFast: fast, cheap, and aimed at solving his own repeated pain.",[11,23,24],{},"He chose Next.js for a boring, correct reason — market demand. Next.js had the largest mindshare among indie hackers, which meant the widest possible buyer pool. He wasn't picking the best framework; he was picking the most sellable one.",[11,26,27,28,32],{},"The proof came at launch. ShipFast reportedly earned about ",[29,30,31],"strong",{},"$6,000 of profit in 48 hours"," — more than he'd made in the entire prior year. That validation shaped everything after: the product wasn't \"a better React app,\" it was \"the thing that gets you to revenue this weekend.\"",[15,34,36],{"id":35},"what-makes-shipfast-different-from-generic-bootstraps","What Makes ShipFast Different From Generic Bootstraps",[11,38,39,40,44],{},"The most common skeptical question — and it's a real Reddit thread — is ",[41,42,43],"em",{},"\"what does ShipFast do differently than any bootstrapper?\""," There are free starters for every stack. Why pay?",[11,46,47,48,55],{},"The answer isn't the parts. It's the wiring. Every starter hands you auth, a database client, a Stripe integration, and a landing page. As we've ",[49,50,54],"a",{"href":51,"rel":52},"https:\u002F\u002Fboiledplate.ai\u002Fblog\u002Fnuxt-saas-boilerplate-for-ai-agents",[53],"nofollow","written before",", the parts were never the problem — bolting them to each other is the part that eats your weekends. ShipFast sells the integrated ecosystem: Stripe, auth, and email that already agree with each other.",[11,57,58],{},"The stack choice is the easy decision. The plumbing is the project.",[15,60,62],{"id":61},"the-real-cost-of-saas-setup-what-shipfast-solves","The Real Cost of SaaS Setup (What ShipFast Solves)",[11,64,65],{},"Ask ten founders how to ship fast and you get ten stack arguments. Meanwhile the actual time sink is invisible until it breaks:",[67,68,69,73,76,79],"ul",{},[70,71,72],"li",{},"The Stripe webhook that has to reconcile with your database",[70,74,75],{},"The row-level security policy you forgot until a user saw someone else's data",[70,77,78],{},"The five files a new locale string has to land in before the build stops complaining",[70,80,81],{},"Subscription state that drifts between Stripe and your own tables",[11,83,84,85,90],{},"None of it is clever work. It's endless, slightly-different-every-time work. That's the ",[49,86,89],{"href":87,"rel":88},"https:\u002F\u002Fboiledplate.ai\u002Fblog\u002Fhow-to-ship-saas-fast",[53],"real cost of shipping SaaS",", and it's exactly the weeks a boilerplate reclaims.",[15,92,94],{"id":93},"webhook-architecture-and-billing-edge-cases","Webhook Architecture and Billing Edge Cases",[11,96,97],{},"The hardest part of any billing system is the webhook, not the checkout button. Checkout is a redirect. The webhook is where money becomes truth.",[11,99,100],{},"Two principles separate a toy integration from a trustworthy one:",[11,102,103,106,107,112],{},[29,104,105],{},"Idempotency."," Stripe ",[49,108,111],{"href":109,"rel":110},"https:\u002F\u002Fdocs.stripe.com\u002Fwebhooks",[53],"retries webhooks"," on failure, which means your handler will receive the same event more than once. A non-idempotent handler double-grants access or double-emails. You need to safely absorb repeats.",[11,114,115,118,119,124],{},[29,116,117],{},"Stripe as source of truth."," Your ",[49,120,123],{"href":121,"rel":122},"https:\u002F\u002Fboiledplate.ai\u002Fblog\u002Fstripe-webhooks-source-of-truth",[53],"checkout success page should never touch billing state",". The success page is a client redirect a user can refresh, close, or fake. The webhook is the only event you can trust.",[11,126,127,128,133,134,138],{},"Then there's compliance. Selling to EU customers means encoding things like the ",[49,129,132],{"href":130,"rel":131},"https:\u002F\u002Fboiledplate.ai\u002Fblog\u002Fstripe-checkout-consent-collection-german-withdrawal-waiver",[53],"German withdrawal waiver"," directly into the pay button via Stripe's ",[135,136,137],"code",{},"consent_collection",". Refunds and subscription reconciliation are more of the same: unglamorous, mandatory, easy to get subtly wrong.",[15,140,142],{"id":141},"the-interconnected-portfolio-strategy","The Interconnected Portfolio Strategy",[11,144,145],{},"ShipFast isn't a standalone product. It's the hub of a portfolio. It feeds CodeFast (a coding course), a YouTube channel, and a stream of smaller startups. Each one cross-promotes the others.",[11,147,148,149,152],{},"The genius is that shipping many startups ",[41,150,151],{},"validates the boilerplate itself",". Every new launch is a live demo that the tool works. Revenue diversifies across product sales, courses, content, and affiliates — and the boilerplate sits underneath all of it as proof.",[15,154,156],{"id":155},"ai-agent-consistency-the-agentsmd-solution","AI Agent Consistency: The AGENTS.md Solution",[11,158,159],{},"Here's where the playbook is about to change. When you build with coding agents, agents drift. Ask Claude to add a feature twice and you can get two different data-access patterns, two secret-handling conventions, two shapes of the same thing.",[11,161,162,163,168],{},"The fix is a contract. An ",[49,164,167],{"href":165,"rel":166},"https:\u002F\u002Fboiledplate.ai\u002Fblog\u002Fconventions-for-ai-coding-agents",[53],"AGENTS.md file documents the one way"," to do data access and secrets, so the agent produces consistent output every session. This is why BoiledPlate ships one — the setup interview and every later change route through documented conventions instead of the agent's mood that day. Write your conventions for the agent, not the next hire.",[15,170,172],{"id":171},"product-delivery-mechanics-github-invites-as-the-product","Product Delivery Mechanics: GitHub Invites as the Product",[11,174,175],{},"There's a quiet lesson in how ShipFast delivers: you don't get a download, you get a GitHub repository invite. The purchase triggers automation, not a human.",[11,177,178,179,184],{},"We build the same way, and it's harder than it looks. When ",[49,180,183],{"href":181,"rel":182},"https:\u002F\u002Fboiledplate.ai\u002Fblog\u002Fthe-github-invite-is-the-product-building-a-stripe-webhook-where-delivery-throws",[53],"the GitHub invite IS the product",", your Stripe webhook has to decide which failures throw (retry me) and which must never throw (don't retry, you'll spam invites). Get that logic right and fulfillment scales to thousands of buyers with zero manual work.",[15,186,188],{"id":187},"the-anti-plumbing-stack-why-these-tools-work-together","The Anti-Plumbing Stack: Why These Tools Work Together",[11,190,191],{},"The specific tools matter because each one carries its weight and demands something back:",[67,193,194,200,206,212],{},[70,195,196,199],{},[29,197,198],{},"Nuxt \u002F Next.js"," — the framework everyone already knows, so onboarding friction is near zero.",[70,201,202,205],{},[29,203,204],{},"Supabase"," — auth is the fast part; RLS is the part you forget. Rolling your own auth is a mistake you make once.",[70,207,208,211],{},[29,209,210],{},"Stripe"," — reliable webhook delivery and mature refund handling, if you respect idempotency.",[70,213,214,217,218,221],{},[29,215,216],{},"Resend"," — transactional email without running mail infrastructure. Simple to send, annoying to send ",[41,219,220],{},"exactly once",".",[11,223,224,225,230],{},"We break down ",[49,226,229],{"href":227,"rel":228},"https:\u002F\u002Fboiledplate.ai\u002Fblog\u002Fnuxt-supabase-stripe-saas-boilerplate",[53],"what each piece actually demands"," in detail. The short version: good stack, real wiring cost.",[15,232,234],{"id":233},"technical-debt-and-real-bugs-youll-actually-hit","Technical Debt and Real Bugs You'll Actually Hit",[11,236,237],{},"Shipping to thousands of developers surfaces the same recurring bugs, and they're rarely the ones you plan for:",[67,239,240,246,255,261],{},[70,241,242,245],{},[29,243,244],{},"JSON-LD hydration crashes"," — a page can return 200 from curl and 500 in Chrome purely because of source order in structured data.",[70,247,248,251,252,221],{},[29,249,250],{},"Canonical URL edge cases"," — a misconfigured blog can quietly tell Google its canonical URL is ",[135,253,254],{},"localhost:3000",[70,256,257,260],{},[29,258,259],{},"Peer dependency conflicts"," — the Node ecosystem where one analytics package breaks your typecheck.",[70,262,263,266],{},[29,264,265],{},"Webhook retry failures"," — the hardest to debug because they only fail intermittently, under load, in production.",[11,268,269],{},"A boilerplate's real value is that someone already hit these bugs so you don't have to.",[15,271,273],{"id":272},"the-marketing-advantage-why-marc-lous-approach-works","The Marketing Advantage: Why Marc Lou's Approach Works",[11,275,276,277,280],{},"Marc Lou's biggest edge isn't the code — it's the marketing. He publishes his revenue figures, his failures, and his playbooks openly. Transparency ",[41,278,279],{},"is"," the marketing. His YouTube channel doubles as proof of concept and an SEO moat that competitors can't buy their way past.",[11,282,283],{},"Building in public beat stealth here because the product's promise — \"you can ship fast\" — is best demonstrated by a founder visibly shipping fast, in public, on repeat.",[15,285,287],{"id":286},"pricing-strategy-and-unit-economics","Pricing Strategy and Unit Economics",[11,289,290,291,294],{},"ShipFast is a one-time purchase with lifetime updates, and so is BoiledPlate at ",[29,292,293],{},"€159",". This pricing model works for boilerplates specifically because the buyer's mental math is simple: one payment versus weeks of their own billable time.",[11,296,297,298,303],{},"A free, MIT-licensed tier acts as the top of the funnel. Developers try ",[49,299,302],{"href":300,"rel":301},"https:\u002F\u002Fboiledplate.ai\u002Fblog\u002Ffree-nuxt-supabase-saas-boilerplate",[53],"the free version",", hit the plumbing wall, and upgrade for the automation. Low CAC, high perceived value, no subscription to churn out of.",[15,305,307],{"id":306},"customization-without-merge-hell","Customization Without Merge Hell",[11,309,310,311,314],{},"The dirty secret of boilerplates is what happens ",[41,312,313],{},"after"," you buy. You customize the code, then a new version ships, and merging updates into your fork becomes hell.",[11,316,317],{},"The way out is semantic, agent-readable release notes and opt-in, deterministic patches. Updates apply to customized code without forcing a full re-fork. This is the difference between a boilerplate you use once and a boilerplate you keep.",[15,319,321],{"id":320},"seo-and-technical-foundation-as-differentiator","SEO and Technical Foundation as Differentiator",[11,323,324],{},"The foundation that ships out of the box quietly compounds:",[67,326,327,330,333,336],{},[70,328,329],{},"JSON-LD, canonical URLs, and og:meta tags configured correctly from day one",[70,331,332],{},"TypeScript strict mode for long-term maintainability",[70,334,335],{},"i18n in four languages so localization isn't a rewrite later",[70,337,338],{},"A prerendered Markdown blog for content and SEO",[11,340,341],{},"None of this wins a demo. All of it matters six months in.",[15,343,345],{"id":344},"comparing-boiledplate-to-shipfast-stack-specific-positioning","Comparing BoiledPlate to ShipFast: Stack-Specific Positioning",[11,347,348,349,354,355,358],{},"ShipFast owns the Next.js crowd. ",[49,350,353],{"href":351,"rel":352},"https:\u002F\u002Fboiledplate.ai",[53],"BoiledPlate"," is built for the Nuxt + Supabase + Stripe + Resend stack, with heavier emphasis on webhook idempotency, EU compliance, and — the real differentiator — agent-driven setup where your coding agent interviews you and ",[41,356,357],{},"provisions the services",", not just the code.",[11,360,361],{},"Choose based on your stack and how you work. If you live in Next.js, ShipFast is the default. If you're on Nuxt and building with agents, BoiledPlate is the more natural fit.",[15,363,365],{"id":364},"the-myth-vs-reality-what-boilerplates-actually-solve","The Myth vs. Reality: What Boilerplates Actually Solve",[11,367,368,369,372],{},"A boilerplate does ",[29,370,371],{},"not"," solve product-market fit. You still need an idea people want. It does not make your startup good.",[11,374,375],{},"What it solves is weeks of plumbing — the endless, error-prone integration work between services. Framework choice is easy; service integration is the bottleneck. The shipping-speed advantage is real, and speed is a genuine moat when your competitors are still wiring their webhooks.",[15,377,379],{"id":378},"building-a-sustainable-business-on-top-of-boilerplates","Building a Sustainable Business on Top of Boilerplates",[11,381,382],{},"The durable version of this business isn't one-time sales — it's the ecosystem. Lifetime updates keep the product alive, community and content keep customers around, and each new startup the founder ships re-validates the framework in public.",[11,384,385,386,388,389,392,393,221],{},"As the underlying stack commodifies, the moat shifts from ",[41,387,135],{}," to ",[41,390,391],{},"automation and consistency",". That's the future Marc Lou pointed at, and the one AGENTS.md-driven, webhook-provisioned tools are built for: fewer manual steps, higher switching costs, and delivery that runs itself. Read more on how the ",[49,394,396],{"href":87,"rel":395},[53],"plumbing — not the stack — is the real project",{"title":398,"searchDepth":399,"depth":399,"links":400},"",3,[401,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417],{"id":17,"depth":402,"text":18},2,{"id":35,"depth":402,"text":36},{"id":61,"depth":402,"text":62},{"id":93,"depth":402,"text":94},{"id":141,"depth":402,"text":142},{"id":155,"depth":402,"text":156},{"id":171,"depth":402,"text":172},{"id":187,"depth":402,"text":188},{"id":233,"depth":402,"text":234},{"id":272,"depth":402,"text":273},{"id":286,"depth":402,"text":287},{"id":306,"depth":402,"text":307},{"id":320,"depth":402,"text":321},{"id":344,"depth":402,"text":345},{"id":364,"depth":402,"text":365},{"id":378,"depth":402,"text":379},"2026-08-01","Discover how Marc Lou built ShipFast into a $90K\u002Fmonth SaaS boilerplate business. Full breakdown of the launch strategy, pricing, and marketing playbook.",false,"md",{},true,"\u002Fblog\u002Fmarc-lou-shipfast-business-breakdown",{"title":5,"description":419},"blog\u002Fmarc-lou-shipfast-business-breakdown",[428,429,430,431,432],"saas","shipfast","marc-lou","entrepreneurship","next.js","fzGsPclYe-SEgSFSnBCfMY7tIr5Sh9tjst7GBr9MEpQ",[435,860,1123],{"id":436,"title":437,"author":6,"body":438,"category":6,"date":848,"description":849,"draft":420,"extension":421,"image":6,"meta":850,"navigation":423,"path":851,"seo":852,"stem":853,"tags":854,"__hash__":859},"blog\u002Fblog\u002Fshipfast-github-boiledplate-saas-boilerplate.md","ShipFast GitHub: Why BoiledPlate Beats Generic SaaS Templates",{"type":8,"value":439,"toc":810},[440,443,447,452,455,459,462,466,473,477,481,488,492,500,504,511,515,518,522,526,529,533,541,545,548,552,555,559,563,571,575,578,582,590,594,597,601,605,613,617,626,630,633,637,640,644,647,691,695,710,713,717,726,730,733,745,749,752,755,759,762,765,768,796,800,803],[11,441,442],{},"If you searched \"shipfast github,\" you are probably comparing SaaS boilerplates and trying to figure out which one actually saves you time. Most of them ship you the same box of parts: auth, a database client, a Stripe integration, and a landing page. That box was never the hard part. What follows is why BoiledPlate takes a different approach — and where generic templates quietly hand you weeks of work disguised as \"5 minutes to production.\"",[15,444,446],{"id":445},"why-developers-choose-boiledplate-over-generic-saas-boilerplates","Why Developers Choose BoiledPlate Over Generic SaaS Boilerplates",[448,449,451],"h3",{"id":450},"the-saas-boilerplate-trap","The SaaS boilerplate trap",[11,453,454],{},"Every starter promises production in minutes. That claim is true for the demo and false for your product. The template compiles, the login button works, Stripe test mode charges a card. Then day two arrives and you discover the integration work nobody mentioned.",[448,456,458],{"id":457},"what-every-boilerplate-claims-and-why-it-matters-less-than-you-think","What every boilerplate claims (and why it matters less than you think)",[11,460,461],{},"Authentication, a database, payment processing — every template lists the same features. They sound identical because they are. The difference lives one layer down: in webhook idempotency, in row-level security edge cases, in whether your billing state survives a retried event. That layer is where products succeed or leak data.",[448,463,465],{"id":464},"boiledplates-difference-agent-driven-setup-over-copy-paste","BoiledPlate's difference: agent-driven setup over copy-paste",[11,467,468,469,472],{},"Other templates give you code and a README. ",[49,470,353],{"href":351,"rel":471},[53]," interviews you and provisions services at the same time. Your coding agent asks about your billing model, languages, and theme, then reshapes the codebase with deterministic patches and wires up Stripe products, a Supabase database with RLS, and Google sign-in — in one session.",[15,474,476],{"id":475},"the-real-cost-of-saas-setup-and-why-stack-choice-isnt-the-bottleneck","The Real Cost of SaaS Setup (And Why Stack Choice Isn't the Bottleneck)",[448,478,480],{"id":479},"nuxt-vs-nextjs-debates-waste-time-you-dont-have","Nuxt vs. Next.js debates waste time you don't have",[11,482,483,484,487],{},"Both frameworks are production-ready. Pick whatever you already know and the stack argument is over in an afternoon. As we've ",[49,485,54],{"href":87,"rel":486},[53],", the framework is not what slows you down.",[448,489,491],{"id":490},"where-the-weeks-actually-go","Where the weeks actually go",[11,493,494,495,499],{},"The plumbing is. Stripe webhook idempotency. RLS policies you test and re-test. Email that sends exactly once, not twice. Setup is measured in hours; wiring four services into something trustworthy is measured in weeks. We know because we ",[49,496,498],{"href":227,"rel":497},[53],"logged every edge case"," it took to make ours dependable.",[448,501,503],{"id":502},"why-5-minutes-to-production-fails-on-day-two","Why \"5 minutes to production\" fails on day two",[11,505,506,507,510],{},"Boilerplates ship you working code. They do not ship working ",[41,508,509],{},"integrations under load",". The webhook that agrees with your database, the RLS policy you forgot until a user saw someone else's data — none of it is clever, all of it is endless.",[448,512,514],{"id":513},"boiledplate-solves-this-in-one-interview-session","BoiledPlate solves this in one interview session",[11,516,517],{},"Instead of jumping between the Stripe dashboard, Supabase settings, and Google Cloud console, the agent provisions them. You answer questions; deterministic patches do the wiring.",[15,519,521],{"id":520},"building-for-ai-agents-the-agentsmd-contract","Building for AI Agents: The AGENTS.md Contract",[448,523,525],{"id":524},"why-generic-boilerplates-break-when-agents-touch-them","Why generic boilerplates break when agents touch them",[11,527,528],{},"Point a coding agent at an undocumented template and it drifts. It invents a second way to query data, a new place to read a secret, a pattern that fights the three already there.",[448,530,532],{"id":531},"agentsmd-one-documented-way-to-handle-data-and-secrets","AGENTS.md: one documented way to handle data and secrets",[11,534,535,536,540],{},"BoiledPlate ships an ",[49,537,539],{"href":165,"rel":538},[53],"AGENTS.md contract",": one documented way to access secrets, query data, and apply changes. Conventions written for the agent, not the next hire.",[448,542,544],{"id":543},"deterministic-patches-vs-hallucinated-code","Deterministic patches vs. hallucinated code",[11,546,547],{},"When the rules are explicit, an agent can apply repeatable, idempotent changes to customize your starter. When they aren't, it hallucinates. That's the whole difference.",[448,549,551],{"id":550},"how-boiledplate-stays-coherent-as-your-agent-reshapes-it","How BoiledPlate stays coherent as your agent reshapes it",[11,553,554],{},"Because the conventions are published, a future agent run reads the same rules and doesn't revert yesterday's fix. The codebase stays readable as it grows.",[15,556,558],{"id":557},"webhook-architecture-that-actually-survives-production","Webhook Architecture That Actually Survives Production",[448,560,562],{"id":561},"why-payment-received-pages-are-a-lie","Why \"payment received\" pages are a lie",[11,564,565,566,570],{},"A client-side success page tells the user their card was charged. It does not tell your database. The ",[49,567,569],{"href":121,"rel":568},[53],"Stripe webhook is the source of truth","; your checkout success page should not touch billing state.",[448,572,574],{"id":573},"idempotent-webhook-design","Idempotent webhook design",[11,576,577],{},"Stripe retries. Network blips, timeouts, and delivery failures all mean the same event can arrive twice. Your handler must absorb duplicates without double-charging or double-provisioning. That is idempotency, and it is not optional.",[448,579,581],{"id":580},"boiledplates-signature-verified-idempotent-handler","BoiledPlate's signature-verified, idempotent handler",[11,583,584,585,589],{},"The starter verifies each Stripe signature and deduplicates events before touching your data. We even documented ",[49,586,588],{"href":181,"rel":587},[53],"a webhook where some failures throw and some never do"," — because delivery is the product, and knowing which failures Stripe should retry is the entire design.",[448,591,593],{"id":592},"refund-flows-and-subscription-state-management","Refund flows and subscription state management",[11,595,596],{},"Mid-cycle cancellations, grace periods, refunds, consent laws — this is where copy-paste templates stop. BoiledPlate tracks state through webhooks, not through a button.",[15,598,600],{"id":599},"eu-consent-laws-billing-edge-cases-and-why-your-dashboard-isnt-done","EU Consent Laws, Billing Edge Cases, and Why Your Dashboard Isn't Done",[448,602,604],{"id":603},"german-consumer-protection-and-explicit-consent","German consumer protection and explicit consent",[11,606,607,608,612],{},"Selling a digital product to EU customers means encoding a withdrawal waiver into the pay button. We wrote up exactly how to do that with ",[49,609,611],{"href":130,"rel":610},[53],"Stripe Checkout's consent_collection",". Generic templates ignore it; regulators don't.",[448,614,616],{"id":615},"subscription-state-machines","Subscription state machines",[11,618,619,620,625],{},"Active, paused, cancelled, past due — most boilerplates render a button and call it billing. BoiledPlate tracks the full state machine through webhook events, following the ",[49,621,624],{"href":622,"rel":623},"https:\u002F\u002Fboiledplate.ai\u002Fblog\u002Fstripe-subscriptions-nuxt-supabase",[53],"subscription decisions"," that make multi-plan billing survive reality.",[448,627,629],{"id":628},"multi-plan-subscriptions-without-merge-conflicts","Multi-plan subscriptions without merge conflicts",[11,631,632],{},"Users upgrade mid-cycle, downgrade a tier, switch plans. Every transition stays idempotent.",[448,634,636],{"id":635},"a-billing-dashboard-you-dont-fight","A billing dashboard you don't fight",[11,638,639],{},"Pick a preset theme in the setup interview — Warm Studio, Clean SaaS, Midnight Pro, Sharp Enterprise — or describe your own colors and the agent maps them onto the codebase. No CSS wrestling.",[15,641,643],{"id":642},"technical-debt-you-inherit-from-fast-setup-templates","Technical Debt You Inherit From \"Fast Setup\" Templates",[11,645,646],{},"Fast-setup templates hide integration debt that surfaces after launch:",[67,648,649,661,673,685],{},[70,650,651,654,655,660],{},[29,652,653],{},"JSON-LD hydration crashes."," We hit a page that ",[49,656,659],{"href":657,"rel":658},"https:\u002F\u002Fboiledplate.ai\u002Fblog\u002Fthe-page-that-returned-200-on-the-server-and-500-in-the-browser-a-json-ld-tempor",[53],"returned 200 from the server and 500 in the browser"," because of source order in structured data.",[70,662,663,666,667,672],{},[29,664,665],{},"Canonical URL pitfalls."," Our own blog once ",[49,668,671],{"href":669,"rel":670},"https:\u002F\u002Fboiledplate.ai\u002Fblog\u002Four-blog-canonically-pointed-at-localhost",[53],"told Google its canonical URL was localhost:3000",". Multi-language sites break SEO in exactly these quiet ways.",[70,674,675,678,679,684],{},[29,676,677],{},"Peer dependency conflicts."," Version mismatches between Stripe, Supabase, and Nuxt are real — even ",[49,680,683],{"href":681,"rel":682},"https:\u002F\u002Fboiledplate.ai\u002Fblog\u002Fvercel-web-analytics-nuxt-4-analytics-package-breaks-typecheck",[53],"Vercel's analytics package broke our typecheck",". Semantic release notes are how you survive them.",[70,686,687,690],{},[29,688,689],{},"RLS testing is harder than it looks."," Generic templates ship policies with gaps. BoiledPlate documents the contract.",[15,692,694],{"id":693},"the-anti-plumbing-stack-why-nuxt-supabase-stripe-work-well-together","The Anti-Plumbing Stack: Why Nuxt + Supabase + Stripe Work Well Together",[11,696,697,698,703,704,709],{},"Not every combination demands the same amount of glue. Supabase moves security into the database with ",[49,699,702],{"href":700,"rel":701},"https:\u002F\u002Fsupabase.com\u002Fdocs\u002Fguides\u002Fauth\u002Frow-level-security",[53],"row-level security",", which is cheaper to reason about than filtering rows in application code. Stripe's ",[49,705,708],{"href":706,"rel":707},"https:\u002F\u002Fstripe.com\u002Fdocs\u002Fwebhooks",[53],"event-driven model"," fits webhook architectures naturally — no polling, no cron jobs. Nuxt's Nitro server gives you one deployment target where transactional email and webhook routes live in the same codebase.",[11,711,712],{},"Each still demands something: Supabase demands RLS discipline, Stripe demands webhook handlers, Nuxt demands TypeScript strictness. BoiledPlate ships all three configured, which is where it saves you weeks.",[15,714,716],{"id":715},"content-and-seo-built-in-not-bolted-on","Content and SEO Built In, Not Bolted On",[11,718,719,720,725],{},"Most boilerplates ship an empty blog folder because content is hard and structure is easy. BoiledPlate ships a ",[49,721,724],{"href":722,"rel":723},"https:\u002F\u002Fboiledplate.ai\u002Fblog",[53],"prerendered Markdown blog",": write a post, push to prod, no headless CMS. JSON-LD and og:url canonicals ship with correct hydration — informed by the bugs above — and i18n delivers four languages from day one without duplicate-content penalties.",[15,727,729],{"id":728},"delivery-as-a-product-feature-github-invites-and-instant-updates","Delivery as a Product Feature: GitHub Invites and Instant Updates",[11,731,732],{},"The delivery mechanism matters as much as the code. Email download links rot; a GitHub invite gives instant, permanent repo access via webhook automation. Semantic release notes are written so agents can read them, which means opt-in updates respect your customizations instead of reverting them. There's no merge hell because the changelog documents the strategy.",[11,734,735,736,739,740,744],{},"BoiledPlate Pro is ",[29,737,738],{},"€159 one-time with lifetime updates"," — no subscription, no obsolescence. Or start free with ",[49,741,743],{"href":300,"rel":742},[53],"BoiledPlate Lite",", the MIT-licensed version you clone and wire manually.",[15,746,748],{"id":747},"comparison-boiledplate-shipfast-and-open-source-forks","Comparison: BoiledPlate, ShipFast, and Open-Source Forks",[11,750,751],{},"ShipFast is Marc Lou's NextJS template, and it works — which is why the \"shipfast github\" results are full of forks. But those clones ship unmaintained copies with no update path. Open-source forks give you the freedom of owning the code and the cost of nobody keeping it coherent as dependencies shift.",[11,753,754],{},"BoiledPlate's split is simpler: Lite for a free MIT clone, Pro for managed lifetime updates. And the framework choice is deliberate. NextJS + Vercel Postgres is the obvious path; Nuxt + Supabase is the pragmatic one — less glue, security in the database, one deployment target.",[15,756,758],{"id":757},"typing-getting-started-and-honest-limits","Typing, Getting Started, and Honest Limits",[11,760,761],{},"BoiledPlate is TypeScript strict mode end to end: database types generated from your Supabase schema, typed Stripe webhook payloads that catch mismatches at build time instead of 3 a.m., and type-safe Nitro server routes with no bridge-library overhead.",[11,763,764],{},"Getting started is five steps: answer the agent's questions, watch deterministic patches reshape your codebase, provision services (or let the agent), deploy with one command wherever Nuxt runs, and update safely as improvements ship.",[11,766,767],{},"And the honest constraints, because clarity builds trust:",[67,769,770,777,783,790],{},[70,771,772,773,776],{},"You need to be comfortable with ",[29,774,775],{},"Nuxt and Supabase",". If you're NextJS-only, this isn't a drop-in swap.",[70,778,779,782],{},[29,780,781],{},"Webhooks are mandatory."," That's a feature and a constraint — the design assumes async event handling.",[70,784,785,786,789],{},"Agent-driven setup assumes ",[29,787,788],{},"Claude or a compatible coding agent",". It works in your editor; it isn't a point-and-click UI.",[70,791,792,795],{},[29,793,794],{},"Multi-tenant architecture isn't included."," Teams and workspaces are your responsibility.",[15,797,799],{"id":798},"the-anti-plumbing-philosophy","The Anti-Plumbing Philosophy",[11,801,802],{},"Framework debates distract from the real bottleneck. Nuxt vs. Next, Postgres vs. Mongo — none of it matters if your webhook handler never shipped. Plumbing is invisible until it breaks, and most boilerplates hide that debt rather than solving it. Conventions are force multipliers, especially for agents. Your billing system is your most critical infrastructure, so treat it like it matters.",[11,804,805,806,221],{},"Shipping fast means accepting constraints. Nuxt + Supabase + Stripe isn't for everyone — it's for makers who'd rather build product than plumbing. If that's you, ",[49,807,809],{"href":351,"rel":808},[53],"start here",{"title":398,"searchDepth":399,"depth":399,"links":811},[812,817,823,829,835,841,842,843,844,845,846,847],{"id":445,"depth":402,"text":446,"children":813},[814,815,816],{"id":450,"depth":399,"text":451},{"id":457,"depth":399,"text":458},{"id":464,"depth":399,"text":465},{"id":475,"depth":402,"text":476,"children":818},[819,820,821,822],{"id":479,"depth":399,"text":480},{"id":490,"depth":399,"text":491},{"id":502,"depth":399,"text":503},{"id":513,"depth":399,"text":514},{"id":520,"depth":402,"text":521,"children":824},[825,826,827,828],{"id":524,"depth":399,"text":525},{"id":531,"depth":399,"text":532},{"id":543,"depth":399,"text":544},{"id":550,"depth":399,"text":551},{"id":557,"depth":402,"text":558,"children":830},[831,832,833,834],{"id":561,"depth":399,"text":562},{"id":573,"depth":399,"text":574},{"id":580,"depth":399,"text":581},{"id":592,"depth":399,"text":593},{"id":599,"depth":402,"text":600,"children":836},[837,838,839,840],{"id":603,"depth":399,"text":604},{"id":615,"depth":399,"text":616},{"id":628,"depth":399,"text":629},{"id":635,"depth":399,"text":636},{"id":642,"depth":402,"text":643},{"id":693,"depth":402,"text":694},{"id":715,"depth":402,"text":716},{"id":728,"depth":402,"text":729},{"id":747,"depth":402,"text":748},{"id":757,"depth":402,"text":758},{"id":798,"depth":402,"text":799},"2026-07-31","Compare ShipFast and SaaS boilerplates. Learn why BoiledPlate's agent-driven setup saves weeks over generic templates with copy-paste code.",{},"\u002Fblog\u002Fshipfast-github-boiledplate-saas-boilerplate",{"title":437,"description":849},"blog\u002Fshipfast-github-boiledplate-saas-boilerplate",[855,856,857,858],"saas-boilerplate","shipfast-alternative","web-development","startup-tools","bm3vxAIhwTNbvI9dcffWosr15d728oOwsMbCzziY28I",{"id":861,"title":862,"author":6,"body":863,"category":6,"date":1112,"description":1113,"draft":420,"extension":421,"image":6,"meta":1114,"navigation":423,"path":1115,"seo":1116,"stem":1117,"tags":1118,"__hash__":1122},"blog\u002Fblog\u002Fshipfast-boilerplate-vs-boiledplate-comparison.md","ShipFast Boilerplate vs BoiledPlate: Full Comparison",{"type":8,"value":864,"toc":1097},[865,868,875,879,882,890,894,897,909,912,916,919,927,940,944,950,959,963,966,978,982,985,992,996,1009,1012,1016,1019,1023,1031,1034,1038,1054,1057,1061,1064,1068,1082,1085,1089],[11,866,867],{},"If you've shopped for a SaaS starter kit, you've met ShipFast. It's the reference point in the category: a NextJS boilerplate with auth, payments, a database, and UI components, priced at $199. It does what it says. But the question worth asking before you buy any boilerplate isn't \"does it include a login page?\" — every one of them does. The question is what happens after you clone it, when you're alone in a room with a box of parts and a README.",[11,869,870,871,874],{},"This is an honest comparison between ShipFast and ",[49,872,353],{"href":351,"rel":873},[53],", the AI-native Nuxt + Supabase alternative. Both ship the same stack of features. They diverge on the part that actually eats your launch.",[15,876,878],{"id":877},"why-stack-choice-isnt-your-bottleneck","Why Stack Choice Isn't Your Bottleneck",[11,880,881],{},"Ask ten founders how to ship fast and you get ten stack arguments — Next vs Nuxt, Postgres vs a hosted DB, Stripe vs Paddle. Pick whatever you already know and the debate is over in an afternoon. The framework is not what slows you down.",[11,883,884,885,889],{},"What slows you down is the plumbing between the pieces: the Stripe webhook that has to agree with your database, the row-level security policy you forgot until a user saw someone else's data, the five places a new locale string has to land before the build stops complaining. None of it is clever. It's just endless. We wrote a whole piece on why ",[49,886,888],{"href":87,"rel":887},[53],"the stack is easy and the plumbing is the project",", and it's the single idea that separates these two products.",[15,891,893],{"id":892},"the-setup-story-manual-wiring-vs-agent-interview","The Setup Story: Manual Wiring vs. Agent Interview",[11,895,896],{},"Here's the core difference. ShipFast follows the classic model: clone the repo, read the docs, wire the services yourself. You create your Stripe products, copy the keys, set up your webhook endpoint, configure your database, and connect Google sign-in by hand. The code is good; the assembly is on you.",[11,898,899,900,903,904,908],{},"BoiledPlate's setup runs itself. Your coding agent interviews you — name, languages, theme, billing model — then reshapes the codebase to your answers with ",[29,901,902],{},"deterministic patches"," and provisions the services: Stripe products and webhooks, a Supabase database with RLS, Google sign-in. That's not a marketing flourish. As we argued in ",[49,905,907],{"href":51,"rel":906},[53],"every boilerplate ships the stack — that was never the hard part",", the slow part with coding agents moved somewhere else, and the win is measured in weeks, not hours.",[11,910,911],{},"\"Agent-driven\" doesn't mean magic. It means the repetitive, error-prone wiring is scripted and repeatable, with a human confirming each decision. You still build your product. You just skip the parts nobody enjoys.",[15,913,915],{"id":914},"billing-that-survives-reality","Billing That Survives Reality",[11,917,918],{},"Both products give you Stripe subscriptions. The difference shows up in the edge cases.",[11,920,921,922,926],{},"A client-side success page is a lie. The user's browser can close, refresh, or lose connection between paying and landing back on your site — so ",[49,923,925],{"href":121,"rel":924},[53],"your checkout success page should never touch your billing state",". The Stripe webhook is the source of truth. That means you need signature verification, idempotent processing (Stripe retries; duplicate delivery is normal), and a plan for partially refunded subscriptions.",[11,928,929,930,934,935,939],{},"BoiledPlate ships multi-plan subscriptions with signature-verified, idempotent webhooks out of the box, and we've documented the messy specifics — including ",[49,931,933],{"href":130,"rel":932},[53],"encoding a German withdrawal waiver into the pay button"," for EU consent law, and ",[49,936,938],{"href":181,"rel":937},[53],"a webhook where some failures must throw and some never do",". These aren't hypotheticals. They're the difference between a demo and a product that survives contact with real customers.",[15,941,943],{"id":942},"database-security-row-level-security-matters","Database Security: Row-Level Security Matters",[11,945,946,947,949],{},"ShipFast leans on its own database setup with security largely handled in the application layer. BoiledPlate uses Supabase ",[29,948,702],{},", which enforces access rules at query time in the database itself — not in your API handlers, where one forgotten check leaks data across tenants.",[11,951,952,953,958],{},"For multi-tenant SaaS this matters enormously. RLS means a bug in your application code can't hand user A the rows belonging to user B, because the database refuses to return them. Supabase's own ",[49,954,957],{"href":955,"rel":956},"https:\u002F\u002Fsupabase.com\u002Fdocs\u002Fguides\u002Fdatabase\u002Fpostgres\u002Frow-level-security",[53],"RLS documentation"," is worth reading if you're weighing this trade-off.",[15,960,962],{"id":961},"agent-consistency-the-agentsmd-contract","Agent Consistency: The AGENTS.md Contract",[11,964,965],{},"This is BoiledPlate's genuinely unique angle, and ShipFast doesn't address it at all.",[11,967,968,969,972,973,977],{},"Coding agents drift. Ask one to add a feature and it may invent a new way to access data, handle secrets, or name things — subtly inconsistent with the last thing it wrote. BoiledPlate ships an ",[29,970,971],{},"AGENTS.md"," contract: one documented way to do data access and secret handling, so agent output stays consistent across sessions. We made the full case in ",[49,974,976],{"href":165,"rel":975},[53],"write your conventions for the agent, not the next hire",". If you build with Claude or similar, this is the feature that keeps your codebase from turning into archaeology.",[15,979,981],{"id":980},"authentication-and-internationalization","Authentication and Internationalization",[11,983,984],{},"Both boilerplates handle Google sign-in. BoiledPlate pairs it with Supabase auth backed by RLS, so authentication and authorization share one enforcement point rather than a scattered JWT strategy layered on top.",[11,986,987,988,221],{},"On languages, ShipFast's i18n story is minimal. BoiledPlate ships four languages from day one, with locale setup handled by the same deterministic patches — because adding a language later means touching every string in the app, and that's exactly the kind of endless, slightly-different work described in ",[49,989,991],{"href":227,"rel":990},[53],"what it actually takes to wire up a Nuxt, Supabase and Stripe SaaS",[15,993,995],{"id":994},"the-blog-seo-and-transactional-email","The Blog, SEO, and Transactional Email",[11,997,998,999,1003,1004,1008],{},"Every SaaS needs SEO momentum from day one, which is why both include a blog. BoiledPlate's is prerendered Markdown with JSON-LD schema, canonical URLs, and og:url tags. That corner has real pitfalls — we shipped a bug where ",[49,1000,1002],{"href":669,"rel":1001},[53],"our blog told Google its canonical URL was localhost:3000",", and another where ",[49,1005,1007],{"href":657,"rel":1006},[53],"a JSON-LD source-order issue returned 200 from curl but 500 in Chrome",". Prevention is baked in because we hit them first.",[11,1010,1011],{},"For email, BoiledPlate integrates Resend for billing confirmations, refunds, and multi-language templates. Sending once is easy; sending exactly once, with SPF, DKIM, and unsubscribe handling correct, is the annoying part a starter should absorb.",[15,1013,1015],{"id":1014},"updates-and-maintenance-the-merge-hell-problem","Updates and Maintenance: The Merge Hell Problem",[11,1017,1018],{},"With most boilerplates, ShipFast included, you own all your customizations and every upstream update is yours to integrate — which usually means rebase conflicts you postpone forever. BoiledPlate writes semantic, agent-readable release notes and offers opt-in updates to customized code, so your agent can apply an improvement without stomping your changes. Lifetime updates are part of the Pro tier.",[15,1020,1022],{"id":1021},"deployment-types-and-theming","Deployment, Types, and Theming",[11,1024,1025,1026,1030],{},"BoiledPlate deploys in minutes to Vercel, Netlify, or self-hosted, with environment variables and secrets documented. It's TypeScript strict mode end to end — server, client, and database layer — which is how you catch billing bugs at compile time instead of in a customer's inbox. (One caveat we hit: ",[49,1027,1029],{"href":681,"rel":1028},[53],"Vercel's analytics package can break Nuxt typecheck",", documented so you don't lose an afternoon to it.)",[11,1032,1033],{},"Theming is handled in the setup interview: pick a preset — Warm Studio, Clean SaaS, Midnight Pro, Sharp Enterprise — or describe your own and the agent maps it onto the codebase. The dashboard previews on the homepage are the real thing every buyer gets.",[15,1035,1037],{"id":1036},"pricing-one-time-vs-recurring","Pricing: One-Time vs. Recurring",[11,1039,1040,1041,1044,1045,1049,1050,1053],{},"ShipFast is $199 per license. BoiledPlate comes in two tiers: ",[29,1042,1043],{},"Lite"," is free and MIT-licensed — clone it and wire the services manually, exactly the ShipFast experience minus the price — documented in our post on the ",[49,1046,1048],{"href":300,"rel":1047},[53],"free Nuxt + Supabase boilerplate",". ",[29,1051,1052],{},"Pro"," is €159 one-time with lifetime updates and instant delivery via GitHub invite.",[11,1055,1056],{},"The honest total-cost comparison isn't the sticker price. It's the sticker price plus the weeks of wiring. If you value an afternoon over a fortnight, the setup process is where the money is.",[15,1058,1060],{"id":1059},"when-a-boilerplate-isnt-enough","When a Boilerplate Isn't Enough",[11,1062,1063],{},"Be clear-eyed: any boilerplate solves maybe 60–70% of setup. Your actual product logic — the thing that makes you money — is still yours to write. What both products give you is a clean, owned starting point. BoiledPlate's agent-readable conventions arguably reduce lock-in, because the code documents its own contract.",[15,1065,1067],{"id":1066},"decision-framework-shipfast-or-boiledplate","Decision Framework: ShipFast or BoiledPlate?",[67,1069,1070,1076],{},[70,1071,1072,1075],{},[29,1073,1074],{},"Choose ShipFast if:"," you're committed to NextJS, prefer wiring services by hand, and don't build with coding agents.",[70,1077,1078,1081],{},[29,1079,1080],{},"Choose BoiledPlate if:"," you're on (or happy to be on) the Nuxt + Supabase + Stripe stack, you build with agents, you want RLS enforced at the database, and lifetime updates matter.",[11,1083,1084],{},"The framework is not the differentiator. The setup process and the maintenance cost are.",[15,1086,1088],{"id":1087},"the-bigger-picture","The Bigger Picture",[11,1090,1091,1092,1096],{},"Agent-native contracts like AGENTS.md are becoming table stakes. As more code gets written with coding assistants, the boilerplates that win won't just be readable by humans — they'll be written for agent consumption, with one documented way to do every dangerous thing. That's the bet BoiledPlate makes, and it's worth understanding before you commit €159 or $199 to a codebase you'll live in for the next year. Read ",[49,1093,1095],{"href":722,"rel":1094},[53],"the full blog"," if you want the edge cases in detail before you decide.",{"title":398,"searchDepth":399,"depth":399,"links":1098},[1099,1100,1101,1102,1103,1104,1105,1106,1107,1108,1109,1110,1111],{"id":877,"depth":402,"text":878},{"id":892,"depth":402,"text":893},{"id":914,"depth":402,"text":915},{"id":942,"depth":402,"text":943},{"id":961,"depth":402,"text":962},{"id":980,"depth":402,"text":981},{"id":994,"depth":402,"text":995},{"id":1014,"depth":402,"text":1015},{"id":1021,"depth":402,"text":1022},{"id":1036,"depth":402,"text":1037},{"id":1059,"depth":402,"text":1060},{"id":1066,"depth":402,"text":1067},{"id":1087,"depth":402,"text":1088},"2026-07-30","Compare ShipFast and BoiledPlate SaaS boilerplates. Learn which NextJS or Nuxt starter kit is best for your launch.",{},"\u002Fblog\u002Fshipfast-boilerplate-vs-boiledplate-comparison",{"title":862,"description":1113},"blog\u002Fshipfast-boilerplate-vs-boiledplate-comparison",[1119,1120,353,1121],"SaaS boilerplate","ShipFast","startup tools","8oQ72bY_8m5LCPzvTkG2lpmm-Ev85wdQnPhYSmrbnkQ",{"id":1124,"title":1125,"author":6,"body":1126,"category":6,"date":1479,"description":1480,"draft":420,"extension":421,"image":6,"meta":1481,"navigation":423,"path":1482,"seo":1483,"stem":1484,"tags":1485,"__hash__":1486},"blog\u002Fblog\u002Fshipfast-docs-beyond-framework.md","ShipFast Docs: Beyond the Framework Stack",{"type":8,"value":1127,"toc":1448},[1128,1131,1134,1138,1142,1145,1149,1157,1161,1164,1168,1174,1178,1182,1185,1189,1192,1196,1199,1203,1206,1208,1215,1219,1232,1239,1243,1247,1254,1258,1261,1265,1273,1277,1284,1288,1299,1303,1314,1317,1321,1334,1338,1341,1345,1354,1360,1363,1367,1370,1373,1397,1404,1408,1441],[11,1129,1130],{},"If you searched for \"ShipFast docs,\" you were probably trying to answer one question: can a boilerplate actually get me from idea to revenue faster? ShipFast built its reputation on that promise for Next.js — \"launch in days, not weeks.\" It's a good product. But the promise hides an assumption worth challenging: that the framework and UI scaffolding are what stand between you and a shipped product.",[11,1132,1133],{},"They aren't. The stack is the easy part. The plumbing between the pieces is the project. This article walks through what a SaaS starter actually needs to do — and where an AI-native approach changes the math.",[15,1135,1137],{"id":1136},"the-real-cost-of-saas-setup-why-stack-choice-isnt-your-bottleneck","The Real Cost of SaaS Setup: Why Stack Choice Isn't Your Bottleneck",[448,1139,1141],{"id":1140},"the-myth-pick-the-right-framework-and-youre-done","The myth: \"pick the right framework and you're done\"",[11,1143,1144],{},"Ask ten founders how to ship fast and you get ten stack arguments — Next vs Nuxt, Postgres vs a hosted DB, Stripe vs Paddle. Pick whatever you already know and the debate is over in an afternoon. Framework choice is a days-long decision at most.",[448,1146,1148],{"id":1147},"what-actually-kills-shipping-velocity","What actually kills shipping velocity",[11,1150,1151,1152,1156],{},"Authentication with real session handling. Billing webhooks that survive retries. Database schemas with access control. Email that doesn't land in spam. Multi-currency display. Refund flows. This is the ",[49,1153,1155],{"href":87,"rel":1154},[53],"plumbing that eats your launch",", and it doesn't show up in a demo. It shows up three weeks in, when a webhook fires twice and you've charged someone twice.",[448,1158,1160],{"id":1159},"why-nextjs-boilerplates-miss-the-actual-problem","Why Next.js boilerplates miss the actual problem",[11,1162,1163],{},"Most boilerplates, ShipFast included, give you a landing page, auth scaffolding, and UI components. That's genuinely useful. But the hard integration — making Stripe the source of truth, wiring idempotent webhooks, enforcing row-level security — is often left as an exercise for the reader. You still write the part that's actually hard.",[448,1165,1167],{"id":1166},"solving-for-the-real-constraint","Solving for the real constraint",[11,1169,1170,1173],{},[49,1171,353],{"href":351,"rel":1172},[53]," takes a different angle: your coding agent doesn't just write code, it provisions the services. Stripe products and webhooks, a Supabase database with RLS, Google sign-in — configured in one session, not copied from a docs page you follow by hand.",[15,1175,1177],{"id":1176},"from-idea-to-production-what-5-minutes-actually-means","From Idea to Production: What \"5 Minutes\" Actually Means",[448,1179,1181],{"id":1180},"the-honest-timeline","The honest timeline",[11,1183,1184],{},"Five minutes gets you a running local app. It does not get you correct Stripe webhook handling — that historically takes weeks to get right. Anyone promising both in the same sentence is selling you the clone step and hiding the wiring step.",[448,1186,1188],{"id":1187},"what-you-get-immediately","What you get immediately",[11,1190,1191],{},"A Nuxt codebase, a Supabase schema with policies, Google sign-in, real Stripe products and price IDs, a prerendered Markdown blog, and i18n across four languages. That's the plumbing pre-solved.",[448,1193,1195],{"id":1194},"what-still-requires-your-thought","What still requires your thought",[11,1197,1198],{},"Your business logic. Your domain data model. Your pricing strategy. Your actual features. A boilerplate can't ship those, and it shouldn't pretend to. What it can do is stop you spending 80% of your effort on integration work — the real indie-builder killer.",[15,1200,1202],{"id":1201},"billing-done-right-webhook-architecture-that-survives-reality","Billing Done Right: Webhook Architecture That Survives Reality",[11,1204,1205],{},"Missed or mishandled webhooks mean lost refunds, corrupted subscription state, and angry customers. This is non-negotiable, and it's where most DIY setups quietly rot.",[448,1207,574],{"id":573},[11,1209,1210,1211,1214],{},"Stripe will send the same event more than once. Your handler must process a replayed event ten times and produce the same result as processing it once. If replaying ",[135,1212,1213],{},"invoice.paid"," can charge or provision twice, your billing is broken by design.",[448,1216,1218],{"id":1217},"making-the-webhook-the-source-of-truth","Making the webhook the source of truth",[11,1220,1221,1222,1226,1227,1231],{},"The single most important billing decision: ",[49,1223,1225],{"href":121,"rel":1224},[53],"your checkout success page should not touch your billing state",". The success page is a redirect the user might never see. The webhook is the fact. BoiledPlate's implementation verifies the Stripe signature, applies deterministic state transitions, and handles failure explicitly — some failures throw and retry, ",[49,1228,1230],{"href":181,"rel":1229},[53],"some must never throw",". Knowing which is which is the whole game.",[11,1233,1234,1235,221],{},"For a full walkthrough of the ordering — plans in config, checkout, webhook, RLS-gated access, customer portal — see ",[49,1236,1238],{"href":622,"rel":1237},[53],"how to set up Stripe subscriptions in a Nuxt + Supabase app",[15,1240,1242],{"id":1241},"database-security-without-the-headaches-row-level-security","Database Security Without the Headaches: Row-Level Security",[448,1244,1246],{"id":1245},"what-rls-actually-does","What RLS actually does",[11,1248,1249,1250,1253],{},"Row-level security enforces access at query time, in the database, not in your application code. Even if an API route forgets a ",[135,1251,1252],{},"WHERE user_id ="," check, Postgres refuses to return rows the caller shouldn't see.",[448,1255,1257],{"id":1256},"why-it-matters-for-multi-tenant-saas","Why it matters for multi-tenant SaaS",[11,1259,1260],{},"Application-level checks fail the moment someone adds an endpoint and forgets the guard. RLS makes data leakage a database-level impossibility, not a code-review hope. BoiledPlate ships policies for users, subscriptions, and audit logs, with JWT claims from Supabase auth feeding the policies directly.",[448,1262,1264],{"id":1263},"the-gotchas-nobody-mentions","The gotchas nobody mentions",[11,1266,1267,1268,1272],{},"RLS interacts with JWT custom claims, foreign-key constraints, and query performance in ways that surprise people. Correct policies can still block valid queries or slow them down under load. These aren't reasons to skip RLS — they're reasons to start from patterns that have already hit those walls. The ",[49,1269,1271],{"href":955,"rel":1270},[53],"Supabase docs on RLS"," are the canonical reference worth bookmarking.",[15,1274,1276],{"id":1275},"deterministic-patches-how-ai-agents-customize-your-codebase","Deterministic Patches: How AI Agents Customize Your Codebase",[11,1278,1279,1280,1283],{},"Templating scatters ",[135,1281,1282],{},"{{variables}}"," across your entire tree and leaves you to clean up. BoiledPlate uses deterministic patches instead: the agent interviews you once — pricing tiers, email provider, theme, domain, languages — then applies surgical, idempotent edits to known code.",[448,1285,1287],{"id":1286},"agentsmd-the-contract-for-consistent-output","AGENTS.md: the contract for consistent output",[11,1289,1290,1291,1293,1294,1298],{},"The reason patches stay coherent is a shipped ",[135,1292,971],{}," contract that documents one correct way to do data access and secrets. Writing ",[49,1295,1297],{"href":165,"rel":1296},[53],"conventions for the agent, not the next hire"," is what keeps AI output from drifting into three different patterns for the same task. Adding a subscription tier becomes one flow: interview → migration → Stripe product → webhook handler → email template, all consistent.",[15,1300,1302],{"id":1301},"multi-currency-and-eu-consent-billing-complexity-you-cant-ignore","Multi-Currency and EU Consent: Billing Complexity You Can't Ignore",[11,1304,1305,1306,1310,1311,1313],{},"Currency handling breaks late — tax rates, rounding, Stripe's integer-cents precision. And regulation is worse. EU law grants a 14-day withdrawal right (Widerrufsrecht) that affects how you handle digital-goods subscriptions. Encoding that correctly means ",[49,1307,1309],{"href":130,"rel":1308},[53],"wiring a withdrawal waiver into the checkout button"," via Stripe's ",[135,1312,137],{}," — not a hardcoded checkbox you bolt on later.",[11,1315,1316],{},"The rule: don't hardcode policy. Make consent flows, retention, and pricing display configurable from day one, tied to user locale via the built-in i18n.",[15,1318,1320],{"id":1319},"seo-and-metadata-without-the-crashes","SEO and Metadata Without the Crashes",[11,1322,1323,1324,1328,1329,1333],{},"The subtle bugs that kill SEO aren't glamorous. A JSON-LD hydration mismatch can make ",[49,1325,1327],{"href":657,"rel":1326},[53],"a page return 200 from curl and 500 in the browser",". A misconfigured canonical can tell Google ",[49,1330,1332],{"href":669,"rel":1331},[53],"your site lives at localhost:3000",". BoiledPlate ships a prerendered Markdown blog, JSON-LD product and organization schema, and og:url canonicals that point at the right domain — because these were debugged in production, not assumed.",[15,1335,1337],{"id":1336},"instant-github-delivery-the-product-isnt-code-its-provisioned-services","Instant GitHub Delivery: The Product Isn't Code, It's Provisioned Services",[11,1339,1340],{},"Sending a zip file is a 2010 delivery model. You don't just need the repo — you need Stripe products created, a Supabase database initialized with policies, and Google OAuth configured. BoiledPlate Pro delivers via webhook: you pay, GitHub access is granted automatically, and you get a repo ready to be provisioned by your agent. Instant, auditable, and repeatable if you need a fresh copy.",[15,1342,1344],{"id":1343},"lite-vs-pro-fork-the-template-or-buy-instant-setup","Lite vs. Pro: Fork the Template or Buy Instant Setup",[11,1346,1347,1349,1350,221],{},[29,1348,743],{}," is free and MIT-licensed. Clone it from GitHub, wire the services yourself, keep full control — ",[49,1351,1353],{"href":300,"rel":1352},[53],"everything a paid product needs, minus the automation",[11,1355,1356,1359],{},[29,1357,1358],{},"BoiledPlate Pro"," is €159 one-time, with lifetime updates and instant GitHub delivery. You get the agent-driven interview, deterministic patches, provisioned services, and update paths that don't devolve into merge hell.",[11,1361,1362],{},"The calculation is simple: if the paid tier saves you two weeks of plumbing, €159 is not the expensive part of your launch. Your time is.",[15,1364,1366],{"id":1365},"comparing-to-shipfast-and-other-boilerplates-honest-trade-offs","Comparing to ShipFast and Other Boilerplates: Honest Trade-Offs",[11,1368,1369],{},"ShipFast is a Next.js boilerplate with a large community and a proven track record. If your whole world is React and Next, that ecosystem depth is real value. Nuxt vs Next is a framework preference, not a capability gap.",[11,1371,1372],{},"The honest trade-offs cut both ways:",[67,1374,1375,1381,1387],{},[70,1376,1377,1380],{},[29,1378,1379],{},"Open-source forks"," are free but often unmaintained — you're not saving time if you're debugging someone's two-year-old code.",[70,1382,1383,1386],{},[29,1384,1385],{},"Building from scratch"," gives maximum flexibility and zero velocity; most indie builders shouldn't.",[70,1388,1389,1392,1393,221],{},[29,1390,1391],{},"A Nuxt-based starter"," means a smaller community than Next and fewer niche libraries — but a stack where ",[49,1394,1396],{"href":227,"rel":1395},[53],"every piece's demands are already handled",[11,1398,1399,1400,221],{},"The real difference isn't framework. It's that most boilerplates ship the stack and leave the plumbing to you, while ",[49,1401,1403],{"href":51,"rel":1402},[53],"that was never the hard part",[15,1405,1407],{"id":1406},"getting-started-a-practical-walkthrough","Getting Started: A Practical Walkthrough",[1409,1410,1411,1417,1423,1429,1435],"ol",{},[70,1412,1413,1416],{},[29,1414,1415],{},"Decide Lite or Pro."," Fork the free MIT version, or pay €159 for the provisioned setup.",[70,1418,1419,1422],{},[29,1420,1421],{},"Interview."," Your agent asks about pricing, languages, branding, and email provider.",[70,1424,1425,1428],{},[29,1426,1427],{},"Infrastructure lives."," Stripe products exist, the Supabase database is initialized with RLS, Google sign-in works.",[70,1430,1431,1434],{},[29,1432,1433],{},"Customize and ship."," Add your business logic, deploy, collect customers.",[70,1436,1437,1440],{},[29,1438,1439],{},"Iterate with agent help."," The agent reads AGENTS.md, applies patches, you review and merge.",[11,1442,1443,1444,221],{},"The stack was always the easy decision. The plumbing was the project. That's the part worth automating — and the reason to look past the framework debate entirely. Read more on the ",[49,1445,1447],{"href":722,"rel":1446},[53],"BoiledPlate blog",{"title":398,"searchDepth":399,"depth":399,"links":1449},[1450,1456,1461,1465,1470,1473,1474,1475,1476,1477,1478],{"id":1136,"depth":402,"text":1137,"children":1451},[1452,1453,1454,1455],{"id":1140,"depth":399,"text":1141},{"id":1147,"depth":399,"text":1148},{"id":1159,"depth":399,"text":1160},{"id":1166,"depth":399,"text":1167},{"id":1176,"depth":402,"text":1177,"children":1457},[1458,1459,1460],{"id":1180,"depth":399,"text":1181},{"id":1187,"depth":399,"text":1188},{"id":1194,"depth":399,"text":1195},{"id":1201,"depth":402,"text":1202,"children":1462},[1463,1464],{"id":573,"depth":399,"text":574},{"id":1217,"depth":399,"text":1218},{"id":1241,"depth":402,"text":1242,"children":1466},[1467,1468,1469],{"id":1245,"depth":399,"text":1246},{"id":1256,"depth":399,"text":1257},{"id":1263,"depth":399,"text":1264},{"id":1275,"depth":402,"text":1276,"children":1471},[1472],{"id":1286,"depth":399,"text":1287},{"id":1301,"depth":402,"text":1302},{"id":1319,"depth":402,"text":1320},{"id":1336,"depth":402,"text":1337},{"id":1343,"depth":402,"text":1344},{"id":1365,"depth":402,"text":1366},{"id":1406,"depth":402,"text":1407},"2026-07-29","Discover why ShipFast's promise of fast SaaS launches misses the real bottleneck: not the framework, but the hidden plumbing between pieces.",{},"\u002Fblog\u002Fshipfast-docs-beyond-framework",{"title":1125,"description":1480},"blog\u002Fshipfast-docs-beyond-framework",[428,429,858,432],"6Nz32RaquyM1jOlKYNp-MNjFqXiiMjaz2KWngkrty_c",1785545502394]