# ========================= # Debug / Logging # ========================= DEBUG_PAYLOAD=false DEBUG_PAYLOAD_MAX=400 DEBUG_LAST_MAX=50 DEBUG_STATUS_MAX=50 PAYLOAD_PREVIEW_MAX=800 # ========================= # Server / Storage # ========================= WEB_PORT=8080 STATE_DIR=/data BACKUP_ENABLED=false BACKUP_INTERVAL_SECONDS=43200 BACKUP_DIR=/backup BACKUP_RETENTION_DAYS=7 STATE_FILE=/data/state.json DEVICE_ROLES_FILE=/data/device_roles.json DEVICE_COORDS_FILE=/data/device_coords.json NEIGHBOR_OVERRIDES_FILE=/data/neighbor_overrides.json CHANNEL_SECRETS_FILE=/data/channel_secrets.json STATE_SAVE_INTERVAL=5 # ========================= # Access Control # ========================= PROD_MODE=false PROD_TOKEN=change-me TURNSTILE_ENABLED=false TURNSTILE_SITE_KEY= TURNSTILE_SECRET_KEY= TURNSTILE_API_URL=https://challenges.cloudflare.com/turnstile/v0/siteverify TURNSTILE_TOKEN_TTL_SECONDS=86400 TURNSTILE_BOT_BYPASS=true TURNSTILE_BOT_ALLOWLIST=discordbot,twitterbot,slackbot,facebookexternalhit,linkedinbot,telegrambot,whatsapp,skypeuripreview,redditbot # ========================= # Site / UI # ========================= SITE_TITLE=Anonymous Mesh Live Map SITE_DESCRIPTION=Live view of mesh nodes, message routes, and advert paths. SITE_OG_IMAGE= SITE_URL=https://your-domain.example/ SITE_ICON=/static/logo.png SITE_FEED_NOTE=Feed: MQTT broker. CUSTOM_LINK_URL= PACKET_ANALYZER_URL= QR_CODE_BUTTON_ENABLED=false PEERS_DEFAULT_LIMIT=8 DISTANCE_UNITS=km NODE_MARKER_RADIUS=8 HISTORY_LINK_SCALE=1 MAP_START_LAT=42.3601 MAP_START_LON=-71.1500 MAP_START_ZOOM=10 MAP_RADIUS_KM=241.4 MAP_RADIUS_SHOW=false MAP_BOUNDARY_MODE=radius MAP_BOUNDARY_FILE=/data/map_boundary.json MAP_BOUNDARY_SHOW=false MAP_DEFAULT_LAYER=light # Optional coverage map integration (leave blank to hide Coverage button) # Legacy example: # COVERAGE_API_URL=https://coverage.example.com # MeshMapper example: # COVERAGE_API_URL=https://meshmapper.net # The envs below are MeshMapper-only and are not used by legacy coverage maps. # COVERAGE_API_KEY=your_meshmapper_api_key # COVERAGE_MAX_AGE_DAYS=30 # COVERAGE_RATE_LIMIT_COOLDOWN_SECONDS=3600 # COVERAGE_CACHE_FILE=/data/coverage_cache.json # COVERAGE_SYNC_INTERVAL_SECONDS=3600 COVERAGE_API_URL= COVERAGE_API_KEY= COVERAGE_MAX_AGE_DAYS=30 COVERAGE_RATE_LIMIT_COOLDOWN_SECONDS=3600 COVERAGE_CACHE_FILE=/data/coverage_cache.json COVERAGE_SYNC_INTERVAL_SECONDS=3600 # ========================= # Weather Overlay # ========================= # Master radar feature flag. Set false to remove radar from the Weather panel. WEATHER_RADAR_ENABLED=true # Set true to clip radar tiles to the resolved country around current map center. WEATHER_RADAR_COUNTRY_BOUNDS_ENABLED=false # Optional override. Keep default unless you host a custom country-bounds endpoint. WEATHER_RADAR_COUNTRY_LOOKUP_URL=/weather/radar/country-bounds # Master wind feature flag. Set false to remove wind from the Weather panel. WEATHER_WIND_ENABLED=true # Wind API endpoint. Must return Open-Meteo compatible current wind fields. WEATHER_WIND_API_URL=https://api.open-meteo.com/v1/forecast # Wind sample density per map view (1-5). Higher = more detail + more API requests. WEATHER_WIND_GRID_SIZE=3 # Wind refresh interval in seconds (minimum 30). WEATHER_WIND_REFRESH_SECONDS=180 # ========================= # MQTT # ========================= MQTT_HOST=your-mqtt-host MQTT_PORT=443 # For michaelhart/meshcore-mqtt-broker, use a broker SUBSCRIBER_N account here. # Example broker side: SUBSCRIBER_1=meshmap:change-this-password:2 MQTT_USERNAME=meshmap MQTT_PASSWORD=change-this-password # Comma-separated list supported, e.g. meshcore/BOS/#,meshcore/CON/# MQTT_TOPIC=meshcore/# MQTT_TRANSPORT=websockets MQTT_WS_PATH=/ MQTT_TLS=true MQTT_TLS_INSECURE=false MQTT_CA_CERT= MQTT_CLIENT_ID= MQTT_ONLINE_SECONDS=300 MQTT_ONLINE_STATUS_TTL_SECONDS=300 MQTT_ONLINE_INTERNAL_TTL_SECONDS=300 MQTT_ACTIVITY_PACKETS_TTL_SECONDS=300 # Legacy compatibility setting; primary MQTT presence now uses status/internal TTL envs. MQTT_ONLINE_TOPIC_SUFFIXES=/status,/internal MQTT_ONLINE_FORCE_NAMES= MQTT_SEEN_BROADCAST_MIN_SECONDS=5 MQTT_STATUS_OFFLINE_VALUES=offline,disconnected # ========================= # Device / Route Behavior # ========================= DEVICE_TTL_HOURS=96 PATH_TTL_SECONDS=172800 TRAIL_LEN=0 HEAT_TTL_SECONDS=600 ROUTE_TTL_SECONDS=120 ROUTE_PAYLOAD_TYPES=8,9,2,5,4 ROUTE_PATH_MAX_LEN=16 ROUTE_MAX_HOP_DISTANCE=100 ROUTE_INFRA_ONLY=true ROUTE_ALLOW_AMBIGUOUS_ONE_BYTE_FALLBACK=false MESSAGE_ORIGIN_TTL_SECONDS=300 ROUTE_HISTORY_ENABLED=true ROUTE_HISTORY_HOURS=24 ROUTE_HISTORY_MAX_SEGMENTS=40000 ROUTE_HISTORY_COMPACT_INTERVAL=120 ROUTE_HISTORY_FILE=/data/route_history.jsonl ROUTE_HISTORY_PAYLOAD_TYPES=8,9,2,5,4 ROUTE_HISTORY_ALLOWED_MODES=path # ========================= # Decoder # ========================= DECODE_WITH_NODE=true NODE_DECODE_TIMEOUT_SECONDS=2.0 DIRECT_COORDS_MODE=topic DIRECT_COORDS_TOPIC_REGEX=(position|location|gps|coords) DIRECT_COORDS_ALLOW_ZERO=false # ========================= # LOS / Elevation # ========================= LOS_ELEVATION_URL=https://api.opentopodata.org/v1/srtm90m LOS_ELEVATION_PROXY_URL=/los/elevations LOS_SAMPLE_MIN=10 LOS_SAMPLE_MAX=80 LOS_SAMPLE_STEP_METERS=250 ELEVATION_CACHE_TTL=21600 LOS_CURVATURE_ENABLED=true LOS_CURVATURE_FACTOR=1.333333 LOS_PEAKS_MAX=4 # ========================= # Update Checks # ========================= GIT_CHECK_ENABLED=false GIT_CHECK_FETCH=false GIT_CHECK_PATH=/repo GIT_CHECK_INTERVAL_SECONDS=43200