embedsync
Incremental synchronization between source documents and vector indexes — detect changes, re-embed only deltas, and delete stale chunks.
Status: v0.9 — local + sitemap + Notion sources, hash/Ollama/OpenAI embedders, JSONL + pgvector + Qdrant.
60-second try
pip install embedsync
embedsync plan examples/docs --state-db /tmp/embedsync-demo.db
# or with Docker:
docker compose run --rm plan
Why this vs alternatives
| Approach | Strength | Gap |
|---|---|---|
| embedsync | Content-hash deltas + pluggable embedders | Destinations: memory, JSONL, pgvector, Qdrant |
| Full re-embed pipelines | Simple mentally | Expensive; misses deletes |
| Framework ingestion (e.g. LlamaIndex) | Rich connectors | Change detection is DIY |
| One-off sync scripts | Fits one repo | No shared plan/state model |
Problem
RAG indexes rot when documents change. Full re-embeds are expensive and miss deletes. Every team rebuilds change detection from scratch.
Key features (v0.9)
- Local markdown directory,
sitemap:URL, ornotion:/notion:querysources - Content-hash change detection per document
- Sync plan: add / update / delete actions
--full-reindexto force re-embed of all current docs- Hash / Ollama / OpenAI embedders
- JSONL, memory, pgvector, or Qdrant destination
- Unchanged docs/chunks skip re-embedding on the next run
Architecture
embedsync run ./docs
embedsync run 'sitemap:https://example.com/sitemap.xml'
embedsync run 'notion:' # or notion:handbook
├── LocalFileSource | SitemapSource | NotionSource
├── StateStore (SQLite)
├── plan_sync() → diff
└── Destination (Memory / JSONL / pgvector / Qdrant)
Installation
pip install embedsync
pip install 'embedsync[pg]' # optional: pgvector destination
pip install 'embedsync[qdrant]' # optional: Qdrant destination
pip install -e ".[dev]"
Usage
embedsync health
embedsync plan examples/docs --state-db /tmp/embedsync-demo.db
embedsync run examples/docs --dry-run --state-db /tmp/embedsync-demo.db
embedsync run examples/docs --embedder hash --destination memory --state-db /tmp/embedsync-demo.db
embedsync run examples/docs --full-reindex --embedder hash --destination jsonl:/tmp/index.jsonl
embedsync run examples/docs --embedder hash --destination jsonl:/tmp/index.jsonl
# Requires Postgres with pgvector + pip install 'embedsync[pg]':
embedsync run examples/docs --embedder hash --destination pgvector:postgresql://user:pass@localhost/db
# Requires Qdrant + pip install 'embedsync[qdrant]':
embedsync run examples/docs --embedder hash --destination qdrant:http://localhost:6333/embedsync
embedsync run examples/docs --embedder hash --destination 'qdrant:http://localhost:6333#embedsync'
# Requires a running Ollama with an embedding model:
embedsync run examples/docs --embedder ollama --destination jsonl:/tmp/index.jsonl
embedsync run examples/docs --embedder ollama:nomic-embed-text --destination memory
# Requires OPENAI_API_KEY:
embedsync run examples/docs --embedder openai --destination jsonl:/tmp/index.jsonl
embedsync run examples/docs --embedder openai:text-embedding-3-small --destination memory
# Sitemap (urlset only; --max-pages caps crawl):
embedsync plan 'sitemap:https://example.com/sitemap.xml' --max-pages 20
embedsync run 'sitemap:https://example.com/sitemap.xml' --embedder hash --destination memory
# Notion (integration token; share pages with the integration):
export NOTION_API_KEY=secret_...
embedsync plan 'notion:' --max-pages 20
embedsync run 'notion:handbook' --embedder hash --destination memory
Docker
docker compose run --rm test
docker compose run --rm plan
Configuration
| Variable | Default | Description |
|---|---|---|
EMBEDSYNC_STATE_DB |
.embedsync/state.db |
State database path |
EMBEDSYNC_LOG_LEVEL |
INFO |
Log level |
NOTION_API_KEY |
— | Required for notion: sources |
OPENAI_API_KEY |
— | Required for --embedder openai |
OLLAMA_HOST |
http://127.0.0.1:11434 |
Ollama base URL |
QDRANT_API_KEY |
— | Optional API key for Qdrant Cloud |
Roadmap
- Pluggable embedder protocol + hash backend
- JSONL destination (local stand-in)
- Chunk-level stable IDs across edits
- Ollama embedder (
--embedder ollama) - OpenAI embedder (
--embedder openai) - pgvector destination
- Qdrant destination
- Sitemap source (
sitemap:URL) - Notion source (
notion:/notion:query)
License
MIT
Known limitations (v0.9)
- Hash embeddings are not semantic — use
--embedder ollamaor--embedder openaifor semantic vectors - JSONL is not a vector DB; use
--destination pgvector:...orqdrant:...for real stores - Sitemap: urlset only (no sitemap-index recursion); failed page fetches are skipped
- Notion: Search API pages only (no database queries); shallow block recursion; needs pages shared with the integration
- Re-runs reuse
.embedsync/state.db; pass--state-dbfor an isolated plan - Ollama must already be running and have the embedding model pulled
- OpenAI needs
OPENAI_API_KEY - pgvector destination needs
pip install 'embedsync[pg]'and thevectorextension - Qdrant destination needs
pip install 'embedsync[qdrant]'
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 embedsync-0.9.0.tar.gz.
File metadata
- Download URL: embedsync-0.9.0.tar.gz
- Upload date:
- Size: 102.9 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via:
twine/7.0.0 CPython/3.12.14
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
ffb0ff9423ea3fa9cb1955561754203501b171d0d8c6b32ce415c1d55938b61a
|
|
| MD5 |
355778cdf1f0e8524c5af481bc6b00ce
|
|
| BLAKE2b-256 |
a30036f7fa7677b1810fd05a46b158374131c20dcc01c101cba9a38bd80bf9b9
|
File details
Details for the file embedsync-0.9.0-py3-none-any.whl.
File metadata
- Download URL: embedsync-0.9.0-py3-none-any.whl
- Upload date:
- Size: 22.2 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via:
twine/7.0.0 CPython/3.12.14
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
7a35b2d43c929d35ed21f13cf2a8cfaf3eb1b0b8dac2dd1470a2b8000b08f0e3
|
|
| MD5 |
c86d6edc08b3e6a4d789f06b634f7d90
|
|
| BLAKE2b-256 |
5d9bee00bb62430b235fa796e4e72bdb6cbce11215d2f6c20964e4ca5fd472ec
|