Q&A: common questions
Questions that come up when people run this workshop on their own.
Frontend tools other than Lovable
You don't have to use Lovable. It's fast for generating a React app you can see running, but any tool that produces a frontend works. That includes Bolt, v0, Cursor, or your coding assistant writing React directly.
The rest of the workshop depends on how the frontend is built. It has to centralize its backend calls in one place and ship a mock implementation, so you can run it before the backend exists. Ask for that explicitly whatever tool you use.
Codex versus other assistants
You don't have to use Codex either. I use it, but every prompt is plain English
and runs on other assistants like Claude Code, GitHub Copilot, or Cursor. Most
assistants read the AGENTS.md file we add in
Part 4: FastAPI backend from the spec, so the house rules
follow you across tools.
Writing the spec before the backend
Writing openapi.yaml first makes the agreement between frontend and backend
explicit and gives the backend a precise target. Without it, the assistant has
to infer the backend from the frontend twice, once to build it and once every
time they disagree. With the spec, one document settles those disagreements:
whichever side doesn't match openapi.yaml is the one to fix. The details are
in Part 3: OpenAPI spec from the frontend.
Skipping the AWS deployment
You can skip the deployment in Part 11: Deploy to AWS with infrastructure as code, which is optional. After Part 9: Postgres in a container you have a full app running locally under Docker Compose, which is enough to finish the workshop. You can also point the same Compose stack at any other cloud or a managed host.
Switching the database between SQLite and Postgres
The backend picks its database from the DATABASE_URL environment variable.
Containers set it to the Postgres service, and for local development you set it
to a SQLite file in backend/.env. The tests use SQLite automatically. One
variable switches the whole app with no code change, which is why everything
routes through DATABASE_URL in Part 7: Real persistence with SQLite.
Frontend and backend disagreements
A mismatch on a field name or a request body is normal during integration. Read
the error from the browser console or the uvicorn log. Paste both the request
and the error to the assistant, and ask it to make them agree and follow
openapi.yaml. Let the spec settle the disagreement, and the debugging note in
Part 5: Connect frontend and backend walks through one such mismatch.