A cross-platform Dynamic Island for your AI agents.
Free. Native. MIT. Works with any agent — no account, no cloud, no lock-in.
pip install dulus-bar
Live model + context per agent, and Allow / Deny right on the island — no diving back into a terminal.
Dulus Bar puts a floating status island at the top of your screen that shows every AI coding agent you're running — Claude Code, Codex, Gemini, Cursor, Dulus, and any other CLI — and lets you Allow / Deny their permission prompts without diving back into a terminal.
It's the idea itself, shipped for everyone. Not tied to Dulus — wrap any agent and it shows up. We built the island we wanted; here it is for the whole world. 🌎
- All platforms — Windows, macOS, and Linux.
- macOS notch-native — on MacBooks with a camera notch the island hugs the notch and stays visible across every Space and full-screen app.
- Reveal on hover — everywhere else it rests as a slim tab at the top edge and slides open when your mouse approaches, or when an agent needs you.
- Any agent — anything with a CLI works through a thin wrapper; well-known agents get their own icon and accent color.
- 100% local — no cloud, no account, no telemetry. One WebSocket on
127.0.0.1:17372.
Requires Python 3.10+.
pip install dulus-bar
dulusbarThat's it — the island appears at the top of your screen. Move your mouse to the top-center to reveal it; right-click the tray icon for the menu.
From source (for the wired-agent extras)
git clone https://github.com/Dulus-Ai/Dulus-bar.git
cd Dulus-bar
# macOS / Linux
./setup.sh
# Windows
.\setup.ps1Linux tip: for click-to-focus of a terminal on X11, install
wmctrlorxdotool.macOS:
setup.shalso builds the native SwiftUI/AppKit notch surface using the Swift toolchain in Xcode Command Line Tools. The Python process stays the local WebSocket hub; Windows and Linux use the PyQt overlay.
Dulus Bar is agent-agnostic. Wrap any CLI and it reports to the island:
python wrappers/agent_wrapper.py "Codex" codex fix auth bug
python wrappers/agent_wrapper.py "Gemini" gemini
python wrappers/claude_wrapper.py # Claude Code helperagent_wrapper.py "Display Name" <command> [args...] reports that agent to the
bar. Known names (Claude, Codex, Gemini, Cursor, Copilot, Kimi, DeepSeek, Grok,
Qwen, Mistral, Windsurf, Zed, Aider, Ollama, …) get a curated icon + color;
anything else gets a stable auto-assigned color.
Or right-click the island → Open agent… and pick any executable from a file dialog — Dulus Bar launches it in its own terminal, already wired.
If you run Dulus, the island also shows the active model
and live context usage — e.g. kimi/kimi-k2.5 · ctx 38%. But you never need
Dulus to use Dulus Bar. The bar is the gift; Dulus is just one of many agents it
speaks to.
- Floating island, top-center (or notch-anchored on macOS).
- Lists active agents with a live status dot (running / waiting / done / error).
- When an agent asks for permission, shows Allow / Deny right on the island and forwards your choice back to the agent over stdin.
- Reveals on hover, pops open on agent activity, and stays open on a permission request until you answer.
- Click an agent to jump to its terminal / editor window.
Agents connect to a tiny local WebSocket hub and send status; the island renders it and relays your Allow/Deny back.
Agent → bar:
{ "agent": "Claude", "type": "tool_request", "session_id": "abc123",
"payload": { "tool": "Bash", "args": "rm -rf build/" } }Event types: session_started, message, tool_request, tool_approved,
tool_denied, completed, error. (model / ctx payload fields are optional.)
Bar → agent (Allow/Deny):
{ "type": "decision", "session_id": "abc123", "payload": { "approved": true } }dulus_bar/
overlay.py Floating island UI (PyQt6), notch-aware + reveal-on-hover
server.py WebSocket hub (ws://127.0.0.1:17372)
agents.py Per-agent icon + accent color registry
native/ win32 / pyobjc / wmctrl window focus per platform
wrappers/
base_wrapper.py Shared: pipe stdio, detect prompts, inject Allow/Deny
agent_wrapper.py Generic wrapper for any CLI agent
macos/ Native SwiftUI/AppKit notch surface
pip install pyinstaller
pyinstaller --noconfirm DulusBar.specOutput lands in dist/ — DulusBar.exe on Windows, DulusBar.app on macOS
(bundled as an LSUIElement, so no Dock icon).
- Windows — fully tested.
pywin32for window focus; PyQt overlay with reveal-on-hover. - macOS — notch hugging + always-visible via
pyobjc. Without it, still runs as a plain top-most island. - Linux — X11 window focus via
wmctrl/xdotool; on Wayland the island shows and stays on top, jump-to-terminal is best-effort.
PRs welcome — new agent icons/colors, platform fixes, packaging. Open an issue, fork it, ship it.
MIT. Use it, fork it, ship it. We shipped the idea on purpose — no monopoly.
Built by one builder in the Dominican Republic 🇩🇴 — for everyone. 🦅