Hydra
Docs

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