A private AI that read a million words so knowledge didn't walk out the door.

Two senior delivery leads were leaving HeroX Air Domes. Almost everything they knew lived in meeting recordings, WhatsApp threads, phone calls, email and screen activity. We built a local LLM pipeline that read all of it — in full — and turned it into a searchable hand-over knowledge base where every fact links to its source.

v0.7 live · in progress
ClientHeroX Air Domes, USA & EU
RoleSolution architect & operator
Timeline6 versions in ~2.5 weeks
Privacy100% local LLM processing

The problem

HeroX designs and builds inflatable sports domes in the US and Europe. When its US head of delivery and EU operations lead were leaving, the CEO issued a scope of work: one knowledge base, built from every source read in full — no summarising from summaries — good enough for their successors to run live projects from it, and reusable later as context for HeroX's own AI agents.

The data could not go to a third-party AI service. That ruled out the easy route.

What we built

A privacy-first pipeline that runs entirely on our own machine. It reads raw business communication and produces a structured knowledge base organised into the chapters the client asked for: every counterparty, how things are actually done, a timeline of decisions with reasons, an open-promises register, a numbers appendix (specs, prices, lead times), lessons and failures, and project status.

It ships as Markdown and as a standalone HTML page with search and filters that works offline. Every line carries a source tag — a meeting timestamp, a chat message, a call or an email — so anyone can check where a fact came from.

Fetch→Normalise & de-dup→Chunk→Local LLM extract→Verify→Merge→Spot-check→Publish

One repeatable pattern per source

  1. Fetch — API pull or export: Fireflies GraphQL, the Quo phone-line API, WhatsApp exports, a Google Takeout mailbox.
  2. Normalise and de-duplicate — recordings with the same meeting link starting within 10 minutes collapse into one.
  3. Chunk deterministically — date-ordered, capped at 8,000 characters with overlap, each line tagged with its exact source.
  4. Extract with a local LLM — Qwen2.5-14B via Ollama fills a fixed 7-section JSON schema and cites line IDs; Python maps each ID back to its timestamp.
  5. Verify — fuzzy de-duplication, and any figure not found verbatim in its chunk is flagged “unverified”.
  6. Merge across sources into the knowledge-base chapters, resolving aliases.
  7. Spot-check with deterministic scripts: tag format, date ranges, personal-data leak terms.
  8. Publish with an anchor-based splice that leaves other chapters untouched, then rebuild the search page.

Sources read

SourceVolumeResult
Meeting recordings (two people)240 recordings → 192 unique meetingsTranscripts extracted; 5 re-transcribed with Whisper
WhatsApp threads12,578 lines · 132 call records192 chunks, 0 unaccounted lines, 0 errors
Business phone line82 calls · 98 SMS · 36 counterparties719 bullets → 687 kept
Screen-activity captures11,233 screenshots137.9 work hours profiled by category
Mailbox3,180 emails · 44 labelsLabel digests; sentence-level re-read in progress

Results

441contacts & companies
398procedures
568decisions
794figures, specs & prices
717lessons
42tracked promises
  • About 8,750 source-linked citations in the search page.
  • 475 per-source extract files with a README and source map for full traceability.
  • 0 extraction errors on the final run of every source.
  • Nothing was sent to a third-party AI service.

Problems we solved

  • Invented timestamps. The model left timestamps blank or made them up 21–40% of the time. We numbered every line so the model cites an ID and code maps it to the exact tag. Result: zero bad line IDs project-wide.
  • Runaway output. A missing minItems in the de-duplication schema let the model pad output with fake groups. Found and fixed at the root, plus generation caps and a repeat penalty.
  • Mixed-language audio. English transcription garbled Romanian speech. We detected garbled text directly, re-ran those meetings with Whisper and documented its one-language-per-file limit.
  • 15-hour runs on a laptop. Every script is resumable with progress files and runs under a sleep-blocking wrapper.
  • Safe fixes. Every fix script runs as a dry run first — which once caught a loose pattern that would have rewritten about 275 valid tags.
  • Privacy by design. A business-only rule applies at extraction and again at spot-check.

Stack

PythonBashOllamaQwen2.5-14B / 7BLlama 3.1 8BJSON-schema outputsfaster-whisperWhisperlangdetectFireflies GraphQL APIQuo APIGoogle TakeoutdifflibHTML/JS search pageMacBook Pro M1 ProClaude (pair-programming)

Status

Knowledge base v0.7 is published. Next: the sentence-level mailbox re-read, project-management, drive and calendar sources, an analytics dashboard, the client's review round and a second phase covering further mailboxes.

Need something like this?

Tell us what your team does by hand today. We'll scope it into jobs and a price.