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
Metadata
Release files for proctide 0.1.0
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | Provenance | Actions |
|---|---|---|---|---|
| proctide-0.1.0.tar.gz | 12.0 kB | Without provenance | Details for proctide-0.1.0.tar.gz |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Actions Reset |
|---|---|---|---|---|
| proctide-0.1.0-py3-none-any.whl | Python 3 | none | any | Details for proctide-0.1.0-py3-none-any.whl |
Total release size: 22.6 kB
Release files / proctide-0.1.0.tar.gz
| Download URL | proctide-0.1.0.tar.gz |
|---|---|
| Size | 12.0 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
63e66192acdf62a5315925a2ad6604f7acfdd663367dbb111cc02f2806202be0
|
|
BLAKE2b-256 checksum How to use checksums |
dd6d072b62d1107b85e6fd9703cf8faf8a81a1b2711d7d7749d2bcbfe568514a
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/6.2.0 CPython/3.11.7
|
Release files / proctide-0.1.0-py3-none-any.whl
| Download URL | proctide-0.1.0-py3-none-any.whl |
|---|---|
| Size | 10.6 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
da62c8bb1c011258a39a1915b5b2ede563a98e01d6c60d8108e7d1433a633458
|
|
BLAKE2b-256 checksum How to use checksums |
703f060d1db37d808076ebc0508fc8c66e35b99a4bdb694e4b8cf422a4d1f6ae
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/6.2.0 CPython/3.11.7
|
Security for proctide 0.1.0
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
No provenance found
None of the files in this release were uploaded with provenance metadata.
A note on package security
PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.
To learn more about protecting yourself from malicious actors, visit our package security documentation.