Skip to content

Configuration Reference

Complete reference for all configuration keys in seerflow.yaml. All settings are optional — sensible defaults apply when omitted.

Seerflow loads configuration from seerflow.yaml in the current working directory. If no file is found, sensible defaults are used.

All string values support ${VAR} and ${VAR:-default} interpolation:

storage:
postgresql_url: ${DATABASE_URL:-postgresql://localhost/seerflow}
receivers:
webhooks:
- auth_token: ${GITHUB_WEBHOOK_SECRET}
KeyTypeDefaultDescription
dashboard_portint8080HTTP port for the Seerflow dashboard UI, REST API, and WebSocket.
health_bind_addressstring"127.0.0.1"Bind address for the health endpoint. Set 0.0.0.0 for container access.
log_levelstring"INFO"Application log verbosity. One of DEBUG, INFO, WARNING, ERROR, CRITICAL.
KeyTypeDefaultDescription
backendstring"sqlite"Storage engine. sqlite (zero-config) or postgresql (production scale).
data_dirstring~/.local/share/seerflowRoot data directory. Respects $XDG_DATA_HOME and $SEERFLOW_DATA_DIR.
sqlite_pathstring<data_dir>/seerflow.dbAbsolute path to the SQLite database file. Derived from data_dir when omitted.
postgresql_urlstring""PostgreSQL DSN, e.g. postgresql://user:pass@host/db. Required when backend=postgresql. Supports ${ENV_VAR} interpolation.
postgresql_pool_min_sizeint2asyncpg pool floor (>= 1). Only used when backend=postgresql.
postgresql_pool_max_sizeint10asyncpg pool ceiling (>= pool_min_size).
postgresql_command_timeout_sfloat30.0Per-query timeout in seconds (must be > 0).
graph_backendstring"igraph"Entity-graph backend. One of igraph, falkordb, postgres_age.
falkordb_urlstring""FalkorDB connection URL, e.g. falkor://host:6379. Required when graph_backend=falkordb. Install with uv sync --extra graph-falkordb.

postgres_age reuses postgresql_url and requires the AGE extension to be installed on the server (CREATE EXTENSION age). Install with uv sync --extra graph-postgres-age. To move a graph between backends use seerflow graph migrate --from <a> --to <b>.

KeyTypeDefaultDescription
bind_addrstring"0.0.0.0"IP address all receivers bind to. Set to 127.0.0.1 to restrict to localhost.
queue_maxsizeint10000Maximum events in the internal receiver queue before back-pressure is applied.
KeyTypeDefaultDescription
syslog_enabledbooltrueEnable the syslog listener (both UDP and TCP when their respective flags are set).
syslog_udp_portint514UDP port for syslog (RFC 3164 / RFC 5424).
syslog_tcp_portint601TCP port for syslog (RFC 6587).
syslog_tcp_enabledbooltrueEnable TCP syslog. Set false to accept UDP only while syslog_enabled=true.
KeyTypeDefaultDescription
otlp_grpc_enabledbooltrueEnable the OTLP/gRPC receiver.
otlp_grpc_portint4317gRPC port (standard OTLP port).
otlp_grpc_max_workersint4Thread-pool size for the gRPC server.
KeyTypeDefaultDescription
otlp_http_enabledbooltrueEnable the OTLP/HTTP receiver.
otlp_http_portint4318HTTP port (standard OTLP/HTTP port).
otlp_http_max_request_bytesint4194304Maximum allowed request body size in bytes (default 4 MiB). Raise for high-volume batches.
KeyTypeDefaultDescription
file_pathslist[string][]Glob patterns for log files to tail, e.g. /var/log/*.log.
file_checkpoint_dirstring""Directory to persist tail offsets across restarts. Empty string disables checkpointing.
file_debounce_msint1600Milliseconds to wait after the last write event before re-reading a file.
allowed_log_rootslist[string][]Security allowlist: file_paths must fall under one of these directory prefixes.
KeyTypeDefaultDescription
webhook_enabledboolfalseEnable the inbound HTTP webhook listener.
webhook_portint8081Port for the webhook HTTP server. Must be 1-65535.
webhookslist[mapping][]Per-endpoint webhook configurations (see sub-table below).
KeyTypeDefaultDescription
pathstring"/ingest/webhook"URL path that this endpoint listens on.
auth_headerstring""HTTP header name used for token authentication. Must be paired with auth_token.
auth_tokenstring""Expected token value. Supports ${ENV_VAR} interpolation. Must be paired with auth_header.
field_mappingmapping{}Maps Seerflow field names to JSON path keys in the incoming payload.
source_idstring"webhook"Identifier applied to events received on this endpoint.
KeyTypeDefaultDescription
sigma_rules_dirslist[string][]Additional directories containing custom Sigma rule YAML files. Loaded alongside the 63 bundled rules.
sigma_custom_upload_dirstringnullDirectory the dashboard upload UI persists Sigma rules into. Always discovered at startup.
attack_mappingslist[mapping][]Per-rule overrides for MITRE ATT&CK tags.
KeyTypeDefaultDescription
hst_window_sizeint1000Sliding window size.
hst_n_treesint25Number of trees in the ensemble.
KeyTypeDefaultDescription
dspot.calibration_windowint1000Minimum events required before DSPOT activates.
dspot.risk_levelfloat0.0001Target false-positive rate (1 alert per 10,000 normal events).
dspot.initial_percentileint98Percentile used to seed the initial threshold.
dspot_threshold_cap_multiplierfloat5.0Hard cap on threshold growth (× the initial value). Stops runaway drift.
KeyTypeDefaultDescription
hw_seasonal_periodint1440Bucket count for one season (minutes in a day).
hw_alphafloat0.3Level smoothing factor.
hw_betafloat0.1Trend smoothing factor.
hw_gammafloat0.1Seasonal smoothing factor.
hw_n_stdfloat3.0Standard-deviation multiplier for the anomaly band.
KeyTypeDefaultDescription
cusum_driftfloat0.5Allowable drift before accumulating a deviation.
cusum_thresholdfloat5.0Cumulative-sum threshold that flags a change.
cusum_ema_alphafloat0.1EMA smoothing factor for the baseline.
cusum_warmup_bucketsint30Buckets observed before CUSUM is allowed to fire.
KeyTypeDefaultDescription
markov_smoothingfloat1e-6Laplace smoothing applied to transition probabilities.
markov_min_eventsint100Minimum events per entity before scoring is enabled.
markov_max_entitiesint1000Per-source cap on entities held in memory.

DetectionEnsemble blends the four ML scores. Weights do NOT need to sum to 1.0 — the blender divides by their sum.

KeyTypeDefaultPurpose
weights_contentfloat0.30Half-Space Trees.
weights_volumefloat0.25Holt-Winters.
weights_sequencefloat0.25Markov chain.
weights_patternfloat0.20CUSUM.
weights_template_volumefloat0.15Holt-Winters keyed on Drain3 template.
weights_entity_volumefloat0.15Holt-Winters keyed on entity.
KeyTypeDefaultDescription
risk_half_life_hoursint4Exponential decay half-life on accumulated entity risk.
risk_thresholdfloat50.0Risk score at which an alert fires.
risk_max_entitiesint10000Cap on entities held in the risk register.
graph_algo_intervalint500Re-run graph algorithms (PageRank, Louvain, etc.) every N events.
KeyTypeDefaultDescription
max_sourcesint256Max distinct sources tracked by detectors.
score_intervalint1Score every Nth event per source. 1 = every event.
min_events_for_scoringint50Events observed per source before scoring engages.
max_template_hwint500Max Drain3 templates tracked by per-template volume detector.
max_entity_hwint500Max entities tracked by per-entity volume detector.
model_save_interval_secondsint300Period between ML model state checkpoints.

Cross-source correlation engine — sliding window + risk register + graph-structural scoring.

KeyTypeDefaultDescription
window_duration_secondsint1800Per-entity sliding-window duration (30 minutes).
max_events_per_entityint1000Cap on events retained per entity inside the window.
max_entitiesint10000Cap on entities held in memory by the correlation engine.
late_tolerance_secondsint30Watermark tolerance for out-of-order / late-arriving events.
rule_dirslist[string][]Extra directories containing custom correlation rule YAMLs.
KeyTypeDefaultDescription
community_crossing_enabledbooltrueFlag edges that cross detected igraph communities.
betweenness_thresholdfloat0.3Minimum normalized betweenness centrality to flag a bridge entity.
fan_out_sigmafloat3.0Standard-deviation multiplier above per-entity fan-out history to flag.
fan_out_min_floorint5Minimum fan-out value before fan-out scoring engages.
fan_out_history_sizeint20Rolling history length used for fan-out statistics.
KeyTypeDefaultDescription
enabledbooltrueEnable MITRE ATT&CK tactic-progression detection.
tactic_thresholdint3Distinct tactics within window_seconds required to fire.
window_secondsint86400Time window for tactic progression (24h).
max_entitiesint10000Memory cap.

User and Entity Behaviour Analytics — per-entity baselines.

KeyTypeDefaultDescription
enabledbooltrueMaster switch for the UEBA engine.
warmup_daysint7Days of observation before scoring kicks in for a new entity.
warmup_min_eventsint50Minimum events observed before scoring kicks in.
max_entitiesint100000Entity cap for UEBA state.
ema_alphafloat0.05Exponential-moving-average smoothing factor.
source_ip_capint64Max distinct source IPs tracked per entity.
template_top_kint32Top-K Drain3 templates retained per entity.
score_thresholdfloat0.75Alert threshold for the blended UEBA score.
alert_cooldown_secondsint900Cooldown between UEBA alerts for the same entity.

TAXII 2.1 feeds matched against ingested events via a Bloom-filter IoC matcher.

KeyTypeDefaultDescription
enabledboolfalseMaster switch.
feedslist[mapping][]TAXII feeds to poll (see sub-table below).
default_poll_interval_sint3600Default poll cadence per feed (1h).
request_timeout_sfloat30.0HTTP request timeout.
max_indicators_per_feedint1000000Hard cap to bound memory.
expired_grace_daysint30Days to retain indicators after their expiry date.
startup_jitter_sint30Random delay before first poll to spread load.
KeyTypeDefaultDescription
idstringrequiredStable identifier for the feed.
urlstringrequiredTAXII server root URL.
collection_idstringrequiredTAXII collection ID to poll.
poll_interval_sintinheritsOverride default_poll_interval_s for this feed.
confidence_floorint0Drop indicators below this confidence score.
enabledbooltruePer-feed switch.
allow_insecureboolfalseAllow http:// (non-TLS) URLs. Use only in lab environments.
allow_private_addressesboolfalseAllow feed URLs that resolve to private IP ranges (lab only).
auth.kindstringOne of api_key or basic.
auth.api_key_envstringEnv var name holding the API key.
auth.api_key_headerstring"Authorization"Header name for the key.
auth.username_env / auth.password_envstringEnv vars for basic-auth credentials.
KeyTypeDefaultDescription
enabledboolfalseEnable the Bloom-filter matcher.
fprfloat0.001Target false-positive rate (0.1%).
min_capacityint100000Initial filter capacity (indicators).
capacity_growth_factorfloat1.25Multiplier when the filter is rebuilt with more indicators.
confidence_floorint0Drop indicators below this confidence score from the filter.
rebuild_debounce_msint200Coalesce rebuilds within this window after feed updates.
enabled_typeslist[string][ipv4, ipv6, domain, url, md5, sha1, sha256]IoC types loaded into the filter.

See the Alerting page for narrative + examples. Every channel below is opt-in — nothing fires until you list a target.

KeyTypeDefaultDescription
dedup_window_secondsint900Default dedup window (15 min).
dedup_window_overrideslist[(string, int)][]Per alert_type override, e.g. [["correlation", 300]].
dashboard_urlstring""Base URL injected into message renderers for deep-links back to the dashboard.
KeyTypeDefaultDescription
urlstringrequiredWebhook URL. Supports ${ENV_VAR}.
formatstring"json"One of slack, teams, json.
min_severityint0Minimum OCSF severity ID (0–6) to dispatch.
KeyTypeDefaultDescription
pagerduty_routing_keystring""Events API v2 routing key. Supports ${ENV_VAR}. Hidden from repr.
KeyTypeDefaultDescription
namestringrequiredIdentifier referenced from routing_rules.
smtp_host / smtp_portstring / intrequiredSMTP server.
use_starttlsboolrequiredEnable STARTTLS.
from_address / to_addressesstring / list[string]requiredEnvelope.
smtp_user / smtp_passwordstring""Hidden from repr. Read at startup; rotate via restart.
min_severityint0OCSF severity gate.
max_per_minuteint?nullToken-bucket cap; omit for unlimited.
KeyTypeDefaultDescription
namestringrequired
account_sidstringrequiredTwilio account SID.
auth_tokenstring""Hidden from repr.
from_number / to_numbersstring / list[string]requiredE.164.
min_severityint0
rate_per_second / burstfloat / int1.0 / 3Token-bucket limit.
KeyTypeDefaultDescription
namestringrequired
bot_tokenstring""Hidden from repr.
chat_idstringrequiredUser ID or group ID (negative for groups).
min_severityint0
rate_per_second / burstfloat / int30.0 / 30Telegram’s documented limit.

WhatsApp targets (whatsapp_targets[], Cloud API)

Section titled “WhatsApp targets (whatsapp_targets[], Cloud API)”
KeyTypeDefaultDescription
namestringrequired
phone_number_idstringrequiredWhatsApp Cloud phone ID.
template_name / language_codestringrequiredPre-approved template + language.
access_tokenstring""Hidden from repr.
to_numberslist[string]requiredE.164.
min_severityint0
rate_per_second / burstfloat / int10.0 / 20Token-bucket + internal circuit breaker.

Routing (routing_rules[] + default_routing)

Section titled “Routing (routing_rules[] + default_routing)”
KeyTypeDefaultDescription
routing_rules[].match.alert_typestring or listsigma, ml, correlation, ueba, ioc.
routing_rules[].match.rule_namestringfnmatch.fnmatchcase glob.
routing_rules[].match.entity_typestring or listipv4, user, host, etc.
routing_rules[].match.min_severity / max_severityintInclusive range.
routing_rules[].notify[].channelstringrequiredReference to a target’s name.
routing_rules[].notify[].modestring"immediate"immediate or digest.
routing_rules[].notify[].digest_window_minutesint15Only used with digest.
default_routing.actionstring"drop"drop or notify.
default_routing.notifylist[mapping][]Same shape as routing_rules[].notify.
KeyTypeDefaultDescription
quiet_hours_by_channellist[(string, mapping)][]Pair [channel_name, { start, end, min_severity }]. Times UTC. Severities >= min_severity still break through.
KeyTypeDefaultDescription
otlp_endpointstring""OTel collector endpoint (host:port). Empty disables export.
otlp_protocolstring"grpc"grpc or http.
otlp_export_interval_secondsint5Batch flush cadence.
otlp_tlsbool?nullOverride the scheme-derived TLS default.
otlp_tls_ca_filestring""Custom CA PEM.
otlp_mtls_cert_file / otlp_mtls_key_filestring""Client cert PEMs for mTLS.

See the LLM Overview for narrative.

KeyTypeDefaultDescription
backendstring""llama_cpp, ollama, cloud, or "" to disable.
KeyTypeDefaultDescription
model_pathstring""Path to a GGUF model.
n_ctxint4096Context window in tokens.
n_threadsint?nullCPU threads; null uses the default.
n_gpu_layersint0Layers to offload to GPU (0 = CPU-only).
max_tokens_defaultint256Per-request token cap.
temperature_defaultfloat0.2Sampling temperature.
seedint42Deterministic sampling seed.
KeyTypeDefaultDescription
ollama_urlstring"http://localhost:11434"Ollama server URL.
ollama_modelstring"phi4-mini"Pulled model name.
ollama_timeout_sfloat30.0Per-request wall-clock timeout.
KeyTypeDefaultDescription
cloud_providerstring""anthropic or openai.
cloud_api_keystring""API key. Hidden from repr.
cloud_modelstring""Model ID, e.g. claude-sonnet-4-6.
cloud_timeout_sfloat30.0Per-request wall-clock timeout.
cloud_base_urlstring""Override provider base URL (proxies, gateways).
KeyTypeDefaultDescription
explanation_cache_sizeint256LRU size for AlertExplanationService.

/api/v1/ws is the dashboard’s live feed. These knobs sit at the top level of seerflow.yaml.

KeyTypeDefaultDescription
ws_max_connectionsint20Max concurrent client connections.
ws_queue_maxlenint1000Per-connection outbound queue (drops oldest on overflow).
ws_tick_interval_sfloat0.01Internal flush cadence.
ws_batch_max_eventsint10Max events grouped into one frame.
ws_status_interval_sfloat5.0Cadence of pipeline status frames.
ws_allowed_originslist[string][]Explicit Origin allowlist. Empty = localhost defaults derived from dashboard_port.
ws_filter_min_interval_msint100Debounce window for filter-change re-subscriptions.

Top-level keys controlling REST API rate limits + CORS + reverse-proxy trust.

KeyTypeDefaultDescription
api_rate_limit_enabledbooltrueMaster switch for endpoint rate limits.
api_rate_limit_redis_urlstring?nullRedis URL for multi-process limit sharing. Hidden from repr. Falls back to per-process in-memory.
api_allowed_originslist[string][]CORS allowlist. Empty = no CORS (same-origin only).
api_list_rate_limitstring"60/minute"Limit for list endpoints (/alerts, /events, /entities/search).
api_detail_rate_limitstring"300/minute"Limit for detail endpoints.
api_coverage_rate_limitstring"10/minute"Limit for the expensive /attack/coverage endpoint.
api_trust_proxy_headersboolfalseWhen true, honour X-Forwarded-For for rate-limit client identity. Enable only behind a trusted reverse proxy.
storage:
backend: sqlite
graph_backend: igraph
receivers:
bind_addr: "0.0.0.0"
syslog_enabled: true
syslog_udp_port: 5514
syslog_tcp_port: 5601
otlp_grpc_enabled: true
otlp_grpc_port: 4317
otlp_http_enabled: true
otlp_http_port: 4318
webhook_enabled: false
file_paths:
- /var/log/syslog
- /var/log/auth.log
detection:
# sigma_rules_dirs:
# - /etc/seerflow/sigma-rules
hst_window_size: 1000
hst_n_trees: 25
dspot:
calibration_window: 1000
risk_level: 0.0001
initial_percentile: 98
correlation:
window_duration_seconds: 1800
kill_chain:
enabled: true
tactic_threshold: 3
ueba:
enabled: true
warmup_days: 7
score_threshold: 0.75
alerting:
dedup_window_seconds: 900
dashboard_port: 8080
log_level: INFO

Production example (PostgreSQL + Slack + TAXII)

Section titled “Production example (PostgreSQL + Slack + TAXII)”
storage:
backend: postgresql
postgresql_url: ${SEERFLOW_PG_URL}
postgresql_pool_min_size: 4
postgresql_pool_max_size: 20
graph_backend: postgres_age
alerting:
dedup_window_seconds: 900
pagerduty_routing_key: ${SEERFLOW_PD_KEY}
webhooks:
- url: ${SLACK_WEBHOOK_URL}
format: slack
threat_intel:
enabled: true
matcher:
enabled: true
feeds:
- id: otx-malware
url: https://otx.alienvault.com/taxii2/
collection_id: malware
auth:
kind: api_key
api_key_env: OTX_API_KEY