markseek
Semantic search over your markdown vault. Built on Obsidian. Lightweight, local, zero-config.
Query by meaning, not keywords. Works offline. No API keys.
Why
You want semantic search over your Obsidian vault, your notes, or any folder of markdown files. Everything else that does this is either a heavy web app (PrivateGPT, AnythingLLM — full Docker containers, web UIs, hundreds of MB of RAM) or only works while the desktop app is open.
markseek is one package, no web server, no Docker, no cloud:
$ markseek "what did Frankl say about the bird"
Search results for: "what did Frankl say about the bird"
─── Result 1 (relevance: 0.91) ───
File: letters/Pen Pal.md
Snippet:
And then a bird lands on the dirt he just dug up and looks at him.
That's it. That's the whole philosophy. A man who has lost literally
everything and a bird lands and looks at him and the world is still,
for one second, looking back.
Install
pip install markseek
Quick Start
- Configure your vault:
markseek --configure
Or point it directly via environment variable:
export MARKSEEK_VAULT_PATH="~/Documents/Obsidian Vault"
- Search:
markseek "what does Frankl say about meaning and suffering" -n 5
- Watch for changes (background index):
markseek --watch
Run this in a terminal, or as a systemd/launchd service. Whenever you
modify a .md file in the vault, it gets re-indexed automatically
within 2 seconds.
Commands
| Command | Description |
|---|---|
markseek "your query" |
Semantic search (auto-indexes on first run) |
markseek -n 10 "query" |
Top 10 results |
markseek --watch |
Start auto-indexing watcher (background) |
markseek --index |
Manually update the index |
markseek --index --rebuild |
Force full reindex |
markseek --status |
Show index stats (files, chunks, model) |
markseek --configure |
Interactive config wizard |
How It Works
- Markdown files in your vault are chunked by paragraphs (~500 chars).
- Local embeddings --
all-MiniLM-L6-v2(~80MB, CPU, no GPU needed) converts each chunk to a vector. - ChromaDB stores the vectors locally for fast similarity search.
- Auto-indexing -- a file watcher detects changes and re-indexes only the changed file.
- Semantic queries -- your question gets embedded and matched against all chunks, ranked by cosine similarity.
No files are uploaded anywhere. Everything runs on your machine.
Configuration
Config file: ~/.config/markseek/config.yaml
vault_path: ~/Documents/Obsidian Vault
index_path: ~/.cache/markseek/index
model_name: all-MiniLM-L6-v2
max_chunk_size: 500
debounce_seconds: 2.0
log_level: INFO
extensions: [".md"]
Environment variables take priority:
MARKSEEK_VAULT_PATH-- override vault pathMARKSEEK_INDEX_PATH-- override index location
As a Library
from markseek.config import Config
from markseek.core import Index
cfg = Config.load()
index = Index(cfg)
results = index.search("meaning through encountering someone")
License
MIT. See LICENSE.
Metadata
Release files for markseek 0.1.1
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | Provenance | |
|---|---|---|---|---|
| markseek-0.1.1.tar.gz | 13.9 kB | Without provenance | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| markseek-0.1.1-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 27.8 kB
Release files / markseek-0.1.1.tar.gz
| Download URL | markseek-0.1.1.tar.gz |
|---|---|
| Size | 13.9 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
74649615468195ab9f8dc4627d49e5309b0a54e6a034ae53e8a1988048e35896
|
|
BLAKE2b-256 checksum How to use checksums |
b9932a7454e75de1da2766ddc28369239004fc03ce4fff5b41c51226233be818
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/6.2.0 CPython/3.12.3
|
Release files / markseek-0.1.1-py3-none-any.whl
| Download URL | markseek-0.1.1-py3-none-any.whl |
|---|---|
| Size | 13.9 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
ff928ab740461a6ff1e376a903964047331ef7e456b942e5df5af63a9037b1c7
|
|
BLAKE2b-256 checksum How to use checksums |
3b5e18a2be460465cf9646dc9ee1ba4bb6e6dca3e82776fbac555c70b8e29ef4
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/6.2.0 CPython/3.12.3
|
Security for markseek 0.1.1
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
No provenance found
None of the files in this release were uploaded with provenance metadata.
A note on package security
PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.
To learn more about protecting yourself from malicious actors, visit our package security documentation.