Local development process manager with web UI
Project description
Promenade
A local development process manager with a web UI. Run all your services with one command and see their status, logs, and health in a unified dashboard.
Installation
pip install promenade
Quick Start
- Create a
promenade.yamlin your project root:
services:
api:
command: flask run --port 5001
directory: ./backend
port: 5001
ready_check:
type: http
path: /health
frontend:
command: npm run dev
directory: ./frontend
port: 3000
depends_on:
- api
- Start everything:
promenade start
- Open http://localhost:7766 to see the web UI.
Features
- Process supervision - Start, stop, and restart services with automatic dependency ordering
- Health checks - HTTP and TCP health checks with configurable timeouts
- Log aggregation - Unified log viewer with per-service filtering
- Web UI - Real-time dashboard showing service status, health, and logs
- Hot reload - Automatically detects config changes and restarts affected services
- Restart policies - Configure
never,once, oralwaysrestart behavior
CLI Commands
promenade start # Start all services (with web UI on port 7766)
promenade start --no-ui # Start services without the web UI
promenade start --daemon # Run in background
promenade stop # Stop all services
promenade status # Show service status
promenade restart [service] # Restart a service (or all if no name given)
promenade logs [service] # View logs
promenade logs -f # Follow logs in real-time
promenade reload # Reload config and restart changed services
promenade config check # Validate your config file
Configuration
Promenade looks for config in this order:
--configflag./promenade.yaml~/.config/promenade/promenade.yaml
Full Example
manager:
port: 7766
host: 127.0.0.1
log_buffer_lines: 1000
defaults:
restart_policy: once
env:
NODE_ENV: development
services:
api:
command: flask run --port 5001
directory: ./backend
port: 5001
env:
FLASK_DEBUG: "1"
ready_check:
type: http
path: /health
timeout: 30
interval: 2
frontend:
command: npm run dev
directory: ./frontend
port: 3000
depends_on:
- api
ready_check:
type: tcp
timeout: 30
worker:
command: python worker.py
directory: ./backend
restart_policy: always
Service Options
| Option | Description |
|---|---|
command |
Command to run (required) |
directory |
Working directory |
port |
Port the service listens on |
env |
Environment variables |
env_file |
Path to .env file |
depends_on |
Services that must start first |
restart_policy |
never, once, or always |
ready_check |
Health check configuration |
Health Checks
ready_check:
type: http # or "tcp"
path: /health # HTTP only
timeout: 30 # Seconds to wait for healthy
interval: 2 # Seconds between checks
Running as a Daemon
For services you always want running, you can set up promenade to start automatically on login.
macOS (launchd)
Create ~/Library/LaunchAgents/com.promenade.plist:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>Label</key>
<string>com.promenade</string>
<key>ProgramArguments</key>
<array>
<string>/path/to/promenade</string>
<string>start</string>
<string>--no-ui</string>
</array>
<key>RunAtLoad</key>
<true/>
<key>KeepAlive</key>
<true/>
<key>StandardOutPath</key>
<string>/tmp/promenade.log</string>
<key>StandardErrorPath</key>
<string>/tmp/promenade.log</string>
</dict>
</plist>
Then load it:
launchctl load ~/Library/LaunchAgents/com.promenade.plist
Find the path to promenade with which promenade.
Linux (systemd)
Create ~/.config/systemd/user/promenade.service:
[Unit]
Description=Promenade Dev Services
[Service]
ExecStart=/path/to/promenade start --no-ui
Restart=always
[Install]
WantedBy=default.target
Then enable it:
systemctl --user enable --now promenade
REST API
The manager exposes a REST API at the same port as the web UI:
GET /api/status- All services statusGET /api/services/{name}- Single service statusPOST /api/services/{name}/start- Start a servicePOST /api/services/{name}/stop- Stop a servicePOST /api/services/{name}/restart- Restart a serviceGET /api/services/{name}/logs- Get service logsPOST /api/reload- Reload configurationWS /api/logs/stream- WebSocket for real-time logs
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 promenade-0.1.0.tar.gz.
File metadata
- Download URL: promenade-0.1.0.tar.gz
- Upload date:
- Size: 102.4 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.10.3
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
a2fc9a9b060368b8f280e5d9cff95a0dc9c15ecd3cced2edbbe2d2409add5f8f
|
|
| MD5 |
90a7e44b16e72702e34823c31f50ecce
|
|
| BLAKE2b-256 |
30e9e56789c6c058989e32218c432841aebd8139d3ac49d6a1cc4ff439a24694
|
File details
Details for the file promenade-0.1.0-py3-none-any.whl.
File metadata
- Download URL: promenade-0.1.0-py3-none-any.whl
- Upload date:
- Size: 74.8 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.10.3
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
e64d645f15a6728405e5d8302091eaaacb32f2cb8ff3d897bd7210e690be1b34
|
|
| MD5 |
912c6947df338bcb09bb6ca3d2022119
|
|
| BLAKE2b-256 |
134740b9cdd46a1277c1f2900deec80cd40a18f53e931f6cff993aba3bd96ea9
|