What stack for a SaaS clone

What stack for a SaaS clone is the one you already know. Pick AHA, Next.js, Laravel, or Rails, then pin the first estimate so the agent stays on v1.

  • getting-started
  • vibe-coding
  • stack

What stack for a SaaS clone is the one you already write. Every product page already has four prompts. Pick the tab you can debug on Monday.

Yesterday I wrote about how Buffer works. That was a teardown. This one is a regular backlog topic. The prompt post is the skip list. This post is which flavor you paste it into.

Every product page ships the same prompt in four stacks: AHA, Next.js, Laravel, and Rails. The FAQ on those pages already says pick the stack you already know. Scope matters more than the framework.

What stack for a SaaS clone

Open the card for the app you pay for. Scroll to the complete build prompt. You get four tabs. The journeys and the first estimate stay put when you switch them. Only the adapters change.

AHA stack for a SaaS clone

Astro, HTMX, and Alpine.js. Persistence is Cloudflare D1. Files go to R2. Scheduled work is a Worker. Durable Objects only show up when the product needs a coordinated room. This site is an Astro app on Cloudflare, so that is the path I default to.

Next.js for a SaaS clone

The App Router and TypeScript. Server Components by default. Server Actions for forms. PostgreSQL through Drizzle. S3-compatible files. A real job system for anything you would retry.

Laravel for a SaaS clone

Blade, Livewire, and Alpine.js. Eloquent and migrations. Queued jobs. The scheduler for cron. Mail for the email you already send.

Rails for a SaaS clone

Hotwire. Turbo for navigation and forms. Stimulus for the small browser bits. Active Record, Active Storage, Active Job, Action Mailer. Action Cable only if you need live updates.

AHA Astro, HTMX, Alpine D1, R2, Workers NEXT.JS App Router, RSC Postgres, Drizzle LARAVEL Blade, Livewire Eloquent, Jobs RAILS Hotwire, Turbo Active Record SAME FIRST ESTIMATE Typeform, 2 hours One question at a time A table of answers The tab picks the adapters The skip list stays the same
Four tabs. One first estimate. The adapters change, the form does not.

How the four build prompts differ

The long prompt is shared. Two paragraphs swap.

One paragraph is how the interface talks to the server. AHA starts with Astro pages and ordinary HTML forms, then HTMX, then Alpine only for local state. Next.js starts with React Server Components and Server Actions. Laravel starts with Blade forms and Livewire. Rails starts with Turbo.

The other paragraph is where data lives. D1 and Workers, or Postgres and a job queue, or Eloquent and the scheduler, or Active Record and Active Job.

I would not pick a tab because it is fashionable. I would pick the one whose error messages I can read.

const typeform = {
  product: 'Typeform',
  tab: 'Laravel',
  capability: 'Astro, HTMX, D1',
  ship: 'one-question form and a response table',
}

The tab is Laravel. The capability line on the Typeform page is still Astro, HTMX, and D1. That line is the shape of the product: a form, a table, server validation. It is not a demand that you install Astro.

What capability context means

Each card has a Capability context box. Typeform says Astro, HTMX, D1. Buffer says Astro, Workers, R2. Linktree says Astro, Alpine, D1.

Those names describe the job. Typeform needs a form post and a row in a table. Buffer needs object storage for images and a cron that publishes. Linktree needs a page and a click count.

The prompt tells the agent to keep that capability through a narrow adapter for the stack you picked. Laravel Buffer still needs a scheduled job and private files. Next.js Typeform still needs a validated form and a table.

Trello is Astro, Alpine, D1. 3 hours for columns and drag-and-drop cards. $10–$17.50 a month. $120–$210 a year. Alpine is on the card because cards move in the browser. You can still ship that with Livewire or a Client Component. Do not invent a second product to get drag-and-drop.

When the stack is not a web framework

Some cards are not “pick a tab and go”.

TinyPNG Pro is Astro, Alpine, and the browser. $25–$39 a month. $300–$468 a year. 60 minutes. The originals never leave the device. The TinyPNG walkthrough is that path. If you pick Laravel, you still compress in the tab. You do not POST hero-home.jpg to a PHP worker and call that a v1.

Slack is Astro, Durable Objects, D1. $15–$18 per person per month. The Slack teardown is why the room is the hard half. Messages in a channel are a weekend, and presence and fanout still need a realtime path you can name. AHA uses Durable Objects for that room. Rails would use Action Cable. Switching tabs does not remove that work.

CleanMyMac is SwiftUI, Swift, macOS. $3.33–$9.95 a month. The cleanup loop reads disk. A Worker cannot see your node_modules. The prompt says keep native as the primary surface when the workflow needs it. Do not invent a website that pretends to clean a Mac.

THE TAB CHANGES ADAPTERS TINYPNG PRO Compress in the browser No upload, no PHP worker SLACK A realtime room you can name Durable Object or Action Cable CLEANMYMAC Swift on the Mac A website cannot see the disk
Pick any tab. TinyPNG still stays in the tab. Slack still needs a room. CleanMyMac still runs on the Mac.

How to pick a stack you already know

If you already ship Astro, take the AHA tab. If your day job is Rails, take Rails. The agent writes better code in the stack you can review.

A new framework costs you the first weekend. You spend it on config, not on the form. Typeform is 2 hours if you already know the tools. It is not 2 hours if you also learn Drizzle.

I default to AHA because this site already runs that way. I would switch if the replacement has to live next to an existing Laravel app, or if the only host I can use is a VPS with PHP. I would take Next.js if the team already reviews React pull requests and already has Postgres.

The copy button on the page follows the tab. Click Rails, then Copy Ruby on Rails prompt. Paste that, not a mix of two tabs.

Buffer on the AHA tab still has to publish later. The capability line is Astro, Workers, R2. The first estimate is 8 hours: a post queue, one network, scheduled publish. A Worker cron or a Laravel scheduler both count. A page that only stores drafts does not.

The scope post is which row you pin. Pin it after you pick the tab. The skip list from the prompt post still applies.

Build only the first estimate: a one-question form and a response table.
Use the Laravel prompt from the Typeform page.
Do not create a visual builder, payment fields, or an integrations gallery.
Stop when I can publish one form and download a CSV of answers.

Those four lines go under the copied prompt. The first three already lived in the prompt post. The second line is the only new one.

Scope matters more than the framework

“Clone Typeform in Next.js” still aims at the visual builder. Typeform is $29–$99 a month. $348–$1,188 a year. The first row is 2 hours: one question at a time and a table of answers. The third row is 2 weeks and up, with payment fields and an integrations gallery, and switching tabs does not cut that row.

Buffer is the same shape. $18–$36 a month. $216–$432 a year. 8 hours for a queue, one network, scheduled publish. A month and up for every network API. Rails or AHA, the analytics suite is still the third row.

If the agent starts a second workspace or a theme shop, stop it. Paste the non-goal again. The stack tab is not a substitute for a stop line.

The guardrail stays in every flavor. Typeform wants server-side validation, a rate limit, and a honeypot. Buffer wants encrypted tokens and idempotent publish jobs. TinyPNG wants the file to stay on the device.

Linktree is 30 minutes on any of the four tabs: a links list, an avatar, one theme. $9–$24 a month. The week-long version is billing and a theme marketplace. You are not selling themes.

Start now

Go to the audit. Open the app you already pay for.

Pick the tab you already write. Copy the prompt. Pin the first estimate.

Ship that slice in the stack you can debug. Cancel when the paid tab has been closed for a week.