The idea
A small service you run yourself that turns meeting recordings and chat threads into a searchable register of decisions. You feed it a transcript; it proposes a short list of candidate decisions — what was chosen, who owns it, what was rejected and why — and a human confirms or discards each one in a review queue. Confirmed entries become permanent records with a date, an owner, a link back to the source, and a status: active, superseded, or reversed. Six months later, "why do we use Postgres for this and not the queue?" is a search, not an archaeology project.
The point is the filter. Transcripts are already easy to produce and nearly useless to read. What survives is a few dozen sentences a year that everyone keeps re-litigating.
Why build this
Every team of more than four people has the same failure: a decision gets made in a call, gets written down nowhere or in a doc nobody can find, and gets quietly reversed eight months later by someone who never knew it happened. The cost shows up as rework, as the same argument twice, and as new hires burning a week rediscovering a constraint.
The existing options are bad. Wiki pages go stale and nobody edits them. Architecture decision records in the repo work well for engineering and cover nothing else. Meeting-notes tools store transcripts, which is the opposite of the problem — more text, not less.
What changed is that transcription and extraction are now cheap enough to run on your own hardware. faster-whisper transcribes an hour of audio on a mid-range GPU in a couple of minutes, and a 14B model running locally is good enough to spot "so we're going with X" in a wall of text. Meeting content is exactly the material a company will not hand to a third-party API, which makes self-hosting a feature rather than a tax.
Stack sketch
- FastAPI backend, Postgres with
pgvectorfor semantic search over decision text faster-whisperwith speaker diarization viapyannotefor audio ingest; plain text and VTT accepted directly- Extraction through Ollama running Qwen 3 14B, with an option to point at the Claude API for teams that allow it — same prompt, structured JSON output either way
- htmx and Tailwind for the UI; the review queue is a list of cards with confirm/edit/discard, nothing heavier is warranted
- A Slack bot for two things: a
/decidedcommand that writes a record straight in, and a daily DM to whoever has unreviewed candidates - Docker Compose, Postgres volume, one container per concern
Scope for v1
- Upload audio or paste a transcript; get candidate decisions back
- Review queue with confirm, edit, discard — nothing enters the register unreviewed
- Decision records: title, date, owner, one-paragraph rationale, rejected alternatives, source link
- Full-text and semantic search, plus filters by owner and date
- Mark a decision superseded by a newer one, keeping the chain intact
- Slack
/decidedfor the decisions that never happen in a meeting
Deliberately out of v1: a bot that joins live calls, per-team permissions and SSO, Jira or Notion sync, and any attempt at automatic superseding. Someone has to say a decision is dead.
Where it could go
The obvious next step is ingest breadth. Most decisions are not made in meetings at all — they land in a Slack thread or a pull request comment. Watching a handful of channels and treating long threads as transcript input widens coverage a lot for very little new code.
After that, drift detection is the interesting move. If the register holds an active decision and a new pull request or design doc contradicts it, the system can flag it on the spot: "this touches the retry policy, which was decided in March, here's the record." That turns a passive archive into something that intervenes at the moment it matters. A third path is export — writing engineering decisions out as ADR markdown into the repo, so the register stays the source of truth without forcing developers to leave their editor.
Watch out for
Extraction precision is the whole product: a register padded with fifty non-decisions per meeting is worse than no register, because people stop trusting search results. Keep the human confirmation step even when the model gets good, and tune the prompt for recall low and precision high. Transcripts also contain performance discussions and salary talk, so ship a retention policy that deletes source audio after extraction by default.