A community-driven registry for Claude, Cursor, Windsurf, Cline & more. Not affiliated with Anthropic.
Are you the author? Sign in to claim
A service that monitors an Obsidian vault for file changes (new, modified, or deleted Markdown files) and indexes each n
This service monitors an Obsidian vault directory and indexes Markdown files—metadata and full content—into an SQLite database. I built it to work with my mcp-server project, but switched to an implementation that uses the Obsidian plugin API instead. I still see use for this as an agnostic note indexer or sync tool (see note under "Future Steps"), so I'm putting it up here.
It tracks file changes (create, modify, delete) in an Obsidian vault and stores everything in SQLite, accessible via a Docker volume. It captures:
uv (optional, but recommended)Clone the repo:
git clone https://github.com/pmmvr/obsidian-index-service.git
cd obsidian-index-service
Set up a virtual environment:
With uv (recommended):
uv venv
source .venv/bin/activate # Linux/macOS
.venv\Scripts\activate # Windows
With python (standard):
python -m venv .venv
source .venv/bin/activate # Linux/macOS
.venv\Scripts\activate # Windows
Install dependencies:
uv (recommended):
uv sync # Installs from uv.lock
uv pip install pytest pytest-bdd pytest-mock # For tests
pip:
pip install -e .
pip install pytest pytest-bdd pytest-mock # For tests
Set environment variables:
export OBSIDIAN_VAULT_PATH=/path/to/vault
export DB_PATH=/path/to/notes.sqlite
Run it:
python main.py
With uv:
uv run python main.py
For a one-time scan:
python main.py --scan-only
Or with uv:
uv run python main.py --scan-only
--vault-path: Path to vault directory--db-path: Path to SQLite database--scan-only: Scan without watchingdocker-compose up -d
To let another service read the database (e.g., for scanning changes):
obsidian-index-service in your docker-compose.yml:
services:
your-service:
image: your-image
volumes:
- ${DB_VOLUME_PATH:-./data}:/data:ro # Read-only mount
Obsidian Index Service writes to /data/notes.sqlite (mounted read-write), while other services (e.g. an mcp-server) read it. SQLite's WAL mode handles concurrent access.The Obsidian Index Service operates through the following process:
Startup (ObsidianIndexService.__init__)
DatabaseConnection)NoteProcessor)Database Initialization (DatabaseConnection.__init__)
Initial Vault Scan (NoteProcessor.scan_vault)
NoteOperations.insert_note)Continuous Monitoring (FileWatcher.watch)
File Processing (NoteProcessor.process_note)
NoteOperations.upsert_note)Graceful Shutdown (ObsidianIndexService.shutdown)
The service operates in the background, continuously keeping the SQLite database in sync with the Obsidian vault. Other applications can then use this database to access note metadata without having to parse Markdown files directly.
Run tests:
pytest
With some rework I can see this as a sync tool:
sync_status and remote_id columns.--sync to trigger it manually or continuously.Run Claude Code as an MCP server so any agent can delegate coding tasks to it
Browser automation using accessibility snapshots instead of screenshots
MCP server integration for DaVinci Resolve Studio
A Jetbrains IDE IntelliJ plugin aimed to provide coding agents the ability to leverage intelliJ's indexing of the codeba