# Frontend & Backend (/academy/frontend-backend)



The [builder](/builder) asks for a frontend and a backend as two different questions. That is not pedantry. It is a restaurant.

**The frontend is the room people sit in.** Open the app the [CLI](/academy/cli) just scaffolded. The header, the sign-in pill, the empty state that says "add a todo," the check that fills when you tap it. That's the dining room — the menu, the host stand, the table. A guest can point, tap, leave. They never walk into the kitchen.

Nothing on that menu cooks at the table.

Tap "Add todo" and you have not saved a row. You have handed a ticket to a waiter. The waiter has no stove. He walks it to the [API](/academy/api) window, the kitchen does the work, and a plate comes back — a new item, or a polite no.

**That kitchen is the backend.** The [database](/academy/database). The rules. The [server](/academy/server) they run on. The hallway guests are not supposed to see.

Anything that has to be true tomorrow happens back there:

* Load this user's whole list, not a fake one
* Decide if the session badge is real
* Take a Polar or Stripe payment
* Send the mail after they have already closed the tab

The frontend is allowed to pick the paint and the type. It is not allowed to be the source of truth.

A night-market cart can cook one thing in front of you. A product cannot. It needs a pantry that remembers yesterday's tickets, a person who can refuse a bad card, a way to mail the receipt after the guest has left. That work stays out of sight on purpose.

**What you're actually choosing**

When the builder asks Next, TanStack, Nuxt, Expo, it is asking which floor plan you want for the dining room. Same job. Different chairs.

When it asks Hono, Express, Fastify, Elysia, it is asking which kitchen kit. Convex is a kitchen that also owns the pantry and the ticket rail. `--backend self` tucks the kitchen into the same building as the dining room — still a kitchen. `--backend none` is a dining room serving photographs of food. Fine for a still. Fatal the second a judge clicks twice.

**How you tell which side broke**

A *frontend* problem is the one you can screenshot. A button that ignores you. Copy sitting on top of a hero. Fine on a laptop, junk on a phone. Food is still coming out. The room just looks like it closed for renovation. Annoying, usually a short fix.

A *backend* problem empties every table at once. The Hono process never came up. Convex is unreachable. The database URL points at nothing. The chairs are still there. The lights are on. Nobody is getting a plate — and if you were sharing that kitchen with other apps, they go dark too.

So when the demo dies, look once: is the room messy, or did the tickets stop coming back?

The room is the experience. The kitchen is the product.
