A Windows notification system for AI agent workflows. Track multiple agent windows, see their status at a glance, and switch focus instantly.
When running multiple AI agents (Claude, ChatGPT, Cursor, etc.) across different windows, you lose track of which ones need attention. Alt+Tab cycling is slow and breaks your flow. You need a way to:
- Know when an agent finishes a task
- See status of all agent windows in one place
- Switch to any agent window instantly
Your AI agents → ntfy.sh → Notification App → focus: protocol → Window switches
- Agents publish status to ntfy.sh (e.g.,
claude:project - done) - Notification app displays all agents as clickable bars with status
- Press Enter to instantly switch to that window via the
focus:protocol
- Real-time status updates via ntfy.sh SSE subscription
- Keyboard-driven UI - navigate with arrows, switch with Enter
- Global hotkey (Ctrl+,) to toggle visibility
- System tray integration - runs in background
- Instant window switching - 150ms via compiled C# (87% faster than PowerShell)
- Status color coding - done (green), ongoing (blue), addressed (gray)
- Windows 10/11
- Python 3.8+ (Windows version with tkinter)
- WSL (optional, for development)
git clone https://github.com/tomyoung903/agent-switchboard.git
cd agent-switchboardpip install pillow pystray pynput requestscd focus-protocol
.\install-focus-protocol-exe.ps1This registers the focus: URL protocol so clicking focus:chrome brings Chrome to front.
Edit noti_app/src/ntfy_listener.py and change:
TOPIC_NAME = "your_unique_topic_name" # Make this unique to youcd noti_app
python main.pyThe app starts minimized to system tray. Press Ctrl+, to show/hide.
From any script or agent, send notifications via ntfy.sh:
# Simple window registration
curl -d "myagent" ntfy.sh/your_topic_name
# With status
curl -d "myagent - done" ntfy.sh/your_topic_name
curl -d "claude:project - ongoing" ntfy.sh/your_topic_namewindow_name - status
window_name: Used to match and focus the window (matches title or process name)status: Optional -done,ongoing,addressed, or any custom text
| Key | Action |
|---|---|
Ctrl+, |
Toggle window visibility (global) |
↑ / ↓ |
Navigate between agents |
Tab |
Next agent |
Enter |
Switch to selected agent's window |
A |
Mark as addressed |
Delete |
Remove from list |
Home / End |
Jump to first/last |
| Any letter | Hide to tray |
Key settings in noti_app/src/notification_app.py:
# Window spawn position (adjust for your monitor setup)
SPAWN_X = 1500
SPAWN_Y = -1100 # Negative for monitor above primary
# Window position mode
WINDOW_POSITION = "upper-monitor-center" # or "bottom-right", "center", etc.Database location in noti_app/src/db.py:
# Windows AppData (for proper SQLite locking)
DB_DIR = Path(appdata) / "noti_app"noti_app/
├── main.py # Entry point
├── src/
│ ├── notification_app.py # Tkinter UI, keyboard handling
│ ├── ntfy_listener.py # SSE subscription to ntfy.sh
│ ├── db.py # SQLite storage
│ ├── styles.py # UI theming
│ └── ui_utils.py # Rounded corners, etc.
focus-protocol/
├── FocusWindow.exe # Pre-compiled window switcher
├── FocusWindow.cs # C# source (uses Windows API)
├── install-*.ps1 # Registry setup scripts
- AI Agent Dashboard: Monitor Claude Code, Cursor, ChatGPT windows
- Build Notifications: Alert when long builds complete
- Task Switching: Quick keyboard-driven window management
- Remote Notifications: Receive alerts from servers/CI pipelines
MIT License - see LICENSE
This is a demo project showing what's possible with ntfy.sh + custom URL protocols. Fork and customize for your own workflow!