Skip to content
Super v1.1.9 is here! 🎉 See the changelog

vs Supervisor

Supervisor has been the industry standard for process management for over a decade. It is stable and battle-tested. However, it was designed in an era before containers, microservices, and modern DevOps pipelines.

Here is why Project Super is the modern successor.

1. The Dependency Tax

Supervisor is written in Python. To run it, you must install a Python interpreter and the necessary libraries.

  • Bare Metal: You have to manage Python versions and pip environments.
  • Containers: Adding Python to a minimal base image (like Alpine or Distroless) often doubles the image size.

Comparison:

FeatureSupervisor (Python)Project Super (Rust)
Runtime RequirementPython 2.7 or 3.xNone (Static Binary)
Docker Base Imagepython:slim or manual installscratch or alpine
Disk Footprint~50MB+ (Interpreter + Libs)~5MB

2. Configuration: INI vs TOML

Supervisor uses the INI format, which lacks nested structures and typing. Super uses TOML, which maps 1:1 to JSON and supports arrays, tables, and strong types.

Supervisor (supervisord.conf):

[program:my-app]
command=/bin/app
autostart=true
autorestart=true
environment=KEY="val",KEY2="val2"

Super (super.toml):

[[programs]]
name = "my-app"
command = "/bin/app"
autostart = true
retry_limit = 3

[programs.env]
KEY = "val"
KEY2 = "val2"

3. The API Gap: XML-RPC vs REST

This is the most significant difference for DevOps automation.

Supervisor: XML-RPC

Supervisor exposes an XML-RPC interface. It is notoriously difficult to interact with unless you use a specific client library.

  • Debugging: You cannot simply curl it to see the status.
  • Integration: Integrating with modern dashboards or CI/CD requires writing complex XML-RPC wrappers.

Super: REST & WebSockets

Super adopts an API-First design. The CLI is just a wrapper around the HTTP API.

Get Status:

curl http://localhost:9002/api/programs

Restart a Process (API paths use program UUID, not name):

ID=$(curl -s http://localhost:9002/api/programs | jq -r '.[] | select(.name=="my-app") | .id')
curl -X POST "http://localhost:9002/api/programs/${ID}/restart"

Real-time Logs: Connect to ws://localhost:9002/ws?id=... to stream logs instantly. No polling required.

Migration Cheatsheet

Mapping your muscle memory from supervisorctl to super:

Actionsupervisorctlsuper
Check Statussupervisorctl statussuper list
Start Processsupervisorctl start <name>super start <name>
Tail Logssupervisorctl tail -f <name>super logs <name>
Reload Configsupervisorctl reread && updatesuper update <name> ...
Group Actionsupervisorctl restart <group>:super restart @<group>
Reload app configsupervisorctl signal HUP <name>super reload <name>
Reload daemon configsupervisorctl reloadsuper reload (no target)

Supervisor Migration: reread / update / reload

Supervisor and Super use different configuration models. Use this table when migrating automation:

SupervisorWhat it doesSuper equivalent
supervisorctl rereadRe-read config files into memory; does not change running processesNo 1:1 command. Edit super.toml / stack JSON locally; changes apply on next explicit action.
supervisorctl updateApply config changes; may start new programs and restart changed onessuper update <name> ... updates persisted config. Does not auto-restart unless you also change OTA artifact checksum or run super restart <name>.
supervisorctl reloadRe-read supervisord main config (not program sections)super reload (no target) — reloads system config (super.toml), log level, includes.
supervisorctl restart <name>Stop then start one programsuper restart <name>
supervisorctl signal HUP <name>Send signal to running processsuper reload <name> or super signal <name> hup

Decision guide

  1. Changed program command/env onlysuper update <name> ... then super restart <name> if it is running.
  2. Changed global server settingssuper reload (no target).
  3. App supports SIGHUP config reload (nginx, etc.)super reload <name> without restart.
  4. Deploy new binary → use OTA artifact block, or replace binary + super restart <name>.
  5. Zero-downtime release → use load balancer / blue-green; Super intentionally does not run two instances of the same program (same as Supervisor).

Fields mapped from Supervisor

SupervisorSuper
stopwaitsecsstopsecs (optional; else [server].shutdown_timeout)
prioritypriority (lower starts first; complements depends_on)
stdout_logfilestdout_logfile
stderr_logfilestderr_logfile
startretriesretry_limit
autorestart=unexpectedautorestart = "unexpected" + exitcodes

Not yet mapped (use workarounds)

SupervisorWorkaround
stopsignal (per program)super signal <name> <sig> manually; default stop uses SIGTERM
redirect_stderr=trueNot supported; stdout/stderr are separate files
[eventlistener:x]OSS [[event_hooks]] + Premium notify.toml; see Event Hooks