Supervisor, but it doesn't hate you back.
A production-grade process supervisor for the modern sysadmin. Drop-in compatible with your existing supervisord.conf, but with email alerts, a REST API, a built-in web UI, and a CLI that won't make you cry at 3am.
Python 2 baggage. Pinned dependencies. A web UI from another era. A CLI that gets weird under pressure. Sound familiar?
Direktor is a single statically-linked Go binary that does everything Supervisor does, drops into the same config, and adds the things you've been hand-rolling around it for a decade — email alerts, a real REST API, hot config reload, runtime process management, and a web UI that doesn't make you reach for the dev tools to read it.
Point it at your existing supervisord.conf. It will probably just work. That's not an accident — it's the whole point.
Pick the archive that matches your platform and CPU architecture. All downloads are served directly from this site.
.tgz archives
.tgz archives
.tgz archives
No more cron jobs scraping the XML-RPC interface. No more shell wrappers around supervisorctl. No more "did the alerting work this time?"
INI config that mirrors Supervisor's. Use [supervisord] or [direktord]. Existing [program:x] sections work as-is. Migration is a binary swap, not a rewrite.
SMTP with TLS, configurable per-state triggers (FATAL, STOPPED, RUNNING…), and a 5-second batching window so cascading failures don't nuke your inbox.
Clean JSON endpoints for list, start, stop, restart, add, remove, logs, and reload. Token or basic auth. No XML-RPC, no surprises, no hand-rolled parsers.
Real-time process list, start/stop/restart/remove buttons, an Add Service form, live log viewer (stdout & stderr), 5-second auto-refresh, keyboard accessible.
No more "edit config, reread, update, pray." Add new managed processes via the Web UI or REST API without touching a single config file.
Linux, macOS, and Windows. Unix domain sockets where they exist, TCP-on-localhost where they don't. Process groups handled correctly on every platform.
always, on-failure, or never — with proper expected-exit-code handling and exponential backoff before going FATAL. No more flapping services killing your CPU.
Per-process stdout and stderr rotation with configurable max bytes and backup count. No logrotate recipes, no cron, no awkward HUP dance.
Send SIGHUP or call /api/reload. Config changes apply without restarting your services. Glob-based [include] works exactly like you'd expect.
Manage your whole web stack — app, worker, scheduler, queue runner — as a single named unit. Start the group, stop the group, restart the group. One command.
Two binaries, actually: direktord and direktorctl. No interpreter, no pip install, no virtualenvs. scp it and run it.
Per-process RWMutex, per-process monitoring goroutines, async non-blocking notifications, and clean context cancellation. No global lock holding back your fleet.
No marketing fluff. Here's what's different.
| Feature | Supervisor | Direktor |
|---|---|---|
| Language / runtime | Python (interpreter required) | Go (single static binary) |
| Install footprint | pip + dependencies + service file | Drop the binary, done |
| Config format | INI | Same INI — drop-in compatible |
| Control protocol | XML-RPC | JSON REST API + Unix socket |
| Email alerts | Bolt-on event listener (DIY) | First-class, batched, TLS |
| Add process at runtime | Edit config + reread + update | POST to /api/processes |
| Web UI | Vintage | Modern, live, keyboard-friendly |
| Windows support | No | Yes — TCP IPC, console-event signals |
| arm64 binaries | Build it yourself | Shipped |
If you've used Supervisor, you already know how to drive Direktor.
; Drop-in compatible with supervisord.conf [direktord] logfile = /var/log/direktor/direktord.log http_port = 9876 http_auth = token http_auth_token = changeme [program:webapp] command = /usr/bin/gunicorn app:application -b :8000 directory = /opt/webapp user = www-data autorestart = always startretries = 3 stdout_logfile_maxbytes = 50MB stdout_logfile_backups = 10 [email] enabled = true smtp_host = smtp.example.com smtp_port = 587 use_tls = true recipients = [email protected], [email protected] notify_on = FATAL, STOPPED, RUNNING [include] files = /etc/direktor/conf.d/*.conf
$ direktorctl status webapp NAME STATUS PID UPTIME webapp RUNNING 12345 2h 15m 3s $ direktorctl restart webapp webapp: stopped webapp: started (pid 12892) $ direktorctl reread && direktorctl update
# Add a new managed process at runtime $ curl -X POST http://localhost:9876/api/processes \ -H 'Authorization: Bearer changeme' \ -H 'Content-Type: application/json' \ -d '{ "name": "my-worker", "command": "/usr/bin/worker", "autorestart": "always" }'
Every state transition is deliberate. Every retry is bounded. Every backoff is exponential. When a process goes FATAL, it stays FATAL until you say otherwise — no infinite restart loops chewing through your CPU at 4am.
Email alerts ride the same state machine, so you find out from your inbox before you find out from the on-call rota.
Existing Supervisor fleet you can't easily rip out. Migrate one host at a time. Same config, same workflow, fewer 3am pages.
VPS-hosted side projects, on-prem boxes, edge devices. systemd alone is not enough. Kubernetes is too much. Direktor is the middle path.
Locked-down arm64 systems where Python feels like a liability. A single 10MB binary that just runs. No interpreter, no surprises.
Direktor is open source under GPLv3. Linux, macOS, and Windows binaries shipped per release. Drop it in. Watch it work.