Skip to main content
This document covers all environment variables used by the AIS/OpenSky relay path:
  • Railway relay process: scripts/ais-relay.cjs
  • Vercel relay proxy endpoints (legacy): api/opensky.js, api/ais-snapshot.js, api/polymarket.js, api/rss-proxy.js
The api/*.js edge function endpoints listed above are legacy patterns being phased out in favor of the sebuf proto-first approach. See Adding Endpoints for the current recommended pattern.
  • Server relay callers: server/worldmonitor/* handlers
  • Optional browser local fallback callers in src/services/*

1) Minimum Production Setup

Set these before enabling strict relay auth.

Railway (relay)

VariableRequiredExampleNotes
AISSTREAM_API_KEYYesais_...Required for AIS upstream WebSocket feed.
RELAY_SHARED_SECRETYeswm_relay_prod_...Must exactly match Vercel value.
RELAY_AUTH_HEADERRecommendedx-relay-keyMust match Vercel if changed from default.

Vercel (proxy + server functions)

VariableRequiredExampleNotes
WS_RELAY_URLYeshttps://<railway-app>.up.railway.appHTTPS relay base URL used by server-side proxy calls.
RELAY_SHARED_SECRETYeswm_relay_prod_...Must exactly match Railway value.
RELAY_AUTH_HEADERRecommendedx-relay-keyHeader name used to forward relay secret.

2) Full Parameter Reference

Core Relay/Auth

VariableSet OnDefaultRequiredPurpose
AISSTREAM_API_KEYRailwaynoneYesAuth for AIS upstream stream source.
VITE_AISSTREAM_API_KEYLocal dev onlynoneNoLocal fallback if AISSTREAM_API_KEY is missing. Not recommended for production.
PORTRailway/local3004NoHTTP server listen port for relay process.
WS_RELAY_URLVercel + server handlersnoneYes (for relay-backed features)Base URL used by Vercel/server to reach Railway relay.
VITE_WS_RELAY_URLBrowser (local dev)noneNoLocalhost fallback path for direct browser calls in development only.
RELAY_SHARED_SECRETRailway + VercelemptyYes in productionShared secret for non-public relay routes.
RELAY_AUTH_HEADERRailway + Vercelx-relay-keyNo (but recommended explicit)Header name carrying relay secret.
ALLOW_UNAUTHENTICATED_RELAYRailwayfalseNoEmergency override. If true, production can start without secret. Keep false.
ALLOW_VERCEL_PREVIEW_ORIGINSRailwayfalseNoIf true, allows *.vercel.app origins in relay CORS checks.

Relay-Adjacent Feature Flags

VariableSet OnDefaultRequiredPurpose
VITE_ENABLE_AISBrowser/client build envenabled (unless false)NoClient-side feature gate for AIS UI/polling.
LOCAL_API_MODELocal/server runtimenoneNoIf contains sidecar, some server handlers bypass relay and call OpenSky directly.
WINGBITS_API_KEYVercel/servernoneNoMilitary enrichment/fallback source used by server handlers; not required for relay core.

OpenSky Upstream Auth

VariableSet OnDefaultRequiredPurpose
OPENSKY_CLIENT_IDRailwaynoneNo (recommended)OAuth client ID for higher OpenSky reliability/rate limits.
OPENSKY_CLIENT_SECRETRailwaynoneNo (recommended)OAuth client secret paired with client ID.

OpenSky Cache/Cardinality Controls

VariableSet OnDefaultRequiredPurpose
OPENSKY_CACHE_MAX_ENTRIESRailway128NoMax positive cache keys retained in memory.
OPENSKY_NEGATIVE_CACHE_MAX_ENTRIESRailway256NoMax negative cache keys (429/5xx) retained in memory.
OPENSKY_BBOX_QUANT_STEPRailway0.01NoCoordinate quantization step for bbox cache key reuse. 0 disables quantization.

AIS Pipeline Tuning

VariableSet OnDefaultRequiredPurpose
AIS_SNAPSHOT_INTERVAL_MSRailway5000 (min 2000)NoInterval for rebuilding snapshot payloads.
AIS_UPSTREAM_QUEUE_HIGH_WATERRailway4000 (min 500)NoPause upstream socket when queue reaches this.
AIS_UPSTREAM_QUEUE_LOW_WATERRailway1000 (clamped below HIGH_WATER)NoResume upstream socket when queue drops below this.
AIS_UPSTREAM_QUEUE_HARD_CAPRailway8000 (must be > HIGH_WATER)NoMax queue size before dropping incoming upstream messages.
AIS_UPSTREAM_DRAIN_BATCHRailway250 (min 1)NoMax messages drained per cycle.
AIS_UPSTREAM_DRAIN_BUDGET_MSRailway20 (min 2)NoMax CPU time budget per drain cycle.

Rate Limit / Logging / Metrics

VariableSet OnDefaultRequiredPurpose
RELAY_RATE_LIMIT_WINDOW_MSRailway60000NoGlobal rate-limit window.
RELAY_RATE_LIMIT_MAXRailway1200NoDefault max requests per IP per window.
RELAY_OPENSKY_RATE_LIMIT_MAXRailway600NoOpenSky route max requests per IP per window.
RELAY_RSS_RATE_LIMIT_MAXRailway300NoRSS route max requests per IP per window.
RELAY_LOG_THROTTLE_MSRailway10000NoMinimum interval between repeated log events per key.
RELAY_METRICS_WINDOW_SECONDSRailway60 (min 10)NoRolling window used by /metrics.

Platform-Managed Variables (Do Not Manually Set)

These are used only for production detection and are usually injected by platform/runtime.
VariableWho sets itPurpose
NODE_ENVRuntime/platformUsed to detect production mode.
RAILWAY_ENVIRONMENTRailwayUsed to detect production relay environment.
RAILWAY_PROJECT_IDRailwayUsed to detect production relay environment.
RAILWAY_STATIC_URLRailwayUsed to detect production relay environment.
These are safe starting points for a busy relay:
# Auth + routing
RELAY_SHARED_SECRET=<strong-random-secret>
RELAY_AUTH_HEADER=x-relay-key
WS_RELAY_URL=https://<your-railway-relay>.up.railway.app
ALLOW_UNAUTHENTICATED_RELAY=false

# OpenSky cache/cardinality
OPENSKY_CACHE_MAX_ENTRIES=256
OPENSKY_NEGATIVE_CACHE_MAX_ENTRIES=512
OPENSKY_BBOX_QUANT_STEP=0.01

# AIS pipeline
AIS_SNAPSHOT_INTERVAL_MS=3000
AIS_UPSTREAM_QUEUE_HIGH_WATER=5000
AIS_UPSTREAM_QUEUE_LOW_WATER=1500
AIS_UPSTREAM_QUEUE_HARD_CAP=10000
AIS_UPSTREAM_DRAIN_BATCH=300
AIS_UPSTREAM_DRAIN_BUDGET_MS=20

# Rate limits + metrics
RELAY_RATE_LIMIT_WINDOW_MS=60000
RELAY_RATE_LIMIT_MAX=1200
RELAY_OPENSKY_RATE_LIMIT_MAX=600
RELAY_RSS_RATE_LIMIT_MAX=300
RELAY_LOG_THROTTLE_MS=10000
RELAY_METRICS_WINDOW_SECONDS=60

4) How to Verify Configuration

Health:
curl -sS https://<relay>/health
Metrics (requires relay auth):
curl -sS https://<relay>/metrics \
  -H "x-relay-key: $RELAY_SHARED_SECRET"
or:
curl -sS https://<relay>/metrics \
  -H "Authorization: Bearer $RELAY_SHARED_SECRET"
Expected checks:
  • auth.sharedSecretEnabled is true in /health.
  • /metrics.opensky.hitRatio is stable and high under load.
  • /metrics.ais.dropsPerSec stays at 0 in normal operation.
  • /metrics.ais.queueMax is comfortably below AIS_UPSTREAM_QUEUE_HARD_CAP.