Complete reference for Hydra Node YAML configuration.
#Configuration Reference
The Hydra Node reads its configuration from ~/.hydra/node.yaml by default. Override the path with --config:
hydra-node start --config /etc/hydra/node.yaml
#Full Configuration
# ── Mode ──────────────────────────────────────────────────
# "public" — submit data to Hydra network, earn rewards
# "private" — personal use only, no network submission
mode: private
# ── Node Identity (from Platform → Nodes → Create Node) ──
node:
id: "" # Node ID from the platform (e.g. "node_abc12345")
secret: "" # Shared secret (e.g. "hnd_...") — or use HYDRA_NODE_SECRET env var
# ── Network ─────────────────────────────────────────────
network:
backendUrl: "https://api.hydra.fast" # Hydra backend URL
submissionInterval: 60s # How often to submit signal batches
heartbeatInterval: 30s # Heartbeat frequency
batchSize: 100 # Max signals per submission batch
# ── Client-Facing Server ─────────────────────────────────
server:
port: 4001 # HTTP + WebSocket port for clients
host: "0.0.0.0" # Bind address (0.0.0.0 = all interfaces)
domain: "" # Optional custom domain (e.g. "node-a.hydra.fast")
rateLimits:
public: 60 # Requests/min for unauthenticated clients
authenticated: 300 # Requests/min for clients with API key
# ── Control Plane ────────────────────────────────────────
control:
port: 4002 # Control plane port
host: "127.0.0.1" # Localhost only — DO NOT expose publicly
# ── Data Sources ─────────────────────────────────────────
sources:
usgs:
enabled: true
interval: 5m # Poll every 5 minutes
adsb:
enabled: false
interval: 60s # Poll every 60 seconds
apiKeyEnv: "ADSB_API_KEY"
apiHostEnv: "ADSB_API_HOST"
ais:
enabled: false
flushInterval: 60s # WebSocket flush interval
apiKeyEnv: "AISSTREAM_API_KEY"
oref:
enabled: false
proxyUrl: "" # Optional proxy for oref.org.il
cyber:
enabled: false
interval: 5m
apiKeyEnv: "OTX_API_KEY"
airspace:
enabled: false
interval: 10m
openaipKeyEnv: "OPENAIP_API_KEY"
xtracker:
enabled: false
interval: 2m
accounts: [] # X/Twitter accounts: ["@ABORINT", "@IntelDoge"]
telegram:
enabled: false
interval: 2m
channels: [] # Channel names: ["ukraine_now", "intelslava"]
polymarket:
enabled: false
marketInterval: 15m
maritime:
enabled: false
interval: 24h
# ── Local Storage ────────────────────────────────────────
storage:
dataDir: "~/.hydra/data" # SQLite database directory
retentionHours: 24 # Data older than this is pruned
# ── Logging ──────────────────────────────────────────────
logging:
level: "info" # debug | info | warn | error
format: "text" # text | json
streamToBackend: false # Send logs to platform dashboard
# ── Metrics ──────────────────────────────────────────────
metrics:
enabled: true
port: 9090 # Prometheus /metrics endpoint
#Environment Variable Overrides
The following environment variables override their YAML counterparts:
| Environment Variable |
Overrides |
Example |
HYDRA_NODE_SECRET |
node.secret |
hnd_xxxxxxxxxxxxxxxx... |
ADSB_API_KEY |
Source credential for ADS-B |
RapidAPI key |
ADSB_API_HOST |
Source host for ADS-B |
RapidAPI host |
AISSTREAM_API_KEY |
Source credential for AIS |
AIS Stream key |
OTX_API_KEY |
Source credential for OTX Cyber |
OTX API key |
OPENAIP_API_KEY |
Source credential for OpenAIP |
OpenAIP key |
The node secret should ideally be passed via environment variable rather than stored in the YAML file. Create an env file:
# /etc/hydra/node.env
HYDRA_NODE_SECRET=hnd_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
ADSB_API_KEY=your-rapidapi-key
AISSTREAM_API_KEY=your-aisstream-key
OTX_API_KEY=your-otx-key
OPENAIP_API_KEY=your-openaip-key
#Section Reference
#mode
| Value |
Description |
private |
Personal use. No network submission, no registration needed. |
public |
Submit data to the Hydra network and earn rewards. Requires platform registration. |
#node
| Field |
Type |
Description |
id |
string |
Node ID from the platform (e.g. node_abc12345). Only needed in public mode. |
secret |
string |
Shared secret key (e.g. hnd_...). Can also be set via HYDRA_NODE_SECRET env var. Only needed in public mode. |
#network
| Field |
Type |
Default |
Description |
backendUrl |
string |
https://api.hydra.fast |
URL of the Hydra backend |
submissionInterval |
duration |
60s |
How often to batch and submit signals |
heartbeatInterval |
duration |
30s |
How often to send heartbeats |
batchSize |
int |
100 |
Maximum signals per submission batch |
#server
| Field |
Type |
Default |
Description |
port |
int |
4001 |
Client-facing HTTP + WebSocket port |
host |
string |
0.0.0.0 |
Bind address |
domain |
string |
"" |
Optional custom domain for the node |
rateLimits.public |
int |
60 |
Max requests/min for unauthenticated clients |
rateLimits.authenticated |
int |
300 |
Max requests/min for authenticated clients |
#control
| Field |
Type |
Default |
Description |
port |
int |
4002 |
Control plane port |
host |
string |
127.0.0.1 |
Bind address — keep as localhost for security |
Warning: Never expose the control plane to the internet. It provides admin access including restart, config editing, and API key management.
#sources
Each source has its own configuration block. Common fields:
| Field |
Type |
Description |
enabled |
bool |
Whether this source is active |
interval |
duration |
Polling interval (for poll-type sources) |
apiKeyEnv |
string |
Name of the environment variable containing the API key |
Source-specific fields:
| Source |
Extra Fields |
Description |
adsb |
apiHostEnv |
RapidAPI host header env var |
ais |
flushInterval |
WebSocket data flush interval |
oref |
proxyUrl |
Optional HTTP proxy for accessing oref.org.il |
airspace |
openaipKeyEnv |
OpenAIP API key env var |
xtracker |
accounts |
List of X/Twitter accounts to monitor |
telegram |
channels |
List of Telegram channel names to scrape |
polymarket |
marketInterval |
Market data polling interval |
#storage
| Field |
Type |
Default |
Description |
dataDir |
string |
~/.hydra/data |
Directory for SQLite database files |
retentionHours |
int |
24 |
Data older than this is pruned every 30 minutes |
#logging
| Field |
Type |
Default |
Description |
level |
string |
info |
Log level: debug, info, warn, error |
format |
string |
text |
Log format: text (human-readable) or json (structured) |
streamToBackend |
bool |
false |
Stream logs to the platform dashboard for remote viewing |
#metrics
| Field |
Type |
Default |
Description |
enabled |
bool |
true |
Enable Prometheus metrics endpoint |
port |
int |
9090 |
Port for the /metrics endpoint |
Available Prometheus metrics:
hydra_node_uptime_seconds
hydra_node_memory_alloc_bytes
hydra_node_goroutines
hydra_source_polls_total{source="adsb"}
hydra_source_errors_total{source="adsb"}
hydra_signals_submitted_total
hydra_signals_accepted_total
hydra_signals_rejected_total
#Example Configs
#Minimal Private Node (Free Sources Only)
mode: private
server:
port: 4001
host: "0.0.0.0"
sources:
usgs:
enabled: true
interval: 5m
oref:
enabled: true
polymarket:
enabled: true
marketInterval: 15m
storage:
dataDir: "~/.hydra/data"
retentionHours: 24
logging:
level: "info"
#Full Public Node (All Sources)
mode: public
node:
id: "node_abc12345"
network:
backendUrl: "https://api.hydra.fast"
server:
port: 4001
host: "0.0.0.0"
domain: "node.example.com"
sources:
usgs: { enabled: true, interval: 5m }
adsb: { enabled: true, interval: 60s, apiKeyEnv: "ADSB_API_KEY" }
ais: { enabled: true, flushInterval: 60s, apiKeyEnv: "AISSTREAM_API_KEY" }
oref: { enabled: true }
cyber: { enabled: true, interval: 5m, apiKeyEnv: "OTX_API_KEY" }
airspace: { enabled: true, interval: 10m, openaipKeyEnv: "OPENAIP_API_KEY" }
xtracker: { enabled: true, interval: 2m, accounts: ["@ABORINT", "@IntelDoge"] }
telegram: { enabled: true, interval: 2m, channels: ["ukraine_now", "intelslava"] }
polymarket:{ enabled: true, marketInterval: 15m }
maritime: { enabled: true, interval: 24h }
storage:
dataDir: "~/.hydra/data"
retentionHours: 48
logging:
level: "info"
format: "json"
streamToBackend: true
metrics:
enabled: true
port: 9090