BirdEye
by zanni098
README.md
<div align="center">
# π¦
BirdEye
**One hub, every bird.**
Local-first mission control for all your AI agent harnesses β Claude Code, Claude Desktop, Codex, opencode, OpenClaw, Zcode, Gemini CLI, Cursor, Continue.
[](LICENSE)
[](#quick-start)
[](#how-it-runs)
[](CONTRIBUTING.md)
<img src="docs/screenshots/memory-graph.png" alt="BirdEye memory graph" width="900" />
</div>
---
## The problem
If you use more than one AI agent harness, you know this pain:
1. **Every harness is an island.** Each has its own sessions, memories, MCP servers, plugins, skills, and routines. Nothing is shared.
2. **Memory doesn't travel.** What Claude Code learned about you yesterday, Codex re-asks today. Import tools β where they exist β are per-harness and incompatible.
3. **Credentials multiply.** Giving agents access to GitHub means configuring auth in every single harness. N harnesses = N copies of every token.
4. **Zero visibility.** Which harness can touch what? How many tokens has each burned? Nobody can tell you.
5. **No shared work.** You can't assign a task from one place and have different harnesses pick it up.
## What BirdEye does
BirdEye is a **daemon on `127.0.0.1` + an interactive dashboard + one MCP gateway** that every harness joins. Free, MIT, no cloud, no telemetry β your data never leaves your machine.
| Pillar | What you get |
|---|---|
| πΊοΈ **Unified inventory** | Read-only adapters scan all 9 harnesses' on-disk state into one normalized model: sessions, memories, skills, plugins, MCP servers, agents, credential key *names*, usage. |
| π§ **Collective memory** | Every harness's native memory imported, deduped, and rendered as an **interactive memory graph**. Two-way: `birdeye memory sync-back` writes a shared memory pack into each harness's context file (`CLAUDE.md`, `GEMINI.md`, `AGENTS.md`β¦) inside safe marker blocks. |
| π **MCP gateway + vault** | One MCP server every harness registers with a single line. Any agent in any harness gets `memory_search` / `memory_save`, a shared task queue, and `vault_get` β secrets stored **once**, AES-256-GCM encrypted. |
| π― **Missions** | A shared task board. Write a briefing once, dispatch to any harness with a headless CLI (`claude -p`, `codex exec`, `opencode run`, `gemini -p`) and watch output stream live. |
<div align="center">
<img src="docs/screenshots/aviary.png" alt="Aviary β fleet overview" width="900" />
</div>
## Quick start
Requires **Node β₯ 23.6** (BirdEye runs TypeScript natively β no build step for the daemon).
```bash
git clone https://github.com/zanni098/BirdEye.git
cd BirdEye
npm install
npm run build # builds the dashboard (one-time, ~1s)
npm run demo # β http://127.0.0.1:4477 with rich demo data
# or scan YOUR machine:
npm run up
```
Then wire your harnesses into the hub:
```bash
node packages/cli/bin/birdeye.ts scan # inventory every harness
node packages/cli/bin/birdeye.ts register claude-code # add the BirdEye MCP gateway (with backup)
node packages/cli/bin/birdeye.ts register codex # ...same one-liner for each harness
node packages/cli/bin/birdeye.ts vault set GITHUB_TOKEN ghp_yourtoken
node packages/cli/bin/birdeye.ts memory sync-back # push shared memory into every context file
```
## The dashboard
Seven views, live over WebSocket:
- **Aviary** β fleet overview: one card per harness with health, counts, warnings, dispatch capability.
- **Memory Graph** β the shared brain, drawn: memories colored by source harness, tags, auto-extracted entities, `[[links]]`. Drag, zoom, filter, click any node for full detail.
- **Missions** β task board with live dispatch streaming.
- **Sessions** β cross-harness session timeline with filters.
- **Arsenal** β skills / plugins / MCP matrix: see instantly that `github` MCP is configured 4 separate times.
- **Access** β which harness holds which credential keys (names only), with duplication flagged β plus the encrypted vault.
- **Usage** β tokens and cost per harness. Honest: harnesses that don't log usage show *unknown*, never invented numbers.
<div align="center">
<img src="docs/screenshots/missions.png" alt="Missions β dispatch board" width="440" />
<img src="docs/screenshots/access.png" alt="Access β credential matrix and vault" width="440" />
</div>
## Harness support
| Harness | Sessions | Memories | Skills | Plugins | MCP | Usage | Dispatch |
|---|:-:|:-:|:-:|:-:|:-:|:-:|:-:|
| Claude Code | β
| β
| β
| β
| β
| β
| β‘ `claude -p` |
| Claude Desktop | β | β | β | β
| β
| β | manual |
| Codex | β
| β
| β | β | β
| β
| β‘ `codex exec` |
| opencode | β
| β
| β
| β
| β
| β | β‘ `opencode run` |
| OpenClaw | β
| β
| β
| β
| β | β | manual |
| Zcode | β | β | β
| β
| β | β | manual |
| Gemini CLI | β
| β
| β | β | β
| β | β‘ `gemini -p` |
| Cursor | β | β
| β | β
| β
| β | manual |
| Continue | β
| β
| β | β | β
| β | manual |
β
full Β· β best-effort Β· β the harness doesn't expose it on disk
## The MCP gateway
`birdeye register <harness>` adds one entry to that harness's MCP config (original backed up first). After that, **any agent in any harness** can call:
| Tool | Does |
|---|---|
| `memory_search {query}` | search the unified, deduped memory of *all* harnesses |
| `memory_save {title, body, tags?}` | save a memory every other harness can recall |
| `task_list` / `task_claim` / `task_update` | the shared work queue |
| `vault_get {key}` | fetch a secret stored once in the encrypted vault |
## Security model
- The daemon binds **`127.0.0.1` only**. No telemetry, no outbound calls.
- Adapters are **read-only**; scanning never touches your harness files.
- Credential **values are never read** from harness configs β key names only. The dashboard never displays secret values; `vault_get` flows only over local stdio MCP.
- Vault: AES-256-GCM, scrypt-derived key (`BIRDEYE_VAULT_PASSPHRASE`, or a machine-derived default).
- The only writers β `register`, `sync-env`, `memory sync-back` β are explicit commands that create timestamped backups and, for context files, only ever touch the `<!-- BIRDEYE:START/END -->` block.
## How it runs
TypeScript monorepo, zero native dependencies, no compile step for the daemon (Node's native type-stripping). Vite builds the dashboard once.
```
packages/core types Β· JSON store Β· dedup Β· memory graph Β· marker sync Β· vault
packages/adapters 9 harness scanners + registry (failure-isolated)
packages/server Hono daemon: REST + WebSocket + dispatcher + demo mode
packages/mcp the MCP gateway (stdio) + per-harness registration snippets
packages/cli birdeye up Β· scan Β· register Β· vault Β· sync-env Β· memory Β· dispatch
apps/dashboard React + d3-force dashboard
```
`npm test` β 62 tests across every package, fixture-driven.
## Honest limits (v1)
- Usage stats depend on what each harness logs locally β rich for Claude Code/Codex, honest *unknown* elsewhere.
- Cursor/Continue chat data lives in app-internal storage; those adapters are shallower.
- Dispatch needs the harness CLI on your PATH.
- Cross-harness collaboration is via shared memory + shared task queue; automatic result-chaining between harnesses is on the roadmap.
## Roadmap
- [ ] Result-chaining: harness A's output feeds harness B's next task
- [ ] Embedding-based memory similarity edges (currently: links, tags, entities)
- [ ] More adapters β Aider, Windsurf, Clineβ¦ ([add one β it's ~100 lines](CONTRIBUTING.md))
- [ ] `npx birdeye` as a published npm package
## Contributing
Adapters are the sweet spot β one focused file + a fixture + a test. See [CONTRIBUTING.md](CONTRIBUTING.md).
MIT Β© BirdEye contributors
This server cannot be deployed
Maintenance
ActivityMaintained
ResponsivenessUnresponsive