A Rust watchdog for Node.js apps and long-running development commands.
Zervox can run commands in the foreground for quick checks, or start a detached supervisor that keeps runtime state, tracks PIDs, writes persistent logs, restarts crashed processes with backoff, and reports useful crash hints.
- Ships as a single binary
- Lower memory footprint than a Node daemon
- Better fit for long-running process supervision
- Easier to install on servers and developer machines
- Strong foundation for native process control, systemd integration, and safe AI-assisted diagnostics
zervox check -- <command>- run once and summarize failureszervox start -- <command>- foreground watchdog with restart limitzervox start --detach --name <name> -- <command>- background supervisorzervox add <name> -- <command>- save a command locallyzervox up <name>- start a saved command in detached modezervox status [name]- show runtime status, supervisor PID, child PID, restarts, and log pathzervox logs <name>- tail persistent logszervox stop <name>- stop supervisor and child processzervox restart <name>- restart a saved supervised processzervox cleanup- remove stopped runtime records and mark stale supervisorszervox systemd <name>- print a user-level systemd unit for a tracked commandzervox systemd <name> --install- install the user-level systemd unitzervox list,zervox run,zervox remove,zervox doctor- Crash hints for common Node errors like port conflicts, missing modules, permission issues, and syntax errors
- Config:
~/.config/zervox/processes.json - Runtime state:
~/.local/state/zervox/runtime.json - Logs:
~/.local/state/zervox/logs/<name>.log
Use zervox doctor to print the exact paths on your machine.
cargo build --releaseThe binary will be available at:
./target/release/zervoxRun a command once:
zervox check -- node server.jsRun in the foreground and restart it up to five times:
zervox start --max-restarts 5 -- node server.jsStart as a detached supervised process:
zervox start --detach --name api --max-restarts 5 -- node server.jsInspect and operate it:
zervox status api
zervox logs api -n 50
zervox restart api
zervox stop apiJavaScript entry files are automatically run with Node:
zervox start server.jsTrack a command for later:
zervox add api --max-restarts 5 -- node server.js
zervox list
zervox up apiRun in another directory:
zervox start --detach --name api --cwd ./apps/api -- npm run devCrash detected
command: node server.js
exit code: 1
hint: port conflict detected. Stop the existing process or change PORT.
recent output
Error: listen EADDRINUSE: address already in use :::3000
Zervox now has the core pieces of a production watchdog:
- Detached supervisor process
- PID tracking for supervisor and child
- Persistent runtime state
- Persistent per-process logs
- Stop/restart/status/log commands
- Restart limit and exponential backoff
- Stale PID detection for killed supervisors or rebooted machines
- User-level systemd unit generation
- Integration tests around the real CLI and detached lifecycle
- Strict Rust checks passing
Still needed before a serious public release:
- GitHub Actions release pipeline for Linux binaries
- Optional AI diagnostics with review-before-run safety controls
- TUI or web dashboard
- More platform testing outside Linux/systemd
The recommended public install path is a one-line installer script. The script downloads the prebuilt release binary, verifies the SHA256 checksum when available, and installs zervox into ~/.local/bin by default.
curl -fsSL https://raw.githubusercontent.com/ziuus/Zervox/master/scripts/install.sh | bashInstall a specific version:
VERSION=v0.1.0 curl -fsSL https://raw.githubusercontent.com/ziuus/Zervox/master/scripts/install.sh | bashInstall somewhere else:
BIN_DIR=/usr/local/bin curl -fsSL https://raw.githubusercontent.com/ziuus/Zervox/master/scripts/install.sh | bashUninstall:
curl -fsSL https://raw.githubusercontent.com/ziuus/Zervox/master/scripts/install.sh | bash -s -- --uninstallTag a version to trigger the Linux binary release workflow:
git tag v0.1.0
git push origin v0.1.0The workflow uploads zervox-x86_64-unknown-linux-gnu.tar.gz and a SHA256 file.
cargo fmt --check
cargo test --all-targets
cargo clippy --all-targets --all-features -- -D warnings
cargo run -- check -- node -e "console.log('ok')"