Lightweight desktop app to index and query your meeting notes using a local LLM + vector store. It parses meeting notes (Markdown), chunks them, stores embeddings in a vector database (Postgres + pgvector), and provides a small Kivy UI for asking questions and running incremental indexing.
- Parse meeting notes from a directory (configurable).
- Chunk text, extract metadata (title, date, attendees, action items).
- Store embeddings in Postgres via pgvector.
- Use a local or remote LLM (Ollama or other) through LangChain for Q&A chains.
- Simple Kivy-based UI for ad-hoc queries and indexing operations.
- Code: this repo
- Config:
settings.json - Env helpers:
env_setup.sh,README_ENV.md - Pre-download helper:
download_hf_model.py - Sample meeting note:
meeting_2025-09-17_Sample_Meeting_Title.md
- Python 3.11+
- See
requirements.txtfor the Python dependencies (LangChain, Kivy, sentence-transformers, SQLAlchemy, psycopg2-binary, etc.).
- Create and activate a virtualenv:
python3.11 -m venv .venv
source .venv/bin/activate- Install dependencies:
pip install --upgrade pip
pip install -r requirements.txt- Configure environment variables. You can use the provided
env_setup.shto load values from a.envfile:
cp env_setup.sh .env # edit .env and set vars like PG_CONN, OLLAMA_HOST, HF_MODEL_DIR
source env_setup.sh- (Optional) Pre-download the Hugging Face embeddings model to avoid repeated downloads:
python download_hf_model.py --model sentence-transformers/all-MiniLM-L6-v2 --out ~/.cache/hf/all-MiniLM-L6-v2
export HF_MODEL_DIR=$HOME/.cache/hf/all-MiniLM-L6-v2- Run the app:
python main.pysettings.jsoncontains the default path for your meeting notes directory. Current value:
meeting_notes_dir: "/mnt/c/Users/vswam/Obsidian/Work/Diary/"
Override configuration using environment variables (preferred):
PG_CONN— Postgres connection string (required for pgvector storage)OLLAMA_HOST— URL for Ollama if using a local LLMMODEL_NAME— model name for Ollama/LLMHF_MODEL_DIR— local path to a pre-downloaded HF embeddings model
Check README_ENV.md for more detailed steps on environment setup and troubleshooting.
- The codebase uses lazy initialization for heavy runtime resources (embeddings, LLM, vector store) to avoid import-time failures.
note_parser.pycontains the parsing logic for meeting notes — it extracts title, date, attendees, bullets, and action items.indexer.pyperforms incremental indexing and writes to the vector store.rag_pipeline.pywires embeddings, vector store, and the chain used by the UI.
- If imports fail at runtime, make sure you installed the dependencies in an activated virtual environment.
- If the app can't reach the vector store, verify
PG_CONNand that the Postgres server has thepgvectorextension installed. - To check DB connectivity, use the included
check_pg_conn.pyscript. - If embeddings appear to re-download each run, set
HF_MODEL_DIRto a local copy of the model (seedownload_hf_model.py).
- See
LICENSE.
- Venkat Swaminathan (c) 2025