Worksheet

A tier, a shape, and what to refuse.

Every recipe is on this page — that is also the catalog. Take the six questions to feature the one that fits your idea.

Tier 0 — Local

A file on your machine

Just you, nothing shared, not charging. The honest default is a page, a script, or a notebook that never leaves the laptop. A URL is optional and can wait.

Default shape

One HTML file, or a Python/JS script, or a local SQLite file. Open it. Run it. That is hosting.

One alternative

If you already want a link for yourself, skip to static-info and put the same file on Pages. Do not add an account first.

You don’t need

A framework, a database product, auth, Docker, a domain, CI. You especially do not need Next.js so it “feels like a real app.”

Napkin

10 uses: $0. 100 uses: $0. 10k uses: still $0, and also still just you, so that number is a fantasy — if it happens, you now have a different who.

Read next

Where the code runs · Static site, actually

Tier 1 — Static + glue

Files on a CDN

People read what you published. The site does not have to remember them. This is the recipe for docs, essays, landing pages, and this site.

Default shape

HTML and CSS, maybe Markdown compiled by Astro or Eleventy, hosted on Cloudflare Pages or GitHub Pages. Multi-page is fine. A click is a navigation.

One alternative

Hand-written HTML with no compiler, if the page count stays small and you want the exhibit. Hugo or Zola if you already like them and do not mind correcting your editor.

You don’t need

React, a database, auth, HTMX (there is no server to talk to), Alpine, a view-layer “app.” You do not need a JSON API to render an essay.

Napkin

10 visits: $0. 100: $0. 10k/month: still $0 on a free Pages tier. A million is a bandwidth conversation, not a rewrite.

Read next

Static site, actually · Where the code runs

Tier 1–2 — Static UI + a tiny backend

Your data, one small backend

Just you (or each person alone), but you want the data on another device. That is already “a backend.” It is not yet a product.

Default shape

A static UI plus one worker or one small process that talks to SQLite or a hosted Postgres, with the simplest login you can stand (a magic link, even a password in an env var if it is truly only you).

One alternative

Stay on the device: a local file syncs with the folder tool you already use. If that is enough, you wanted local.

You don’t need

Multi-tenant anything, an ORM-for-its-own-sake, Kubernetes, “event sourcing your notes.” Do not invite the public to a database you have not backed up.

Napkin

10 people: $0–5. 100: $5–15 (the box or the Postgres). 10k solo-users: you have a product-shaped bill and should re-run the tree as strangers.

Read next

Where the code runs · Static site, actually

Tier 2 — One process

One process, one database

People you know save things, maybe they share a list. This is the classic web app. It is allowed to be Rails, Laravel, Flask, or SvelteKit. It is not required to be a fleet.

Default shape

One long-running process on Railway, Fly, or a $5 VPS. SQLite until you feel pain, then managed Postgres. Cookie sessions if you must log people in. HTML from the server is a complete architecture (Hotwire, HTMX, or just forms).

One alternative

If the “app” is still mostly pages with a couple of forms, a static site plus one worker may be enough. Do not start at Next.js + Prisma + a queue because a tutorial did.

You don’t need

Microservices, Redis “for cache,” a separate frontend repo, Kubernetes, or realtime. Friends will text you when it is down.

Napkin

10 friends: $5–10. 100: $10–25. 10k strangers-who-used-to-be-friends: you have wandered into public-social and should budget abuse and backups.

Read next

Where the code runs · Static site, actually

Tier 3 — A product

Shared state among strangers

Anyone can show up and touch someone else’s stuff. That is a product whether or not you charge. Abuse, spam, and “please don’t lose my data” are now your job.

Default shape

Still one app and one database. Add email you can actually deliver, backups you have restored once, and a boring auth option. Stay on one process until a specific bottleneck names itself.

One alternative

If strangers only read, you wanted static-info. Do not build accounts so a comments box can exist; often you should refuse the comments box.

You don’t need

A service per noun, multi-region, Kafka, “scale-ready” from day one. You need a ToS, a backup, and a way to ban someone.

Napkin

10 users: $10–20. 100: $20–40 plus email. 10k: $50–200 and your time, which is the real cost. Rewrite when a page is slow, not when a thread told you to.

Read next

Where the code runs · Why this site talks you down

Tier 3 — A product

A ledger and an email

People will pay you. That forces a ledger, a refund path, and mail that arrives. It does not force a rewrite into microservices.

Default shape

The same one-process app as friends-crud, plus Stripe (or equivalent), transactional email, and accounts you can support. Still one database. Jobs for “receipt fell over.”

One alternative

If you are selling a file or a seat in a newsletter, Gumroad / a shop / Buttondown may be the whole backend. Do not build a SaaS to sell a PDF.

You don’t need

Your own payment processor, a data warehouse, an event bus, or a mobile app. You need a number people can be refunded from.

Napkin

10 paying: $20–40 + ~3% of revenue. 100: same shape, more support. 10k: the bill is support and compliance, not Kubernetes.

Read next

Where the code runs · About

Tier 2 — One process (plus a clock)

A clock, then a place to put results

Work happens while nobody is looking. Pages cannot do that. You need something that wakes on a schedule or pulls from a queue, and somewhere the output lands.

Default shape

One process with a cron, or a scheduled worker (Cloudflare Cron, GitHub Actions if it is truly batch, a sidekiq/rq if you already have the app). Store results in the same database or as files. The UI can still be static.

One alternative

If the “job” is you clicking a script, stay at local until the clicking hurts. Scheduled does not mean distributed.

You don’t need

Kubernetes CronJobs, a separate “jobs service,” or websockets so you can watch a progress bar. Refresh a page. Send an email when it is done.

Napkin

10 runs/day: $0–5. 100: $5–15. 10k: you are paying for whatever the job calls (APIs, tokens, bandwidth), not for the cron itself.

Read next

Where the code runs · Static site, actually

Tier 2–3 — different sport

A live connection is a different sport

You said it has to keep a connection open. CRUD tutorials will lie to you. This is closer to a game server than to a form.

Default shape

A long-lived process (Fly, a VPS, anything that will not freeze a function mid-handshake) or a hosted realtime fabric if you truly only need presence/fanout. State lives in memory plus a DB you can rebuild from. Test two laptops in the same room before you buy a platform.

One alternative

If “realtime” means “I didn’t want to refresh,” you wanted polling or a form. That is friends-crud. If it means chat with a model, see the chat modifier — that can still be request/response.

You don’t need

Next.js as the simulation. A separate microservice per packet. WebRTC on day one unless the idea is media.

Napkin

10 concurrent: $5–20. 100 concurrent: $20–100 and you will feel sockets. 10k concurrent: this is a company, or a platform bill that looks like one.

Read next

Where the code runs — especially “always-on server” versus “function that wakes up.”

Tier 2 — One process (token-shaped bill)

One backend that holds the key

The model is the product. That does not make the stack a research lab. It makes the bill look like usage, and it makes the secret the whole game.

Default shape

One backend (a process or a worker) that calls the model, meters usage, and never ships the key to the browser. The UI can be almost static. Log prompts you are willing to see in a postmortem. Cap spend per user on day one.

One alternative

If the model is a garnish (summarize this page), you wanted whatever recipe you would have without it, plus the “few calls” modifier — not this card.

You don’t need

A vector database on day one, a fleet of agents, LangChain because the README said so, or Python because “AI is Python.” TypeScript on a worker is a complete answer. Python is a complete answer. The language is not the product.

Napkin

10 chatty users: often more than your hosting. 100: the token line will dominate the VPS line. 10k: you are a reseller of someone else’s GPU unless you have a cache, a cap, and a price. HTML was never the expensive part.

Read next

Where the code runs · Why the oracle is not a model

Start over · share this page; the query string is the save file.