Operations
Running GovBridge: hosting in the Netherlands, environment variables, size limits, timeouts, caching and the error messages of the adapter.
GovBridge is a lean, stateless Node service. rooom AG operates it in a data centre in the Netherlands.
Hosting
| Aspect | Value |
|---|---|
| Hosting provider | Railway (headquartered in the USA) |
| Region | europe-west4 (Netherlands) |
| Public URL | https://govbridge.sovrgpt.com |
| Health check | GET /healthz → 200 {"status":"ok","protocols":["cmis","fit-connect"]} (served protocols) |
| Image | private GHCR image, pulled with registry credentials |
| TLS | Let's Encrypt certificate, issued automatically |
The dispatcher is stateless; several instances can run in parallel.
Configuration (environment variables)
| Variable | Default | Purpose |
|---|---|---|
PORT | 8080 | HTTP listen port. |
SUPABASE_URL | — (required) | Supabase project URL (endpoint lookup). |
SUPABASE_SERVICE_ROLE_KEY | — (required) | Service role key for the endpoint lookup. |
GOVBRIDGE_ENCRYPTION_KEY | — (required) | 32-byte base64 AES key. |
GOVBRIDGE_PROTOCOLS | cmis | Comma-separated list of served protocols. |
BACKEND_TIMEOUT_MS | 15000 | Hard timeout per DMS HTTP call. |
LOG_LEVEL | info | error / warn / info / debug. |
SENTRY_DSN | — (optional) | Error monitoring (region DE). |
Size limits
Hard limits protect memory and response time:
| Limit | Value | Where |
|---|---|---|
| JSON-RPC request body | 1 MB | transport (single call or batch) |
Inline text (cmis_dokument_holen) | 32 KB | content.ts (MAX_TEXT_BYTES) |
| Inline binary (base64) | 5 MB | content.ts (MAX_INLINE_BYTES) |
| CMIS JSON response | 4 MB | cmis/client.ts (MAX_JSON_BYTES) |
| FIT-Connect JSON response | 1 MB | fit-connect/client.ts (MAX_JSON_BYTES) |
FIT-Connect application data (fit_antrag_senden) | 5 MB | fit-connect/index.ts (MAX_INLINE_BYTES) |
| FIT-Connect attachments | max. 10, 5 MB each | fit-connect/index.ts (MAX_ATTACHMENTS, MAX_INLINE_BYTES) |
| OAuth token response | 64 KB | backend-auth.ts |
Content policy for cmis_dokument_holen
- Text ≤ 32 KB → inline as a text resource.
- Allowlisted binary type ≤ 5 MB (PDF, DOC/DOCX, XLS/XLSX, PNG, JPEG) → base64 blob.
- Anything larger and MIME types not on the list → a reference only
(
cmis://<objectId>) with metadata, without the bytes.
Timeouts & caching
- Hard upstream timeout (
BACKEND_TIMEOUT_MS, default 15 s) viaAbortController: a hanging backend does not block the chat. - The backend OAuth token is kept per endpoint in process RAM and renewed 30 s
before it expires (
SAFETY_WINDOW_MS). - The CMIS repository service document is cached for 5 minutes (
REPO_TTL_MS), saving one round trip per call. - The adapter never caches business content. Every call reads live from the DMS.
Error behaviour
Errors come back as a tool result with isError: true, not as a protocol abort, so the
model can react to them. The messages are always in German, because the service is
built for German public administration:
| Cause | Message to the model (German, verbatim) | Meaning |
|---|---|---|
| Backend timeout | „Das Fachverfahren hat nicht rechtzeitig geantwortet (Timeout).“ | The line-of-business system did not answer in time. |
| Backend HTTP/network error | „Fehler beim Zugriff auf das Fachverfahren: …“ | Error while accessing the line-of-business system. |
| Missing parameter | „Parameter 'name' fehlt.“ | Parameter 'name' is missing. |
| Write access blocked | „Schreibzugriff ist für diesen Endpoint nicht freigegeben.“ | Write access is not enabled for this endpoint. |
| Unknown tool | „Unbekanntes Tool: name“ | Unknown tool: name. |
At the transport level: an invalid route or method → 404/405, a failed tenant
resolution → a generic 401, pure notifications → 202 without a body.
Availability check
curl -s https://govbridge.sovrgpt.com/healthz
# → {"status":"ok","protocols":["cmis","fit-connect"]}The initialize handshake against a specific endpoint is described in
Setup.