If it doesn't need a server, it doesn't get one.
A fully static app builds to a folder of HTML and hashed assets — no Node process to keep alive. Add the Node adapter only once a route actually needs to run server code per request.
Two outputs, one build
Document + routes
HTML shell, metadata, and asset placement stay visible.
- Static output
Documents + hashed assets
No required server runtime.
- Node output
Adapter + HTTP handlers
A thin runtime boundary.
The things your orchestrator actually asks for
Liveness, readiness, and startup are separate probes, because "is the process running" and "can it serve a database-backed request right now" are different questions — answering them the same way is how you get restart loops.
Message keys for localization are typed, so a missing translation fails at build time, not in front of a user. OpenTelemetry attributes are redaction-aware by default, but you still choose the exporter and the sensitive-data policy — Askr doesn't phone data anywhere on its own.
View the Node adapter