Skip to main content

Semantic search over your markdown vault -- lightweight, local, zero-config

Project description

markseek MIT License Python 3.9+

markseek

Semantic search over your markdown vault. 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
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.

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

markseek-0.1.0.tar.gz (13.3 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

markseek-0.1.0-py3-none-any.whl (13.2 kB view details)

Uploaded Python 3

File details

Details for the file markseek-0.1.0.tar.gz.

File metadata

  • Download URL: markseek-0.1.0.tar.gz
  • Upload date:
  • Size: 13.3 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.12.3

File hashes

Hashes for markseek-0.1.0.tar.gz
Algorithm Hash digest
SHA256 d0cb50076cc642dfbd1214e258ece4bf3f84c60ac3d87147fce012ef84d1c5a5
MD5 b03b945b3cca68129ff73f0d63475022
BLAKE2b-256 38330b6346e4f212568cd0a7455f0df45ad438d82d7a2fe3dde2c76bd4b97f6b

See more details on using hashes here.

File details

Details for the file markseek-0.1.0-py3-none-any.whl.

File metadata

  • Download URL: markseek-0.1.0-py3-none-any.whl
  • Upload date:
  • Size: 13.2 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.12.3

File hashes

Hashes for markseek-0.1.0-py3-none-any.whl
Algorithm Hash digest
SHA256 8608133164f6a8d89e636841066df04c118a506c265a8684947d31467e1b9c27
MD5 d2af89ed2a6b72b097b18289dac95b51
BLAKE2b-256 0b9aac6e7f72794c2cb4ea5533bb7fef5f7b2fe9bce6b72794e64bf393529403

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page