deckgen // citation-backed presentations from your reports
Every number on the slide traces to its source.
deckgen turns scattered internal PDFs into presentations where every figure is backed by a verified citation — composed by a pipeline of reasoning agents, checked against an evidence ledger, and reviewed before it ships.
Hover or tap a stage to see what it does. It runs left to right, from raw PDFs to a deck where every figure is cited.
the problem
AI can draft a deck in seconds. The trouble is the numbers. A slide that claims "revenue grew 40%" is worthless if no one can say which report it came from — or whether the model invented it. deckgen works from the opposite end: no figure reaches a slide unless it traces to a line in a source document.
How a deck gets made
From a folder of PDFs to a presentation you can trace line by line. The hard part isn't writing slides — it's never letting a number onto one without its source.
- 01
Ingest & extract
Your PDFs are parsed page by page, and structured facts are pulled into an evidence ledger — each one tagged with its document, page, exact quote, and a confidence score.
ledger ← {doc, page, value, quote, conf} - 02
Index for meaning and for value
Facts are stored two ways: vector embeddings for semantic search and the structured ledger for exact figures — so a query can find the right passage and the verified number behind it.
pgvector · semantic + ledger · exact - 03
Orchestrate & fan out
An orchestrator reads your prompt, routes it against each report, and spawns one explorer agent per relevant report — running in isolated contexts, in parallel.
orchestrate → explorer × N · parallel - 04
Reason, per report
Each explorer works over only its own report, selecting the facts that matter to your prompt and carrying their ledger ids forward — so the composer sees focused findings, not the raw corpus.
distill · cite-only · carry ledger ids - 05
Compose the slides
The builder writes the deck from the union of findings. Every figure it places onto a slide carries the citation it came from — numbers are never written from free reasoning.
slide.figure → ledger.row - 06
Verify against the ledger
Before the deck is final, every figure on every slide is checked back against the ledger. Anything that doesn't resolve is flagged — a hard gate, not a hint.
verify · 56/56 → ledger · 0 dangling - 07
Review & ship
You resolve any flags — accept, regenerate, or attest a manual value that stays permanently marked "not from source" — then export a deck where every number traces to its origin.
resolve → export · pdf · pptx
How the agents reason
deckgen uses an orchestrator–worker pattern. The orchestrator never reasons over the whole corpus at once — it fans the work out to explorer sub-agents, each confined to a single report in its own context. That keeps coverage balanced and lets the corpus grow past any one context window. And because every explorer stays cite-only, nothing it produces can outrun the evidence.
one explorer's path · runs once per report, in parallel · the verifier is the second gate
Four ideas hold the accuracy together
The pipeline is built so a generated slide can never assert a number that isn't grounded in a source — and when a human edits it, that guarantee survives.
Evidence Ledger
Every extracted fact carries its source document, page, exact quote, and a confidence. Slides are composed only from verified ledger rows — numbers never come from free reasoning.
ledger.row {
doc "Q3_Report.pdf"
page 4
value "$1.2B" conf 0.97
quote "…revenue of $1.2 billion…"
}Fan-out Reasoning
An orchestrator spawns one explorer agent per relevant report, in isolated contexts, in parallel — so coverage stays balanced and the corpus can scale past any single context window.
orchestrate → fan-out ├ explorer · Q3 Report ✓ ├ explorer · Risk Memo ✓ └ explorer · Market Scan ✓ → distill → compose
Citation Verifier
Before a deck is final, every figure on every slide is checked back against the ledger. Unsupported claims are flagged, not shipped — a hard gate, not a suggestion.
verify deck ✓ 56/56 figures → ledger row ✓ 0 dangling citations ✗ 0 unsupported claims status: ready
Human Review
Flagged claims are resolved by accept, regenerate, or an attested manual value that is permanently marked "not from source" — and can never silently become a citation.
flag · slide 3 value not found in source [ accept ] [ regenerate ] [ ✋ manual — not from source ]
Built on a split architecture
The web app, the agent pipeline, and the evidence layer run on three surfaces — with the service-role key confined to the worker and row-level security enforcing every read.
web → Vercel · agent pipeline → Trigger.dev · evidence + auth → Supabase
How it was built
The accuracy isn't an accident of prompting — it's enforced by how the system was engineered, and proven the same way every time.
Spec-driven
Every capability began as a written specification and change proposal before any code — so the durable spec always matches what actually shipped.
Test-driven
Unit tests and database-level security tests gate every change. The accuracy core is locked with tests before the interface on top of it is built.
Live-verified
Green tests aren't the bar — the real gate is the live run. Every pipeline path is proven end to end against a real database, where the seams actually live.
Dogfooded
Built and proven on real reports — multi-report decks with every figure resolving to its source document, and zero dangling citations.
See it run on your own reports
Upload a set of PDFs and watch the pipeline build a deck you can trace, line by line.