Skip to content
Super 1.7.0 is production-ready — transactional installs with automatic rollback, cron runtime caps (kill_after_secs), and panic-free input handling. See what’s new →

Config Reference

Edition legend

MarkMeaning
💎 SubscriptionRequires valid [license].key in conf/super.toml and matching authorized plugin libraries. Single-admin core auth and the embedded Dashboard are OSS (no 💎).
(no mark)Available in OSS (with or without plugins).

Free 90-day trial

Licensed plugins (Super Pro) are available with a free 90-day trial license (Portal claim). See the feature matrix. Day-to-day auth and Dashboard: Essentials. Licensed plugins: Advanced Management.

Licensed-plugin fields in this reference (quick index):

LocationKeys / file
[server]auth_secret — OSS core auth or licensed security bootstrap (💎 required when licensed)
[license]key 💎 — cryptographically signed subscription token from your vendor
conf/conf.d/* (program stacks)services[].resource_limits (cpu_quota, memory_limit, memory_warn_percent, memory_warn_headroom, memory_high) 💎
conf/notify.toml (separate file)[[channels]] 💎 — see Event Notifications

Note

See Configuration — OSS security defaults for fail-closed bind, log path confinement, and other defensive defaults.

Instance layout (SUPER_ROOT)

The instance root is resolved from SUPER_ROOT first, then the binary’s directory layout, then the working directory — see Environment Variables.

PathPurpose
conf/super.tomlDaemon settings (this file)
conf/notify.tomlLicensed notify plugin config (optional)
data/Persisted registry / auth state
data/tokens.json💎 Access Token records (security plugin).
data/auth_settings.json💎 security plugin: currently auth_secret_disabled (turn off bootstrap auth_secret login).
logs/Daemon (app.log) and child process logs
run/Runtime files; default pidfile run/superd.pid when self-daemonizing
plugins/Licensed .so / .dylib libraries

[server]

Global settings for the daemon.

KeyTypeDefaultDescription
auth_secretstring—Admin Bearer secret. Non-empty enables OSS core auth. Required for non-loopback TCP binds (unless security is active). Licensed 💎: also required for security plugin startup / bootstrap; Admins may later disable login with it after creating an Admin Access Token. Top-level auth_secret keys are rejected (must live here under [server]).
hoststring127.0.0.1Bind address for API and Dashboard.
portint9002Bind port.
shutdown_timeoutint10Seconds to wait for SIGTERM before SIGKILL during shutdown.
flapping_windowint60Time window (seconds) to detect restart loops.
flapping_thresholdint5Max restarts allowed within the window.
enable_docsboolfalseEnable Swagger UI (/api/docs) when the binary is built with the docs feature.
daemonboolfalseUnix only: self-daemonize after start (like nginx daemon on). Keep false under systemd/Docker (Type=simple / PID 1). CLI: --daemon / --foreground override this.
pidfilestring—Optional pidfile path. Relative paths resolve under SUPER_ROOT. When daemonizing and unset, defaults to run/superd.pid. Foreground writes a pidfile only when this (or --pidfile) is set. CLI: --pidfile.
socketstring—Optional Unix socket endpoint for the API, e.g. socket = "run/superd.sock". Relative paths resolve under SUPER_ROOT; absolute paths are used as-is. Unix only (macOS/Linux). When set, the daemon listens on both TCP and the socket unless socket_only = true. The socket file is created with socket_mode permissions (default 0600, owner only) and removed on clean shutdown.
socket_modestring0600Unix socket file permission mode as an octal string (0600 = owner read/write, 0660 = owner + group, 0640 = owner read/write + group read). World-writable modes (0666) are refused — a world-writable socket would let any local user drive the control API.
socket_onlyboolfalseWhen true, bind only the Unix socket and skip the TCP listener entirely (zero network exposure). Requires socket to be set. The non-loopback bind check no longer applies because no TCP port is opened.
request_timeout_secsint30Whole-request wall-clock budget for the API in seconds. A request that does not finish in time is answered with 408 ({"status":"error","message":"request timeout"}). 0 disables the limit. Plugin HTTP hooks carry their own tighter 10-second budget inside this. Note for control routes (/stop, /system/shutdown, …): a 408 means the response timed out, not that the operation failed — stop/shutdown work continues in the background; re-query status instead of retrying the request.
# super.toml — [server]
[server]
# Enable API auth (required when binding beyond loopback):
# auth_secret = "your-own-long-random-string"

# Optional self-daemonize when not using systemd/Docker:
# daemon = true
# pidfile = "run/superd.pid"   # default when daemonizing

# Optional wall-clock budget for API requests (seconds, 0 = disabled):
# request_timeout_secs = 30

# Optional Unix socket endpoint (default 0600, owner-only):
# socket = "run/superd.sock"
# socket_mode = "0600"   # "0600" | "0640" | "0660" — never world-writable
# socket_only = true     # disable the TCP listener entirely

# CLI: super --server unix:///path/to/superd.sock list

[license] — subscription key (Licensed 💎)

Optional section in conf/super.toml. When present and valid, superd loads authorized plugins from plugins/ and requires the bundled security plugin (security.so + auth_secret) or refuses startup. See Licensed deployments require security.

When a key is present but does not verify, behavior depends on deployment signals:

ConditionInvalid key behavior
Loopback OSS dev (no plugins, no auth_secret)Degrade to OSS with stderr/tracing warnings
Licensed intent (plugins on disk, auth_secret set, or non-loopback bind)Refuse startup
[license].strict = true (or SUPER_LICENSE_STRICT=1)Refuse startup always

The SUPER_LICENSE and SUPER_LICENSE_STRICT overrides are documented in Environment Variables.

KeyTypeDefaultDescription
key 💎string—Base64-encoded signed subscription key. Obtain from your subscription vendor. Override: SUPER_LICENSE env (same format). Every valid license includes a signing key id (kid, e.g. k_<8hex>) that must match a verifying key embedded in your superd build — see Troubleshooting license verification.
strict 💎boolfalseWhen true, invalid or incompatible keys refuse startup instead of degrading to OSS. Recommended for production licensed deployments. Override: SUPER_LICENSE_STRICT=1.
# super.toml — [license]
[license]
strict = true
key = "eyJjbGFpbXMiOnsiaXNzdWVkX3RvIjoi..."

[storage] / [logging] / [child_logging]

See Configuration and Logging for examples. Keys mirror ServerConfig in common/src/config.rs.

[storage] — data paths & event retention

KeyTypeDefaultDescription
data_filepath./data/snapshot.jsonRuntime program snapshot (snapshot.json). See Snapshot persistence & restore.
log_dirpath./logsDaemon + child log directory.
events_filepath./data/events.dbSQLite event-history database location. Relative paths resolve under SUPER_ROOT.
events_keep_daysint30Retention window (days) for persisted event history. Events older than this are pruned once per day. 0 keeps everything (unlimited).

Event history is persisted to SQLite at events_file (default data/events.db, WAL mode). Every lifecycle event is recorded — program crashes, exits, recoveries, health restarts, cron runs (cron_started/cron_exit/cron_spawn_failed), queue drops, and daemon startup/shutdown. The store supports time/type/exit-code/text filtering and retention statistics via super events and the events API. The database is tuned for high write/query throughput: batched transactional inserts from a background writer, indexes aligned with the millisecond sort key, and WAL PRAGMA settings (large page cache, memory temp tables, capped WAL growth) are applied automatically. See Event History for usage.

[child_logging] — child process log capture

KeyTypeDefaultDescription
driverfile | stdoutfileWhere captured child stdout/stderr lines go. stdout prints them (prefixed with [name:source]) to the daemon’s own stdout; file writes to {log_dir}/{id}.out / .err.
max_size_mbint10Max size per log file before rotation (MB).
max_backupsint5Number of rotated backups to keep; older backups are deleted (not an infinite archive).
max_line_size_kbint16Max single-line length in KB; longer lines are truncated before disk/WebSocket.
timestamplocal | utc | nonelocalPrefix each captured line with a timestamp. local → [YYYY-MM-DD HH:MM:SS], utc → [YYYY-MM-DDTHH:MM:SSZ], none → raw line. Applied when the daemon consumes the line; the WebSocket stream always carries the raw line.
# super.toml — [child_logging]
[child_logging]
driver = "file"
max_size_mb = 10
max_backups = 5
max_line_size_kb = 16
timestamp = "local"

[include] — program stack files

Programs are declared in stack files, not in super.toml. [include].files lists glob patterns for those files; superd parses every match as a stack and applies it on daemon start and on super reload.

KeyTypeDefaultDescription
fileslist of string[]Glob patterns for program stack files, e.g. ["conf/conf.d/*.toml"]. TOML is the default format (.toml or no extension); legacy .json stacks are still parsed and can be mixed in the same glob. Relative patterns resolve under SUPER_ROOT; patterns that resolve outside SUPER_ROOT are skipped.
# super.toml — [include]
[include]
files = ["conf/conf.d/*"]

Stack file schema and per-program keys: the Program stacks section below.

Program stacks — conf/conf.d/*

Programs are not declared in super.toml — [[programs]] / [[program]] tables there are ignored (super check reports them as an error). Programs load from stack files matched by [include].files (applied on daemon start and super reload), the API (POST /api/v1/programs), or the CLI (super add); all persist to data/snapshot.json.

A stack file is a TOML (default) or JSON document with services = [...] and an optional prune flag (default false when omitted — pruning never runs unless set to true). TOML uses one [[services]] table per program; JSON uses the legacy {"services":[...]} shape. See Declarative Stacks for a full example.

Note

In TOML stacks, tagged values like health_check are written as an inline table — health_check = { type = "tcp", port = 8080 } — or a nested table ([services.health_check]); [[array.of.tables]] is rejected.

The keys below describe a single program entry — one item in a stack file’s services[] array, or a create/update API payload. Multiple services[] entries are allowed per stack.

Note

Keys such as autostart, autorestart, exitcodes, startsecs, and stopsecs align with Supervisor for migration. Newer keys (retry_limit, health_check, depends_on, artifact, …) use snake_case. In stack JSON / API payloads, stopwaitsecs is accepted as an alias for stopsecs. OTA settings live under per-program artifact (including download_timeout / verify_timeout) — not under [server] or a global [ota] section.

Identity & execution

KeyTypeDefaultDescription
namestring—Required. Unique program name.
commandstring—Required. Path to the executable.
argslist[]Command-line arguments.
envdict{}Inline environment variables (KEY = "VAL").
env_filestring—Path to a .env file loaded at spawn time.
cwdstring—Working directory. When unset, the program inherits superd’s own working directory (the directory the daemon was started in — under systemd/launchd this is typically /). The effective value is shown in super info and the Dashboard.
userstring—Run as this user (requires root).
groupstring—Logical group for batch control (e.g. @backend).
numprocsint1Spawn N OS processes from this program (super add --numprocs). For workers / queue consumers — not a rolling dual-version deploy, and not Node cluster mode. See Process Operations.
process_namestring{name}-{num}Name template when numprocs > 1 (e.g. worker-{num}). Each instance gets SUPER_PROCESS_NUM / SUPER_PROCESS_TOTAL.

Restart & stop behaviour

autostart and autorestart are independent:

  • autostart — start the program when superd boots.
  • autorestart — restart the program after it exits (crash recovery).

Example: autostart = false with autorestart = "true" gives a manually started service that still recovers from crashes.

super stop and super start persist their effect: stop holds the program (and its cron schedule) down across daemon restarts; start clears the hold and sets autostart = true. See State Across Daemon Restarts.

KeyTypeDefaultDescription
autostartbooltrueStart on daemon boot. Cron programs skip boot-time start regardless.
autorestartstringunexpectedunexpected — restart unless exit code is in exitcodes; true — always restart; false — never restart on exit.
exitcodeslist[0]Exit codes treated as success when autorestart = "unexpected".
retry_limitint3Max consecutive crash restarts before status becomes Fatal.
startsecsint10Seconds of stable uptime before an exit resets the retry counter.
stopsecsint[server].shutdown_timeoutPer-program seconds to wait after SIGTERM before SIGKILL. Omit to use [server].shutdown_timeout (default 10). TOML alias: stopwaitsecs.
priorityint999Boot-time autostart order; lower values start first.

Logging

KeyTypeDefaultDescription
stdout_logfilestring{log_dir}/{uuid}.outCustom stdout log path (must resolve under storage.log_dir).
stderr_logfilestring{log_dir}/{uuid}.errCustom stderr log path (must resolve under storage.log_dir).

Orchestration

KeyTypeDefaultDescription
depends_onlist[]Program names that must be Healthy before this one starts. References are validated on stack apply, create, and update: unknown names are rejected with depends_on: unknown service(s): …, and configurations that would close a dependency cycle are rejected with the cycle members listed (include stacks applied during daemon start/reload only warn, for backward compatibility).
cronstring—Cron expression (e.g. 0 0 * * * *). See Scheduled Tasks.
on_overlapstringskipCron overlap policy: skip (drop tick while previous run is active), queue (run after the current instance exits), or kill (terminate the running instance, then run).
catchupstringskipCron catch-up policy for slots missed while the daemon was down: skip (drop), latest (backfill the most recent slot once), or all (backfill every missed slot, capped at 10).
jitter_secint0Max random delay in seconds added to each cron trigger to spread load. 0 disables jitter.
max_concurrentint1Max overlapping cron runs allowed at once (1–64; 0 means the default). See Scheduled Tasks.
max_queuedint100Cap on queued cron firings when max_concurrent is reached and on_overlap is queue/kill (0–10000; 0 means the default). Firings beyond the cap are dropped and recorded as queue_full events.
kill_after_secsint0Per-run wall-clock cap for cron runs, measured from process start. When a run exceeds it, the supervisor stops it (SIGTERM, then SIGKILL after stopsecs) and records a cron_overtime_kill event; the schedule keeps firing. 0 disables the cap. See Scheduled Tasks.

artifact

Per-program OTA / binary update settings (stack entry, create/update API, dashboard, or CLI super update --artifact-*). Storing an artifact does not download by itself — OTA starts when an update changes checksum. See OTA Updates — When OTA runs. Full flow: OTA Updates.

KeyTypeDefaultDescription
sourcestring—Required when triggering OTA. Download URL. Remote hosts must use HTTPS (HTTP allowed on loopback for dev).
checksumstring—Required when triggering OTA. SHA256 hex of the downloaded bytes (the archive when extract is true).
destinationstring—Required when triggering OTA. Absolute path of the final binary on disk.
extractboolfalseUnpack .tar.gz / .tgz / .tar / .zip and stage one payload file to destination.
restart_policystringimmediateimmediate, manual, or signal / signal:<name>. See OTA Updates.
download_timeoutint60Max seconds for this artifact’s HTTP download (connect + body). Raise for large/slow links. 0 disables the overall transfer timeout (a 10s connect timeout still applies). CLI: --artifact-download-timeout.
verify_timeoutint60Post-swap verification window (seconds). The new version must become Healthy within this window; on timeout the daemon rolls back. 0 disables. Without a live health_check, commit waits for startsecs (min 1s); if this timeout is shorter than that dwell, Super extends it automatically. CLI: --artifact-verify-timeout.
# conf/conf.d/api.toml — optional artifact block on a service
[[services]]
name = "api"
command = "/usr/local/bin/api"
# …
[services.artifact]
source = "https://example.com/builds/api"
checksum = "a1b2c3d4e5f6789abcdef0123456789abcdef0123456789abcdef0123456789"
destination = "/usr/local/bin/api"
extract = false
restart_policy = "immediate"
# download_timeout = 60
# verify_timeout = 60

hooks

Per-program lifecycle shell hooks. Full behavior table: Lifecycle Hooks.

KeyTypeDefaultDescription
pre_startstring—Run before spawn; non-zero exit aborts start.
post_startstring—Run after PID assigned (async).
pre_stopstring—Run before stop signal (sync).
post_stopstring—Run after process exits (async).

health_check

KeyTypeDefaultDescription
typestring—Required. tcp, http, or exec.
hoststring127.0.0.1For tcp checks.
portint—For tcp checks.
urlstring—For http checks.
methodstringGETFor http checks: GET, HEAD, or POST.
commandstring—For exec checks.
interval_secsint5Seconds between probes. 0 = default.
timeout_secsint3 (tcp) · 5 (http) · 7 (exec)Max seconds a single probe may take. 0 = default.
start_period_secsint1Grace window after start during which probe failures do not count toward max_failures. Probes run immediately; the first success ends the window early. 0 = default.
max_failuresint3Consecutive failures before auto-restart; 0 disables auto-restart. Bounded by retry_limit — see Health Checks.

resource_limits 💎

Schema fields are always accepted and stored. Enforcement (Linux cgroups v2 CPU/memory) requires the isolation plugin — without it, Super warns that limits are stored only. See Resource Isolation.

KeyTypeDefaultDescription
cpu_quota 💎float—CPU quota in cores (1.0 = one core, 0.5 = half a core).
memory_limit 💎int—Hard memory limit in MB (1 MB = 1024² bytes); kernel OOM-kills when exceeded.
memory_warn_percent 💎int80Pre-kill warning threshold as % of memory_limit (Tier 1). 0 disables.
memory_warn_headroom 💎int0Also warn when live memory is within this many MB of the limit. 0 disables.
memory_high 💎int0Kernel soft limit in MB (cgroup memory.high, Tier 2, opt-in). 0 disables.

[[event_hooks]] (OSS)

Global event listeners: local scripts (JSON on stdin) or native webhooks (url). Distinct from licensed conf/notify.toml webhooks (notify plugin). Full reference: Event Hooks.

Warning

[webhook] is not supported in super.toml. superd and super check reject configs that still contain a [webhook] table. For IM-specific templates, use conf/notify.toml with the notify plugin.

KeyTypeDefaultDescription
commandstring—Shell command (sh -c). Receives JSON on stdin. Ignored when url is set.
urlstring—HTTP(S) webhook URL. When set, the event JSON is POSTed here instead of running command.
headersmap—Extra headers for webhook mode (e.g. Authorization).
eventslist["*"]Event names (process_fatal, …) or "*".
programslist["*"]Program names to match, or "*".
asyncbooltrueRun hook in background task (webhooks are fire-and-forget).
timeout_secsint30Kill hook script / abort webhook request after N seconds.
idstring—Optional label for logs.

conf/notify.toml 💎

Licensed plugin only (notify). Separate from super.toml. Hot-reloadable webhook / IM channels. Schema and presets: Event Notifications.

System events & reactions

Super emits System Events (process_fatal, process_started, etc.). Where to configure reactions:

MechanismConfig fileEditionStatus
Lifecycle hooksper-program hooks (stack JSON / API)OSS✅ Active
Event hookssuper.toml → [[event_hooks]]OSS✅ Event Hooks
Webhook notificationsconf/notify.toml💎 Licensed (notify)✅ Event Notifications

Was this page helpful? Thanks for your feedback!

Still have questions? Open an issue or browse the source.