July 2026
Canopy
An agent situation-room: a panel of AI leads debates a call across your projects, then you approve it. Bounded, mediated, human-approved.
Built to make multi-agent work legible — you watch the deliberation happen in an isometric room and stay the one who decides, instead of trusting a black box.
Canopy is the visible layer of a bigger system. Behind every venture I run — Kaeru, Aoi-san, Bui, Portfolio — sits a crew of specialist AI agents. Canopy is where I put them in one room, hand them a single real decision, and watch them argue it out before I sign off. Overcooked-style isometric, but the stakes are my actual roadmap.
The whole app is one loop: convene → debate → decide → approve. You ask the panel a question, they deliberate live, and nothing is final until you — the Overseer — say so.
What's inside
🎛️ The situation room
A hand-built isometric room where the meeting happens. Each agent has its own sprite and seat; a status line tells you whether the panel is idle, connected, debating, or done. It reads like a game screen on purpose — the point is to watch the work, not read a transcript dump.
🧑🤝🧑 A cross-project panel
The roster isn't hardcoded. Canopy discovers agents by reading the .claude/agents/*.md files from a shared groundwork repo and from each venture (Kaeru HQ, Aoi-san, Bui, Portfolio…). Whoever I've actually defined as an agent shows up on the panel — so the crew debating a call is the same crew that does the real work.

⚖️ Bounded, mediated debate
One question, one round, a fixed cast — bounded so it can't spiral. Two styles: mediated, where a chair routes the turns, and peer-to-peer, where the agents respond to each other directly. The debate produces meeting minutes and a proposed decision, not just chatter.
✅ Human-in-the-loop approval
Nothing ships on the model's say-so. When the panel lands on a recommendation I can Approve, Hold, or send it back for another round. Approved calls are written to a dated decision file in the ledger — so there's a paper trail, not vibes.

📡 Streamed live
The debate arrives over Server-Sent Events, so it unfolds in the browser as it happens instead of landing as one finished wall of text.
🔌 Bring your own engine
Runs in mock mode by default — no network, no API keys, fully explorable. Flip to live and it can talk to Claude, ILMU (a Malaysian LLM), or Ollama for fully-local models.
How it's built
- Next.js (App Router) + TypeScript + Tailwind v4, on Bun.
- SSE over websockets — an
/api/eventsroute streams the debate through a small pub/sub bus (lib/bus.ts);/api/{start,approve,roster}handle the rest. - Roster discovery —
lib/agents.tswalks groundwork and each venture repo for.claude/agents/*.md, so the panel is generated from real agent definitions rather than a static list. - The orchestrator —
lib/orchestrator.tsruns exactly one bounded, mediated debate and emits each turn as it resolves. - Auth without pasting keys —
lib/auth.tscan reuse my Claude Code OAuth token straight from the macOS keychain, so live mode needs no secret in an env file. - The room —
components/CanopyView.tsxrenders the isometric canvas client-side; there's an illustration gallery at/heritage.
Why I built it
Most multi-agent tools hide the work: you get an answer and a shrug. I wanted the opposite — to see the disagreement, keep the veto, and walk away with a written record I trust. Canopy makes the deliberation legible and keeps me the decision-maker, not the black box.
More projects
view all →
MakanMana
Your AI-powered food plug for the best makan spots in Malaysia. Ask naturally in Manglish and it hooks you up with real places, backed by real Google Maps reviews. Built with Syahirah for Cursor Hackathon 2025.

Mukawa AR Trail
A web AR trail built as a study for the Mukawa dinosaur story. Eight printed boards hang around a building, each with a picture and a QR. The QR only opens a link, so the phone's own camera does the scanning; the app asks for the camera when the visitor taps, recognises the picture itself as an image target, and stands the creature on the board as you move. Every board found unlocks its creature in a collection saved on the phone, with no sign-up. Built end to end by me: the trail app, the image targets, the printed panels and the deploy.
Kaeru Plugins
Two independent Claude Code plugins from one marketplace: kaeru lets non-technical staff safely edit a website's text, images, and colors in their own language and submit a PR for review — git stays hidden, it never merges; octo is the developer-facing GitHub + CI/CD toolkit — repo bootstrap, the issue → PR → merge flow, CI checks, and releases. The name folds in three meanings at once: 変える (change/edit), 帰る (return — a PR coming back for review), and 蛙 (frog — the mascot) — chosen so non-technical staff hear "Kaeru shite!" as friendly, not technical.