Skip to main content

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

  1. Create a promenade.yaml in 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
  1. Start everything:
promenade start
  1. 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, or always restart 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:

  1. --config flag
  2. ./promenade.yaml
  3. ~/.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 status
  • GET /api/services/{name} - Single service status
  • POST /api/services/{name}/start - Start a service
  • POST /api/services/{name}/stop - Stop a service
  • POST /api/services/{name}/restart - Restart a service
  • GET /api/services/{name}/logs - Get service logs
  • POST /api/reload - Reload configuration
  • WS /api/logs/stream - WebSocket for real-time logs

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

promenade-0.1.0.tar.gz (102.4 kB view details)

Uploaded Source

Built Distribution

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

promenade-0.1.0-py3-none-any.whl (74.8 kB view details)

Uploaded Python 3

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

Hashes for promenade-0.1.0.tar.gz
Algorithm Hash digest
SHA256 a2fc9a9b060368b8f280e5d9cff95a0dc9c15ecd3cced2edbbe2d2409add5f8f
MD5 90a7e44b16e72702e34823c31f50ecce
BLAKE2b-256 30e9e56789c6c058989e32218c432841aebd8139d3ac49d6a1cc4ff439a24694

See more details on using hashes here.

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

Hashes for promenade-0.1.0-py3-none-any.whl
Algorithm Hash digest
SHA256 e64d645f15a6728405e5d8302091eaaacb32f2cb8ff3d897bd7210e690be1b34
MD5 912c6947df338bcb09bb6ca3d2022119
BLAKE2b-256 134740b9cdd46a1277c1f2900deec80cd40a18f53e931f6cff993aba3bd96ea9

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