Semantic search CLI for markdown vaults
Project description
memex-md
You like Obsidian? Your LLM will love it too.
Memex: Vannevar Bush's 1945 concept of a "memory extender" - a device for storing and retrieving personal knowledge. The conceptual ancestor of personal wikis and second brains.
Semantic search and wikilink graph traversal for markdown vaults. Uses any sentence-transformers model. Point it at your Obsidian vault (or any markdown folder).
Quick Start
uvx memex-md --help
or
uv tool install memex-md
If installed, you can run memex directly, or via the alias mx:
mx vault:add personal ~/notes ~/journal
mx search "How does the auth flow handle token refresh?" -v personal
mx explore auth personal
For a memex skill, see my agent workflows.
How It Works
A vault is a named collection of directories. Each vault has its own embedding model and SQLite index (~/.local/share/memex-md/<vault-name>/index.db).
The index contains:
- Embeddings for semantic similarity (default: embeddinggemma-300m)
- Wikilink graph for backlink/outlink queries
- Extracted frontmatter (aliases, tags)
Indexing is incremental — on each command, only files with changed mtimes are re-indexed. Hidden directories (.obsidian, .trash, .git, etc.) are excluded.
Note: Initial indexing requires embedding computation. Example: ~3800 notes took ~7 minutes on an RTX 3070 Ti.
Configuration
Vaults are configured via CLI. Config lives at ~/.config/memex/config.toml.
mx vault:add personal ~/notes ~/journal
mx vault:add work ~/work-docs --model some/other-model
mx vault:list
mx vault:info personal
mx vault:remove personal --path ~/journal # remove one path
mx vault:remove work # remove entire vault
Re-add a vault with --model to change its embedding model (triggers re-embedding). Use --model none to disable semantic search (wikilink navigation only).
Commands
search
mx search "How does the auth flow handle token refresh?" -v personal
mx search "What approaches did we consider for caching?" -v work --full
Embeds the query and ranks indexed notes by cosine distance. Natural language questions of a few sentences tend to work well.
| Flag | Description |
|---|---|
-v, --vault |
Search a specific vault (default: all) |
-n, --limit |
Max results (default: 5) |
-p, --page |
Pagination (default: 1) |
-f, --full |
Include note content (default: paths only) |
explore
mx explore auth personal
mx explore docs/api-design work --full
Shows a note's outlinks ([[wikilinks]]), backlinks, and semantically similar notes.
note_path can be a title (auth) or path (docs/auth.md). Titles must be unique in the vault.
| Flag | Description |
|---|---|
-f, --full |
Include note content and metadata (default: graph only) |
rename
mx rename old-name new-name personal
mx rename docs/guide manual work
Renames a note file and updates all [[wikilinks]] pointing to it. Handles path links, title links, aliases, and heading refs. Ambiguous links (multiple files share a name) are skipped with warning.
index
mx index
mx index -v personal
Trigger indexing. Runs automatically before search/explore.
Development
uv sync
make check # ruff + ty
make test # pytest
make release-patch # 1.0.0 -> 1.0.1, tag, push
make release-minor # 1.0.0 -> 1.1.0
make release-major # 1.0.0 -> 2.0.0
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file memex_md-2.1.0.tar.gz.
File metadata
- Download URL: memex_md-2.1.0.tar.gz
- Upload date:
- Size: 19.2 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: uv/0.10.10 {"installer":{"name":"uv","version":"0.10.10","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"26.04","id":"resolute","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":null}
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
c6316896d8d84dfdfa60013e91b382a5e993c9f12c11e0f294fe98029baccf2f
|
|
| MD5 |
895cf4b23b90d7ad683d4f295f4e2b0f
|
|
| BLAKE2b-256 |
ba47837c43b052f1c5b3e1bf316b7ade1314c82623ffc1c16443c169ef4f976b
|
File details
Details for the file memex_md-2.1.0-py3-none-any.whl.
File metadata
- Download URL: memex_md-2.1.0-py3-none-any.whl
- Upload date:
- Size: 22.8 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: uv/0.10.10 {"installer":{"name":"uv","version":"0.10.10","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"26.04","id":"resolute","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":null}
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
a20885864ccc0580c9aa87e629d1e6913b6ee19e72d2ed94f7ff93e18db5d46a
|
|
| MD5 |
f301e7576ac2a0375583cc6974cae060
|
|
| BLAKE2b-256 |
653e314fdd85f7026c974a9208bdda5e850fed88da2f4ca74b0c9378c7984931
|