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
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).
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.
Each app writes to a managed root (gitignored), one subfolder per source, mirroring the source structure:
doocus-data/<source>/ — document collections (index.json + .doocus/)meetus-data/<source>/ — meeting collections (index.json + .meetus/)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.
Local Vue 3 + Vite apps over ui/framework/ (shared components + tokens):
@review,
composed — not duplicated).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
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.
# 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