womp is a local-dev process orchestrator. You describe your services in a single
womp.yaml, and womp boots them in dependency order, waits for each to be
genuinely healthy, supervises them, streams their logs, and tears everything
down cleanly on exit.
curl -fsSL https://raw.githubusercontent.com/idrissgarfa/womp/develop/install.sh | sh
The script detects your platform (macOS or Linux, Intel or ARM) and drops the
womp binary in /usr/local/bin, falling back to ~/.local/bin if that is not
writable. Set WOMP_INSTALL_DIR to install elsewhere, or WOMP_VERSION=v0.1.0
to pin a release. Prefer to do it by hand? Grab a tarball from the
releases page and move womp
onto your PATH.
womp.yaml lives at your project root and is committed to version control.
Everything lives under services:, keyed by service name.
services:
db:
cmd: "docker run --rm -p 5432:5432 postgres:16"
health: { tcp: "localhost:5432", timeout: 30s }
api:
cmd: "uv run fastapi dev"
dir: ./apps/api
env: { DATABASE_URL: "postgres://localhost:5432/app" }
depends_on: [db]
health: { http: "http://localhost:8000/health", timeout: 20s }
restart: { policy: on-failure, max: 3, backoff: 1s }
watch: { paths: ["src/**"], debounce: 300ms }
web:
cmd: "bun dev"
dir: ./apps/web
depends_on: [api]
health: { log: "ready in .*ms" }
| Field | Meaning |
|---|---|
cmd |
Command to run (required), executed via sh -c. |
dir |
Working directory for the process. |
env |
Environment variables for the process. |
depends_on |
Services that must be healthy before this one starts. |
health |
One of tcp, http, or log, plus an optional timeout. No health block means healthy the instant it spawns. |
restart |
policy, max tries, and backoff base. |
watch |
Restart the service when files change. |
grace |
Wait after SIGTERM before SIGKILL on teardown (default 10s). |
Durations are written 300ms, 30s, or 2m. Unknown keys, a missing cmd, a
dependency cycle, or a reference to a service that does not exist are all
rejected up front with an error that names the exact service and field. Cycles
print the path: cycle: api -> worker -> api.
A service is STARTING until its probe passes, then HEALTHY. Dependents do
not start until it is healthy.
| Probe | Passes when |
|---|---|
tcp: "host:port" |
A TCP connection to the address succeeds. |
http: "url" |
A GET returns a 2xx status. |
log: "regex" |
A line matching the regex appears in the service’s output. |
timeout (default 30s) bounds how long the probe may take before the service
is marked unhealthy.
| Key | Meaning |
|---|---|
policy |
on-failure, always, or never. |
max |
Restart attempts before the service goes FAILED (default 3). |
backoff |
Base delay; doubles each attempt, capped at 30s. |
When a service exhausts its restarts it goes FAILED, and every service that
transitively depends on it is marked DEGRADED with the root cause recorded
(web DEGRADED (root cause: db failed after 3 restarts)). Degraded services are
not killed.
Give a service a watch block and womp restarts it when matching files change,
debounced so a burst of saves counts as one restart.
watch:
paths: ["**/*.py"] # globs, relative to the service dir
debounce: 300ms # quiet window before restarting
ignore: ["migrations/**"] # extra patterns to never restart on
default_ignores: true # built-in ignore list (on by default)
use_gitignore: true # honor .gitignore / .ignore (on by default)
Build tools write files themselves on startup (dependency caches, build output,
generated code), so a broad glob can trigger an endless restart loop. Before a
changed path is matched against your paths, womp filters it through three
layers: your repo’s .gitignore, a built-in list of never-source directories
(node_modules, target, __pycache__, all dot-directories, and more), and a
built-in list of generated-file globs (*.gen.ts, *.pb.go, *_pb2.py,
*.g.dart) that catches codegen committed to git. Set default_ignores: false
to match only what you write.
| Command | What it does |
|---|---|
womp up [--tui] |
Boot the whole graph and supervise it. --tui opens the dashboard. |
womp status [--json] |
Print each service’s state once and exit. |
womp restart <service> |
Restart one service; its dependents re-check health. |
womp stop |
Tell a running womp to shut down (same as Ctrl-C). |
womp help |
Full reference, including interactive keys. |
status, restart, and stop reach a running womp up over a Unix socket at
.womp/control.sock. Kill womp with kill -9 and the next womp up notices the
stale socket and recovers.
Plain womp up is non-interactive and pipe-friendly. Stop it with Ctrl-C;
drive it with womp restart / womp stop from another terminal.
| Code | Meaning |
|---|---|
0 |
Success. For status, every service is healthy. |
1 |
Runtime error: unreadable or invalid config, cannot bind the socket. |
2 |
Usage error, unknown command, or status found an unhealthy service. |
womp up --tui opens a full-screen dashboard: a service list on the left
(state, uptime, restart count) and logs on the right. There is a focused pane,
shown by a highlighted border.
| Key | Action |
|---|---|
Tab |
Move focus between the services and logs panes. |
← → h l |
Focus the services / logs pane. |
↑ ↓ j k |
Act on the focused pane: change service, or scroll logs. |
| mouse wheel | Scroll logs or change service, by the pane under the cursor. |
b Space |
Page the logs up / down. |
Ctrl-U Ctrl-D |
Half-page the logs up / down. |
g G |
Jump to top / bottom of the logs (G resumes follow). |
f |
Toggle follow (auto-scroll to newest). |
r |
Restart the selected service. |
q Esc Ctrl-C |
Quit (graceful teardown, same as Ctrl-C). |