AI Agent Orchestrator with Dashboard - oversee your autonomous coding agents
Project description
PyWiggum — AI Agent Orchestrator with Dashboard
"Me fail English? That's unpossible!" — Ralph Wiggum
Chief Wiggum oversees Ralph. PyWiggum oversees your AI coding agents.
What Is PyWiggum?
PyWiggum is a Python-based autonomous AI coding agent orchestrator with a built-in web dashboard. It runs a configurable loop that feeds tasks from a kanban to an LLM-powered coding agent, tracks velocity and progress, detects stalls, and gives humans real-time controls to steer the process — pause, resume, inject hints, and adjust iteration limits — all from a web UI.
Key differentiators from existing Ralph implementations:
- Local-model-first: Native support for OpenAI-compatible APIs (vLLM, Ollama, llama.cpp) — not just Claude CLI
- Web dashboard: Real-time kanban, velocity tracking, stall detection, baseline drift monitoring, ETA predictions
- Human-in-the-loop via web UI: Pause/resume, hint injection, iteration control — no Telegram bot or CLI-only interaction
- Kanban-driven: Uses a structured kanban.json (not PRD/user-stories), supports milestones with dependency ordering
- 🚔 Springfield PD routing: Multi-agent hierarchy (Ralph → Eddie → Lou → Chief Matt) with automatic escalation
- Smart task routing: Route different task types to different agents based on complexity
Installation
pip install pywiggum
# Or with uv (recommended)
uv pip install pywiggum
Quick Start
# Initialize a new project with kanban
pywiggum init
# Edit wiggum.yaml and kanban.json to customize your project
# Start the autonomous loop
pywiggum run --max-iterations 50
# Start the dashboard (in another terminal)
pywiggum dash --port 3333
# Open http://localhost:3333 in your browser
Usage
Initialize Project
pywiggum init
This creates two files:
wiggum.yaml- Configuration filekanban.json- Kanban board with example tasks
Run the Agent Loop
# Basic usage
pywiggum run
# With options
pywiggum run --max-iterations 100 --agent claude_code --dash
# Available agents: opencode, claude_code, api
Control the Runner
# Check status
pywiggum status
# Pause/resume
pywiggum pause
pywiggum resume
# Send a hint to the agent
pywiggum hint "The control IDs need zero-padding normalization"
# Add more iterations
pywiggum add-iterations 25
Start the Dashboard
# Default (port 3333)
pywiggum dash
# Custom port/host
pywiggum dash --port 8080 --host 0.0.0.0
Configuration
Edit wiggum.yaml to customize your project:
# Project metadata
project:
name: "My Awesome Project"
kanban: "kanban.json"
work_dir: "."
# Agent configuration
agent:
backend: "opencode" # opencode | claude_code | api
model: "vllm/qwen3-coder-next"
timeout: 600
# Runner settings
runner:
max_iterations: 50
sleep_between: 3
commit_after_task: true
commit_format: "{task_id}: {task_title}"
# Dashboard
dashboard:
port: 3333
host: "0.0.0.0"
refresh_interval: 15
# Prompt customization
prompt:
tech_stack: |
SvelteKit 5, TypeScript, better-sqlite3, Tailwind CSS
Use $state(), $derived(), $effect() (Svelte 5 runes)
conventions: |
All database code in src/lib/server/db.ts
Types in src/lib/types.ts
extra_context: ""
Kanban Format
The kanban.json file defines your project structure:
{
"milestones": [
{
"id": "M1",
"name": "Project Setup",
"blocked_by": [],
"tasks": [
{
"id": "M1.1",
"title": "Initialize SvelteKit project",
"description": "Run sv create to scaffold the project",
"acceptance_criteria": [
"package.json exists",
"npm run dev works"
],
"status": "todo"
}
]
},
{
"id": "M2",
"name": "Core Implementation",
"blocked_by": ["M1"],
"tasks": [
{
"id": "M2.1",
"title": "Create database schema",
"description": "Set up SQLite database with initial tables",
"acceptance_criteria": [
"Database file created",
"Tables exist"
],
"status": "todo"
}
]
}
]
}
Task status values: todo, done, failed
Agent Backends
OpenCode (Local Models)
Use with vLLM, Ollama, or other OpenAI-compatible endpoints:
agent:
backend: "opencode"
model: "vllm/qwen3-coder-next"
Requires: opencode CLI installed
Claude Code
Use with Claude Code CLI:
agent:
backend: "claude_code"
Requires: claude CLI installed and authenticated
API (Direct)
Make direct API calls to OpenAI-compatible endpoints:
agent:
backend: "api"
model: "gpt-4"
api_base_url: "http://localhost:8000/v1"
api_key_env: "OPENAI_API_KEY"
Requires: Set environment variable specified in api_key_env
Dashboard Features
The web dashboard provides:
- Real-time status: Running/paused/stopped with pulsing indicator
- Progress tracking: Visual progress bar and statistics
- Velocity metrics: Average task duration and recent velocity
- ETA predictions: Estimated completion time
- Drift detection: Alerts when behind schedule
- Stall detection: Warnings when tasks take too long
- Kanban view: Milestones and tasks with status
- Git log: Recent commits
- Runner log: Recent activity
- Live controls: Pause/resume, add iterations, send hints
- Claude context blob: Copyable status summary for Claude conversations
How It Works
- Runner reads kanban.json and finds the first
todotask whose milestone is not blocked - Builds a prompt with project context, tech stack, conventions, and any human hints
- Invokes the agent backend (OpenCode, Claude Code, or API)
- Agent completes the task and updates kanban.json status to
doneorfailed - Optionally commits the changes with a formatted message
- Records completion in history for velocity tracking
- Repeats until all tasks are done or max iterations reached
The dashboard runs independently and provides real-time visibility and control.
Human-in-the-Loop Controls
PyWiggum uses file-based IPC for simple, debuggable control:
| File | Purpose |
|---|---|
.wiggum-pause |
Exists = runner paused |
.wiggum-max |
Current max iteration count |
.wiggum-hint |
Text hint for next iteration |
.wiggum-hints-archive/ |
Consumed hints with timestamps |
You can manually create/edit these files or use the CLI/dashboard.
Examples
Basic SvelteKit Project
pywiggum init
# Edit kanban.json to add your SvelteKit tasks
# Edit wiggum.yaml to set tech stack
pywiggum run --max-iterations 100 --dash
Using Local Model with vLLM
agent:
backend: "opencode"
model: "vllm/qwen3-coder-next"
# In one terminal: start vLLM server
vllm serve Qwen/Qwen2.5-Coder-32B-Instruct
# In another terminal: run PyWiggum
pywiggum run
Using Claude Code
agent:
backend: "claude_code"
pywiggum run --agent claude_code
🚔 Springfield PD: Multi-Agent Routing
PyWiggum includes a hierarchical agent routing system inspired by Springfield's police department:
👮 Ralph (Wiggum) → 👮♂️ Eddie → 👨✈️ Lou → 👨💼 Chief Matt
Local model Better local Claude Human
The Team:
- Ralph: Local model (Qwen 3), handles basic tasks
- Eddie: Better local model (Qwen 32B), moderate complexity
- Lou: Frontier model (Claude), complex reasoning
- Chief Matt: Human in the loop, final authority
Example configuration:
routing:
agents:
ralph:
backend: "opencode"
model: "vllm/qwen3-coder-next"
eddie:
backend: "opencode"
model: "vllm/qwen3-32b-instruct"
lou:
backend: "claude_code"
matt:
backend: "human"
rules:
- task_type: "planning"
agent_level: "lou"
- task_type: "test"
agent_level: "ralph"
escalation:
enabled: true
trigger_after_iterations: 3
escalation_chain: ["ralph", "eddie", "lou", "matt"]
How it works:
- Ralph starts with most tasks (cheap, fast)
- If Ralph fails 3 times → escalate to Eddie
- If Eddie fails → escalate to Lou (Claude)
- If Lou fails → escalate to Chief Matt (you!)
See SPRINGFIELD_PD.md for full documentation.
Development
# Clone the repo
git clone https://github.com/pywiggum/pywiggum.git
cd pywiggum
# Install with dev dependencies
uv pip install -e ".[dev]"
# Run tests
pytest
# Lint
ruff check .
# Type check
mypy src/pywiggum
Roadmap
✅ Layer 2 & 3: Springfield PD (Complete!)
Multi-agent routing with automatic escalation. See SPRINGFIELD_PD.md.
Layer 4: Future Ideas
These are potential future enhancements. Vote or suggest via GitHub issues!
- Parallel execution: Run independent tasks simultaneously
- Self-improving prompts: Learn from successful completions
- Multi-agent collaboration: Agents work together on complex tasks
- Checkpoint/resume: Save and restore runner state
- Remote runners: Distribute work across machines
- Plugin system: Custom agents and integrations
Design Principles
- Files as IPC: No message queues, no WebSockets for control. Files are simple, debuggable, and work for single-user local setups.
- Single HTML dashboard: No React, no build step, no node_modules. One HTML file with embedded CSS/JS.
- Config over code: Everything customizable via wiggum.yaml. No need to edit Python to use it.
- Local-first: Designed for local models on local hardware. Cloud APIs are optional escalation, not the default.
- One task per iteration: Clean context per task. Memory persists via git history and kanban state, not model context.
Contributing
Contributions welcome! Please open an issue or PR on GitHub.
License
MIT License - see LICENSE file for details.
Credits
Inspired by the Ralph pattern and all the Ralph implementations in the wild. PyWiggum brings the pattern to local models with a focus on observability and control.
"That's unpossible!" — Ralph Wiggum
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
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 pywiggum-0.1.0.tar.gz.
File metadata
- Download URL: pywiggum-0.1.0.tar.gz
- Upload date:
- Size: 36.0 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
869d77d27eebad2b5e3c7080677232ad31aa0a203bdd507b239efb149a6c52a8
|
|
| MD5 |
a314c0e3f27788974fe9996229c50084
|
|
| BLAKE2b-256 |
58c1e45aa93d692accab447a14e00bb6bb5d6c7976b48e3ec96b49509eb2d52b
|
Provenance
The following attestation bundles were made for pywiggum-0.1.0.tar.gz:
Publisher:
publish.yml on urbantechdc/pywiggum
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
pywiggum-0.1.0.tar.gz -
Subject digest:
869d77d27eebad2b5e3c7080677232ad31aa0a203bdd507b239efb149a6c52a8 - Sigstore transparency entry: 975078919
- Sigstore integration time:
-
Permalink:
urbantechdc/pywiggum@b5a52c7686f0a309a0f0cf08bee60f983cc11284 -
Branch / Tag:
refs/heads/main - Owner: https://github.com/urbantechdc
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish.yml@b5a52c7686f0a309a0f0cf08bee60f983cc11284 -
Trigger Event:
workflow_dispatch
-
Statement type:
File details
Details for the file pywiggum-0.1.0-py3-none-any.whl.
File metadata
- Download URL: pywiggum-0.1.0-py3-none-any.whl
- Upload date:
- Size: 34.5 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
52262947a1a84aa56f73939e34026d960c3a496380177d467594c6d47fe0ac05
|
|
| MD5 |
0e955eab5d7db86944260f3a3c393cfa
|
|
| BLAKE2b-256 |
645f38567d10b271e33534cafdc497944e90c619de4ee7cd0c29a3db56042c5f
|
Provenance
The following attestation bundles were made for pywiggum-0.1.0-py3-none-any.whl:
Publisher:
publish.yml on urbantechdc/pywiggum
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
pywiggum-0.1.0-py3-none-any.whl -
Subject digest:
52262947a1a84aa56f73939e34026d960c3a496380177d467594c6d47fe0ac05 - Sigstore transparency entry: 975078921
- Sigstore integration time:
-
Permalink:
urbantechdc/pywiggum@b5a52c7686f0a309a0f0cf08bee60f983cc11284 -
Branch / Tag:
refs/heads/main - Owner: https://github.com/urbantechdc
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish.yml@b5a52c7686f0a309a0f0cf08bee60f983cc11284 -
Trigger Event:
workflow_dispatch
-
Statement type: