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 a sprite gallery at/sprites.
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 →
Kaeru Desktop App
A lightweight AI workspace anyone can use: chat with an agent to build and edit, preview your app live, and keep your work safe with plain-language source control. A desktop app built on Tauri + Rust, about 8 MB.

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.

Anime-based Gaming Pitch Website
This application serves as a professional platform for Okarun Gaming to showcase their team, attract sponsors, and engage with their community while maintaining their unique anime-inspired identity and professional esports presence.