8.7 KiB
meetus — repo index
A standalone, local-first command-line tool: turn screen-share meeting/training recordings into a rich, AI-summarizable transcript. The extraction pipeline is deterministic and offline; the summarization step is the only LLM-facing part.
meetus stands on its own. The separate cht project does the same thing in
realtime; meetus may or may not feed it, so the two are kept formally apart (the
cht-facing bits here live under ctrl/cht/).
This file maps the whole repo.
README.mdis the detailed manual for the mainprocess_meeting.pyCLI.
Data flow
video / audio
│ process_meeting.py (deterministic, offline)
▼
output/<run>/ run folder: YYYYMMDD-NNN-<stem>/
├── <stem>.json Whisper/WhisperX transcript (base)
├── <stem>.srt / .vtt / ... extra transcript formats (optional)
├── frames/ extracted scene/interval frames
├── <stem>_enhanced.txt transcript + frame refs ◀── the product
└── manifest.json
│ ctrl/summarize/*.py (local LLM — WIP, on hold)
▼
<stem>_summary_simple.md / _reference.md
make batch (→ ctrl/batch.sh) runs the pipeline over a whole directory tree,
mirroring the input folder structure into the output.
doocus — document extraction (alongside meetus)
The same idea for documents. process_doc.py turns local files (Drive exports,
PDFs, images, ...) into a textified product + metadata, deterministically and
offline. Its output is what feeds permitted services (Gemini web, NotebookLM)
and the local search index; the raw source never leaves the machine.
local drive tree (downloaded)
│ process_tree.py (deterministic, offline, no cloud AI)
▼
docs-output/ whole tree replicated, no flattening
├── index.json every file as a node (path, type, mode, url:null)
└── <mirrored path>/<file>.doocus/ sidecar, only for docx/pdf/pptx/xlsx:
├── content.md extracted text — SEARCH INDEX ONLY
└── meta.json (never replaces the original)
Node modes: extracted (docx/pdf/pptx/xlsx → text sidecar), meeting
(mp4/... → belongs to meetus), link (everything else → original is the
artifact, not duplicated). Each node has a url slot for the eventual Drive link
and a created date. make docs (→ process_tree.py) indexes a whole tree;
process_doc.py still does one-off single-file extraction.
Meetings stay coherent with docs: docs-output/meetings.txt lists the meeting
paths, and make batch … LIST=… OUT_FORMAT="{name}.meetus" runs meetus into a
<file>.meetus/ sidecar beside the docs — the exact path the indexer already
pointed each meeting node at (out/transcript). meetus's --out-format
(tokens {date} {run} {stem} {name}) makes the run-folder name configurable;
default is unchanged. Full doocus docs: doocus/README.md.
Cross-search (docs frame + meetings frame, over cached text) is a later phase. 🚧
Status legend
✅ active · 🚧 WIP, on hold · 🗄️ deprecated (kept for reference) · 🧰 one-off / niche · 📄 docs
Layout
process_meeting.py ✅ the CLI tool — entry point (stays at root)
process_tree.py ✅ doocus — index a whole local drive tree → index.json
process_doc.py ✅ doocus — one-off single-file extraction
Makefile ✅ batch convenience wrapper (make batch / make docs)
meetus/ ✅ core package
├─ workflow.py orchestrator (whisper → frames → merge)
├─ frame_extractor.py FFmpeg scene-detection / interval frames
├─ transcript_merger.py interleave transcript + frame refs → enhanced.txt
├─ output_manager.py run-folder naming + manifest.json
├─ cache_manager.py per-step caching (skip done work on rerun)
└─ deprecated/ 🗄️ old screen-text idea (OCR/vision/hybrid) — unwired, reference only
├─ ocr_processor.py (was --ocr-engine)
├─ vision_processor.py (was --use-vision)
├─ hybrid_processor.py (was --use-hybrid)
└─ prompts/ vision context prompts
doocus/ ✅ document-extraction package (see doocus/README.md)
├─ tree.py build_index — walk drive tree → index.json (+ extract sidecars)
├─ registry.py extension → extractor family dispatch (lazy, graceful)
├─ workflow.py single-file DocWorkflow (process_doc.py)
├─ output_manager.py single-file run-folder + content.md/meta.json writer
├─ naming.py YYYYMMDD-NNN naming + sha256 (reuses meetus convention)
└─ extractors/ text, tabular(csv), office(docx/pptx/xlsx), pdf, web(html), image, media(mp4)
ctrl/ control plane / operational scripts
├─ batch.sh ✅ recursive batch runner (mirrors tree, continues past failures)
├─ transcribe_oneoff.sh 🧰 high-quality re-transcription over an existing run
├─ summarize/ 🚧 last step — local-LLM summarization (WIP, on hold)
│ ├─ summarize_simple.py minimal map-and-append; reads every referenced frame
│ ├─ compile_meeting.py REFINE-pattern technical reference; on-demand frames
│ └─ summarize_meeting.py map→extract(validated facts)→reduce
└─ cht/ 🧰 bridge to the separate realtime `cht` project
└─ interleave_cht_frames.py whisperx JSON + cht frames/index.json → enhanced.txt
ui/ local browser UIs (Vue 3 + Vite), shared framework
├─ framework/ ✅ shared component/renderer library + design tokens
├─ meetus-app/ ✅ review meeting runs (video · transcript · frames; @review source)
└─ doocus-app/ ✅ browse tree · search · package; embeds the meetus review
doocus-data/ meetus-data/ ✅ managed collection roots (gitignored): <root>/<source>/
docs/graphs/ 📄 architecture diagram (.dot → .svg, `make graphs`)
def/ 📄 design/decision notes, in order (the feature history)
README.md 📄 project overview (meetus + doocus) + architecture diagram
INDEX.md 📄 this file
MARIAN.md 📄 genesis brainstorm (explains why the deprecated OCR path exists)
local-run.sh 📄 personal scratch invocations (gitignored)
Collections & UIs
- Managed roots (gitignored):
doocus-data/<source>/(docs) andmeetus-data/<source>/(meetings), each<root>/<source>/mirroring the source.process_tree.py --only {all|docs|meetings}scopes a collection. - doocus-app discovers both roots (
DOOCUS_DATAoverrides, comma-separated), merges collections that shareindex.json.rootinto one source, searches the cached text, and can scan a folder (runsprocess_treeviauv) from the UI. - meetus-app is a thin shell over
@review(ui/meetus-app/src/components/ReviewBody.vue), the review composition doocus embeds — meetus stays the single source. - Diagram:
docs/graphs/architecture.dot→docs/graphs/architecture.svg(make graphs; needs system graphviz). Both committed.
Notes
- Default flow uses
--embed-images(frames referenced for the LLM to read) +--scene-detection --scene-threshold 10 --diarize.make batchadds--transcript-formats srtand writes outputs next to the sources. SeeREADME.md. meetus/deprecated/is no longer imported or reachable from the CLI (its flags were removed andworkflow.pyno longer imports it). Kept for reference only; the realtime continuation of the idea is the separatechtproject. Its only unique dependency (ollama) is isolated to thedeprecateduv group inpyproject.toml, so a normaluv sync --group meetus/--group doocusnever installs it.- Dependencies are uv feature groups in
pyproject.toml(norequirements.txt):meetus,doocus,ocr,pdf-render,deprecated. whisper/whisperx are external CLIs (like ffmpeg), installed separately — not uv-managed. ctrl/summarize/scripts are standalone; run them under an env with theopenaiclient (e.g.~/wdir/llm/.venv) against a local OpenAI-compatible server.
Loose ends
README.md's "Output Files" example still shows the old run-folder formatYYYYMMDD_HHMMSS-video(actual:YYYYMMDD-NNN-<stem>). Minor; worth a tidy.