meetus + doocus

A local, offline context extractor · deterministic · no cloud AI touches the source

Turn a downloaded Google Drive — meetings and documents — into a searchable, browsable, packageable knowledge base, then hand focused subsets to the AI services you're allowed to use (Gemini web, NotebookLM). Two offline pipelines feed two local UIs over a shared component framework.

meetus → meeting transcripts (WhisperX + frames) doocus → documents → text + metadata tree

meetus + doocus architecture

The two pipelines

meetus — meetings

WhisperX (speaker diarization) + FFmpeg scene-detection frames → an enhanced transcript with frame references.

uv run process_meeting.py meeting.mkv \
  --embed-images --scene-detection \
  --scene-threshold 10 --diarize

Batch a tree with make batch IN=<dir>. --out-format controls the run-folder name (e.g. {name}.meetus).

doocus — documents

Replicates the whole tree into index.json; extracts text sidecars (content.md + meta.json) only for docx/pdf/pptx/xlsx — other files are linked, not duplicated.

uv run process_tree.py "/path/to/drive" \
  --output "doocus-data/<source>" --only docs

--only {all|docs|meetings} scopes a collection.

Outputs & collections

Each app writes to a managed root (gitignored), one subfolder per source, mirroring the source structure:

Collections whose index.json.root match are the same source: the doocus UI merges their docs + meetings into one tree, toggled as one source. When a file exists in two collections, the copy whose sidecar resolves wins. A meeting's .meetus must sit in the same folder as its collection's index.

The UIs

Local Vue 3 + Vite apps over ui/framework/ (shared components + tokens):

cd ui/doocus-app && DOOCUS_DATA="/abs/doocus-data,/abs/meetus-data" npm run dev
cd ui/meetus-app && MEETUS_OUTPUT=/abs/output npm run dev

Packaging

The doocus package builder zips selected originals + their content.md for a target (Gemini web ≤10 files/≤100 MB, or NotebookLM). Originals are what the permitted services consume; the extracted text is the local search index — never a replacement for the document.

Install

# system
sudo apt-get install ffmpeg graphviz          # + tesseract-ocr, poppler-utils (optional)

# python (uv feature groups)
uv sync --group meetus                         # meeting pipeline
uv sync --group doocus --group ocr             # docs + OCR

# whisper/whisperx are external CLIs (install separately, often a GPU env)
pip install whisperx                           # diarization needs a HuggingFace token

# UIs
cd ui/meetus-app && npm install
cd ui/doocus-app && npm install