Skip to main content

embedsync

Incremental synchronization between source documents and vector indexes — detect changes, re-embed only deltas, and delete stale chunks.

PyPI License: MIT Python 3.11+ CI

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, or notion: / notion:query sources
  • Content-hash change detection per document
  • Sync plan: add / update / delete actions
  • --full-reindex to 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 ollama or --embedder openai for semantic vectors
  • JSONL is not a vector DB; use --destination pgvector:... or qdrant:... 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-db for 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 the vector extension
  • 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

embedsync-0.9.0.tar.gz (102.9 kB view details)

Uploaded Source

Built Distribution

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

embedsync-0.9.0-py3-none-any.whl (22.2 kB view details)

Uploaded Python 3

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

Hashes for embedsync-0.9.0.tar.gz
Algorithm Hash digest
SHA256 ffb0ff9423ea3fa9cb1955561754203501b171d0d8c6b32ce415c1d55938b61a
MD5 355778cdf1f0e8524c5af481bc6b00ce
BLAKE2b-256 a30036f7fa7677b1810fd05a46b158374131c20dcc01c101cba9a38bd80bf9b9

See more details on using hashes here.

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

Hashes for embedsync-0.9.0-py3-none-any.whl
Algorithm Hash digest
SHA256 7a35b2d43c929d35ed21f13cf2a8cfaf3eb1b0b8dac2dd1470a2b8000b08f0e3
MD5 c86d6edc08b3e6a4d789f06b634f7d90
BLAKE2b-256 5d9bee00bb62430b235fa796e4e72bdb6cbce11215d2f6c20964e4ca5fd472ec

See more details on using hashes here.

Release history Release notifications | RSS feed

This release

0.9.0 This release

2 files

0.6.0

2 files

0.5.0

2 files

0.4.0

2 files

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