Ferrox
Pre‑alpha

A fast, batteries‑included process manager for anything with a PID

“pm2, but Rust” — predictable, observable, and boringly reliable. Cross‑platform by design: Linux, macOS, and Windows.

Linux · macOS · Windows

Zero‑downtime reloads

Graceful signals, socket handoff on POSIX, and blue/green strategies so your endpoints stay hot during deploys.

First‑class observability

Structured logs, Prometheus metrics, and optional OpenTelemetry traces — no sidecars required.

Secure by default

Local‑first control plane over IPC. No network exposure unless you enable the HTTP API explicitly.

See full feature list here.

How it works

Ferrox consists of two cooperating binaries: a user‑facing CLI and a background daemon. The CLI talks to the daemon over OS‑native IPC.

CLI

ferrox-cli
  • Start/stop/reload/scale apps
  • Tail logs and query status
  • Install/uninstall the daemon as a system service
  • Export systemd units

Daemon

ferrox-daemon
  • Supervisor state machine & restart/backoff
  • Health checks, watchers, metrics
  • IPC over UNIX sockets / Windows named pipes
  • Per‑OS integrations (systemd/launchd/Windows Service)

Linux

systemd user units, signals (TERM/HUP), cgroups, and socket activation via sd_listen_fds.

macOS

Launchd agents, POSIX signals, and socket handoff through descriptor inheritance.

Windows

Installed as a Windows Service (SCM). Process groups via Job Objects; IPC with named pipes.

Learn more about how Ferrox works.

Minimal examples

Install, run, and configure in minutes.

CLI

# dev install
cargo install ferrox-cli ferrox-daemon

# initialize a project
echo "console.log('hello')" > app.js
ferrox init

# run four instances
ferrox start web -- cmd="node app.js" --instances=4 --watch

# zero-downtime reload
ferrox reload web

Config

version = 1
[defaults]
restart = "always"
backoff = { min_ms = 500, max_ms = 30000, factor = 2.0, jitter = true }
log_format = "json"

[apps.web]
cmd = "node server.js"
instances = 4
watch = ["src"]
healthcheck = { http = "http://127.0.0.1:3000/health", interval_ms = 2000 }

[apps.worker]
cmd = "./target/release/worker"
instances = 2
restart = "on-failure"

Install the CLI and daemon

One command to try it locally. Export to systemd when you're ready.

cargo install ferrox-cli ferrox-daemon