Skip to main content

Configuration

Configure the managed deployment in infra/docker/.env and the admin panel. Start from the tracked example:

cp infra/docker/.env.example infra/docker/.env
chmod 600 infra/docker/.env

The CLI loads this file without overriding existing shell variables and passes it explicitly to Compose. Generated configuration lives below infra/docker/.trusted-config-current/, so a bare docker compose up from the repository root does not address the stack. Use the CLI commands in Managing services.

Compose substitutes ${VAR} references when containers are created. Per-service settings are resolved during rendering; admin values must have been applied to a configuration generation before a CLI render can preserve them. Integration settings and credentials usually belong in /admin/integrations. Environment overrides take precedence within those configuration layers. Selected local service endpoints can take precedence over an integration's endpoint setting; see Backend endpoint overrides.

Apply configuration after editing

Changing .env does not update running containers. Run pnpm openmapx services start <affected-service> to render and apply the new configuration. Recreate app-api as well when its environment or applied service selection changes. services restart only restarts the existing container.

Core / required​

Configure these before the first render or start. Replace example values and generate independent secrets for this deployment.

VariableDescriptionRequired / Default
DOMAINPublic domain. Drives Traefik routing, the auth URLs (BETTER_AUTH_URL, PASSKEY_RP_ID, PASSKEY_ORIGIN), the web app's NEXT_PUBLIC_API_URL, tile-server URLs, and the outbound contact identity (the contact address in third-party User-Agent strings and the email From fallback). Point DNS at the host; add an AAAA record only with working IPv6.Default localhost
ACME_EMAILContact email for Traefik's automatic Let's Encrypt TLS certificates.Default admin@example.com
POSTGRES_PASSWORDUnique password for the PostgreSQL/PostGIS database (used by postgis, app-api, and data-manager). Generate it before the first render with openssl rand -hex 32; it must be at least 24 characters and must not be a known placeholder or match POSTGRES_USER.Required
OPENMAPX_HOST_DIRAbsolute host path of the OpenMapX repo checkout. The ops-agent container shells out to docker compose and mounts this path at the same path inside the container, so generated bind sources like ./data resolve correctly. Find it with pwd from the repo root.Required (no default)
DOCKER_GIDThe host's docker-socket group id. The ops-agent container mounts the Docker socket (/var/run/docker.sock) as a non-root user and must join this group, or host container lifecycle operations fail with "permission denied". Find it with stat -c %g /var/run/docker.sock. Compose has no fallback, so it must be set; .env.example pre-fills 999.Required
Domain and TLS networking

Traefik serves HTTP/3 (QUIC) on UDP/443 and the OpenMapX Docker network is dual-stack. For IPv6 to reach published ports, the Docker daemon needs ip6tables enabled and working host IPv6 forwarding/firewall rules. Review the Docker daemon configuration before changing it; restarting Docker affects all containers on that host.

Compose's required-variable check is not a strength check

The ${VAR:?required} syntax rejects an unset or empty value only. It does not recognize a public example value, a username reused as a password, or a weak short value. openmapx compose render, service start, and openmapx check validate deployment secrets before rendering or checking the stack. Production database bootstraps repeat the database check, while the API and data-manager repeat the checks for their respective application secrets, so direct Compose use cannot bypass the policy. Errors report only the policy reason, never the credential or full database URL.

Secrets​

Authentication and internal service secrets. BETTER_AUTH_SECRET and DATA_MANAGER_AUTH_TOKEN must each contain at least 32 characters in production; the CLI validates both before deployment and their services validate them again at startup. Generate each with the command shown.

VariableDescriptionRequired / Default
BETTER_AUTH_SECRETBetter Auth session-signing key. The API refuses to start without it and rejects production values shorter than 32 characters. Generate with npx @better-auth/cli@latest secret.Required
OPENMAPX_SECRETS_KEY32-byte key encoded as 64 hexadecimal characters for the secret vault, including personal timeline credentials. Preserve it across restarts and restores; losing or changing it makes existing encrypted values unreadable. Generate with openssl rand -hex 32.Required (to use the secret vault)
DATA_MANAGER_AUTH_TOKENShared secret between app-api and the data-manager service; every data-manager mutation endpoint (downloads, hardlinks, dataset reload, conversions) requires it. Production rejects values shorter than 32 characters; development generates a random ephemeral token when unset. Generate with openssl rand -hex 32.Required in production
OPENMAPX_LOCAL_ADMIN_TOKENShared secret for the CLI ↔ API loopback admin short-circuit. When set, loopback requests only gain admin if they carry a matching X-OpenMapX-Local-Admin header (a CSRF guard); the CLI attaches it automatically. Without the token in production, the loopback bypass is denied; admin API calls need normal session authentication. Generate with openssl rand -hex 32.Optional (recommended). Default unset

Docker & host wiring​

How the containers find the host, the repo, and bind-mounted volumes. The required pieces of this group are listed under Core / required (OPENMAPX_HOST_DIR, DOCKER_GID); the rest are optional.

VariableDescriptionRequired / Default
OPENMAPX_CUSTOM_INTEGRATIONS_DIRContainer path where community integrations (installed by the admin panel or CLI) are mounted. Leave at the default unless you also change the app-api bind-mount target.Default /app/custom_integrations
UIDHost UID for bind-mounted volumes (Linux). macOS/Windows usually don't need this; Docker Desktop handles ownership.Optional. Commented 1000
GIDHost GID for bind-mounted volumes (Linux). Same caveat as UID.Optional. Commented 1000
DATA_MANAGER_URLBase URL app-api uses to reach the data-manager. Compose overrides this to the service-network DNS name automatically.Default http://localhost:4000 (pnpm dev); compose sets http://data-manager:4000
DATA_MANAGER_PLAINTEXT_HOSTSComma-separated hostnames that may be reached over plain http:// in addition to localhost, 127.0.0.1, ::1 and data-manager. DATA_MANAGER_URL must otherwise be https://; credentials, path prefixes and query strings are always rejected.Unset
OPENMAPX_FETCH_JSON_MAX_BYTESCeiling in bytes for upstream JSON responses fetched by integrations that do not set their own limit. Lower it to tighten memory use, or raise it for a large regional feed; a raised value is logged once at first use.8 MiB
OPENMAPX_RELEASESelect main, preview, an exact prerelease such as v0.1.0-alpha.1, a metadata sha256:<64hex> digest, or explicit local opt-out. Missing selections fail; stable/latest are unavailable. Existing valid overlays remain deliberate pins until reselected or cleared.main
OPENMAPX_RELEASE_MANIFEST_REPOSITORYTrusted manifest repository without tag/digest. Its namespace must contain every one of the seven images; forwarded to the operations agent.ghcr.io/openmapx/release-manifest
OPENMAPX_ENABLED_SERVICESPin a specific service selection (comma- or space-separated) for CI/repeatable deploys. Wins over the service-selection.json written by the admin UI / CLI.Optional. Default: service-selection.json
OPENMAPX_DOCKER_CONFIG_DIRHost directory holding Docker registry credentials, mounted into ops-agent at /home/node/.docker so ops-agent image pulls can authenticate against private container registries (such as private GHCR images). The directory must be readable by the ops-agent UID.Default /root/.docker
OPENMAPX_PROXY_NETWORKDocker network of a reverse proxy the host already runs (a Traefik with the Docker provider that owns ports 80/443). When set, the bundled traefik service is never selected, every routed service also joins this network, and its labels name it as the network to route over. See Behind an existing reverse proxy.Optional. Default unset (bundled Traefik)
OPENMAPX_PROXY_ENTRYPOINTEntrypoint the routed services' Traefik labels use. Only an operator-run proxy reads the labels.Default websecure
OPENMAPX_PROXY_CERT_RESOLVERCertificate resolver the routed services' Traefik labels use.Default letsencrypt
<SERVICE>_HOST_PORTMoves a service's published loopback port when the host already uses it, e.g. DATA_MANAGER_HOST_PORT=14000. A service that publishes several container ports takes <SERVICE>_HOST_PORT_<CONTAINER_PORT>. The CLI reaches the data-manager on DATA_MANAGER_HOST_PORT; move it there rather than setting DATA_MANAGER_URL, which app-api also reads.Optional. Default: the manifest's port

Resource allow-lists​

The ops-agent's administrative resource inventory defaults to Germany. Set OPENMAPX_ALLOWED_REGIONS (for example europe/germany,europe/france) and OPENMAPX_ALLOWED_COUNTRIES (for example DE,FR) to permit the regions/countries you intend to manage through that surface, then recreate ops-agent. Setting OPENMAPX_REGION or transit countries alone does not expand these allow-lists.

Changing release selection​

main selects the development channel. preview selects the latest deliberately published named prerelease and fails if none exists. Changing configuration does not silently replace an existing overlay: inspect pnpm openmapx compose release --status, then explicitly reselect with pnpm openmapx compose release or clear it when intentionally leaving release mode.

Generated secret files and recovery​

compose render creates platform files under infra/docker/secrets/, including Redis authentication, distinct ops-agent tokens, offline-package signing, erasure-journal, subject-export, privacy-backup, and runner capability keys. Keep their ownership aligned with the container UID. Do not replace them as a routine configuration refresh. Managed Dawarich credentials are provisioned through its dedicated admin setup, not this renderer.

Ordinary volume backups do not include .env, this secret directory, the configuration generations, or the erasure journal. Preserve required deployment keys and recovery state through a protected operator recovery procedure. Keep subject-export artifacts excluded from backups. See Backup and restore before testing a restore or rotating encryption keys.

Authentication & OAuth​

Optional social-login providers. Each requires an OAuth app registered with the provider.

VariableDescriptionRequired / Default
OSM_CLIENT_IDOpenStreetMap OAuth client id. Register at the OSM OAuth applications page.Optional. Commented
OSM_CLIENT_SECRETOpenStreetMap OAuth client secret.Optional. Commented
MAPILLARY_CLIENT_IDMapillary OAuth client id. The same app can issue client access tokens for the imagery integrations. Register at the Mapillary developer dashboard.Optional. Commented
MAPILLARY_CLIENT_SECRETMapillary OAuth client secret.Optional. Commented

Redirect URLs​

Each provider redirects back to <BETTER_AUTH_URL>/api/auth/callback/<provider>. Register exactly this URL with the provider: the OpenStreetMap application's Redirect URIs and the Mapillary application's Callback URL. Sign-in and account linking fail with any other path. OpenStreetMap shows "The requested redirect URI is malformed or doesn't match the client redirect URI". Mapillary sends the person to the registered URL, which then answers 404.

In Docker Compose, port 3001 has no direct host port binding; external traffic routes through Traefik, so use your public domain (or localhost when running without TLS):

https://<DOMAIN>/api/auth/callback/openstreetmap
https://<DOMAIN>/api/auth/callback/mapillary

For a standalone local API dev setup (pnpm dev) that is:

http://127.0.0.1:3001/api/auth/callback/openstreetmap
http://127.0.0.1:3001/api/auth/callback/mapillary

OpenStreetMap contributions​

Lets a signed-in person publish a curated correction to an existing OpenStreetMap element, or a public OSM note, using their own linked account. See the feature overview and the developer notes.

Both flags default to off. Nothing is written to OpenStreetMap until an operator turns them on deliberately.

VariableDescriptionRequired / Default
OSM_CONTRIBUTIONS_ENABLEDMaster flag. Controls whether the UI is discoverable and the contribution routes answer.Optional. false
OSM_DIRECT_EDITING_ENABLEDIndependent kill switch for element writes. Turning it off does not convert a requested edit into a note.Optional. false
OSM_API_URLOpenStreetMap API origin.Optional. https://api.openstreetmap.org
OSM_WEB_URLOpenStreetMap website origin (element, changeset, note and editor links).Optional. https://www.openstreetmap.org
OSM_DISCOVERY_URLOpenID discovery document used for authorization.Optional. https://www.openstreetmap.org/.well-known/openid-configuration
OPENMAPX_VERSIONValue reported in each changeset's created_by tag, as OpenMapX <version>. 1 to 64 characters from [A-Za-z0-9._+-].Optional. 1.0
RATE_LIMIT_OSM_CONTRIBUTION_READ_MAX / _WINDOW_MSPer-user capability/context/category reads.Optional. 60 / 600000
RATE_LIMIT_OSM_CONTRIBUTION_PREVIEW_MAX / _WINDOW_MSPer-user previews.Optional. 30 / 600000
RATE_LIMIT_OSM_CONTRIBUTION_PUBLISH_MAX / _WINDOW_MSPer-user direct publishes.Optional. 10 / 600000
RATE_LIMIT_OSM_CONTRIBUTION_NOTE_MAX / _WINDOW_MSPer-user note creations.Optional. 5 / 600000

Registering the OAuth application​

Contributions reuse the same OAuth app as OpenStreetMap sign-in (OSM_CLIENT_ID / OSM_CLIENT_SECRET). Without both credentials the feature reports itself disabled even if the flags are on. Its redirect URL is the one under Redirect URLs.

Ordinary sign-in requests only openid read_prefs. The write permissions (write_api, write_notes) are requested incrementally, the first time someone actually contributes.

OpenStreetMap only grants scopes that are registered on the application, so enable all four permissions on it: Sign in using OpenStreetMap (openid), Read user preferences (read_prefs), Modify the map (write_api) and Modify notes (write_notes). Without the write permissions, sign-in keeps working but contributing fails with an invalid_scope error from OSM. Adding them later keeps the existing client ID and secret.

Testing against the OpenStreetMap development API​

The development instance is a separate OpenStreetMap deployment: it needs its own OAuth application and its own test accounts, and those accounts must accept that instance's Contributor Terms separately.

Change all three origins together:

OSM_API_URL=https://master.apis.dev.openstreetmap.org
OSM_WEB_URL=https://master.apis.dev.openstreetmap.org
OSM_DISCOVERY_URL=https://master.apis.dev.openstreetmap.org/.well-known/openid-configuration

Setting only OSM_API_URL while leaving the production website and discovery URLs is invalid and rejected at startup because it mixes production identity with development data. The API also refuses credentials, query strings, fragments and non-HTTP(S) schemes in any of the three.

Never point a deployment that has the flags on at production OpenStreetMap for testing.

Public feature discovery​

The public /api/capabilities response carries a single bounded bit, features.osmContributions, which is true only when the master flag and OAuth configuration are set. It never exposes the direct-write kill switch or anyone's linked-account state.

Token storage and the auth secret​

Provider OAuth tokens are encrypted at rest using the deployment's BETTER_AUTH_SECRET. Keep that secret protected and stable: rotating it intentionally makes existing stored tokens undecryptable, and affected users must re-link their OpenStreetMap (or other OAuth) account. See upgrading for what happens to tokens stored before encryption was enabled.

Redis​

Redis is recommended but not required. It backs the short submission lock and the idempotency record. Without it, a bounded in-memory fallback is used, which is correct for a single instance. Contribution safety does not depend on Redis in either case; writes also require the exact OpenStreetMap element version.

Map style & tiles​

Tile-source selection and keys. The NEXT_PUBLIC_* values (except NEXT_PUBLIC_API_URL) are read per-request via the web app's EnvProvider, so runtime changes reach both server and client components without a rebuild.

The default map style is the bundled OpenMapX style. If self-hosted tile URLs are not configured and TileServer GL is not enabled, auto uses MapTiler with a configured server-side key and OpenFreeMap without one. The hosted preference is configurable in Admin Settings → Map; BASEMAP_PROVIDER overrides admin. Set NEXT_PUBLIC_TILES_URL and NEXT_PUBLIC_MAP_STYLE_URL to run the base map fully on your own tile stack.

VariableDescriptionRequired / Default
NEXT_PUBLIC_STYLE_PROVIDERSelects the style. openmapx (default) uses the bundled light/dark styles. maptiler loads a complete hosted style only when MapTiler is the resolved vector provider. Self-hosted and OpenFreeMap vectors always use the owned styles.Default openmapx
BASEMAP_PROVIDERHosted vector preference: auto (MapTiler with a configured key, OpenFreeMap without one), openfreemap, or maptiler. Valid env > admin > auto; invalid env does not lock admin editing. Self-hosted tiles always win. Reload after admin changes.Optional. Commented
MAPTILER_KEYMapTiler Cloud API key for the hosted style/tile fallback and MapTiler layers. Also settable in /admin/settings → Map. Leave commented to manage from the admin UI; uncomment to lock a value (env wins).Optional. Commented
NEXT_PUBLIC_MAP_STYLE_URLGlyph server base URL; the owned style appends /fonts/{fontstack}/{range}.pbf. Built-in TileServer GL supplies this automatically. Does not select the vector provider.Optional. Commented
NEXT_PUBLIC_TILES_URLSelf-hosted TileJSON URL used as the vector source by the OpenMapX style. Always wins over hosted selection. If omitted, enabled TileServer GL is discovered on the web origin (not the API origin), otherwise the selected hosted source is used.Optional. Commented
NEXT_PUBLIC_TRAFFIC_TILE_URL_TEMPLATEOverride URL template for the traffic raster layer.Optional. Commented
NEXT_PUBLIC_CYCLOSM_TILE_URL_TEMPLATEOverride URL template for the CyclOSM layer.Optional. Commented
NEXT_PUBLIC_TERRAIN_DEM_TILEJSON_URLOverride DEM TileJSON URL. Defaults to proxied Mapterhorn for self-hosted/OpenFreeMap tiles, or proxied MapTiler with MapTiler vectors.Optional. Commented
NEXT_PUBLIC_TERRAIN_DEM_TILE_URL_TEMPLATEOptional {z}/{x}/{y} tile URL for browser-generated contours from a custom DEM. Otherwise, read from TileJSON. Use a local URL to keep tile requests on your own origin.Optional. Commented
NEXT_PUBLIC_TERRAIN_DEM_ENCODINGCustom DEM encoding: mapbox (default) or terrarium.Optional. Commented
NEXT_PUBLIC_TERRAIN_CONTOUR_TILEJSON_URLOptional vector contour TileJSON with MapTiler-compatible contour lines; overrides generated contours.Optional. Commented
NEXT_PUBLIC_TERRAIN_ATTRIBUTION_NAMEVisible terrain-data provider credit; defaults to © Mapterhorn for self-hosted/OpenFreeMap tiles or © MapTiler with MapTiler vectors.Optional. Commented
NEXT_PUBLIC_TERRAIN_ATTRIBUTION_URLURL for the terrain-data provider credit. Defaults to the corresponding provider's attribution page.Optional. Commented

The current app-web manifest does not forward NEXT_PUBLIC_TERRAIN_DEM_TILE_URL_TEMPLATE or NEXT_PUBLIC_TERRAIN_DEM_ENCODING. Those runtime options require explicit container wiring; adding them to .env alone does not apply them in the managed stack. See Relief and contours.

Street-level imagery​

Mapillary uses a server-side access token. Coverage, metadata, and panorama assets are proxied, so the token is never shipped in the browser bundle.

VariableDescriptionRequired / Default
INTEGRATION_STREET_LEVEL_IMAGERY_MAPILLARY_ENABLEDEnable the Mapillary coverage overlay and imagery viewer. Review its Terms before opting in.Optional. Default false
INTEGRATION_STREET_LEVEL_IMAGERY_MAPILLARY_ACCESSTOKENServer-side Mapillary client access token for the coverage overlay and imagery viewer.Optional. Default unset
INTEGRATION_PHOTOS_MAPILLARY_ACCESSTOKENServer-side Mapillary client access token for photos on place panels.Optional. Default unset
INTEGRATION_STREET_LEVEL_IMAGERY_PROVIDEROptional comma-separated provider ids that pin the active set and its priority order, such as panoramax,mapillary. Only enabled providers can participate.Optional. Default unset (all enabled providers)

The same access token can be configured for both Mapillary integrations. Set it on each integration's Credentials tab in the admin panel, or supply both environment variables above. Imagery and coverage are proxied through the API; the tokens stay server-side. See Street-level imagery for the opt-in and provider configuration details.

Backend endpoint overrides​

Self-hosted backends are normally resolved from the service registry. These settings support backends outside the Compose stack. The routing and geocoding adapters resolve a selected local service before their configured endpoint. To use an external engine through those adapters, remove the matching local service from the selection and recreate app-api. Within integration config, environment values take precedence over admin values. Direct helpers using OSRM_URL, OVERPASS_URL, and similar variables have separate resolution paths.

VariableDescriptionRequired / Default
INTEGRATION_ROUTING_OSRM_ENDPOINTOSRM endpoint for the routing provider (car routing). Usually unset; a co-deployed osrm service is auto-resolved over the internal network.Optional. Default unset
OSRM_URLOSRM endpoint used by the app-api road-snap helper (distinct from the routing provider above). Usually unset; the co-deployed osrm service is used.Optional. Default unset
VALHALLA_URLValhalla endpoint for isochrones, elevation, and road-snap (bus). The default targets Stadia Maps' hosted Valhalla, which requires VALHALLA_API_KEY; a self-hosted Valhalla needs no key. The routing/directions provider resolves separately; via the co-deployed valhalla service or INTEGRATION_ROUTING_VALHALLA_ENDPOINT / INTEGRATION_ROUTING_VALHALLA_APIKEY.Optional. https://api.stadiamaps.com
VALHALLA_API_KEYAPI key for the hosted Valhalla above (account at stadiamaps.com). Leave blank for a self-hosted Valhalla.Optional. Default unset
MOTIS_URLSelf-hosted MOTIS endpoint for transit, live vehicles, stop search, and rentals. Set automatically when the motis service is selected; over the internal network MOTIS listens on 8080 (8081 is only the host-loopback mapping). Leave unset without a self-hosted MOTIS: transit then runs on the public Transitous API directly.Optional. Commented http://motis:8080
OVERPASS_URLOverpass API base URL (no path) for the core Overpass client (POI fallbacks, navigation alerts, junction-view gantry lookups). The OpenConditions ingest service has its own setting, SERVICE_OPENCONDITIONS_INGEST_OVERPASS_URL. Multi-user deployments should use the self-hosted overpass.Optional. Commented http://overpass:80
NOMINATIM_URLNominatim endpoint for station reverse-geocoding (bike / scooter / car sharing).Optional. Commented http://nominatim:8080
TRANSITOUS_URLTransitous endpoint for rental POIs used by shared-mobility integrations.Optional. https://api.transitous.org

Regional defaults​

Default regions and country filters used by the CLI and selected services, so you can keep them here instead of repeating CLI flags. A region passed on the command line overrides the env value for that invocation.

VariableDescriptionRequired / Default
OPENMAPX_REGIONShared default OSM region for selectors like openmapx data download osm, services build, and data convert overpass.Optional. Commented europe/germany
OSRM_REGIONPer-service OSRM build region (wins over OPENMAPX_REGION for that target).Optional. Commented
OTP_REGIONPer-service OTP build region.Optional. Commented
MOTIS_REGIONPer-service MOTIS build region.Optional. Commented planet
PELIAS_REGIONPer-service Pelias build region.Optional. Commented
TILESERVER_REGIONPer-service TileServer GL build region.Optional. Commented
OVERPASS_REGIONPer-service Overpass build region.Optional. Commented
PLANETILER_JAVA_TOOL_OPTIONSJVM options for the TileServer MBTiles build, e.g. -Xmx8g. The default heap is half the input PBF (at least 2 GB), or -Xmx30g for the planet.Optional. Commented
PLANETILER_WORK_DIRHost directory for Planetiler's downloaded sources and temp files. Its temp files run to several times the PBF, so point it at a disk with room.Optional. Default data/planetiler
OTP_BUILD_JAVA_TOOL_OPTIONSJVM options for the OTP graph build (not the runtime container).Optional. Default -Xmx24g
TRANSITOUS_COUNTRIESCountry filter (e.g. de,at,ch) for data sync and MOTIS Transitous config generation. With the default regional-assisted profile the data-manager refuses to start without it (or MOTIS_FEED_ALLOW_LIST), even when no transit engine is enabled.Required for regional profiles
INTEGRATION_GEOCODING_PROVIDERComma-separated geocoding fallback chain, tried left to right. Valid names: maptiler, photon, nominatim, pelias, motis, transitous, entur, db-ris.Optional. Default maptiler
PHOTON_REGIONRuntime download region for the self-hosted Photon index.Default planet

Global ambient preparation/publication also forwards AMBIENT_PLANET_MAX_PLACES, AMBIENT_PLANET_RESERVE_BYTES, OVERTURE_DUCKDB_MEMORY_MB, OVERTURE_DUCKDB_THREADS, OVERTURE_DUCKDB_TEMP_MB and OSMIUM_PLANET_INDEX_ESTIMATE_BYTES into data-manager. Their defaults, validation and separate container/disk sizing requirements are documented in the global publication resource table.

Service tuning​

These variables are forwarded by service manifests. Set limits for your measured workload; a manifest default is not a hardware sizing guarantee.

VariableDescriptionRequired / Default
POSTGIS_MEMORYMemory limit of the postgis container. The database takes a quarter of it as its buffer pool and plans with the rest as cache. A host running the OpenConditions extension writes to the database continuously; give it room (for example 16g) so its working set stays in memory instead of being read from disk again for every query. Apply with pnpm openmapx services start postgis, which restarts the database.Default 2g
POSTGIS_DIAGNOSTICSOpt in to preserving existing preload libraries and adding pg_stat_statements; initialize first with diagnostics disabled and rehearse activation. See PostgreSQL diagnostics.Default false
POSTGIS_TRACK_IO_TIMINGSeparate I/O-timing opt-in; measure overhead before activation.Default false
POSTGIS_MAX_WAL_SIZEWrite-ahead log PostgreSQL keeps between checkpoints. A checkpoint writes every changed page out again, and the first change to a page after it logs the whole page, so a busy database with too little WAL checkpoints every minute or faster and writes many times its changes to disk. Costs up to this much disk under pg_wal.Default 4GB
POSTGIS_CHECKPOINT_TIMEOUTTime between PostgreSQL's timed checkpoints (5min to 1d). A page changed many times between two checkpoints is written to disk once, and logged whole only after the first change, so a database that rewrites the same rows all the time (live readings) writes far less with a longer interval. After a crash, recovery replays the WAL written since the last checkpoint, which takes longer the longer the interval. Raise POSTGIS_MAX_WAL_SIZE with it, or checkpoints start early when the WAL reaches that size.Default 15min
MARTIN_DB_PASSWORDPassword of openmapx_tiles, the database role the Martin tile server logs in as. The role can call the tile functions in the tiles schema and read no table. PostGIS applies the password on every start; without it the role cannot log in. Generate with openssl rand -hex 32.Required when Martin is enabled
NOMINATIM_THREADSImport/query thread count for the self-hosted Nominatim geocoder.Default 8
NOMINATIM_IMPORT_WIKIPEDIAImport Wikipedia importance scores during the Nominatim build.Default true
NOMINATIM_IMPORT_GB_POSTCODESImport GB postcodes.Default false
NOMINATIM_IMPORT_US_POSTCODESImport US postcodes.Default false
OVERPASS_SPACEOverpass dispatcher available-RAM budget in bytes, not database disk capacity. The 100 GiB default exceeds the 32 GiB container ceiling; tune together with worker concurrency.Default 107374182400 (~100 GiB)
OVERPASS_FASTCGI_PROCESSESNumber of Overpass FastCGI worker processes.Default 4
OVERPASS_DIFF_URLReplication feed Overpass applies daily. The default suits a planet import; a regional import must follow its extract's own feed (for Germany https://download.geofabrik.de/europe/germany-updates/), or the planet diffs pull changes from everywhere into the regional database.Default https://planet.openstreetmap.org/replication/day/
MOTIS_OPERATIONS_PROFILETransit operations profile (regional-assisted, regional-sovereign, planet).Default regional-assisted
MOTIS_FREE_DISK_BYTESOverride for the free-disk measurement used by preflight. Leave unset for the actual filesystem value.Optional. Default unset
MOTIS_IMPORT_TIMEOUT_MSTimeout for MOTIS initial import.Default 1800000 (30 min)
MOTIS_PROMOTE_RESTART_TIMEOUT_MSTimeout for promoted MOTIS restart.Default 3600000 (1 hr)
MOTIS_PROMOTE_RESTART_POLL_INTERVAL_MSPolling interval for promoted MOTIS restart.Default 5000 ms
MOTIS_ROUTE_SHAPESShape synthesis behavior (missing or all).Optional. Default unset
MOTIS_ELEVATORS_URLStation elevator live status feed URL.Optional. Default unset
MOTIS_ELEVATORS_AUTHAuthorization header/token for elevator feed.Optional. Default unset
MOTIS_OSR_FOOTPATHFootpath routing calculation on OpenStreetMap graphs.Default true
MOTIS_TILESMOTIS internal vector tile rendering toggle.Optional. Default unset
MOTIS_INCREMENTAL_RT_UPDATEToggle incremental real-time transit schedule updates.Optional. Default unset
VALHALLA_CONTAINERDocker container name for data-manager traffic extraction.Default docker-valhalla-1
TRAFFIC_VALHALLA_URLValhalla endpoint data-manager traces road-condition spans against, to narrow a closure to the exact graph edges it covers. Must be the co-deployed Valhalla holding this deployment's traffic graph; deliberately separate from VALHALLA_URL, which may point at a hosted endpoint.Default http://valhalla:8002
OPENCONDITIONS_URLBase URL of the OpenConditions instance. The built-in openconditions integration in app-api reads road conditions, fuel stations, parking and EV charging sites, webcams and hazards (weather alerts, fires, earthquakes, natural events) from it; the data-manager reads live traffic (/segments/speed.csv, /segments/conditions.json). Unset: no OpenConditions, no traffic crons, and the hazard overlays stay empty.Optional. Default unset
OPENCONDITIONS_CONTRIBUTIONS_URLBase URL of the OpenConditions contributions API that app-api relays crowd reports to: http://openconditions-contributions-api:4200 with the OpenConditions extension. Unset: http://localhost:4200.Optional. Default unset
OPENCONDITIONS_OPERATOR_TOKENBearer token app-api and the data-manager send for operator scope. The ingest service ignores this file: give its OPENCONDITIONS_OPERATOR_TOKEN credential the same value (32+ chars). Unset there, reads fall back to public scope; a different value fails every read with 401. Required for fuel in DE (Tankerkönig: redistribution not granted), AT (E-Control: no licence asserted) and OpenStreetMap stations (ODbL share-alike); in public scope the fuel layer shows France and Spain only. Read when the containers are created: after a change run pnpm openmapx services start app-api data-manager on the host (the admin panel never recreates app-api).Required for DE/AT/OSM fuel. Default unset
SERVICE_OPENCONDITIONS_INGEST_<KEY>A setting of the OpenConditions ingest service, a community service that never sees the rest of this file (SERVICE_OPENCONDITIONS_INGEST_OVERPASS_URL=http://overpass:80). Wins over the admin config form. Apply with pnpm openmapx services start openconditions-ingest, after applying any newly saved admin settings. CLI renders preserve the last applied generation; unapplied database changes are not available to them. Its database URL and operator token are vault credentials instead.Optional. Manifest defaults
TRAFFIC_LIVE_CRONCron schedule for the live-traffic cycle that writes speeds, speed caps and closures into traffic.tar. Set to disabled, off or false to turn the cycle off.Default */2 * * * *
TRAFFIC_CONDITIONS_STALE_MSHow long the last good conditions set is reused while /segments/conditions.json keeps failing. Past this age the closures are dropped and the router falls back to point-based exclusions.Default 600000 (10 min)
TRUST_PROXY_RANGESIP ranges trusted by Fastify for reverse-proxy headers.Default uniquelocal
OPENMAPX_API_NODE_OPTIONSNode.js memory options for the app-api container.Default --max-old-space-size=1536
RATE_LIMIT_IMAGE_PROXY_MAX_BYTESPer-client image-proxy byte budget over the configured window. Valid upstream Content-Length values reserve capacity early, but only bytes actually streamed remain charged.Default 134217728 (128 MiB)
RATE_LIMIT_IMAGE_PROXY_WINDOW_MSRefill window for the per-client image-proxy byte budget.Default 60000 (1 min)
RATE_LIMIT_IMAGE_PROXY_MAX_CONCURRENT_PER_CLIENTMaximum simultaneous image-proxy upstream streams for one network client.Default 16
RATE_LIMIT_IMAGE_PROXY_MAX_CONCURRENT_GLOBALMaximum simultaneous image-proxy upstream streams in one API process.Default 64

Traffic & extra tile providers​

Keys and overrides for the app-api traffic and tile proxies.

VariableDescriptionRequired / Default
TRAFFIC_PROVIDERTraffic data provider.Default tomtom
TOMTOM_TRAFFIC_KEYTomTom Flow tile-proxy key. Sign up at developer.tomtom.com.Optional. Default unset
TOMTOM_TRAFFIC_URLTomTom API base URL.Optional. https://api.tomtom.com
TOMTOM_TRAFFIC_VERSIONTomTom Flow API version.Optional. Commented 4
TOMTOM_TRAFFIC_STYLETomTom Flow tile style.Optional. Commented relative-delay
TOMTOM_TRAFFIC_TILE_SIZETomTom tile size in pixels.Optional. Commented 256
TOMTOM_TRAFFIC_THICKNESSTomTom Flow line thickness.Optional. Commented 2
THUNDERFOREST_API_KEYThunderforest OpenCycleMap key (key from thunderforest.com).Optional. Default unset
CYCLOSM_TILE_URLOverride URL for the CyclOSM tile proxy.Optional. Commented
WAYMARKED_CYCLING_TILE_URLOverride URL for the Waymarked Trails cycling layer.Optional. Commented
TRAFFIC_EXTRACT_CRONCron schedule for extracting Valhalla traffic CSVs.Default 0 5 * * * (daily, 05:00 UTC)
NEXT_PUBLIC_TRAFFIC_MIN_ZOOMMinimum zoom level where traffic overlays render in the frontend.Default 6
INTEGRATION_STREET_LEVEL_IMAGERY_PROVIDERPreferred order for street-level imagery providers (panoramax,mapillary).Optional. Default unset
OPENMAPTILES_FONTS_URLCustom source archive URL for downloading glyph font stacks.Optional. Default upstream

Email​

Used for email verification, 2FA, and email-change flows. The provider is auto-detected by priority: EmailLabs > Lettermint > SMTP. These are also settable in /admin/settings → Email / SMTP; env always wins.

VariableDescriptionRequired / Default
EMAIL_FROMSender address, e.g. OpenMapX <noreply@openmapx.example.com>.Optional. Commented
EMAILLABS_APP_KEYEmailLabs app key (emaillabs.io, provider account).Optional. Commented
EMAILLABS_SECRET_KEYEmailLabs secret key.Optional. Commented
EMAILLABS_SMTP_ACCOUNTEmailLabs SMTP account.Optional. Commented
LETTERMINT_API_TOKENLettermint API token (lettermint.co, provider account).Optional. Commented
SMTP_HOSTSMTP server hostname (any provider).Optional. Commented
SMTP_PORTSMTP port.Optional. Commented 587
SMTP_SECUREUse TLS on connect.Optional. Commented false
SMTP_USERSMTP username.Optional. Commented
SMTP_PASSSMTP password.Optional. Commented

Transitous & cron​

Schedules and tuning for the daily Transitous transit-data sync.

VariableDescriptionRequired / Default
TRANSIT_SOURCEHow the Transitous dataset is obtained: mirror (default; download the prebuilt community bundle) or build (assemble it locally from feeds). See Transit engines.Optional. Default mirror
TRANSITOUS_ARTIFACT_BASE_URLBase URL the mirror mode pulls the prebuilt Transitous artifact from.Optional. Default unset (upstream)
TRANSITOUS_API_KEYS_PATHHost/container path to Transitous secret API keys file for restricted feeds.Default /config/transitous/api-keys.json
TRANSITOUS_FEEDS_OVERLAY_PATHHost/container path to feeds overlay configuration file.Default /data/overrides/feeds-overlay.json
TRANSITOUS_SYNC_CRONCron schedule for the daily Transitous sync. Leaving it unset (or empty) uses the built-in 0 3 * * *; set it to disabled (or off/false) to turn it off (e.g. on a staging host where you trigger manually).Optional. Commented 0 3 * * *
TRANSITOUS_STALENESS_CHECK_CRONCron schedule for the staleness sweep that flags feeds that have stopped updating. Set to disabled (or off/false) to turn it off.Optional. Commented 0 4 * * *
TRANSITOUS_FEED_PROXY_RELOAD_CRONCron schedule for the feed-proxy nginx-reload heartbeat; a safety net against a missed reload during sync.Optional. Commented */15 * * * *
TRANSITOUS_AUTO_BUMP_CRONOpt-in cron that advances the pinned Transitous catalog to upstream's latest behind the staging-slot canary; activates the new pin (and promotes) only if the candidate builds and passes the functional probes, otherwise keeps the current pin and alerts. Unset/empty = disabled (the pin stays frozen). See Transit engines.Optional. Default disabled
TRANSITOUS_RUNNER_URLBase URL of the private Transitous runner; the unprivileged container that executes the upstream catalog scripts. Compose wires this automatically; override it only if you run the runner elsewhere. Unset or empty values in the managed .env select the bundled runner through Compose interpolation. An actually empty runtime value outside that interpolation refuses script dispatch; it is not a managed opt-out. Disabling scheduled sync does not block manual dispatch.Optional. Default http://transitous-runner:4400
TRANSITOUS_ALERT_GH_TOKEN / TRANSITOUS_ALERT_GH_REPOWhen both are set, sync/auto-bump failures and stale feeds open deduped GitHub issues instead of being log-only. Without them a canary rejection can silently freeze the live dataset for days.Optional. Default log-only
MOTIS_RENTALS_WARMUP_MS / MOTIS_RENTALS_POLL_INTERVAL_MSHow long the rentals canary re-polls MOTIS /rentals while it enumerates zero providers (GBFS warm-up after a restart) before failing, and the interval between polls.Optional. Default 180000 / 5000
MOTIS_HEALTH_BBOX_MIN_LAT / _MIN_LNG / _MAX_LAT / _MAX_LNGBounding box coordinates used by MOTIS health checks to probe local data coverage.Optional. Default unset
MOTIS_HEALTH_PLAN_FROM_LAT / _FROM_LNG / _TO_LAT / _TO_LNGEndpoints for synthetic routing plan canary queries during health verification.Optional. Default unset
MOTIS_HEALTH_RENTAL_PROVIDER_IDS / _PLAN / _GROUPS / _PROVIDERS / _FORM_FACTORSCanaries validating rental provider and vehicle availability in live feeds.Optional. Default unset
MOTIS_GBFS_CATALOG_ENABLEDAutomatically discover and sync feeds from the upstream MobilityData GBFS catalog.Optional. Default false
MOTIS_GBFS_CATALOG_MAX_ADDITIONSCeiling on new GBFS feeds added in a single sync run.Default 50
MOTIS_GBFS_CATALOG_CONCURRENCYConcurrent downloads when fetching GBFS catalog entries.Default 4
MOTIS_GBFS_CATALOG_TIMEOUT_MSPer-feed probe timeout when testing GBFS discovery endpoints.Default 5000 (5 s)
MOTIS_GBFS_CATALOG_MAX_FAILURE_RATIOMaximum tolerated fraction of failed GBFS feeds before catalog update aborts.Default 0.35 (35%)

MOTIS scope and capacity​

For the default regional-assisted profile, set TRANSITOUS_COUNTRIES or MOTIS_FEED_ALLOW_LIST explicitly. regional-sovereign requires origin builds and matching local OSM. Planet operation is experimental and requires MOTIS_OPERATIONS_PROFILE=planet and MOTIS_PLANET_CONFIRM=true.

Set MOTIS_TWO_SLOT=true for retained A/B slots. MOTIS_SLOT_MEMORY controls the runtime container limit (default 16g per slot); MOTIS_SLOT_MEMORY_GB (default 16) reports the capacity envelope to preflight. Keep those values consistent. MOTIS_SLOT_CPU, file-descriptor limits, feed-count caps, retention, and disk headroom are described in MOTIS operations profiles. MOTIS_FREE_DISK_BYTES overrides the measured free-space value; leave it unset for real filesystem measurements instead of using it to bypass a shortage.

Transitous feed-proxy key

The optional age private key used to decrypt AGE-ENCRYPTED: feed values has no env variable. Drop the file at infra/docker/secrets/transitous-feed-proxy.age on the host and re-render compose; the mount is omitted automatically when the file is absent. See infra/docker/secrets/README.md for the generation steps.

Advanced & optional​

Lower-level toggles, retention, and legal-page metadata. All optional.

VariableDescriptionRequired / Default
LOG_LEVELFastify log level (trace, debug, info, warn, error, fatal).Optional. Commented info
OPENMAPX_DISABLE_LOCALHOST_AUTHSet to 1 to disable the loopback admin short-circuit entirely, regardless of OPENMAPX_LOCAL_ADMIN_TOKEN. Use on multi-tenant hosts where another local process could reach the API's loopback.Optional. Commented
ISOCHRONE_PROVIDERGround-mode isochrone provider. Only valhalla is supported; unset or empty also selects it. Other values fail. Transit reachability uses the separate MOTIS workflow.Optional. Commented. Default valhalla
AUDIT_LOG_RETENTION_DAYSDays to keep admin audit-log entries before the daily prune.Optional. Commented 90
ADMIN_JOB_RETENTION_DAYSDays to keep finished admin jobs (in-flight jobs are never pruned).Optional. Commented 30
BACKUP_RETENTION_DAYSDays to keep local backups. Expired backups are pruned and refused by restore; apply the same lifecycle to off-host copies.Optional. Default 30
GITHUB_TOKENGitHub API token for catalog requests. Access and rate limits depend on the token and GitHub policy.Optional. Commented
EXTENSION_CATALOG_URLDefault catalog URL for the Extensions store; the curated (verified-tier) list shown under /admin/extensions.Optional. https://raw.githubusercontent.com/openmapx/community-extensions/main/catalog.json
OFFLINE_PACKAGE_WORKERSConcurrent worker jobs for offline map package preparation.Default 1
OFFLINE_PACKAGE_MAX_BYTESMaximum byte size for a single offline package archive.Default 2000000000 (2 GB)
OFFLINE_PACKAGE_MAX_COUNTMaximum number of offline packages a single user may hold simultaneously.Default 32
OFFLINE_PACKAGE_MAX_TOTAL_BYTESMaximum cumulative storage for all offline packages owned by one user.Default 20000000000 (20 GB)
OFFLINE_PACKAGE_MIN_FREE_BYTESMinimum host disk free space required to accept a new offline package build job.Default 1000000000 (1 GB)
LEGAL_NAMEOperator legal name shown on /terms and /privacy.Optional. Commented
LEGAL_STREETOperator street address.Optional. Commented
LEGAL_POSTAL_CODEOperator postal code.Optional. Commented
LEGAL_CITYOperator city.Optional. Commented
LEGAL_COUNTRYOperator country.Optional. Commented
LEGAL_JURISDICTION_CITYCity of legal jurisdiction.Optional. Commented
LEGAL_EMAILLegal contact email.Optional. Commented
LEGAL_PHONELegal contact phone.Optional. Commented
LEGAL_SUPERVISORY_AUTHORITYData-protection supervisory authority (name + address) named on /privacy. Leave blank to omit the sentence.Optional. Commented
LEGAL_SUPERVISORY_AUTHORITY_URLURL of the supervisory authority above.Optional. Commented
LEGAL_HOSTING_PROVIDERHosting provider (name + address) disclosed on /privacy. Leave blank to omit.Optional. Commented
LEGAL_HOSTING_LOCATIONSHuman-readable hosting locations shown on /privacy, e.g. Germany and Finland (EU).Optional. Commented
LEGAL_SERVER_LOG_RETENTION_DAYSDays persisted API warning/error logs are retained and disclosed on /privacy. Container logs remain an infrastructure setting.Optional. Default 30
Legal pages

The legal fields are optional but required for complete production /terms and /privacy pages. Leave them blank to omit the corresponding rows.

Data-use policy​

Each data source declares whether it may be used commercially. By default the default permits all source classes. Commercial operators should review and exclude sources whose terms do not permit their use. These are resolved env-first, then the admin toggle at /admin/settings, then the default, and have no entry in .env.example; set them only if you need to restrict. See Data-use policy for what each class covers.

VariableDescriptionRequired / Default
OPENMAPX_ALLOW_NONCOMMERCIALSet to false/0 to exclude sources whose licence forbids commercial use (commercialUse: "no"). Overrides the admin toggle.Optional. Default true
OPENMAPX_ALLOW_GREY_AREASet to false/0 to exclude sources with unclear or undocumented terms (commercialUse: "unknown"). Overrides the admin toggle.Optional. Default true

Overture Maps POIs​

Schedules and switches for the regional Overture Maps Places refresh.

VariableDescriptionRequired / Default
OVERTURE_ENABLEDSet to true to discover and atomically import newer Overture Places releases for OPENMAPX_REGION.Optional. Default unset
OVERTURE_SYNC_CRONCron schedule for checking and refreshing the regional snapshot.Optional. Default 0 5 * * 2 (weekly, Tuesday 05:00 UTC)
OVERTURE_CONFLATION_RETRY_CRONRetry an incomplete OSM↔Overture link rebuild without downloading or importing Places again. Recovery also runs once at startup.Optional. Default */15 * * * *
OVERTURE_RELEASE_RETENTIONNumber of completed local release snapshots to retain, including the active release. Applied only after fused quality validation and link publication.Optional. Default 2; range 1 to 12
OVERTURE_DISK_RESERVE_BYTESFree-space safety reserve kept beyond estimated pull/ingest working space.Optional. Default 5368709120 (5 GiB)
OVERTURE_FIRST_PULL_ESTIMATE_BYTESWorking-space estimate for the first regional pull when no earlier snapshot exists. Later pulls use prior local snapshot sizes.Optional. Default 2147483648 (2 GiB)

The job uses Overture's official STAC catalog, skips an installed release, resolves exact spatially relevant Places assets, validates a local release contract, pulls only the configured region, and swaps a fully validated staging schema into service. OSM↔GERS link rebuilding has a separate durable state and retry schedule with resumable extraction, scoring, assignment, and publication phases: a missing PBF or failed rebuild does not roll back a valid Places release. See Overture Places.

After the first successful ingest, enable poi-overture in Admin → Integrations to return Overture search results and knowledge-overture to enrich matched OSM place cards. OVERTURE_ENABLED maintains the data but does not silently enable either runtime integration.

The data-manager keeps an index of places that many Wikipedias cover, fetched from Wikidata, so search can tell the Louvre in Paris from a bar called Louvre nearby without a self-hosted geocoder. About 1,000 cities known worldwide (100 or more language editions) are indexed too, so a city is found by its name in other languages: "rom" finds Rome. Things Wikidata gives a coordinate but that are no place to go to (events, languages, historical states, sports clubs, craters on the Moon) are left out. It builds the index once when none is published and refreshes it on a schedule; a failed refresh keeps the previous snapshot, and a busy endpoint is retried for a few minutes first. Admin → Data workflows → Notable places shows the snapshot and rebuilds it on demand.

VariableDescriptionRequired / Default
NOTABLE_PLACES_REFRESH_CRONCron schedule for the refresh. off disables both the refresh and the first build, and no request leaves the host.Optional. Default 0 2 1 * * (monthly, 1st, 02:00 UTC)
NOTABLE_PLACES_SPARQL_URLWikidata SPARQL endpoint that supports QLever's per-language label predicates.Optional. Default https://qlever.dev/api/wikidata
NOTABLE_PLACES_MIN_SITELINKSWikipedia language editions a place needs to be indexed. Smaller settlements are left out; geocoders rank them.Optional. Default 8; resulting size varies with source data

Natural-language search (the search-nlp integration) is normally configured at /admin/integrations. It is cloud-off by default: the provider list contains local Ollama followed by keyword parsing. A cloud model is used only when it is listed, its credential exists, and the active privacy policy authorizes cloud. If you would rather pin the configuration from the environment, use the per-integration form below (INTEGRATION_SEARCH_NLP_<KEY>). PROVIDERS must contain a JSON array.

VariableDescriptionRequired / Default
INTEGRATION_SEARCH_NLP_PROVIDERSOrdered JSON definitions for keyword, ollama, anthropic, openai, google, openrouter, or openai-compatible.Local Ollama, then keyword
INTEGRATION_SEARCH_NLP_PRIVACYMODEstrict disables cloud server-side; consent requires explicit user consent; open permits server-policy-deferred cloud use.consent
INTEGRATION_SEARCH_NLP_ROUNDCOORDSDECIMALSDecimal places retained for the map center sent to a model and used in cache partitioning.2; range 0 to 5
INTEGRATION_SEARCH_NLP_INTENTCACHETTLSECONDSParsed-intent cache lifetime in seconds.86400
INTEGRATION_SEARCH_NLP_RATELIMITPERIPPERHOURFixed-window parse limit per client IP.200
INTEGRATION_SEARCH_NLP_ANTHROPICAPIKEYCredential for anthropic definitions.Optional; unset
INTEGRATION_SEARCH_NLP_OPENAIAPIKEYCredential for openai definitions.Optional; unset
INTEGRATION_SEARCH_NLP_GOOGLEAPIKEYCredential for google (Gemini) definitions.Optional; unset
INTEGRATION_SEARCH_NLP_OPENROUTERAPIKEYCredential for openrouter definitions.Optional; unset
INTEGRATION_SEARCH_NLP_COMPATIBLEAPIKEYDedicated credential for custom compatible endpoint definitions.Optional; unset

For example, this pins a Gemini-first chain from .env:

INTEGRATION_SEARCH_NLP_PROVIDERS='[{"id":"gemini","type":"google","model":"gemini-2.5-flash"},{"id":"local","type":"ollama","model":"gemma3:4b-it-qat"},{"id":"keyword","type":"keyword"}]'
INTEGRATION_SEARCH_NLP_PRIVACYMODE=consent
INTEGRATION_SEARCH_NLP_GOOGLEAPIKEY=replace-with-vault-or-environment-secret

Environment values override admin-stored values. Prefer the Credentials tab for secrets when you do not need an immutable deployment-level override. See the provider reference for every definition field, OpenRouter privacy controls, and custom endpoint requirements.

To run the local model, enable the local-ai backend service (Ollama). Its container tuning uses LOCAL_AI_MEMORY (default 8g), OLLAMA_KEEP_ALIVE (default 30m), OLLAMA_MAX_LOADED_MODELS (default 1).

Per-integration and per-service overrides​

Manage integration credentials and service settings in the admin UI. Set an environment override only when you want to pin it at deployment level:

  • /admin/integrations: per-integration detail pages.
  • /admin/integrations/bulk: every integration on one page, plus a generated catalogue (Copy config / Copy credentials / Copy all) you can paste into .env.
  • /admin/services/<id>: per-service config, exposed as SERVICE_<ID>_<KEY> (for example SERVICE_VALHALLA_BUILD_ELEVATION=false).

Nothing in these override blocks is required at deploy time. Paste only the lines you want to pin from the bulk page; the admin UI generates them on demand so the catalogue stays in sync with the live manifests.

Where to go next​