Project tutorial
Build a FastAPI Blog
Build Rivermouth Dispatch with FastAPI, Jinja2, HTMX, Pico.css, SQLAlchemy, session cookies, owned post CRUD, search, password recovery, and a Render deployment.
How this project works
Rivermouth Dispatch is an original teaching blog in twelve complete snapshots. Clone once and run any numbered folder without rebuilding earlier stages.
The path starts with FastAPI and routing, adds Jinja2 and Pico, then introduces isolated Postgres databases. Later parts add sessions, media, ownership, pagination, search, reset tokens, and Render deploy notes.
Snapshots 4–12 seed [email protected] and [email protected] with password123.
Local Postgres runs through Docker Compose on host port 5435 with databases rivermouth_01–rivermouth_12.
Start with part 1 Open GitHub repo
Parts in order
Work through the parts in sequence. Each lesson explains the ideas in plain language, then points you to a complete runnable snapshot on GitHub for that stage.
- Part 1: Getting StartedCreate a minimal FastAPI app on port 8001.
- Part 2: RoutingOrganize page routes with an APIRouter.
- Part 3: Layout and UIRender Jinja2 pages with Pico.css and HTMX.
- Part 4: Data LayerPersist authors and posts with SQLAlchemy and PostgreSQL.
- Part 5: Feed and DetailBuild a database-backed feed and post detail pages.
- Part 6: RegistrationValidate accounts and store bcrypt password hashes.
- Part 7: Login and SessionsAuthenticate with signed session cookies.
- Part 8: Profiles and MediaShow author profiles and accept constrained avatar uploads.
- Part 9: Posts CRUD and OwnershipCreate, edit, and delete posts with owner authorization.
- Part 10: Pagination and SearchPaginate the feed and search post text.
- Part 11: Password ResetIssue expiring one-use password reset tokens.
- Part 12: DeployPrepare Rivermouth Dispatch for Render and managed Postgres.