Local-first personal knowledge system: highlight what you read, keep notes, chat over your own pages, graph how they connect.
Chrome extension + local dashboard + optional macOS app, one Python backend on localhost:8765. Data stays in ~/.kb/. RAG via Ollama, or OpenAI if you set a key.
Inspired by Karpathy’s knowledge-base post.
Chrome extension ─┐
dashboard /app/ ─┼──► python3 main.py :8765 ──► ~/.kb/
Context.app ─┘
Highlight → notes in the side panel → Copy JSON onto your site if you want. Chat and graph sit next to that. Life/Wiki are archived from nav. Default LLM is Ollama; set OPENAI_API_KEY to use OpenAI.
| Side panel | Chat |
|---|---|
![]() |
![]() |
| Overview | Graph |
|---|---|
![]() |
![]() |
| Home | Chat |
|---|---|
![]() |
![]() |
macOS, Python 3.11+, Chrome. Ollama or an OpenAI key.
cp .env.example .env # fill what you use; file is gitignored
python3 -m pip install -r requirements.txt
python3 -m spacy download en_core_web_sm
python3 main.py # curl http://127.0.0.1:8765/health- Ollama: leave
OPENAI_API_KEYempty;ollama pull qwen2.5:3bandnomic-embed-text. - OpenAI: set the key;
KB_LLM_PROVIDER=autopicks it up.
node scripts/install-launcher.mjs # starts backend when the extension opensChrome → chrome://extensions → Load unpacked → chrome-extension/.
bash scripts/install_app.sh && open -a Context # optional macOS appVars: .env.example. Walkthrough: getting-started.
pytest tests/Two tests talk to a live LLM — they fail if that service isn’t up, the rest of the suite doesn’t:
test_gmail_sync_ingests_threads— ingest still classifies via Ollama (or OpenAI if a key is in.env)tests/test_llm_providers.py— OpenAI provider path needsOPENAI_API_KEY(tests stub a dummy key; a real call needs network)
docs/ · architecture · status · API
MIT © 2026 Ramya Iyer





