Back to Projects

BunnyDesk

AI documentation that fixes itself when your product changes

Year
2025 – Present
Role
Founding engineer / primary author
Status
In development
Visit bunnydesk.ai
Django Celery PostgreSQL pgvector LangGraph LangChain OpenAI HTMX Alpine.js TipTap Stripe Cloudflare

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:

  1. Uses an LLM to extract the topic of the change.
  2. Matches and merges the topic into existing KnowledgeGap records (so 5 PRs about the same feature don’t create 5 separate gaps).
  3. Runs semantic search over your docs to check coverage.
  4. 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.