Skip to main content

Overview


Backend

Django with Django REST Framework over a single PostgreSQL database. Authentication is JWT, issued by djangorestframework-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.

Field app

Inspectors work in a separate progressive web app rather than the main application. It is offline-first, holding its own local store and syncing to the same API when a connection is available. See Inspector app.

Ingestion

Azure Data Factory loads delivered CSV files into staging tables, from which stored procedures validate, deduplicate and upsert into the production tables. This path does not go through the API, which is why its rules are enforced and documented separately — see How ingestion works.

Hosting

Docker Compose locally; Azure Container Apps for the shared environments, with PostgreSQL as a managed flexible server. See Environments for the production topology and how development differs.