Overview
Backend
Django with Django REST Framework over a single PostgreSQL database. Authentication is JWT, issued bydjangorestframework-simplejwt.
The backend is the only application-level writer. Both clients go through its API, and
authorisation is applied there rather than in the client.
Frontend
React with TypeScript in strict mode, built by Vite.
API types are generated, not hand-written: the frontend consumes types produced from the
backend’s OpenAPI schema, so a backend contract change surfaces as a TypeScript compile
error rather than a runtime failure.