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