Every technical decision is anchored to one fact. A public service runs for years, citizen requirements only grow over time, and the next team to read the code may not be us. We choose the stack with that second moment in mind, when the contract has ended and someone else opens the project.
The citizen-facing area and the operator console live inside one Next.js project. The service indexes in search engines, opens quickly on the first visit, and the team that publishes content works from the same place where applications are reviewed. One repository, one deploy, and the line between "the page citizens see" and "the system that processes their request" stops costing coordination time between departments.
Citizen data is isolated at the database layer, and not only inside application code. Every public-service inspection turns on this point, because the question is always the same: how is separation between departments, tenants, or sensitive groups actually guaranteed. With a managed Postgres and a rule that filters access row by row, the answer fits in one screen of code and lands directly in the technical documentation that ships with the service. The same database handles accounts, attachments, and realtime updates, hosted in an EU region by contract.
Authentication wires the national identity card, banking-backed eIDs, the eIDAS node, and regional schemes into one session layer. The person signing in meets the same flow regardless of provider. The audit log records which provider was used for every event, and when the accessibility review asks how a screen-reader user reaches the application form, the answer is the same flow as everyone else, with no shortcut written only for sighted users.
Documents requiring a qualified electronic signature go through a provider compatible with eIDAS. The signed PDF sits beside the application record, kept for the retention period the regulation requires. The receipt the citizen receives is generated from the same template the back-office operator works with, and the two versions never drift apart over time.
Infrastructure costs do not balloon as traffic grows. Abuse protection and rate limiting run through a managed distributed cache, located geographically close to the people sending requests, without provisioning a dedicated server. Attachments live in an object storage hosted in an EU region, without the surprise charges other providers carry on outbound data transfer. The whole codebase is type-checked at compile time by TypeScript, an unglamorous benefit that pays off later: when the contract ends and another team opens the project, breakage shows up before release, and the new person finds their bearings without a guided tour.