Inspiration
Code has git blame. Decisions have… someone's fading memory and a thread nobody can find. Every team relearns why they chose Postgres, why launch slipped, why pricing is what it is. The context lives in Slack — it's just unfindable. Paper Trail turns the place where decisions happen into the place where they're remembered.
What it does
Log a decision from any thread — hit ⋮ → Log decision and AI reads the thread and prefills the record: what was decided, why, which alternatives were rejected, who decided. You confirm before anything is written. AI drafts, people decide.
It notices decisions happening. When a message looks like a decision ("final call…", "let's go with…"), Paper Trail quietly asks — only you see it — "want this on the record?" One click, logged.
The ledger lives in the App Home. Browsable decision cards with channel filters. Decisions are never deleted: superseding a decision creates a v2 linked to the v1, history preserved. Every card links back to the original thread — that's the receipt.
Ask, and get sourced answers. @Paper Trail why did we choose Redis? returns an answer grounded in the ledger, with the decision cards and thread links attached. If the ledger doesn't know, it says so — it never invents.
And here's the part that's only possible with MCP: your decision history shouldn't be trapped in Slack. Paper Trail ships an MCP server over the same ledger — list_decisions, search_decisions, get_decision. Claude, Cursor, or any MCP client can check the record mid-task: "search Paper Trail before refactoring the cache layer."
It works in both directions — with a human gate. External AI tools can call propose_decision, but nothing enters the ledger directly: Paper Trail posts an approval card in Slack, a human reviews the draft, edits it, and confirms — or rejects it. The card updates with who decided. AI proposes, people decide, in both directions.
How we built it
Bolt for Python on Socket Mode; all UI is Block Kit (prefilled modal, App Home ledger, sourced answer cards, approval cards). SQLite ledger with relevance-scored search and supersede chains. MCP server built on FastMCP, sharing the same database the Slack agent writes to. The AI drafting layer chains providers (Gemini → Groq) and degrades gracefully to heuristic extraction — the app never breaks on a missing or rate-limited key.
Challenges we ran into
Making AI prefill trustworthy: every draft is grounded in the actual thread text and a human confirms it in the modal before the ledger changes. Fitting a decision's full story — context, alternatives, dissent, supersede history — into a Block Kit card that stays scannable took most of our design iterations.
Accomplishments we're proud of
A judge can go from cold start to logging a decision and querying it from an external AI tool in under two minutes, live in the sandbox. And the supersede model means the ledger tells the truth about how decisions evolve — v2 doesn't erase v1.
What we learned
Agents that observe and remember beat agents that chat. The best UX for AI in Slack is often no conversation at all: one shortcut, one confirm, done.
What's next
Decision outcomes ("did this age well?" review nudges after 90 days), weekly decision digests, org-wide ledgers, and richer MCP write tools — always proposing, never committing, with a person in the loop.
Log in or sign up for Devpost to join the conversation.