[{"data":1,"prerenderedAt":1639},["ShallowReactive",2],{"blog-shipfast-company-stack-choice":3,"related-shipfast-company-stack-choice":447},{"id":4,"title":5,"author":6,"body":7,"category":6,"date":432,"description":433,"draft":434,"extension":435,"image":6,"meta":436,"navigation":437,"path":438,"seo":439,"stem":440,"tags":441,"__hash__":446},"blog\u002Fblog\u002Fshipfast-company-stack-choice.md","ShipFast Company: Why Stack Choice Doesn't Matter",null,{"type":8,"value":9,"toc":392},"minimark",[10,14,19,24,32,43,47,58,61,65,74,78,82,91,94,98,105,114,118,144,148,152,161,165,173,177,184,188,192,205,209,212,216,219,223,227,234,238,258,262,269,273,277,290,294,306,310,322,326,334,337,341,352,355,359,365,371,374,378,381,385],[11,12,13],"p",{},"Ask ten founders which \"shipfast company\" or boilerplate to buy and you'll get ten stack arguments. Next.js or Nuxt. Postgres or a hosted database. Stripe or Paddle. The debate feels important. It isn't. The stack takes an afternoon to settle. The weeks disappear somewhere else entirely — and that's the part almost nobody sells you honestly.",[15,16,18],"h2",{"id":17},"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",[20,21,23],"h3",{"id":22},"the-stack-debate-is-a-distraction","The Stack Debate Is a Distraction",[11,25,26,27,31],{},"Whatever framework you already know is the right framework. That decision is done in a day. What actually eats your launch is the wiring ",[28,29,30],"em",{},"between"," services: Stripe webhooks, row-level security rules, an email provider that sends exactly once, EU consent flows. This is the plumbing, and it's invisible until it breaks in production.",[11,33,34,35,42],{},"We know because we built ",[36,37,41],"a",{"href":38,"rel":39},"https:\u002F\u002Fboiledplate.ai",[40],"nofollow","BoiledPlate"," by writing that plumbing, then keeping a running log of every edge case it took to make it trustworthy. This site runs on it. The premise is simple: stop re-wiring the same plumbing for every new project.",[20,44,46],{"id":45},"what-ship-in-days-actually-means","What \"Ship in Days\" Actually Means",[11,48,49,50,53,54,57],{},"Shipping boilerplate ",[28,51,52],{},"code"," is table stakes — every template does that. The real move is shipping ",[28,55,56],{},"configured services"," in a single session: Stripe products created, Supabase auth live, Google OAuth wired, webhooks registered.",[11,59,60],{},"That's where agent-driven setup beats manual wiring. Your coding agent interviews you, then applies deterministic patches to reshape the codebase to your answers. No human fat-fingering a secret into the wrong file, no half-configured webhook endpoint discovered three weeks later.",[20,62,64],{"id":63},"the-boilerplates-landscape","The Boilerplates Landscape",[11,66,67,68,73],{},"Next.js templates like ShipFast are battle-tested with large communities and proven market fit. If you're already deep in Next.js, that ecosystem serves you well. The Nuxt + Supabase angle is quieter but has a stronger TypeScript story, and Supabase's RLS is non-negotiable for multi-tenant SaaS. The other axis is free versus paid: ",[36,69,72],{"href":70,"rel":71},"https:\u002F\u002Fboiledplate.ai\u002Fblog\u002Ffree-nuxt-supabase-saas-boilerplate",[40],"BoiledPlate Lite"," is MIT-licensed and you wire it manually; Pro automates the actual pain with an agent.",[15,75,77],{"id":76},"the-webhook-architecture-nobody-wants-to-build","The Webhook Architecture Nobody Wants to Build",[20,79,81],{"id":80},"why-stripe-webhooks-are-the-source-of-truth","Why Stripe Webhooks Are the Source of Truth",[11,83,84,85,90],{},"Client-side success pages lie. A user closes the tab before the redirect, or the network hiccups, and your UI says \"paid\" while your database says nothing happened. Webhooks don't lie — they're ",[36,86,89],{"href":87,"rel":88},"https:\u002F\u002Fboiledplate.ai\u002Fblog\u002Fstripe-webhooks-source-of-truth",[40],"the source of truth for billing state",". Your checkout success page should never touch your billing state.",[11,92,93],{},"The hard requirement is idempotency: the same event, delivered multiple times, must produce exactly one state change. Naive implementations fail on race conditions, retries without deduplication, and database deadlocks.",[20,95,97],{"id":96},"building-idempotent-webhook-handlers","Building Idempotent Webhook Handlers",[11,99,100,101,104],{},"The pattern is straightforward to describe and easy to get wrong: store the Stripe event ID as an idempotency key ",[28,102,103],{},"before"," running any side effects. Refund flows are where this bites — the refund webhook can arrive before the subscription-cancelled event, so your state machine has to handle out-of-order delivery.",[11,106,107,108,113],{},"Real failure modes production hits: webhook workers that crash mid-transaction, partial state updates, confirmation emails sent twice. ",[36,109,112],{"href":110,"rel":111},"https:\u002F\u002Fboiledplate.ai\u002Fblog\u002Fthe-github-invite-is-the-product-building-a-stripe-webhook-where-delivery-throws",[40],"Our own delivery webhook"," has a deliberate design where some failures throw (so Stripe retries) and some never do (so you don't spam the customer).",[20,115,117],{"id":116},"multi-plan-subscription-management-at-scale","Multi-Plan Subscription Management at Scale",[11,119,120,121,124,125,124,128,131,132,137,138,143],{},"Single-plan setups are a lie the demo tells you. Trials, downgrades, pro-rata credits, and seat-based pricing all break simple logic. Each event — ",[52,122,123],{},"customer.subscription.updated",", ",[52,126,127],{},"invoice.payment_succeeded",[52,129,130],{},"charge.dispute.created"," — triggers a different code path. Testing means the local ",[36,133,136],{"href":134,"rel":135},"https:\u002F\u002Fdocs.stripe.com\u002Fstripe-cli",[40],"Stripe CLI",", replay fixtures, and deliberately dropping events to see what survives. The ",[36,139,142],{"href":140,"rel":141},"https:\u002F\u002Fboiledplate.ai\u002Fblog\u002Fstripe-subscriptions-nuxt-supabase",[40],"five decisions behind Stripe subscriptions"," walk through the order that actually holds up.",[15,145,147],{"id":146},"ai-agents-and-consistency","AI Agents and Consistency",[20,149,151],{"id":150},"the-agentsmd-contract","The AGENTS.md Contract",[11,153,154,155,160],{},"Without conventions, agents drift. Each run produces slightly different naming, structure, and error handling. Documentation becomes a guard rail: here's how we fetch data, here's where secrets live, here's how API routes and errors are shaped. The agent reads the contract, then applies targeted patches to match your answers. We wrote more about ",[36,156,159],{"href":157,"rel":158},"https:\u002F\u002Fboiledplate.ai\u002Fblog\u002Fconventions-for-ai-coding-agents",[40],"writing conventions for the agent, not the next hire",".",[20,162,164],{"id":163},"why-agent-driven-setup-survives-customization","Why Agent-Driven Setup Survives Customization",[11,166,167,168,160],{},"Traditional templates: clone, edit 47 config files, pull a new version, enter merge hell. The BoiledPlate model instead interviews you, applies semantic patches, and delivers via GitHub instantly. When updates ship, semantic release notes tell you exactly what changed and why. ",[36,169,172],{"href":170,"rel":171},"https:\u002F\u002Fboiledplate.ai\u002Fblog\u002Fnuxt-saas-boilerplate-for-ai-agents",[40],"Shipping the stack was never the hard part",[20,174,176],{"id":175},"the-cost-of-agent-drift","The Cost of Agent Drift",[11,178,179,180,183],{},"Two concrete failures we've seen: an agent generating RLS policies in different syntax each run, so Supabase rejects half of them; and secrets scattered across ",[52,181,182],{},".env",", a config file, and the database, so the agent can't reliably find them. The fix is one source of truth in AGENTS.md that the agent validates against before committing.",[15,185,187],{"id":186},"billing-edge-cases-that-production-hits","Billing Edge Cases That Production Hits",[20,189,191],{"id":190},"eu-consent-and-withdrawal-waivers","EU Consent and Withdrawal Waivers",[11,193,194,195,200,201,204],{},"If you sell in the EU, this is not optional. German law lets customers withdraw digital-purchase consent unless they've explicitly waived it. The naive approach — a refund button that hits Stripe immediately — leaves you exposed. We encoded a ",[36,196,199],{"href":197,"rel":198},"https:\u002F\u002Fboiledplate.ai\u002Fblog\u002Fstripe-checkout-consent-collection-german-withdrawal-waiver",[40],"German withdrawal waiver into the pay button"," using Stripe Checkout's ",[52,202,203],{},"consent_collection",", so consent is captured at purchase, not argued about later.",[20,206,208],{"id":207},"subscription-lifecycle-management","Subscription Lifecycle Management",[11,210,211],{},"When does billing actually start after a trial? Stripe's date fields are genuinely confusing. Mid-cycle downgrades generate pro-rata credits that Stripe calculates but you must display correctly. And churn prediction needs usage patterns — webhook data alone won't tell you who's about to leave.",[20,213,215],{"id":214},"refund-flows-that-dont-explode","Refund Flows That Don't Explode",[11,217,218],{},"Partial refunds compound fast: a customer gets a $50 credit, applies it, then requests a full refund. What's owed? Worse, a refund can succeed while the confirmation email silently fails — now support gets five tickets for one refund. The fix is the same trio every time: idempotent webhooks, transactional email with retries, and an audit log of every state change.",[15,220,222],{"id":221},"row-level-security-billing-logic-at-query-time","Row-Level Security: Billing Logic at Query Time",[20,224,226],{"id":225},"why-rls-isnt-optional-for-multi-tenant-saas","Why RLS Isn't Optional for Multi-Tenant SaaS",[11,228,229,230,233],{},"Without RLS, you rely on application code to filter by ",[52,231,232],{},"user_id",". One bug and a customer sees someone else's invoices. With RLS, the database rejects the query outright — no code path can leak data. The tradeoff is performance: policies run at query time, so a slow policy slows every query.",[20,235,237],{"id":236},"rls-policies-for-stripe-driven-billing","RLS Policies for Stripe-Driven Billing",[11,239,240,241,244,245,248,249,252,253,160],{},"A clean split: ",[52,242,243],{},"select"," lets customers see only their own invoices and subscriptions; ",[52,246,247],{},"update"," forbids customers touching billing records directly — only webhooks write them; ",[52,250,251],{},"insert"," opens a narrow onboarding window that the webhook then locks. Auth is the fast part of Supabase; ",[36,254,257],{"href":255,"rel":256},"https:\u002F\u002Fboiledplate.ai\u002Fblog\u002Fnuxt-supabase-stripe-saas-boilerplate",[40],"RLS is the part you forget",[20,259,261],{"id":260},"the-pattern","The Pattern",[11,263,264,265,268],{},"User signs in with Google OAuth (Supabase handles it). RLS policies tied to ",[52,266,267],{},"auth.uid()"," scope every query automatically. The Stripe webhook arrives with a customer ID, the handler writes state using the server key, and RLS enforces who can read it.",[15,270,272],{"id":271},"technical-debt-and-real-world-debugging","Technical Debt and Real-World Debugging",[20,274,276],{"id":275},"json-ld-hydration-crashes","JSON-LD Hydration Crashes",[11,278,279,280,285,286,289],{},"Our prerendered Markdown blog once ",[36,281,284],{"href":282,"rel":283},"https:\u002F\u002Fboiledplate.ai\u002Fblog\u002Fthe-page-that-returned-200-on-the-server-and-500-in-the-browser-a-json-ld-tempor",[40],"returned 200 from the server and 500 in the browser"," — a hydration mismatch that lived in source order. The lesson: use ",[52,287,288],{},"useAsyncData"," with proper caching and avoid dynamic context during SSR.",[20,291,293],{"id":292},"canonical-urls-without-head-drift","Canonical URLs Without Head Drift",[11,295,296,297,300,301,160],{},"Every page needs a canonical link and ",[52,298,299],{},"og:url",". Base URLs differ between dev, preview, and production, so you can't hardcode them. We learned this the hard way when ",[36,302,305],{"href":303,"rel":304},"https:\u002F\u002Fboiledplate.ai\u002Fblog\u002Four-blog-canonically-pointed-at-localhost",[40],"our blog told Google its canonical URL was localhost:3000",[20,307,309],{"id":308},"peer-dependency-hell","Peer Dependency Hell",[11,311,312,313,318,319,160],{},"Upgrading one package breaks types in another, and TypeScript strict mode surfaces all of it — sometimes in surprising places, like ",[36,314,317],{"href":315,"rel":316},"https:\u002F\u002Fboiledplate.ai\u002Fblog\u002Fvercel-web-analytics-nuxt-4-analytics-package-breaks-typecheck",[40],"@vercel\u002Fanalytics breaking nuxt typecheck",". BoiledPlate ships a validated dependency tree; upgrading safely means re-running the agent, not a hopeful ",[52,320,321],{},"npm install",[15,323,325],{"id":324},"the-anti-plumbing-stack-why-these-tools-together","The Anti-Plumbing Stack: Why These Tools Together",[11,327,328,329,333],{},"Nuxt gives you full-stack SSR with Nitro for API routes and less glue than Next.js for small teams. Supabase gives you hosted Postgres with RLS, Auth, and Realtime — and no lock-in, since you can export your database anytime. Stripe is the billing standard that takes weeks to replicate. Resend treats ",[36,330,332],{"href":255,"rel":331},[40],"transactional email"," as code.",[11,335,336],{},"Each demands something: Nuxt wants you to understand composables versus middleware; Supabase RLS is database code that's harder to test than app code; Stripe's retry logic is a contract you can't ignore. And there are gaps this stack leaves open — analytics (bring PostHog), observability (Sentry), file uploads (S3 or Cloudinary), and job scheduling — that you'll integrate yourself.",[15,338,340],{"id":339},"product-delivery-as-plumbing","Product Delivery as Plumbing",[11,342,343,344,347,348,351],{},"The GitHub invite ",[28,345,346],{},"is"," the product. A customer buys, the ",[52,349,350],{},"charge.succeeded"," webhook hits the backend, and the backend creates a private repo from the template and invites them — repo URL in their inbox within seconds. That beats a zip file every time: version control built in, CI\u002FCD ready, code inspectable before running.",[11,353,354],{},"Versioning stays honest with semantic, agent-readable notes. Patch releases fix bugs without touching customizations. Minor releases add features and re-run patches. Major releases are opt-in re-interviews when you actually want the new capability.",[15,356,358],{"id":357},"free-vs-paid","Free vs. Paid",[11,360,361,364],{},[362,363,72],"strong",{}," is free and MIT-licensed: everything a Nuxt + Supabase boilerplate needs, but you wire Stripe, Google Auth, and Supabase yourself — roughly 3-4 hours per new project.",[11,366,367,370],{},[362,368,369],{},"BoiledPlate Pro"," is €159 one-time: the agent interviews you, provisions the services, and delivers a customized private repo instantly, with lifetime updates. Effort: a 15-minute session.",[11,372,373],{},"The ROI math is honest. Ship one SaaS a year and Lite is fine. Ship four or more and Pro pays for itself on the second project. Work with a coding agent daily and the AGENTS.md contract alone saves debugging hours.",[15,375,377],{"id":376},"competitive-landscape","Competitive Landscape",[11,379,380],{},"ShipFast (Next.js) has the larger community and richer integration ecosystem. BoiledPlate leans into type safety, agent-native setup, and an RLS-first billing model. Neither is strictly better — there's room for both. Pick BoiledPlate when you're already comfortable with Supabase, you use Nuxt, you build with Claude, and you need multi-plan Stripe billing with idempotent webhooks.",[15,382,384],{"id":383},"shipping-without-excuses","Shipping Without Excuses",[11,386,387,388,160],{},"Validation is free. Shipping is free. Excuses aren't. BoiledPlate removes the \"set up boilerplate\" excuse — you still have to write your product. The path is short: interview, provision, customize, deploy. The framework was never what slowed you down. The plumbing was. Once it's done, the only thing left is the part that was always yours: ",[36,389,391],{"href":38,"rel":390},[40],"building",{"title":393,"searchDepth":394,"depth":394,"links":395},"",3,[396,402,407,412,417,422,427,428,429,430,431],{"id":17,"depth":397,"text":18,"children":398},2,[399,400,401],{"id":22,"depth":394,"text":23},{"id":45,"depth":394,"text":46},{"id":63,"depth":394,"text":64},{"id":76,"depth":397,"text":77,"children":403},[404,405,406],{"id":80,"depth":394,"text":81},{"id":96,"depth":394,"text":97},{"id":116,"depth":394,"text":117},{"id":146,"depth":397,"text":147,"children":408},[409,410,411],{"id":150,"depth":394,"text":151},{"id":163,"depth":394,"text":164},{"id":175,"depth":394,"text":176},{"id":186,"depth":397,"text":187,"children":413},[414,415,416],{"id":190,"depth":394,"text":191},{"id":207,"depth":394,"text":208},{"id":214,"depth":394,"text":215},{"id":221,"depth":397,"text":222,"children":418},[419,420,421],{"id":225,"depth":394,"text":226},{"id":236,"depth":394,"text":237},{"id":260,"depth":394,"text":261},{"id":271,"depth":397,"text":272,"children":423},[424,425,426],{"id":275,"depth":394,"text":276},{"id":292,"depth":394,"text":293},{"id":308,"depth":394,"text":309},{"id":324,"depth":397,"text":325},{"id":339,"depth":397,"text":340},{"id":357,"depth":397,"text":358},{"id":376,"depth":397,"text":377},{"id":383,"depth":397,"text":384},"2026-08-16","Stop debating your tech stack. Learn why ShipFast companies win by automating service setup instead of chasing framework choices.",false,"md",{},true,"\u002Fblog\u002Fshipfast-company-stack-choice",{"title":5,"description":433},"blog\u002Fshipfast-company-stack-choice",[442,443,444,445],"saas-development","boilerplate","startup-tools","developer-productivity","P4b3XH9-ei_F07C-ss8w_odGv-cKL8eNQAdo8ftvcng",[448,836,1295],{"id":449,"title":450,"author":6,"body":451,"category":6,"date":824,"description":825,"draft":434,"extension":435,"image":6,"meta":826,"navigation":437,"path":827,"seo":828,"stem":829,"tags":830,"__hash__":835},"blog\u002Fblog\u002Fshipfast-saas-boilerplate-comparison.md","ShipFast vs BoiledPlate: SaaS Boilerplate Comparison",{"type":8,"value":452,"toc":805},[453,456,460,463,466,470,478,481,500,503,507,510,518,522,525,528,532,541,549,557,561,564,572,576,584,587,591,599,603,610,614,617,621,627,630,634,637,640,644,647,651,654,658,776,779,783,786,790],[11,454,455],{},"ShipFast made \"launch in days, not weeks\" a rallying cry, and for good reason: a Next.js boilerplate with auth, Stripe, and battle-tested UI components saves real time. But if you've actually shipped a SaaS, you know the template is the easy part. The weeks disappear in the wiring — webhook idempotency, RLS policies, refund flows, EU consent. This is where an AI-native starter changes the math. Here's an honest comparison of ShipFast against BoiledPlate, and why the plumbing is the whole game.",[15,457,459],{"id":458},"what-shipfast-does-and-what-it-doesnt","What ShipFast Does (And What It Doesn't)",[11,461,462],{},"ShipFast is a Next.js SaaS boilerplate. It ships authentication, Stripe payments, a UI component library, email scaffolding, and sensible defaults. It's popular because it's genuinely good at what it is: a code template you clone and customize.",[11,464,465],{},"What it doesn't do is provision anything. You still create your Stripe products, configure webhooks, verify signatures, design your database schema, write RLS policies, set up Google OAuth, and wire your environment variables by hand. ShipFast hands you the code. The infrastructure is your job. For teams comfortable with that setup overhead, that's a fair trade.",[15,467,469],{"id":468},"the-real-problem-with-manual-saas-setup","The Real Problem With Manual SaaS Setup",[11,471,472,473,477],{},"Choosing a stack takes an afternoon. Wiring four services into something trustworthy takes weeks. We know because we ",[36,474,476],{"href":255,"rel":475},[40],"logged every edge case it took"," to make ours reliable.",[11,479,480],{},"The list is longer than it looks:",[482,483,484,488,491,494,497],"ul",{},[485,486,487],"li",{},"Stripe product creation, price objects, webhook endpoints, signature verification",[485,489,490],{},"Supabase schema design, migrations, and RLS policies that actually isolate tenants",[485,492,493],{},"Google OAuth setup, redirect URIs, token handling",[485,495,496],{},"Transactional email (Resend or SendGrid) that sends exactly once",[485,498,499],{},"Testing all of it before a real customer hits it",[11,501,502],{},"Most boilerplates, ShipFast included, leave you at the starting line of this list.",[15,504,506],{"id":505},"boiledplate-agent-driven-provisioning-not-just-code","BoiledPlate: Agent-Driven Provisioning, Not Just Code",[11,508,509],{},"BoiledPlate is an AI-native Nuxt + Supabase starter whose setup runs itself. Instead of handing you a template to customize, an AI coding agent interviews you — name, languages, theme, billing model — then reshapes the entire codebase with deterministic patches and provisions your services.",[11,511,512,513,517],{},"In a single session, your agent creates Stripe products and webhooks, stands up a Supabase database with row-level security, and configures Google sign-in. As the ",[36,514,516],{"href":38,"rel":515},[40],"homepage"," puts it: your coding agent doesn't just write the code — it provisions the services. That's the categorical difference from a code-only template.",[15,519,521],{"id":520},"nuxt-supabase-stripe-why-this-stack-works-together","Nuxt + Supabase + Stripe: Why This Stack Works Together",[11,523,524],{},"The stack is deliberate. Nuxt's server routes map cleanly onto webhook handlers. Supabase RLS enforces billing state at the database layer, not in fragile client-side logic. Stripe webhooks are the source of truth for subscription state. TypeScript strict mode runs end to end, so fewer surprises reach production.",[11,526,527],{},"Next.js, ShipFast's foundation, is excellent — but it tends to demand more glue code to reach the same guarantees, especially around server-side billing state.",[15,529,531],{"id":530},"idempotent-webhooks-the-plumbing-nobody-talks-about","Idempotent Webhooks: The Plumbing Nobody Talks About",[11,533,534,535,540],{},"Webhook delivery matters more than UI elegance, because a dropped or duplicated event corrupts billing state silently. Stripe ",[36,536,539],{"href":537,"rel":538},"https:\u002F\u002Fdocs.stripe.com\u002Fwebhooks#handle-duplicate-events",[40],"explicitly recommends"," handling duplicate events, because it will send them.",[11,542,543,544,548],{},"BoiledPlate's webhook handling is idempotent by design: repeated Stripe events don't double-apply side effects, signatures are verified to block replay attacks, and refund flows don't corrupt subscription state. We wrote about the harder version of this problem — ",[36,545,547],{"href":110,"rel":546},[40],"a Stripe webhook where some failures must throw and some never should"," — because the difference between a retry and a permanent failure is where real bugs live.",[11,550,551,552,556],{},"A related principle: ",[36,553,555],{"href":87,"rel":554},[40],"your checkout success page should not touch your billing state",". The webhook is the source of truth. The success page is just a redirect.",[15,558,560],{"id":559},"row-level-security-database-enforced-billing","Row-Level Security: Database-Enforced Billing",[11,562,563],{},"Client-side permission checks are suggestions. RLS is enforcement. BoiledPlate enforces multi-tenant isolation at query time, so a query that would leak another tenant's data is simply impossible to write, not merely discouraged by middleware.",[11,565,566,567,571],{},"This also carries into compliance. EU rules around German withdrawal waivers and consent flows aren't optional if you sell there, and we encoded one directly into ",[36,568,570],{"href":197,"rel":569},[40],"Stripe Checkout's consent_collection",". Database-enforced billing plus correct consent is the unglamorous part that keeps you out of trouble.",[15,573,575],{"id":574},"agent-consistency-the-agentsmd-contract","Agent Consistency: The AGENTS.md Contract",[11,577,578,579,583],{},"Coding agents drift without conventions. Ask Claude the same question twice and you may get two different data-access patterns. BoiledPlate ships an AGENTS.md contract: one documented way to read secrets and access data, so agent output stays consistent. We argue you should ",[36,580,582],{"href":157,"rel":581},[40],"write your conventions for the agent, not the next hire"," — the agent reads them every session.",[11,585,586],{},"Deterministic patches make customization repeatable, and semantic, agent-readable release notes let your agent understand what changed. Updates are opt-in, applied to your customized code without a merge-hell rewrite.",[15,588,590],{"id":589},"billing-edge-cases-that-bite-you-later","Billing Edge Cases That Bite You Later",[11,592,593,594,598],{},"Subscriptions aren't binary. They transition: active, grace period, past due, canceled. Layer in refund idempotency, double-refund prevention, proration on mid-cycle plan changes, and failed-payment dunning retries, and you have a matrix that's easy to get wrong. Manual setup means debugging these at 2 AM after a customer complaint. BoiledPlate's ",[36,595,597],{"href":140,"rel":596},[40],"Stripe subscription setup"," handles these transitions as designed behavior, not afterthoughts.",[15,600,602],{"id":601},"transactional-email-and-seo-not-afterthoughts","Transactional Email and SEO: Not Afterthoughts",[11,604,605,606,609],{},"Email verification and receipts affect churn, so Resend is integrated, not bolted on later — including sending exactly once, which is harder than it sounds. On SEO, starter kits routinely ship broken defaults. We shipped one ourselves: ",[36,607,305],{"href":303,"rel":608},[40],". BoiledPlate ships JSON-LD structured data, correct og:url canonicals, and a prerendered Markdown blog — correct by default, customizable after.",[15,611,613],{"id":612},"internationalization-from-day-one","Internationalization from Day One",[11,615,616],{},"Four languages ship out of the box. This matters because adding i18n later means refactoring every string, route, and email template. Retrofitting is the \"we'll translate later\" trap that never gets untrapped. Building on top of existing i18n is cheap; grafting it on afterward is not.",[15,618,620],{"id":619},"free-vs-paid-boiledplate-lite-vs-pro","Free vs. Paid: BoiledPlate Lite vs. Pro",[11,622,623,626],{},[36,624,72],{"href":70,"rel":625},[40]," is free and MIT-licensed: the same Nuxt 4, Supabase, Stripe, and Resend app, minus the AI tooling. You clone it and wire it by hand — much like using ShipFast, but Vue-based instead of React.",[11,628,629],{},"Pro is €159 one-time, with lifetime updates and instant delivery via GitHub. It includes the agent-driven provisioning: the interview, the deterministic patches, the whole set-itself-up experience. Honestly: Lite is more work, Pro is instant. Pick Lite if you enjoy the wiring or want to inspect everything first; pick Pro if you'd rather ship product.",[15,631,633],{"id":632},"dashboard-theming-deployment-and-typescript","Dashboard Theming, Deployment, and TypeScript",[11,635,636],{},"Theming is part of the interview: pick a preset (Warm Studio, Clean SaaS, Midnight Pro, Sharp Enterprise) or describe your own colors in plain language, and the agent maps it onto the codebase. Deployment runs in minutes to Vercel, Netlify, or self-hosted — and because the agent interview handles environment variables and provisioning, the classic first-run friction (missing keys, misconfigured webhooks) largely disappears.",[11,638,639],{},"TypeScript strict mode is enforced, not optional. The cost is more upfront friction; the benefit is catching edge cases before production instead of after.",[15,641,643],{"id":642},"github-delivery-the-product-is-your-code","GitHub Delivery: The Product Is Your Code",[11,645,646],{},"When you buy Pro, you get a GitHub repo. That's the product. Your code, in your control, from day one — no locked-in SaaS platform, no managed builder holding your app hostage. This is the opposite of \"no-code\" platforms where you rent your product forever.",[15,648,650],{"id":649},"honest-gaps-and-trade-offs","Honest Gaps and Trade-Offs",[11,652,653],{},"BoiledPlate uses Nuxt, so if you're committed to Next.js or React, ShipFast is the better fit. Supabase is opinionated — no swapping in Firebase. Stripe is non-negotiable for the subscription logic. And it's not a visual builder; you're still coding. If you need a different payment processor or a fundamentally different stack, build from scratch.",[15,655,657],{"id":656},"comparison-at-a-glance","Comparison at a Glance",[659,660,661,678],"table",{},[662,663,664],"thead",{},[665,666,667,670,673,675],"tr",{},[668,669],"th",{},[668,671,672],{},"ShipFast",[668,674,369],{},[668,676,677],{},"Building alone",[679,680,681,696,709,722,735,748,762],"tbody",{},[665,682,683,687,690,693],{},[684,685,686],"td",{},"Framework",[684,688,689],{},"Next.js",[684,691,692],{},"Nuxt 4",[684,694,695],{},"Your choice",[665,697,698,701,704,707],{},[684,699,700],{},"Provisions services",[684,702,703],{},"No",[684,705,706],{},"Yes (agent)",[684,708,703],{},[665,710,711,714,717,719],{},[684,712,713],{},"Auth + RLS",[684,715,716],{},"Auth",[684,718,713],{},[684,720,721],{},"DIY",[665,723,724,727,730,733],{},[684,725,726],{},"Idempotent webhooks",[684,728,729],{},"Manual",[684,731,732],{},"Built-in",[684,734,721],{},[665,736,737,740,743,746],{},[684,738,739],{},"i18n",[684,741,742],{},"Add-on",[684,744,745],{},"4 languages",[684,747,721],{},[665,749,750,753,756,759],{},[684,751,752],{},"Delivery",[684,754,755],{},"Code template",[684,757,758],{},"GitHub repo",[684,760,761],{},"—",[665,763,764,767,770,773],{},[684,765,766],{},"Time to launch",[684,768,769],{},"Days",[684,771,772],{},"A session",[684,774,775],{},"Weeks+",[11,777,778],{},"Over 12 months, the cost of ownership isn't the license fee — it's the maintenance and update friction. Semantic release notes and opt-in patches keep that low.",[15,780,782],{"id":781},"who-should-pick-boiledplate-and-who-shouldnt","Who Should Pick BoiledPlate (And Who Shouldn't)",[11,784,785],{},"BoiledPlate is ideal for Nuxt-comfortable developers, teams using AI coding agents, and billing-heavy products where the webhook and RLS work would otherwise eat weeks. It's sized for teams of one to three, not enterprise procurement. Accept the trade-offs — Vue, Supabase, Stripe, no swaps — and it's a fast path. Reject them and ShipFast or a from-scratch build serves you better.",[15,787,789],{"id":788},"conclusion-plumbing-done-shipping-starts","Conclusion: Plumbing Done, Shipping Starts",[11,791,792,793,798,799,804],{},"The framework is not what slows you down. ShipFast is right that you can launch fast — but a code template still leaves the ",[36,794,797],{"href":795,"rel":796},"https:\u002F\u002Fboiledplate.ai\u002Fblog\u002Fhow-to-ship-saas-fast",[40],"plumbing as the project",". BoiledPlate automates that plumbing so you own the product, not the setup: one agent session provisions Stripe, Supabase with RLS, and Google sign-in, then hands you your code via GitHub. Skip the weeks of wiring and start shipping. Browse the ",[36,800,803],{"href":801,"rel":802},"https:\u002F\u002Fboiledplate.ai\u002Fblog",[40],"blog"," for the edge cases we hit so you don't have to.",{"title":393,"searchDepth":394,"depth":394,"links":806},[807,808,809,810,811,812,813,814,815,816,817,818,819,820,821,822,823],{"id":458,"depth":397,"text":459},{"id":468,"depth":397,"text":469},{"id":505,"depth":397,"text":506},{"id":520,"depth":397,"text":521},{"id":530,"depth":397,"text":531},{"id":559,"depth":397,"text":560},{"id":574,"depth":397,"text":575},{"id":589,"depth":397,"text":590},{"id":601,"depth":397,"text":602},{"id":612,"depth":397,"text":613},{"id":619,"depth":397,"text":620},{"id":632,"depth":397,"text":633},{"id":642,"depth":397,"text":643},{"id":649,"depth":397,"text":650},{"id":656,"depth":397,"text":657},{"id":781,"depth":397,"text":782},{"id":788,"depth":397,"text":789},"2026-09-07","Compare ShipFast and BoiledPlate SaaS templates. Learn which boilerplate handles auth, Stripe, and infrastructure best for your Next.js project.",{},"\u002Fblog\u002Fshipfast-saas-boilerplate-comparison",{"title":450,"description":825},"blog\u002Fshipfast-saas-boilerplate-comparison",[831,832,833,834],"shipfast","saas boilerplate","next.js","saas development","KhX3NSHLjAPepGO0fWifUvLcdlXA5piVm6wtgmZeFJk",{"id":837,"title":838,"author":6,"body":839,"category":6,"date":1284,"description":1285,"draft":434,"extension":435,"image":6,"meta":1286,"navigation":437,"path":1287,"seo":1288,"stem":1289,"tags":1290,"__hash__":1294},"blog\u002Fblog\u002Fshipfast-reviews-honest-comparison.md","ShipFast Reviews: Honest Comparison vs BoiledPlate",{"type":8,"value":840,"toc":1237},[841,844,848,851,855,858,862,865,869,872,876,883,887,895,899,902,906,909,913,921,925,929,937,941,944,948,957,961,964,968,972,975,979,986,990,993,997,1001,1008,1012,1015,1019,1027,1031,1033,1041,1045,1048,1050,1055,1059,1062,1066,1070,1078,1082,1085,1089,1092,1096,1101,1106,1116,1122,1126,1132,1138,1144,1147,1151,1154,1158,1161,1165,1172,1176,1181,1190,1193,1197,1234],[11,842,843],{},"If you search \"shipfast reviews,\" you get a split screen. Product Hunt and TrustPilot praise the clean code and fast landing page. Reddit threads call it \"not worth $200\" and note you could copy the marketing components from Tailwind UI. Both are right, because they're measuring different things. This comparison ignores the marketing on either side and looks at what actually eats your launch weeks: the plumbing between services.",[15,845,847],{"id":846},"what-this-article-covers","What This Article Covers",[11,849,850],{},"We'll compare ShipFast and BoiledPlate on the work that survives contact with a real, paying product — webhooks, refunds, row-level security, EU consent — not on how fast you can put a hero section on a page. Full disclosure: this site runs on BoiledPlate. We'll be specific about where each tool wins.",[15,852,854],{"id":853},"the-shipfast-landscape","The ShipFast Landscape",[11,856,857],{},"ShipFast is a Next.js boilerplate that ships auth, Stripe, email, and a polished set of landing components. Reviews are genuinely positive on structure and speed. The recurring criticism is that you're paying mostly for UI you could assemble yourself.",[20,859,861],{"id":860},"landing-page-marketing-components","Landing Page & Marketing Components",[11,863,864],{},"Pre-built UI is table stakes now. Every serious starter ships a hero, pricing table, and testimonials block. It's nice, but it isn't the thing that decides whether you launch this month or next quarter.",[20,866,868],{"id":867},"code-quality-structure","Code Quality & Structure",[11,870,871],{},"Reviewers praise ShipFast's \"clear code.\" That matters right up until you need to change billing logic. Clear code you don't understand is still code you'll rewrite. The real test is what happens when you customize.",[20,873,875],{"id":874},"speed-to-launch-claims","Speed-to-Launch Claims",[11,877,878,879,882],{},"\"Ship in days\" usually means ship a ",[28,880,881],{},"landing page"," in days. Shipping a deployed product that takes money, verifies webhooks, and doesn't leak one user's data to another is a different measurement — and it's the one that matters.",[15,884,886],{"id":885},"the-plumbing-problem-shipfast-solves-and-doesnt","The Plumbing Problem ShipFast Solves (And Doesn't)",[11,888,889,890,894],{},"Starter kits earn their price by wiring the slowest pieces: auth and payments. That's real value. As we've ",[36,891,893],{"href":170,"rel":892},[40],"written before",", the parts were never the problem — bolting them to each other was what ate the weekends.",[20,896,898],{"id":897},"auth-payments-are-just-the-start","Auth & Payments Are Just the Start",[11,900,901],{},"Wiring Stripe Checkout is easy. Wiring a webhook that agrees with your database, handles retries idempotently, and processes refunds correctly is the actual project. Most reviews never test this because most demos never take a real payment.",[20,903,905],{"id":904},"where-most-starters-fall-short","Where Most Starters Fall Short",[11,907,908],{},"The gaps show up later: row-level security policies, multi-plan billing with upgrades and downgrades, and legal edge cases like EU withdrawal consent. These don't appear in a landing-page demo, so they don't appear in most reviews either.",[20,910,912],{"id":911},"boiledplates-angle-agent-driven-setup","BoiledPlate's Angle: Agent-Driven Setup",[11,914,915,916,920],{},"BoiledPlate's difference isn't more components — it's that ",[36,917,919],{"href":38,"rel":918},[40],"your coding agent provisions the services",". It interviews you (name, languages, theme, billing model), then applies deterministic patches to reshape the codebase and set up Stripe products, webhooks, a Supabase database with RLS, and Google sign-in in one session.",[15,922,924],{"id":923},"stack-comparison-tech-choices-matter","Stack Comparison: Tech Choices Matter",[20,926,928],{"id":927},"nextjs-vs-nuxt","Next.js vs. Nuxt",[11,930,931,932,936],{},"ShipFast is Next.js. BoiledPlate is Nuxt 4. Both are excellent. The honest truth from our ",[36,933,935],{"href":795,"rel":934},[40],"ship-fast breakdown",": the framework is not what slows you down. Pick the one you already know.",[20,938,940],{"id":939},"firebase-vs-supabase-postgres","Firebase vs. Supabase + Postgres",[11,942,943],{},"ShipFast commonly pairs with MongoDB\u002FSupabase options; BoiledPlate is Supabase-first. The distinction that matters is row-level security enforced at query time in Postgres, versus security rules bolted on at the application layer. RLS is baked in, not an afterthought.",[20,945,947],{"id":946},"stripe-integration-depth","Stripe Integration Depth",[11,949,950,951,956],{},"This is where boilerplates separate. Signature verification, idempotent handlers, and failure recovery are the difference between billing that works in a demo and billing that survives production. Stripe's own ",[36,952,955],{"href":953,"rel":954},"https:\u002F\u002Fdocs.stripe.com\u002Fapi\u002Fidempotent_requests",[40],"documentation on idempotent requests"," exists precisely because retries are the norm, not the exception.",[20,958,960],{"id":959},"email-resend-vs-sendgrid-vs-custom-smtp","Email: Resend vs. SendGrid vs. Custom SMTP",[11,962,963],{},"Sending an email is simple. Sending exactly one email, once, on a webhook that might fire twice, is not. BoiledPlate uses Resend for transactional email with that duplicate problem in mind.",[15,965,967],{"id":966},"the-real-cost-of-customization","The Real Cost of Customization",[20,969,971],{"id":970},"deterministic-patches-vs-manual-merge-hell","Deterministic Patches vs. Manual Merge Hell",[11,973,974],{},"Buy a boilerplate, customize it heavily, and the next update becomes a git conflict you dread. BoiledPlate ships semantic, agent-readable release notes and opt-in updates so you can pull new features without merge hell.",[20,976,978],{"id":977},"agentsmd-consistency-for-ai-coders","AGENTS.md: Consistency for AI Coders",[11,980,981,982,160],{},"Coding agents drift. Ask Claude to add a feature twice and you get two different data-access patterns. BoiledPlate ships an AGENTS.md contract documenting one way to do data access and secrets, so ",[36,983,985],{"href":157,"rel":984},[40],"agent output stays consistent",[20,987,989],{"id":988},"multi-language-support-from-day-one","Multi-language Support From Day One",[11,991,992],{},"i18n is a tax you pay forever if you bolt it on late. Four languages ship from day one, so you're not hunting the five places a new locale string has to land before the build stops complaining.",[15,994,996],{"id":995},"billing-edge-cases-nobody-mentions","Billing Edge Cases Nobody Mentions",[20,998,1000],{"id":999},"eu-consent-laws-german-withdrawal-waivers","EU Consent Laws & German Withdrawal Waivers",[11,1002,1003,1004,1007],{},"Selling digital goods in the EU means handling withdrawal rights. German law, for example, requires an explicit waiver before instant delivery. BoiledPlate encodes this into ",[36,1005,570],{"href":197,"rel":1006},[40]," — and treats the webhook, not the success page, as the source of truth.",[20,1009,1011],{"id":1010},"refund-workflows-subscription-state","Refund Workflows & Subscription State",[11,1013,1014],{},"Refunds and cancellations arrive as webhooks that can be delivered more than once. Idempotent handlers that update subscription state exactly once are what keep your database honest.",[20,1016,1018],{"id":1017},"multi-plan-subscription-management","Multi-Plan Subscription Management",[11,1020,1021,1022,1026],{},"Downgrades, cancellations, grace periods, dunning — these are the five decisions behind real ",[36,1023,1025],{"href":140,"rel":1024},[40],"Stripe subscriptions on Supabase",". A single-plan demo never has to answer them.",[15,1028,1030],{"id":1029},"code-quality-red-flags","Code Quality Red Flags",[20,1032,276],{"id":275},[11,1034,1035,1036,1040],{},"Structured data that returns 200 from curl but 500 in Chrome is a real class of bug — we hit exactly that with a ",[36,1037,1039],{"href":282,"rel":1038},[40],"JSON-LD source-order issue",". Ask whether a kit's SEO works in the browser, not just the server.",[20,1042,1044],{"id":1043},"canonical-urls-ogurl-tags","Canonical URLs & og:url Tags",[11,1046,1047],{},"Prerendered Markdown blogs need correct canonicals. It's the kind of quiet bug that ships to production and silently costs you rankings.",[20,1049,309],{"id":308},[11,1051,1052,1053,160],{},"The Nuxt ecosystem and Supabase SDK versions can fight. A well-maintained kit pins and tests these so you don't spend a day on ",[52,1054,321],{},[20,1056,1058],{"id":1057},"typescript-strictness","TypeScript Strictness",[11,1060,1061],{},"Loose types hide billing bugs. BoiledPlate is typed end to end in strict mode, so a mismatched Stripe payload fails at compile time, not at 2 a.m.",[15,1063,1065],{"id":1064},"product-delivery-mechanics","Product Delivery Mechanics",[20,1067,1069],{"id":1068},"github-invites-vs-clone-and-wire","GitHub Invites vs. Clone-and-Wire",[11,1071,1072,1073,1077],{},"BoiledPlate Pro delivers via instant GitHub invite — ",[36,1074,1076],{"href":110,"rel":1075},[40],"the invite is literally the product",", triggered by a Stripe webhook where some failures must throw and some must never.",[20,1079,1081],{"id":1080},"webhook-driven-updates","Webhook-Driven Updates",[11,1083,1084],{},"Because delivery is version-controlled, new features arrive as opt-in updates rather than a fresh download you have to re-customize.",[20,1086,1088],{"id":1087},"licensing-commercial-use","Licensing & Commercial Use",[11,1090,1091],{},"BoiledPlate Lite is MIT-licensed and free. Pro is a one-time purchase with lifetime updates. Both are yours to ship commercially.",[15,1093,1095],{"id":1094},"pricing-reality-check","Pricing Reality Check",[11,1097,1098,1100],{},[362,1099,672],{},": one-time cost, fixed Next.js stack, clear billing.",[11,1102,1103,1105],{},[362,1104,369],{},": €159 one-time, lifetime updates, agent-provisioned services, instant GitHub delivery.",[11,1107,1108,1110,1111,1115],{},[362,1109,72],{},": free, MIT-licensed. ",[36,1112,1114],{"href":70,"rel":1113},[40],"Clone and wire it manually"," — no updates, no support.",[11,1117,1118,1121],{},[362,1119,1120],{},"Hidden costs both miss",": your time debugging Stripe webhooks, EU consent flows, and RLS policies. That's the real invoice, and no landing page pays it down.",[15,1123,1125],{"id":1124},"who-should-use-what","Who Should Use What",[11,1127,1128,1131],{},[362,1129,1130],{},"Choose ShipFast if"," you want a Next.js landing page plus basic Stripe fast and don't need billing complexity yet.",[11,1133,1134,1137],{},[362,1135,1136],{},"Choose BoiledPlate Lite if"," you're happy wiring Supabase and Stripe by hand, want MIT freedom, and treat learning as part of the goal.",[11,1139,1140,1143],{},[362,1141,1142],{},"Choose BoiledPlate Pro if"," you value agent-provisioned services, multi-plan billing, and not maintaining plumbing code — and you're fine on Nuxt + Supabase.",[11,1145,1146],{},"The real decision is framework lock-in versus stack compatibility, and setup speed versus customization safety.",[15,1148,1150],{"id":1149},"common-pitfalls-both-kits-cant-solve","Common Pitfalls Both Kits Can't Solve",[11,1152,1153],{},"No template writes your core features. Webhook debugging still takes time even with idempotent handlers. Boilerplate RLS policies get you started but you'll redesign them as your data model grows. And email deliverability — Resend, SendGrid, or SMTP — has failure modes no starter can eliminate. Starter kits end where product work begins.",[15,1155,1157],{"id":1156},"seo-production-readiness","SEO & Production Readiness",[11,1159,1160],{},"BoiledPlate ships JSON-LD, canonicals, and og:url out of the box, plus a prerendered Markdown blog. ShipFast focuses its SEO story on the landing page. The metrics that decide the outcome are bundle size, time-to-interactive, and deployment time — not how many components ship.",[15,1162,1164],{"id":1163},"the-agent-factor-why-it-matters-now","The Agent Factor: Why It Matters Now",[11,1166,1167,1168,1171],{},"Coding agents changed which part is slow. Writing the code got fast; keeping it consistent and correct across a real integration didn't. AGENTS.md contracts keep agents on-brand with your conventions, and deterministic patches let agents do what they're best at: repeatable, rule-based customization. When you evaluate any 2026 starter, ask whether it's built to work ",[28,1169,1170],{},"with"," Claude and Cursor — not around them.",[15,1173,1175],{"id":1174},"verdict-which-saves-you-the-most-time","Verdict: Which Saves You the Most Time?",[11,1177,1178,1180],{},[362,1179,672],{}," gets you to a visual MVP — landing page, basic auth, Stripe — in hours.",[11,1182,1183,1185,1186,1189],{},[362,1184,369],{}," gets you to a ",[28,1187,1188],{},"provisioned, billing-ready"," product: services wired, webhooks tested, RLS applied, in one setup session.",[11,1191,1192],{},"The honest answer: measure time-to-revenue, not time-to-landing-page. If your next step is a marketing page, ShipFast is fine. If it's live billing that survives EU law and duplicate webhooks, that's a different tool.",[15,1194,1196],{"id":1195},"what-to-do-right-now","What To Do Right Now",[482,1198,1199,1205,1216,1222],{},[485,1200,1201,1204],{},[362,1202,1203],{},"Comparing starters?"," Download both free versions, run the setup, and time your real deploy.",[485,1206,1207,1210,1211,1215],{},[362,1208,1209],{},"Care about webhook safety?"," Read up on why ",[36,1212,1214],{"href":87,"rel":1213},[40],"your success page shouldn't touch billing state"," before you pick anything.",[485,1217,1218,1221],{},[362,1219,1220],{},"Working with agents?"," Evaluate the AGENTS.md contract — lock-in through consistency beats lock-in through code.",[485,1223,1224,1227,1228,1233],{},[362,1225,1226],{},"Launching in the EU?"," Test your consent workflow before your first paying customer, not after your first complaint. The EU's ",[36,1229,1232],{"href":1230,"rel":1231},"https:\u002F\u002Feuropa.eu\u002Fyoureurope\u002Fcitizens\u002Fconsumers\u002Fshopping\u002Fguarantees-returns\u002Findex_en.htm",[40],"consumer withdrawal rules"," are not optional.",[11,1235,1236],{},"The stack was never the hard part. Choose the kit that pays down the plumbing.",{"title":393,"searchDepth":394,"depth":394,"links":1238},[1239,1240,1245,1250,1256,1261,1266,1272,1277,1278,1279,1280,1281,1282,1283],{"id":846,"depth":397,"text":847},{"id":853,"depth":397,"text":854,"children":1241},[1242,1243,1244],{"id":860,"depth":394,"text":861},{"id":867,"depth":394,"text":868},{"id":874,"depth":394,"text":875},{"id":885,"depth":397,"text":886,"children":1246},[1247,1248,1249],{"id":897,"depth":394,"text":898},{"id":904,"depth":394,"text":905},{"id":911,"depth":394,"text":912},{"id":923,"depth":397,"text":924,"children":1251},[1252,1253,1254,1255],{"id":927,"depth":394,"text":928},{"id":939,"depth":394,"text":940},{"id":946,"depth":394,"text":947},{"id":959,"depth":394,"text":960},{"id":966,"depth":397,"text":967,"children":1257},[1258,1259,1260],{"id":970,"depth":394,"text":971},{"id":977,"depth":394,"text":978},{"id":988,"depth":394,"text":989},{"id":995,"depth":397,"text":996,"children":1262},[1263,1264,1265],{"id":999,"depth":394,"text":1000},{"id":1010,"depth":394,"text":1011},{"id":1017,"depth":394,"text":1018},{"id":1029,"depth":397,"text":1030,"children":1267},[1268,1269,1270,1271],{"id":275,"depth":394,"text":276},{"id":1043,"depth":394,"text":1044},{"id":308,"depth":394,"text":309},{"id":1057,"depth":394,"text":1058},{"id":1064,"depth":397,"text":1065,"children":1273},[1274,1275,1276],{"id":1068,"depth":394,"text":1069},{"id":1080,"depth":394,"text":1081},{"id":1087,"depth":394,"text":1088},{"id":1094,"depth":397,"text":1095},{"id":1124,"depth":397,"text":1125},{"id":1149,"depth":397,"text":1150},{"id":1156,"depth":397,"text":1157},{"id":1163,"depth":397,"text":1164},{"id":1174,"depth":397,"text":1175},{"id":1195,"depth":397,"text":1196},"2026-09-06","ShipFast reviews show strong UI, but we compare the real plumbing: webhooks, refunds, row-level security. See where each wins for your launch.",{},"\u002Fblog\u002Fshipfast-reviews-honest-comparison",{"title":838,"description":1285},"blog\u002Fshipfast-reviews-honest-comparison",[831,1291,1292,1293],"saas-boilerplate","product-launch","developer-tools","Q4PpgO8pPBa8LSQemFXLN2iC-oz1VDxk1hgcQZCBCo8",{"id":1296,"title":1297,"author":6,"body":1298,"category":6,"date":1630,"description":1631,"draft":434,"extension":435,"image":6,"meta":1632,"navigation":437,"path":1633,"seo":1634,"stem":1635,"tags":1636,"__hash__":1638},"blog\u002Fblog\u002Fshipfast-repo-free-comparison.md","ShipFast Repo Free: Real Comparison vs Paid Alternatives",{"type":8,"value":1299,"toc":1610},[1300,1303,1306,1310,1317,1320,1322,1332,1335,1339,1342,1356,1359,1363,1366,1378,1381,1385,1391,1394,1401,1405,1428,1432,1435,1443,1452,1456,1459,1470,1474,1481,1489,1493,1496,1504,1508,1526,1529,1533,1536,1540,1543,1547,1550,1554,1557,1561,1564,1581,1584,1588,1591,1595,1607],[11,1301,1302],{},"Search \"shipfast repo free\" and you'll find tutorials promising a production SaaS in five minutes, forks of forks with stale READMEs, and forum threads arguing about whether the original is even worth $129. Underneath the noise is a real question founders are trying to answer: can a free repo actually get me to a shipped product, or does \"free\" just mean I do the hard part myself?",[11,1304,1305],{},"This is an honest comparison. ShipFast and BoiledPlate are both boilerplates, but they solve different halves of the problem and target different stacks. Here's what each actually gives you — and where the gaps hide.",[15,1307,1309],{"id":1308},"why-this-matters","Why This Matters",[11,1311,1312,1313,160],{},"Picking a framework is the easy part. Next vs. Nuxt, Firebase vs. Supabase — you can settle that debate in an afternoon by choosing what you already know. The ",[36,1314,1316],{"href":795,"rel":1315},[40],"framework is not what slows you down",[11,1318,1319],{},"What slows you down is the wiring between services: Stripe webhooks that survive retries, row-level security that isn't an afterthought, refund flows, EU consent, transactional email that sends exactly once. Free repos exist, but \"free\" often means the boilerplate structure is done and the plumbing — the part that eats weeks — is left as an exercise for you. Most comparisons skip this entirely and compare landing pages.",[15,1321,854],{"id":853},[11,1323,1324,1325,124,1328,1331],{},"ShipFast started as a Next.js template for indie makers and grew into an ecosystem. The original is a paid one-time license (around $129), and there are numerous free clones circulating on GitHub — ",[52,1326,1327],{},"krishna-praveen\u002Fshipfast-template-1",[52,1329,1330],{},"vietanhdev\u002Fshipfast",", and others — each with varying maintenance and no guarantee the upstream stays alive.",[11,1333,1334],{},"The short answer to \"is there a free ShipFast repo\": yes, there are free forks. But they're community mirrors, not the maintained original, and the original itself is not free. The audience has also shifted — from solo indie hackers toward AI-powered teams shipping generative AI products.",[15,1336,1338],{"id":1337},"what-free-shipfast-clones-actually-give-you","What Free ShipFast Clones Actually Give You",[11,1340,1341],{},"A typical free clone hands you:",[482,1343,1344,1347,1350,1353],{},[485,1345,1346],{},"A React\u002FNext.js project structure",[485,1348,1349],{},"An authentication scaffold — but you wire Stripe webhooks yourself",[485,1351,1352],{},"A blog template and basic styling",[485,1354,1355],{},"Deploy instructions that get a dev server running",[11,1357,1358],{},"What they don't give you: service provisioning, email infrastructure, AI agent integration, or deterministic patching. The documentation usually assumes you already know the boring part — the integration work between services. That assumption is the whole game.",[15,1360,1362],{"id":1361},"the-hidden-cost-of-ship-in-5-minutes","The Hidden Cost of \"Ship in 5 Minutes\"",[11,1364,1365],{},"Five minutes gets you a local dev server. It does not get you production.",[11,1367,1368,1369,1372,1373,1377],{},"The gap between ",[52,1370,1371],{},"npm run dev"," and a live product that takes money is where the weeks go. As we've ",[36,1374,1376],{"href":255,"rel":1375},[40],"written about wiring a Nuxt + Supabase + Stripe stack",", each service demands real work: Supabase RLS, Stripe webhooks, Google OAuth, and email that doesn't double-send. Webhook idempotency and refund flows are almost never templated. Multi-currency, EU VAT consent, and subscription state management are left to you.",[11,1379,1380],{},"Those are exactly the parts that prevent revenue loss — and exactly the parts a \"5 minute\" clone skips.",[15,1382,1384],{"id":1383},"boiledplates-different-approach","BoiledPlate's Different Approach",[11,1386,1387,1390],{},[36,1388,41],{"href":38,"rel":1389},[40]," is a different bet on a different stack: Nuxt + Supabase + Stripe, not Next.js + Firebase + Stripe.",[11,1392,1393],{},"The bigger difference is setup. Instead of you adapting to the boilerplate, the boilerplate adapts to you. Your coding agent interviews you — name, languages, theme, billing model — then reshapes the codebase with deterministic patches. In a single session it provisions services: Stripe products and webhooks, a Supabase database with RLS, Google sign-in.",[11,1395,1396,1397,1400],{},"An ",[52,1398,1399],{},"AGENTS.md"," contract ships with it, documenting one consistent way to access data and secrets so coding agents don't drift. And because updates arrive as deterministic patches, your customizations survive framework upgrades instead of dying in a merge conflict.",[15,1402,1404],{"id":1403},"side-by-side-what-gets-shipped","Side-by-Side: What Gets Shipped",[482,1406,1407,1413,1422],{},[485,1408,1409,1412],{},[362,1410,1411],{},"Free ShipFast clone",": UI boilerplate, auth skeleton, deploy instructions. You wire the rest.",[485,1414,1415,1421],{},[362,1416,1417],{},[36,1418,1420],{"href":70,"rel":1419},[40],"BoiledPlate Lite (free, MIT)",": The same app as the paid version — Nuxt 4, Supabase, Stripe, Resend — with RLS configured, email wired, and i18n in place. You wire it up by hand.",[485,1423,1424,1427],{},[362,1425,1426],{},"BoiledPlate Pro (€159 one-time)",": All of the above plus agent-driven setup, instant delivery via GitHub, and lifetime updates.",[15,1429,1431],{"id":1430},"the-webhook-architecture-gap","The Webhook Architecture Gap",[11,1433,1434],{},"This is where free repos quietly betray you. Many include a Stripe webhook endpoint but no idempotency. Refund flows are hardcoded or missing.",[11,1436,1437,1438,1442],{},"That matters because Stripe retries. A retry loop hitting a non-idempotent handler can turn one subscription into five charge records — or five actual side effects. BoiledPlate's webhooks are signature-verified and idempotent, so repeated deliveries don't duplicate charges or drop refunds. We wrote up the real design trade-offs in ",[36,1439,1441],{"href":110,"rel":1440},[40],"a Stripe webhook where some failures throw and some never do",", because delivery semantics are the product, not a detail.",[11,1444,1445,1446,1451],{},"Stripe's own ",[36,1447,1450],{"href":1448,"rel":1449},"https:\u002F\u002Fdocs.stripe.com\u002Fwebhooks",[40],"webhook documentation"," is explicit that endpoints must be idempotent. Templates that ignore that are handing you a landmine.",[15,1453,1455],{"id":1454},"ai-agent-integration-the-silent-feature","AI Agent Integration: The Silent Feature",[11,1457,1458],{},"With a free repo, every change a coding agent suggests requires manual review — the agent has no map of your conventions, so it guesses.",[11,1460,1461,1462,1464,1465,1469],{},"BoiledPlate's ",[52,1463,1399],{}," defines how agents read database conventions, handle secrets, and apply patches. That means an agent can update the codebase without destroying your customizations. It's the difference between ",[36,1466,1468],{"href":157,"rel":1467},[40],"writing conventions for the agent"," and hoping the agent behaves. Paid templates tend to lock you in; free ones leave you doing manual patching forever. A documented contract is the third path.",[15,1471,1473],{"id":1472},"billing-that-survives-reality","Billing That Survives Reality",[11,1475,1476,1477,160],{},"Most templates hardcode billing logic or skip the edge cases. BoiledPlate handles multi-plan subscriptions, proration, refunds, and consent laws — including things like a ",[36,1478,1480],{"href":197,"rel":1479},[40],"German withdrawal waiver encoded into the pay button",[11,1482,1483,1484,1488],{},"Supabase RLS prevents billing data from leaking across accounts, so you don't hand-roll row isolation. And Stripe webhooks are the ",[36,1485,1487],{"href":87,"rel":1486},[40],"source of truth for billing state"," — not the client-side success page a user might never reach.",[15,1490,1492],{"id":1491},"the-i18n-and-seo-difference","The i18n and SEO Difference",[11,1494,1495],{},"ShipFast clones ship English boilerplate; internationalization is an add-on project you scope later. BoiledPlate includes four languages from day one — not just translated strings, but routing.",[11,1497,1498,1499,1503],{},"On SEO, JSON-LD structured data and canonical URLs are handled, which sounds trivial until a malformed JSON-LD block ",[36,1500,1502],{"href":282,"rel":1501},[40],"returns 200 from curl and 500 in Chrome",". The blog is prerendered, not client-side rendered.",[15,1505,1507],{"id":1506},"open-source-vs-paid-the-real-trade-off","Open-Source vs. Paid: The Real Trade-Off",[482,1509,1510,1516,1521],{},[485,1511,1512,1515],{},[362,1513,1514],{},"Free ShipFast fork",": Learn by tinkering, maintain your own fork, deal with stale PRs and a possibly-vanishing upstream.",[485,1517,1518,1520],{},[362,1519,72],{},": Fork it, own it — but updates are manual merges.",[485,1522,1523,1525],{},[362,1524,369],{},": Instant GitHub delivery, deterministic updates, lifetime patches.",[11,1527,1528],{},"None of these are \"free forever\" if your time has value.",[15,1530,1532],{"id":1531},"when-free-repos-make-sense","When Free Repos Make Sense",[11,1534,1535],{},"Reach for a free clone when you're learning Next.js fundamentals, building a one-off where billing and scaling don't matter, working on a team with engineers dedicated to integration, or running a stack nothing like Nuxt + Supabase + Stripe. Match the repo to the stack you actually want to learn.",[15,1537,1539],{"id":1538},"when-boiledplate-pays-for-itself","When BoiledPlate Pays for Itself",[11,1541,1542],{},"BoiledPlate earns its keep when you're a founding team of one or two who need to ship fast and stay alive on billing, plan to iterate with Claude or other agents, are crossing borders (EU VAT, GDPR consent, multi-currency), want updates without merge conflicts, and are already comfortable with Supabase + Stripe.",[15,1544,1546],{"id":1545},"the-real-question-what-costs-more","The Real Question: What Costs More?",[11,1548,1549],{},"Three weeks of plumbing for a solo founder is €3,000–€6,000 in opportunity cost, easily. BoiledPlate Pro at €159 pays for itself if it ships you a month earlier. And a free repo plus two weeks of debugging that ends in \"I never launched\" is the most expensive option of all.",[15,1551,1553],{"id":1552},"stack-alignment-matters","Stack Alignment Matters",[11,1555,1556],{},"ShipFast lives in the Next.js\u002FReact\u002FFirebase world. BoiledPlate lives in the Nuxt\u002FVue\u002FSupabase world. Pick based on what your team already knows, not on marketing. Both are valid tools; the wrong stack choice costs more than either license.",[15,1558,1560],{"id":1559},"how-to-evaluate-for-your-situation","How to Evaluate for Your Situation",[11,1562,1563],{},"Ask yourself:",[482,1565,1566,1569,1572,1575,1578],{},[485,1567,1568],{},"Do you use Supabase, or are you willing to learn it?",[485,1570,1571],{},"Have you solved webhook idempotency before?",[485,1573,1574],{},"Do you want agent-driven setup or manual control?",[485,1576,1577],{},"Will you need post-launch updates without breaking customizations?",[485,1579,1580],{},"Is i18n a day-one requirement or a nice-to-have?",[11,1582,1583],{},"Your answers point clearly at one option or the other.",[15,1585,1587],{"id":1586},"the-honest-gaps-both-sides","The Honest Gaps (Both Sides)",[11,1589,1590],{},"BoiledPlate assumes Nuxt comfort — Next.js developers will struggle. Free ShipFast clones lack maintenance, and the original could change or disappear. Neither handles advanced needs like multi-tenancy, fine-grained permissions, or marketplace mechanics out of the box. And both require you to understand your stack, not escape it.",[15,1592,1594],{"id":1593},"what-to-do-next","What to Do Next",[11,1596,1597,1598,1602,1603,1606],{},"Clone a free ShipFast repo, spin it up locally, and note what breaks the moment you try to take real money. Then read ",[36,1599,1601],{"href":801,"rel":1600},[40],"BoiledPlate's blog"," to understand the integration philosophy and where the plumbing actually lives. Ask the one question that matters: ",[28,1604,1605],{},"will this still work when I need to pivot my billing model?"," That's the real test.",[11,1608,1609],{},"And budget time, not just money. Free plus your 100 hours was never cheap.",{"title":393,"searchDepth":394,"depth":394,"links":1611},[1612,1613,1614,1615,1616,1617,1618,1619,1620,1621,1622,1623,1624,1625,1626,1627,1628,1629],{"id":1308,"depth":397,"text":1309},{"id":853,"depth":397,"text":854},{"id":1337,"depth":397,"text":1338},{"id":1361,"depth":397,"text":1362},{"id":1383,"depth":397,"text":1384},{"id":1403,"depth":397,"text":1404},{"id":1430,"depth":397,"text":1431},{"id":1454,"depth":397,"text":1455},{"id":1472,"depth":397,"text":1473},{"id":1491,"depth":397,"text":1492},{"id":1506,"depth":397,"text":1507},{"id":1531,"depth":397,"text":1532},{"id":1538,"depth":397,"text":1539},{"id":1545,"depth":397,"text":1546},{"id":1552,"depth":397,"text":1553},{"id":1559,"depth":397,"text":1560},{"id":1586,"depth":397,"text":1587},{"id":1593,"depth":397,"text":1594},"2026-09-05","Compare free ShipFast repos with paid versions. Discover what's included, what's missing, and whether free boilerplates actually save you time.",{},"\u002Fblog\u002Fshipfast-repo-free-comparison",{"title":1297,"description":1631},"blog\u002Fshipfast-repo-free-comparison",[1291,831,1637,444],"nextjs-template","Cm7S2UaRyIX991FkInVn7DNk5qWK4lHDovHuVSSS1Wo",1788742313719]