Busabase
Busabase is an open-source (MIT) database and workspace for AI agents — data, docs, skills, and apps in one place. Run it locally, self-host it inside your network, or use Busabase Cloud, and turn age
Ask questions of a CSV. An LLM plans the analysis and explains the results; every number it states is independently re-computed from your data.
DataGitHub @srohrerOnlineOwner unconfirmed
Have you tried it? One tap is enough. No sign-in needed.
Repository information has not been collected yet.
No updates detected yet. GitHub releases will appear here.
Data analysis where every claim is checked: an LLM plans and narrates, a deterministic engine executes and verifies.
Loading the full README.
Read the full README ↗Data analysis where every claim is checked. Ask a question about a CSV. An LLM plans the analysis and explains the results, and every number it states is independently re-derived from your data before you see it.
Live demo: receipts.srohrer.dev
LLMs are good at deciding what to compute and at explaining results. They are bad at arithmetic, and they state wrong numbers with total confidence. Receipts splits those jobs. The model never computes anything itself: it writes a plan, a deterministic engine runs it, and the model's explanation is treated as a list of claims to prove.
flowchart LR
Q[Question] --> P
subgraph Model [DeepSeek]
P[Plan<br/><small>queries in a typed DSL + chart spec</small>]
N[Narrate<br/><small>prose + one assertion per claim</small>]
R[Repair<br/><small>rewrite failed claims</small>]
end
subgraph Local [Browser, deterministic]
E[Execute<br/><small>over every row</small>]
V[Verify<br/><small>recompute each claim</small>]
end
P --> E --> N --> V
V -- all verified --> Out[Answer with receipts]
V -- contradicted / unverifiable --> R --> V
E -. schema or column error .-> P
engine.ts). Unknown columns, non-numeric aggregates and bad chart references go back to the model as correction messages, up to 3 attempts.[[c1|grew 14% year over year]]) and paired with a typed assertion, such as pct_change, share, rank, ratio, trend, compare, value or count, that points at cells of the query results.verify.ts recomputes each assertion from the full results and grades it as verified, contradicted (with the true value), or unverifiable (e.g. the claim references a row that doesn't exist).Hover any underlined claim to see its proof. The chart and result tables highlight the exact cells it depends on.
14 → ±0.5, 14.4 → ±0.05, 1,200,000 → ±50,000) and is capped at 5% relative, so the model can't loosen its own grading by writing vaguer numbers.Next.js 16 (App Router) · React 19 · TypeScript · Tailwind v4 · Recharts · TanStack Virtual (virtualized grids for 7k+ rows) · Zustand · Zod · PapaParse (Web Worker parsing) · Vitest · DeepSeek (deepseek-flash, OpenAI-compatible streaming, JSON mode).
The API route streams model tokens to the browser as NDJSON, so the pipeline timeline, the raw model output and the per-stage token/cost readouts update live.
src/lib/
dsl.ts the model↔app contract (zod schemas for plans, claims, checks)
engine.ts deterministic query executor + SQL renderer
verify.ts claim verification with rounding-semantics tolerances
pipeline.ts plan → execute → narrate → verify → repair, with retries
prompts.ts system prompts and message builders
csv.ts type inference and column profiling
server/ DeepSeek streaming client, rate limiting
src/components/ analysis card, chart with evidence highlighting, virtualized grid, …
scripts/ sample data generator, demo recorder, mock DeepSeek server
npm install
cp .env.example .env.local # add DEEPSEEK_API_KEY, or skip it and use demo mode
npm run dev
With no key, the suggested questions replay saved runs through the real engine and verifier. To exercise the full live path offline, including SSE parsing, the retry loop and repair, run the bundled mock DeepSeek server:
npm run mock:deepseek # terminal 1: answers the sample questions, first plan deliberately broken
npm run dev:mock # terminal 2
Other scripts: npm test (engine, verifier, and every demo run end to end through the pipeline), npm run gen:samples (regenerates the seeded synthetic datasets), and npm run record:demos (captures real DeepSeek runs of every suggested question into src/demos/recorded.json).
Import the repo in Vercel and set DEEPSEEK_API_KEY. Optionally set UPSTASH_REDIS_REST_URL / UPSTASH_REDIS_REST_TOKEN for durable rate limits. No other configuration is needed.
All three datasets (SaaS metrics, coffee sales, support tickets) are synthetic, generated by a seeded script with deliberate patterns to find: a regional churn shock, a mid-year price increase, a month-long bug surge.
MIT