Skip to main content

markseek MIT License Python 3.9+

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

  1. Configure your vault:
markseek --configure

Or point it directly via environment variable:

export MARKSEEK_VAULT_PATH="~/Documents/Obsidian Vault"
  1. Search:
markseek "what does Frankl say about meaning and suffering" -n 5
  1. 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

  1. Markdown files in your vault are chunked by paragraphs (~500 chars).
  2. Local embeddings -- all-MiniLM-L6-v2 (~80MB, CPU, no GPU needed) converts each chunk to a vector.
  3. ChromaDB stores the vectors locally for fast similarity search.
  4. Auto-indexing -- a file watcher detects changes and re-indexes only the changed file.
  5. 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 path
  • MARKSEEK_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)

Source distribution for markseek 0.1.1
File Size Uploaded Provenance
markseek-0.1.1.tar.gz 13.9 kB Without provenance Details

Built distribution (wheel)

Table of built distributions (wheels) for markseek 0.1.1
File Interpreter ABI Platform
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.

Release history Release notifications | RSS feed

This release

0.1.1 This release

2 release files No provenance

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page