by IvenKooLab
A queryable second brain over your scattered notes and docs - hybrid retrieval (vector + BM25), section-level citations, and an MCP server so AI agents can use it. ~300 lines, no LangChain.
# Add to your Claude Code skills
git clone https://github.com/IvenKooLab/lociSee how loci compares with popular alternatives.
loci is an open-source ai agents skill for AI coding assistants such as Claude Code, Codex CLI, and ChatGPT, built by IvenKooLab. A queryable second brain over your scattered notes and docs - hybrid retrieval (vector + BM25), section-level citations, and an MCP server so AI agents can use it. ~300 lines, no LangChain. It has 55 GitHub stars.
loci's catalog security scan is still queued. You can run an instant dependency and prompt-injection check now with the "Scan for vulnerabilities" button above.
Clone the repository with "git clone https://github.com/IvenKooLab/loci" and add it to your Claude Code skills directory (see the Installation section above).
loci is primarily written in Python. It is open-source under IvenKooLab on GitHub, so you can review or fork the full source.
Yes. SkillsLLM lists many other AI Agents skills you can browse and compare side by side. Open the AI Agents category from the badge at the top of this page, or use the Related Skills and comparison links further down to weigh loci against similar tools.
No comments yet. Be the first to share your thoughts!
Unlocks once the catalog security scan passes (runs nightly).
โ ๏ธ Third-Party Software Notice
This skill is third-party open-source software developed and hosted independently on GitHub. SkillsLLM is an informational directory and does not control or maintain the underlying repository.
Any security checks, ratings, or warnings displayed by SkillsLLM are automated and limited in scope. They do not constitute a security certification or guarantee that the software is safe, error-free, or free from malicious code, vulnerabilities, compromised dependencies, or prompt-injection risks.
Review the source code, permissions, dependencies, and configuration before installing or running any third-party skill. Use is at your own risk. To the maximum extent permitted by applicable law, SkillsLLM is not liable for losses arising from third-party software.
The deep catalog scan for this skill is still queued. Run an instant dependency check now instead.
Two thousand years ago, orators stored their speeches in the rooms of a palace and walked through them to remember. loci does the same for your files.
Loci is the method behind every memory palace: place knowledge in locations, recall it by walking the path.
A queryable "second brain" for the project docs, notes, and chat logs scattered across a dozen directories โ and an MCP server so your AI agents can use it too.
Local files โ heading-aware chunking โ embeddings โ hybrid retrieval (vector + BM25) โ LLM answer with section-level citations. The index lives entirely on your machine; only embedding/chat calls go out, to any OpenAI-compatible API (Zhipu / DeepSeek / Kimi / OpenAI / โฆ).
The thesis (from studying the 90k-star platforms and the graveyard of dead lightweight tools โ see our competitive landscape study): don't build another chat app. Build the memory layer that every chat app can mount. Claude Desktop, Cursor, Cline, or any MCP host becomes this project's UI, for free.
Real session, indexed against the docs of minimax-h3-turing (paths shortened for display):
$ python main.py search "what the 22G card can and cannot do" -k 3
[1] minimax-h3-turing/docs/en/01-hardware-limits.md > 01 ยท What a 2080Ti 22G Can and Cannot Do (similarity 0.562)
[2] minimax-h3-turing/docs/en/02-w4a8-vs-w4a4.md > 02 ยท Quantization Measured > You Can Try Without 22G (similarity 0.446)
[3] minimax-h3-turing/docs/en/01-hardware-limits.md > ... > 3. VRAM is just barely enough โ manage it (similarity 0.504)
$ python main.py ask "How should I choose between T8 aggressive mode and the final-render mode, and why?"
Answer:
* Drafts / preview / shot selection: use T8 aggressive mode โ a 43% speedup
(2.7 min/clip), and "a different picture of equal quality" is fine for picking shots.
* Final shots: use final-render mode (no T8). T8 makes the numerical trajectory
fork, so re-running with the same seed produces a different clip โ which breaks
the reproducibility final outputs need.
[source: docs/en/08-t8-blockcache-4step.md > Practical Advice (4-step Turbo route)]
[source: docs/en/06-faq.md > 12. Cache-style accelerators break "same-seed re-runs"]
Hybrid retrieval means a Chinese query still finds the English doc (and vice
versa) โ keyword evidence (BM25) catches what embeddings miss, and every
citation points at a section, not just a file.
$ python scripts/eval_retrieval.py scripts/eval_cases.example.jsonl
vector-only: 9/10 โ hybrid: 10/10
Hybrid also fixed the #1 ranking on keyword-ish queries (e.g. "T8 block cache threshold speedup": vector put an FAQ first, hybrid puts the actual T8 writeup first). Run it against your own corpus with your own cases file.
--rerank reorders the fused candidates for precision:
| Provider | How | Cost |
|---|---|---|
llm (default) |
pointwise 0โ3 relevance scoring by your chat model | one extra LLM call |
local |
cross-encoder, via pip install 'loci[rerank]' |
~30โ70 ms for 5 pairs on GPU โ offline, free |
python main.py search "T8 speedup" --rerank # provider from config
python main.py search "T8 speedup" --rerank local # cross-encoder (BAAI/bge-reranker-base)
The local model downloads on first use (~1.1 GB; set HF_ENDPOINT=https://hf-mirror.com
if HuggingFace is slow in your region). Measured on a 2080 Ti, bilingual query.
[pdf] extra, PyMuPDF4LLM extracts pages as markdown โ
tables come through as pipe rows (plain pypdf text is the fallback)[docx] extra, .docx paragraphs and table rows are indexedconversations.json into any
source directory โ it becomes one searchable document per conversation,
tagged chatlog (search --tag chatlog scopes to chat history)It doesn't compete โ the two layer up. Obsidian (or any editor) is the
note-taking frontend; this is the cross-vault search engine: point
sources at any directories (Obsidian vaults, project docs, chat exports)
and query all of them at once โ from your terminal, your scripts, or your AI
agent via MCP. Obsidian-native details are understood: frontmatter tags:
(filter with search --tag), [[wikilinks]] (walk the graph with links),
code blocks are never cut mid-block, and one-line notes stay searchable.
%%{init: {'theme':'base','themeVariables':{'background':'#000000','primaryColor':'#000000','primaryTextColor':'#00FF41','primaryBorderColor':'#00FF41','lineColor':'#00FF41','secondaryColor':'#001a00','tertiaryColor':'#000000','clusterBkg':'#000000','clusterBorder':'#00FF41','edgeLabelBackground':'#000000','fontSize':'14px','fontFamily':'trebuchet ms, verdana, arial, sans-serif'},'themeCSS':'.nodeLabel { color: #00FF41 !important; } .edgeLabel { background: #000 !important; color: #00FF41 !important; } .cluster-label { color: #00FF41 !important; }'}}%%
flowchart LR
subgraph sources["๐ฅ Your machine"]
notes["Obsidian / markdown notes"]
docs["PDF tables ยท docx ยท project docs"]
chats["ChatGPT / Claude exports"]
mem["memories/ โ agent-written notes"]
wikidir["wiki/ โ consolidated pages"]
end
subgraph loci["๐ง loci โ local index, nothing leaves the machine"]
ingest["ingest / watch<br>loaders โ chunker โ embedder"]
store[("ChromaDB<br>hybrid index")]
retrieve["hybrid retrieval<br>vector + BM25 โ RRF"]
mcp["loci-mcp<br>8 tools ยท resources ยท prompts"]
end
subgraph hosts["๐ฅ๏ธ Your AI hosts"]
ide["Claude Code ยท Qoder ยท Trae<br>Cursor ยท Cline"]
desktop["Claude Desktop"]
term["Terminal<br>search / ask / chat / wiki"]
end
api["โ๏ธ OpenAI-compatible API<br>Zhipu / DeepSeek / Kimi / OpenAI<br>or 100% offline via Ollama"]
sources --> ingest --> store
mem -. auto-indexed .-> store
wikidir -. auto-indexed .-> store
store --> retrieve
retrieve --> term
retrieve --> mcp
mcp <--> ide
mcp <-.-> desktop
retrieve -. "embedding + chat calls only" .-> api
The write path in one line: loaders โ chunker (heading-aware split) โ embedder โ store (ChromaDB, persistent) โ incremental, deduplicated by content hash.
Requires Python 3.11+ (uses the stdlib tomllib).
# option A: install as a package (adds `loci` and `loci-mcp` commands)
pip install -e ".[pdf,docx]" # optional extras: PDF w/ tables, Word documents
# option B: zero-install quickstart
pip install -r requirements.txt
# 1. Configure: copy the example and fill in your values
cp config.example.toml config.toml
# 2. Ingest (incremental โ deduplicated by content hash, safe to re-run)
loci ingest # or: python main.py ingest
# 3. Ask
loci ask "what did I write about X?"
%%{init: {'theme':'base','themeVariables':{'background':'#000000','primaryColor':'#000000','primaryTextColor':'#00FF41','primaryBorderColor':'#00FF41','lineColor':'#00FF41','secondaryColor':'#001a00','tertiaryColor':'#000000','clusterBkg':'#000000','clusterBorder':'#00FF41','edgeLabelBackground':'#000000','fontSize':'14px','fontFamily':'trebuchet ms, verdana, arial, sans-serif'},'themeCSS':'.nodeLabel { color: #00FF41 !important; } .edgeLabel { background: #000 !important; color: #00FF41 !important; } .cluster-label { color: #00FF41 !important; }'}}%%
flowchart TD
A["pip install loci-rag"] --> B["cp config.example.toml config.toml<br>fill API keys + source dirs"]
B --> C["loci ingest โ hybrid index built"]
C --> D["loci watch โ index stays fresh (optional)"]
C --> E{"What do you need?"}
E -->|"a synthesized answer"| F["loci ask --verify<br>claim-by-claim audit"]
E -->|"raw excerpts to quote"| G["loci search --tag memory"]
E -->|"back-and-forth"| H["loci chat"]
E -->|"scattered notes on a topic"| I["loci wiki topic<br>consolidate into a wiki page"]
F --> J["loci remember โ<br>keep what you learned"]
I --> J
| Command | What it does |
|---|---|
ingest |
scan sources, index new/changed files, prune deleted ones (--force re-embeds everything) |
search "query" |
retrieval only โ ranked excerpts with path > section breadcrumbs |
ask "question" |
retrieval + LLM answer with [source: path > section] citations |
ask "โฆ" --verify |
additionally audit the answer claim-by-claim against the sources (โ supported, ~ partial, โ unsupported) |
Filter operators (combine freely, on search and ask):
| Flag | Filters to |
|---|---|
--tag foo |
files whose frontmatter tags contain foo |
--in docs/en |
files whose path contains the substring |
--since 2026-08 / `-- |