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.
Project description
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 (pure Python stdlib). No Ruby. No tmux.
pipx run proctide
web | 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 Python or Node you already have.
Install
pipx run proctide # no install, run on demand
pip install proctide # or install the `proctide` command
There's an identical Node build too: npx proctide / npm i -g proctide
(see proctide). 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: python server.py
worker: python worker.py
css: npx tailwindcss -i app.css -o public/app.css --watch
proctide # runs ./Procfile
proctide -f Procfile.dev # or point somewhere else
Usage
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's process group, 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.
parse_procfile,color_for, andprefix_lineare pure functions — no spawn, no clock, no signals — which is what lets the Python and Node 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. Python uses
subprocess.Popen+ one reader thread per process behind a shared lock so prefixed lines never interleave mid-line; Node useschild_process.spawn+readline.
License
MIT
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file proctide-0.1.0.tar.gz.
File metadata
- Download URL: proctide-0.1.0.tar.gz
- Upload date:
- Size: 12.0 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.11.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
63e66192acdf62a5315925a2ad6604f7acfdd663367dbb111cc02f2806202be0
|
|
| MD5 |
10ddcdb1663922138d20f86c550d4d63
|
|
| BLAKE2b-256 |
dd6d072b62d1107b85e6fd9703cf8faf8a81a1b2711d7d7749d2bcbfe568514a
|
File details
Details for the file proctide-0.1.0-py3-none-any.whl.
File metadata
- Download URL: proctide-0.1.0-py3-none-any.whl
- Upload date:
- Size: 10.6 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.11.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
da62c8bb1c011258a39a1915b5b2ede563a98e01d6c60d8108e7d1433a633458
|
|
| MD5 |
9fa2a56b7d925363c1bf5a35c207b435
|
|
| BLAKE2b-256 |
703f060d1db37d808076ebc0508fc8c66e35b99a4bdb694e4b8cf422a4d1f6ae
|