The command center for AI-assisted development.
A native macOS app that unifies issue tracking, agent chat, and coding session monitoring into a single, purpose-built interface.
Features • Quick Start • Architecture • Configuration • Contributing
Modern AI-assisted development involves three simultaneous activities:
| Activity | Current Tools | Pain Point |
|---|---|---|
| Track work | Terminal + bd CLI |
Scattered across windows |
| Talk to agents | Telegram/Discord/web | Switching contexts constantly |
| Review output | Browser + Terminal | No unified view of agent work |
AgentBoard unifies all three.
Issue tracking powered by Beads — a git-backed issue tracker.
- Four columns: Open, In Progress, Blocked, Done
- Drag-and-drop to move cards between statuses
- Rich metadata: title, description, kind (task/bug/feature/epic/chore), priority (P0–P4), assignee, labels, epic linking
- Live sync: filesystem watcher keeps the board in sync when agents commit changes externally
- Context menu: edit, delete, assign to agent, view in terminal
Track progress across related issues.
- Progress bars showing child issue completion (e.g., "3/5")
- Expandable disclosure groups listing all child issues
- Create new epics and link existing issues
Full-featured chat connected to OpenClaw gateway.
- Session picker: switch between gateway sessions
- Streaming responses with typing indicator and abort button
- Markdown rendering with syntax-highlighted code blocks
- Bead linking: assistant messages auto-detect bead references
- Thinking levels: control reasoning depth (low/medium/high)
Track running coding agent sessions in real time.
- Status indicators: running (green), idle (yellow), stopped (gray), error (red)
- Session details: agent type, model, project, linked bead, elapsed time
- Terminal view: read-only capture with auto-refresh
- Nudge button: send Enter to stuck sessions
- Launch from UI: configure project, agent, bead ID, and seed prompt
Aggregate view of all agent sessions.
- Columns: name, agent type, model, project, bead, status, elapsed, tokens, cost
- Stats: sessions today, total tokens, estimated cost
Rich content panel for agent output.
- Formats: Markdown, HTML, images, code diffs, Mermaid diagrams, terminal output
- Toolbar: back/forward history, zoom controls, export
- Drag-and-drop: paste images or open files directly
Right panel supports three modes:
| Mode | Layout |
|---|---|
| Chat | Full-height chat |
| Canvas | Full-height canvas |
| Split (default) | 60% canvas / 40% chat, resizable divider |
Reverse-chronological event timeline.
- Filters: project, event type (bead events, session events, commits), date range
- Events: bead creation/status changes, session starts/completions, git commits
- Task cards show commit SHA, branch name, and commit count
- Click a SHA to view the diff in canvas
- Bead IDs in commit messages auto-linked
| Shortcut | Action |
|---|---|
Cmd+N |
New bead |
Cmd+Shift+N |
New coding session |
Cmd+1–Cmd+4 |
Tab navigation |
Cmd+[ / Cmd+] |
Canvas history back/forward |
Cmd+L |
Focus chat input |
Esc |
Back to board from terminal |
Enter |
Send chat message |
Shift+Enter |
Newline in chat |
Full dark mode support with adaptive theming. Sidebar stays dark in both modes.
- macOS 15 (Sequoia) or later
- Xcode 16.2+ with Swift 6.0
- XcodeGen (
brew install xcodegen) - Beads (
brew install beads) - An OpenClaw gateway running
- tmux (for coding session management)
# Clone
git clone https://github.com/nicobailon/AgentBoard.git
cd AgentBoard
# Generate Xcode project (if needed)
xcodegen generate
# Open in Xcode
open AgentBoard.xcodeproj
# Or build from CLI
xcodebuild -project AgentBoard.xcodeproj \
-scheme AgentBoard \
-destination 'platform=macOS' \
build- AgentBoard auto-discovers projects in
~/Projectswith.beads/directories - Configure your OpenClaw gateway in Settings (default:
ws://127.0.0.1:18789) - Auth tokens are stored securely in macOS Keychain
┌─────────────────────────────────────────────────────────────────┐
│ AgentBoard.app │
│ (SwiftUI, macOS 15+) │
├─────────────┬──────────────────────┬────────────────────────────┤
│ Sidebar │ Center Panel │ Right Panel │
│ (220pt) │ (flexible) │ (resizable) │
│ │ │ │
│ • Projects │ • Board (Kanban) │ • Chat Mode │
│ • Sessions │ • Epics View │ • Canvas Mode │
│ • Views │ • Agents View │ • Split Mode │
│ • Actions │ • Terminal View │ │
│ │ • History View │ │
└──────┬──────┴──────────┬───────────┴──────────┬─────────────────┘
│ │ │
▼ ▼ ▼
┌──────────────┐ ┌───────────────┐ ┌────────────────────────────┐
│ SessionMonitor│ │ BeadsWatcher │ │ OpenClawService │
│ (tmux/ps) │ │ (FSEvents) │ │ (WebSocket JSON-RPC) │
└──────────────┘ └───────────────┘ └────────────────────────────┘
│ │
▼ ▼
┌──────────────┐ ┌─────────────────────┐
│ .beads/ dirs │ │ OpenClaw Gateway │
│ (filesystem) │ │ ws://127.0.0.1:18789 │
└──────────────┘ └─────────────────────┘
AgentBoard/
├── App/
│ └── AppState.swift # @Observable central state
├── Models/
│ ├── AppConfig.swift # Persisted configuration
│ ├── Bead.swift # Issue model (task, bug, feature, epic)
│ ├── CanvasContent.swift # Canvas render types
│ ├── ChatMessage.swift # Chat message with streaming support
│ ├── CodingSession.swift # tmux session model
│ └── Project.swift # Project with bead counts
├── Services/
│ ├── AppConfigStore.swift # Config persistence
│ ├── BeadsWatcher.swift # DispatchSource file watcher
│ ├── CanvasRenderer.swift # WKWebView content rendering
│ ├── DeviceIdentity.swift # Ed25519 device keypair
│ ├── GatewayClient.swift # WebSocket JSON-RPC client
│ ├── GitService.swift # Commit discovery and diffs
│ └── SessionMonitor.swift # tmux + process polling
├── Views/
│ ├── Board/ # Kanban board and cards
│ ├── Canvas/ # WKWebView canvas
│ ├── Chat/ # Chat panel with streaming
│ ├── Epics/ # Epic progress view
│ ├── History/ # Event timeline
│ ├── Sidebar/ # Project and session list
│ └── Terminal/ # SwiftTerm wrapper
└── Resources/
└── Assets.xcassets
| Service | Role |
|---|---|
GatewayClient |
WebSocket JSON-RPC client for OpenClaw gateway |
OpenClawService |
Actor wrapper around GatewayClient |
BeadsWatcher |
DispatchSource file watcher for .beads/issues.jsonl |
SessionMonitor |
tmux session + process tree polling |
CanvasRenderer |
WKWebView rendering (markdown, HTML, diffs, Mermaid) |
GitService |
Commit discovery, bead-ID linkage, diff retrieval |
KeychainService |
Secure token storage in macOS Keychain |
| Package | Purpose |
|---|---|
| SwiftTerm | Terminal emulation |
| swift-markdown | Markdown parsing |
Both managed via Swift Package Manager. No local database — beads files are the source of truth.
AgentBoard connects to an OpenClaw gateway for chat and session management.
Auto-discovery: On launch, reads from ~/.openclaw/openclaw.json:
{
"gateway": {
"url": "ws://127.0.0.1:18789",
"auth": { "token": "your-gateway-token" }
}
}Manual configuration: Switch to Manual mode in Settings and enter URL + token directly. Tokens are stored in macOS Keychain.
| Method | Configuration |
|---|---|
| LAN/Direct IP | Set gateway.bind: "0.0.0.0" on gateway, connect to http://<ip>:18789 |
| Tailscale/VPN | Use gateway's VPN IP: http://100.x.y.z:18789 |
| SSH Tunnel | ssh -L 18789:localhost:18789 user@host, then connect locally |
Projects are auto-discovered by scanning ~/Projects for folders with .beads/ subdirectories. Configure manually in Settings or via ~/.agentboard/config.json:
{
"projects": [
{ "name": "NetMonitor-iOS", "path": "~/Projects/NetMonitor-iOS", "icon": "📡" },
{ "name": "AgentBoard", "path": "~/Projects/AgentBoard", "icon": "🎛️" }
]
}Each device must be approved on first connection:
- AgentBoard shows a pairing guide if approval is needed
- Run
openclaw devices approve <device-id>on the gateway machine - Click "Retry Connection" in AgentBoard
Device identity (Ed25519 keypair) is stored in ~/.agentboard/device-identity.json.
# Unit + UI tests
xcodebuild -project AgentBoard.xcodeproj \
-scheme AgentBoard \
-destination 'platform=macOS' \
test
# Run specific test file
swift test --filter BoardViewTests# SwiftLint runs automatically as a build phase
# Manual run:
swiftlint lint
# SwiftFormat
swiftformat --lint .After editing project.yml:
xcodegen generateNever edit project.pbxproj directly — it's regenerated from project.yml.
Contributions welcome! Here's how to get started:
- Fork the repository
- Create a feature branch:
git checkout -b feature/my-change - Read the docs:
DESIGN.md— Architecture and decisionsdocs/ADR.md— Architecture Decision Records
- Build and test before committing:
xcodebuild -project AgentBoard.xcodeproj -scheme AgentBoard build test - Use conventional commits:
feat:,fix:,docs:,refactor:,test: - Open a pull request against
main
- Swift 6 strict concurrency (
SWIFT_STRICT_CONCURRENCY: complete) - SwiftUI with
@Observable(not@ObservableObject) - Actor-based services for thread safety
- No force unwraps (
!) — useguard,if let, or??
- Direct Launch: Launch coding agents from AgentBoard with bead context
- Multi-window: Detach terminal/canvas into separate windows
- Cloud Sync: Sync settings across devices via iCloud
- Team Collaboration: Multi-user support with presence
- iOS Companion: Read-only board on the go
MIT License. See LICENSE for details.
- Beads — Git-backed issue tracking
- OpenClaw — Agent gateway
- SwiftTerm — Terminal emulation
- swift-markdown — Markdown parsing