Promenade

Stop juggling terminal tabs.
Run all your local dev services with one command.

pip install promenade
Promenade web UI showing service status and logs

Why Promenade?

Modern apps need multiple services running locally: your API, frontend dev server, background workers, maybe a database. Promenade lets you define them once in a simple YAML file and start everything with promenade start.

One command to start everything

Define your services once, start them in the right order automatically. Your API starts before your frontend, every time.

Health checks built in

Know when your services are actually ready, not just running. HTTP and TCP health checks with configurable timeouts.

Unified log viewer

All your service logs in one place, color-coded and filterable. No more switching between terminal tabs.

Hot reload your config

Change your promenade.yaml and services automatically restart. No manual restarts needed.

Runs on startup

Set it up once with launchd or systemd and your services are always there when you need them.

Quick Start

Create a promenade.yaml in your project:

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

Then run:

promenade start

Open http://localhost:7766 to see the web UI with status, health, and logs for all your services.

CLI Commands

promenade start # Start all services with web UI
promenade stop # Stop everything
promenade status # See what's running
promenade logs -f # Follow logs in terminal
promenade restart api # Restart a single service
promenade reload # Reload config, restart changed services

Configuration

Promenade looks for promenade.yaml in your current directory, or at ~/.config/promenade/promenade.yaml for a global config.

manager:
  port: 7766              # Web UI port
  log_buffer_lines: 1000  # Lines to keep per service

defaults:
  restart_policy: once    # "never", "once", or "always"
  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

  worker:
    command: python worker.py
    directory: ./backend
    restart_policy: always  # Keep this one running