DEV Community

Cover image for Burrow: a voice-driven research canvas that lives on your own disk
Ronak Parmar
Ronak Parmar

Posted on

Burrow: a voice-driven research canvas that lives on your own disk

If you've ever tried to research a deep topic — literature review, technical due diligence, a rabbit hole you fell into at 11pm — you know the problem isn't finding information. It's that your notes end up scattered across browser tabs, a Notion page, a PDF folder, and your own head. Burrow is my attempt at fixing that: a voice-driven AI research assistant on an infinite canvas, built local-first and BYOK.

What it actually does

Burrow gives you a canvas — think digital detective board — where you drop notes, documents, tables, diagrams, and images while talking to an assistant that can search the web, fetch papers, read your documents, and build things directly on the board with you. Everything it creates lands as a real block on the canvas, not a wall of chat text you have to mine for insight later.

Some specifics:

  • Fifteen assistant tools — writing blocks, connecting them, framing them, flagging uncertainty, reading your documents and your handwriting, searching academic literature across four open indexes, web search, and image generation.
  • Document import — PDF, Word, Markdown, and text files get imported, read in-app, and excerpted straight onto the board.
  • Freehand ink with a shared undo stack between you and the assistant — Ctrl+Z undoes whatever happened last, regardless of who did it.
  • Always-on voice, wake-word activated ("Hey Burrow"), with a persistent status indicator so it's never ambiguous whether the mic is live.

Local-first and BYOK, actually

This is the part I care most about. Workspaces are plain folders on your disk:

<Documents>/Burrow/<id>/
  workspace.json
  board.json          # { nodes, edges, ink, viewport }
  transcript.jsonl    # append-only, text only — never audio
  documents/
  images/
Enter fullscreen mode Exit fullscreen mode

You bring your own API keys, stored in your OS keychain. Nothing leaves your machine except calls you explicitly configure. And if you'd rather not use any hosted provider at all, point it at Ollama or any OpenAI-compatible endpoint and the whole thing runs locally — no keys required.

Voice input works the same way: it defaults to a local Whisper server (whisper.cpp, Speaches, LocalAI, or vLLM), with hosted providers like Groq or Deepgram available if you'd rather not run one yourself.

The architecture decision I'm proudest of

Every mutation to the board — whether from you clicking around or the assistant acting — goes through a single apply(board, command) function in src/canvas/commands.ts. That one decision gives you:

  1. A unified undo stack (no separate "undo my edits" vs "undo the assistant's edits")
  2. Assistant tool schemas generated from the same command union the UI uses, so they can't drift apart over time

Stack

  • Shell: Tauri v2 (Rust + WebView2/WKWebView) — chosen for real filesystem access, OS-keychain key storage, background wake-word listening, and a non-CORS-bound HTTP client (no relay proxy needed)
  • Canvas: React Flow (@xyflow/react)
  • Frontend: React 19 + Vite + TypeScript

Where it stands today

Honest status, not marketing copy: the assistant loop and every block type are verified against live providers, and document import/paper search work. Image generation is built but not yet verified end-to-end against a real provider, and the vision half of handwriting-reading has request shapes written from documentation but hasn't been tested against a model that can actually see. No bundled speech engine ships — you run your own Whisper server.

Try it

It's MIT-licensed and free to run. Grab a release for Windows, macOS, or Linux, or build from source:

npm install
npm run tauri dev
Enter fullscreen mode Exit fullscreen mode

Repo: github.com/ronak-create/burrow
Design doc (the real docs, hand-written): DESIGN.md

If you're working on something similar or have thoughts on the voice UX, I'd love to hear them in the comments.

Top comments (0)