PROCESS SUPERVISOR WRITTEN IN GO

Direktor

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.

Linux macOS Windows amd64 / arm64 GPLv3

Supervisor turns 20 this year. It shows.

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.

2
Static binaries.
That's the install.
0
Runtime dependencies.
No Python, no pip, no venv.
6
Build targets out of the box.
Linux, macOS, Windows × amd64/arm64.
Hours of your life back.
(Approximately.)

Download Direktor

Pick the archive that matches your platform and CPU architecture. All downloads are served directly from this site.

View GitHub releases

Everything Supervisor does. Plus the bits you keep wishing it did.

No more cron jobs scraping the XML-RPC interface. No more shell wrappers around supervisorctl. No more "did the alerting work this time?"

Drop-In Compatible

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.

Email Alerts Built In

SMTP with TLS, configurable per-state triggers (FATAL, STOPPED, RUNNING…), and a 5-second batching window so cascading failures don't nuke your inbox.

Real REST API

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.

Built-in Web UI

Real-time process list, start/stop/restart/remove buttons, an Add Service form, live log viewer (stdout & stderr), 5-second auto-refresh, keyboard accessible.

Add Services at Runtime

No more "edit config, reread, update, pray." Add new managed processes via the Web UI or REST API without touching a single config file.

Cross-Platform

Linux, macOS, and Windows. Unix domain sockets where they exist, TCP-on-localhost where they don't. Process groups handled correctly on every platform.

Smart Restart Policies

always, on-failure, or never — with proper expected-exit-code handling and exponential backoff before going FATAL. No more flapping services killing your CPU.

Log Rotation, Solved

Per-process stdout and stderr rotation with configurable max bytes and backup count. No logrotate recipes, no cron, no awkward HUP dance.

Hot Config Reload

Send SIGHUP or call /api/reload. Config changes apply without restarting your services. Glob-based [include] works exactly like you'd expect.

Programme Groups

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.

Single Static Binary

Two binaries, actually: direktord and direktorctl. No interpreter, no pip install, no virtualenvs. scp it and run it.

Concurrency-Safe Core

Per-process RWMutex, per-process monitoring goroutines, async non-blocking notifications, and clean context cancellation. No global lock holding back your fleet.

The honest comparison.

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

Familiar config. Modern tooling.

If you've used Supervisor, you already know how to drive Direktor.

/etc/direktor/direktor.conf INI
; 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 CLI
$ 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
REST API JSON
# 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"
    }'

Predictable process lifecycle.

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.

STOPPED→ start
STARTING→ startsecs elapsed
RUNNING→ exit
EXITED→ autorestart triggers
BACKOFF→ retry (1s, 2s, 3s…)
FATAL→ manual recovery

Built for the people who actually run the box.

Sysadmins inheriting Supervisor

Existing Supervisor fleet you can't easily rip out. Migrate one host at a time. Same config, same workflow, fewer 3am pages.

Single-node deployments

VPS-hosted side projects, on-prem boxes, edge devices. systemd alone is not enough. Kubernetes is too much. Direktor is the middle path.

Embedded & appliance builds

Locked-down arm64 systems where Python feels like a liability. A single 10MB binary that just runs. No interpreter, no surprises.

Stop babysitting your supervisor.

Direktor is open source under GPLv3. Linux, macOS, and Windows binaries shipped per release. Drop it in. Watch it work.