BunnyDesk
AI documentation that fixes itself when your product changes
- Year
- 2025 – Present
- Role
- Founding engineer / primary author
- Status
- In development
What it is
BunnyDesk is an AI documentation platform — the idea is that product docs should keep themselves up to date. When something ships in your codebase or your product (a GitHub PR merges, a Linear/Jira issue closes, a Zendesk ticket spikes), BunnyDesk reads the change, figures out which docs are now stale, and either flags them or proposes the fix via an AI agent.
My role
I’m the founding engineer and primary author — I wrote the initial commit (Sep 2025) and own the AI/agent layer, the integration framework, the credit/billing system, RAG, and the multi-tenant hosted-sites infra. The team is small (a few engineers); I lead technical direction.
What I built
A multi-agent LLM system
The core of the product is a LangGraph multi-agent system. An orchestrator agent receives a request (e.g. “draft an update for this knowledge gap”) and delegates to specialized sub-agents:
- Researcher — does semantic search over existing docs, extracts info from videos and screenshots, returns a structured
ResearchAnalysis. - Draft writer — writes / updates pages.
- Site builder — manages the doc site’s navigation and sidebar.
- General purpose — fallback for everything else.
Conversations are persisted in Postgres via langgraph-checkpoint-postgres, so a long-running drafting session can pause, resume, and be inspected. There are ~12 structured tools the agents can call — create / update / read pages, navigation operations, screenshot capture, image analysis, video processing.
An automated agent-evaluation harness
Testing an agent is a pain — the same input doesn’t give you the same output. So I built an eval harness: YAML test cases with fixtures, a runner that executes the agent against each case with deterministic cleanup, and three layers of assertion — exact-match deterministic checks, trajectory checks (did it call the right tools in the right order?), and LLM-as-judge checks (is the output qualitatively correct?). It runs as a Django management command; CI gates rely on it.
A token-metered AI billing layer
Every AI feature deducts workspace credits in real time. I built the model-config registry (per-model dollar-per-token rates), a write-once CreditTransaction ledger, and a LangChain callback that intercepts every LLM call’s token usage and posts the deduction. Workspaces have plan-based credit grants, free-trial credits, and per-feature gating.
A pluggable third-party-integration framework
7+ providers — GitHub, GitLab, Jira, Linear, ClickUp, Zendesk, Intercom — and the integration adapter pattern is built so adding the next one is a small file. Each adapter handles OAuth, webhook registration, and event normalization. Inbound events land as IntegrationEventLogs, then get deduplicated and routed.
AI-driven documentation-drift detection
This is the part that ties integration events back to the docs. A KnowledgeGapProcessor takes raw events and:
- Uses an LLM to extract the topic of the change.
- Matches and merges the topic into existing
KnowledgeGaprecords (so 5 PRs about the same feature don’t create 5 separate gaps). - Runs semantic search over your docs to check coverage.
- Surfaces the gap to the user, who can then “assign to bunny” — that spawns a Task, which kicks off the multi-agent system to draft the fix.
Multi-tenant hosted documentation sites
Every BunnyDesk customer also gets a public doc site. Custom domains via Cloudflare’s custom-hostname API; private sites gated by JWT; analytics, theming, branding customization; RAG-powered AI search on each site (markdown-aware chunking with Chonkie, OpenAI embeddings, pgvector search).
Tech & decisions
- Django + HTMX/Alpine — server-rendered, no SPA. The product is mostly form-and-table CRUD with AI bolted on; HTMX kept the frontend minimal and team velocity high.
- PostgreSQL + pgvector for everything, including embeddings. One database, no separate vector store.
- LangGraph (later
deepagents) for the agent layer — gives us the typed graph + checkpointing without writing it ourselves. - OpenRouter as the LLM gateway, so we can swap models per purpose without changing client code.
Status
BunnyDesk is in active development. Everything above is built and running, but the product is still early.