proctide
v0.1.0
Published
Run every process in your Procfile at once in one terminal, each output line prefixed with a colored process name; a clean Ctrl-C shuts them all down. Like foreman/overmind but zero-dependency and dual-runtime — no Ruby, no tmux.
Downloads
10
Maintainers
Readme
proctide
Run every process in your Procfile together, in one terminal. Each output
line is prefixed with a colored process name so you can tell web from worker
from css at a glance — and a single Ctrl-C takes the whole lot down cleanly.
Zero dependencies. No Ruby. No tmux. Runs on Node or Python.
npx proctideweb | listening on http://localhost:3000
worker | polling jobs queue…
css | rebuilt app.css in 42ms
web | GET / 200 11ms
worker | processed job #1841
^C
proctide: SIGINT received, shutting down…
web | exited (signal SIGTERM)
worker | exited (signal SIGTERM)
css | exited (signal SIGTERM)Why another Procfile runner?
foreman is the classic, but it's a Ruby
gem — one more runtime to install on a Node/Python box.
overmind is great but needs tmux.
concurrently is excellent and
mature — but it's an npm dependency, and you spell your processes out on the
command line instead of in a checked-in Procfile.
proctide is the small middle ground: a real Procfile, prefixed interleaved
output, clean shutdown — and nothing to install but the tool itself, on
whichever of Node or Python you already have.
Install
npx proctide # no install, run on demand
npm i -g proctide # or install the `proctide` command globallyThere's an identical Python build too: pipx run proctide / pip install proctide
(see proctide-py). Both ports parse the
same Procfile and print the same prefix format — their pure cores are tested
against the same vectors.
The Procfile
One process per line, name: command. Blank lines and # comments are ignored.
The command runs through your shell, so pipes, &&, env vars, and globs all work.
# Procfile
web: node server.js
worker: node worker.js
css: npx tailwindcss -i app.css -o public/app.css --watchproctide # runs ./Procfile
proctide -f Procfile.dev # or point somewhere elseUsage
proctide [options]| Option | Description |
| --- | --- |
| -f, --file <path> | Procfile to read (default: ./Procfile). |
| --no-color | Disable the colored name prefixes (e.g. when piping to a file). |
| -h, --help | Show help. |
| -v, --version | Print version. |
Behavior
- Concurrent. Every process starts at once; their stdout and stderr are
merged into one stream, each line tagged
name | …. The name column is padded to the longest process name so the|separators line up. - Clean shutdown. Ctrl-C (SIGINT) — or SIGTERM — forwards SIGTERM to every child, waits briefly, then exits. A child that ignores SIGTERM gets SIGKILL as a backstop.
- One dies, all stop. If any process exits on its own, the rest are shut down too — that's the foreman/overmind contract for a dev stack.
- Honest exit code.
proctideexits non-zero if any child exited non-zero, so it behaves in CI andMakefiles.
Design notes
- A pure core, an IO shell.
parseProcfile,colorFor, andprefixLineare pure functions — no spawn, no clock, no signals — which is what lets the Node and Python ports be proven identical against one shared vector table. The spawning/streaming/signal-forwarding lives in a separate runner module and is covered by an integration smoke test instead (live output is nondeterministic). - Prefixes align by construction. The name is padded to
widthbefore any ANSI color is applied, so the escape codes never throw off the columns. - Zero dependencies. Node uses
child_process.spawn+readline; Python usessubprocess.Popen+ one reader thread per process behind a shared lock so prefixed lines never interleave mid-line.
License
MIT
