Skip to main content

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. proctide exits non-zero if any child exited non-zero, so it behaves in CI and Makefiles.

Design notes

  • A pure core, an IO shell. parse_procfile, color_for, and prefix_line are 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 width before 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 uses child_process.spawn + readline.

License

MIT

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

proctide-0.1.0.tar.gz (12.0 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

proctide-0.1.0-py3-none-any.whl (10.6 kB view details)

Uploaded Python 3

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

Hashes for proctide-0.1.0.tar.gz
Algorithm Hash digest
SHA256 63e66192acdf62a5315925a2ad6604f7acfdd663367dbb111cc02f2806202be0
MD5 10ddcdb1663922138d20f86c550d4d63
BLAKE2b-256 dd6d072b62d1107b85e6fd9703cf8faf8a81a1b2711d7d7749d2bcbfe568514a

See more details on using hashes here.

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

Hashes for proctide-0.1.0-py3-none-any.whl
Algorithm Hash digest
SHA256 da62c8bb1c011258a39a1915b5b2ede563a98e01d6c60d8108e7d1433a633458
MD5 9fa2a56b7d925363c1bf5a35c207b435
BLAKE2b-256 703f060d1db37d808076ebc0508fc8c66e35b99a4bdb694e4b8cf422a4d1f6ae

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page