systemd, User=www-data, memory-capped); state is a single local SQLite file the bank owns.The built-in analyser (the instant default) makes zero outbound calls. Every external caller below is
opt-in and OFF by default, and a single master switch OFFLINE=1 hard-disables all of them.
| Caller | What it would send | Default & control |
|---|---|---|
| Screening engines (SafeGround / FloodGuard) | lat/lon of the asset only — never exposure, borrower or account data | live engine overlay only; fail-closed to 127.0.0.1 (on the same box) unless an operator sets PORTFOLIOCHECK_SAFEGROUND_URL / _FLOODGUARD_URL |
| Address geocoder (Nominatim) | the typed address string | OFF by default — opt in with PORTFOLIOCHECK_GEOCODE_ONLINE=1; otherwise a built-in Ghana gazetteer resolves locations locally |
| GhanaPostGPS digital-address resolver | the GhanaPost code | OFF by default — opt in with PORTFOLIOCHECK_GHANAPOST_ONLINE=1 |
| NASA POWER rainfall climatology | lat/lon only (a coarse grid cell) | OFF by default — opt in with PORTFOLIOCHECK_CLIMATE_ONLINE=1 |
| Map basemap tiles (browser only) | the map viewport — served to the viewer's browser, not from the app server | cosmetic; degrades to a 'same data in the table' note offline |
| Usage analytics (Umami) | page-view telemetry, no book data | OFF unless PORTFOLIOCHECK_UMAMI_ID is set |
'unsafe-inline' for the app's own inline scripts/styles; all reflected parameters are HTML-escaped, so no injection sink was found, and migrating inline scripts to per-response nonces is a tracked hardening item.)nosniff with server-assigned MIME.POST /api/screen — screen one property at the point of application from a loan-origination system (JSON in, JSON out; coordinates travel in the request body, not the query string, so they never land in access logs).GET /health for your monitoring.GET /health returns status, version and the offline flag; the service is memory-capped and self-restarts under systemd.OFFLINE=1 for a hard air-gap: the built-in analyser still runs fully (pure local compute); all external callers are disabled.connectors/*.py
(*_ONLINE flags, OFFLINE), security headers and routes in web/app.py,
and the full method in the Technical spec and Methodology. Screening-grade and illustrative until
calibrated on the bank's own loss data.