Last updated
One way: SharePoint stays the system of record, and SPSync keeps a read-only copy of your lists current in Weaviate.
Status: Shipped · product: SPSync for Search & Vector Stores
SPSync replicates SharePoint list items into Weaviate, one object per item, reading from SharePoint and never changing it. The objects carry no vector and each collection is created without a vectorizer, so Weaviate holds them for filters and keyword search until you add an embedding step of your own. SPSync generates embeddings on sync only for Postgres with pgvector and Azure AI Search; doing the same for Weaviate is under consideration, with no plan or date.
Unlike Qdrant and LanceDB, Weaviate ranks keyword matches: every text property SPSync creates is indexed for BM25 by default, so a ranked keyword search over list text works from the first run, with no model involved.
Connecting over REST and gRPC
SPSync needs the REST endpoint, such as http://localhost:8080 or your Weaviate Cloud
URL, and the gRPC port, 50051 by default, on the same host. The Python client sends batch
imports over gRPC, so open both ports to the sync host. Authentication is an optional
API key from an environment variable; a local cluster without one needs none. SPSync keeps
a local state file between runs on a stable path.
Collections and properties
A grant applications list, fund_applications, with a multi-choice Themes column gives
three collections: fund_applications, fund_applications__themes and the shared users
collection. Lookups arrive as an ID and a display value on the object, and a person as a
user ID that matches the users collection.
Properties use five Weaviate types: text for text and IDs, int for whole numbers,
number for numbers and currency, boolean for Yes/No, and date for dates and times.
Weaviate reserves id and vector as property names, so SPSync renames such a column
with a _prop suffix. Weaviate refuses to retype an existing property, so SPSync checks
first and writes to a new _v2 collection when a SharePoint column changes type. A new
column is added as a property in place.
How do I search SharePoint list data in Weaviate without vectors?
SPSync leaves Weaviate’s property defaults alone, so each property is indexed for
filtering, and text properties are also indexed for BM25. Text uses Weaviate’s default
word tokenisation, which means a filter or keyword query on a text property matches the
words in the value. Dates are compared as RFC 3339 timestamps.
A BM25 query with filters, using the Python client: submitted applications that mention community energy, asking for 25,000 or more, changed since April.
import weaviatefrom weaviate.classes.query import Filter
client = weaviate.connect_to_local()apps = client.collections.use("fund_applications")response = apps.query.bm25( query="community energy", query_properties=["title", "summary"], filters=( Filter.by_property("status").equal("Submitted") & Filter.by_property("amount_requested").greater_or_equal(25000) & Filter.by_property("sp_modified").greater_or_equal("2026-04-01T00:00:00Z") ), limit=10,)for obj in response.objects: print(obj.properties["title"], obj.properties["amount_requested"])client.close()How do I add vectors to SharePoint objects in Weaviate?
Weaviate 1.31 and later can add a named vector, with a vectorizer and the properties it should embed, to a collection that already exists, including one created without a vector. Weaviate does not vectorise the objects already there when you add it. SPSync rewrites an object each time its row changes and rewrites every object on each reconcile, weekly by default, but it has not been tested against a collection with a named vector added, so try that on a copy of the collection before you depend on it.
The other route keeps the two apart: your own job reads the objects, embeds the properties you pick and writes the vectors to a collection it owns, under the same object IDs, so a hit leads back to the SharePoint item.
Deletes, changes and the scheduled reconcile
A deleted SharePoint item’s object is removed, and so are its objects in the child collections. Each run sends only changed rows; a reconcile, weekly by default, sends everything, which repairs objects changed or removed by hand.
Who reads the collections
Applications already built on Weaviate read list data from the collections without calling Graph, and agent tools use BM25 over them as a keyword search; see AI agents and tools over SharePoint. For retrieval where SPSync produces the embeddings, see RAG on SharePoint lists.
Steps
- Choose delegated sign-in or per-site
Sites.Selectedapp permissions; the second is what a sync with no signed-in user needs. - Set the REST URL, the gRPC port and the API key variable if the cluster needs one.
- Choose the lists and run; the first run creates the collections.
- Query them from your application with filters or BM25.
Use a local cluster for development and Weaviate Cloud or a cluster you operate for production. Collection size drives memory and storage, and SharePoint permissions do not travel with the objects, so cluster access is the boundary.
Desktop, Azure or command line
All three editions run the same engine, write the same tables and use the same licence key, so the choice comes down to who looks after the sync.
Desktop app
For macOS and Windows. Sign in with Microsoft, tick the lists, choose a database and sync from your own machine on the schedule you set. Delegated sign-in needs no admin unless your tenant requires admin consent for apps.
In your Azure
SPSync in your Azure, a managed application for your own subscription, is deployed with you on a call while the Marketplace listing is prepared. Once deployed it is always on, so the sync keeps running with every laptop closed.
Command line
Every replication is a YAML file you can review and commit. Run it from a server, a container or a CI pipeline, and re-run it safely any time.
Frequently asked questions
What does a SharePoint list become in Weaviate?
A set of collections: the list's items in one, each multi-value column in its own, and people in a users collection shared by every list. Each item is an object whose properties are its columns.
Does SPSync write vectors to Weaviate?
No. SPSync creates each collection with no vector settings and inserts objects without a vector. On Weaviate 1.40 and later such a collection has no vector at all; earlier versions filled in server defaults, including any cluster-wide default vectorizer module. Vectors generated by SPSync are available on SharePoint to pgvector and SharePoint to Azure AI Search.
Which ports does Weaviate need?
Two: the REST endpoint, often 8080, and the gRPC port, 50051 unless you set another. Batch imports go over gRPC, so both must be reachable from the sync host.
Why is there an id_prop property in the users collection?
Weaviate reserves the property names id and vector. SPSync renames any column with one of those names by adding _prop, which affects the users table's id column.
Talk to us about Weaviate
SPSync is licensed per installation and per target family, with Standard Support included. Tell us which targets you need and how many machines, and we will size it with you. See how licensing works.
Set it up
Sign in to SharePoint with the SharePoint connection guide, then follow the Weaviate setup guide to create the database user and open the connection for Weaviate. If the connection test fails, the troubleshooting guide lists the errors people hit and what fixes them.
Script it
Everything you can click, you can script. The CLI, YAML config and automation below reproduce this scenario exactly. See the CLI reference.
spsync auth login --client-id 00000000-0000-0000-0000-000000000000
spsync export-config --output replication.yaml --pipeline-name weaviate --prefix weaviate --destination-kind weaviate --connection-string-env SPSYNC_DB_CONNECTION --dataset-name weaviate --client-id 00000000-0000-0000-0000-000000000000 --site-url https://contoso.sharepoint.com/sites/example --all-lists
spsync doctor replication.yaml
spsync run replication.yaml pipeline_name: weaviate
prefix: weaviate
auth:
mode: delegated
client_id: 00000000-0000-0000-0000-000000000000
tenant_id: common
destination:
kind: weaviate
connection_string_env: SPSYNC_DB_CONNECTION
dataset_name: weaviate
scopes:
- site_url: https://contoso.sharepoint.com/sites/example
mode: entire_site
reconcile_interval_days: 7
create_reporting_views: false
Cron (Weaviate nightly):
# every night at 02:00
0 2 * * * cd /opt/spsync && SPSYNC_DB_CONNECTION="$(cat /etc/spsync/db.env)" uv run spsync run replication.yaml >> /var/log/spsync/run.log 2>&1 GitHub Actions:
# .github/workflows/spsync-run.yml
name: SPSync
on:
schedule:
- cron: "0 2 * * *"
workflow_dispatch: {}
jobs:
run:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: astral-sh/setup-uv@v3
- run: uv sync
- run: uv run spsync run replication.yaml
env:
SPSYNC_DB_CONNECTION: ${{ secrets.SPSYNC_DB_CONNECTION }}
SPSYNC_LICENCE_KEY: ${{ secrets.SPSYNC_LICENCE_KEY }} Azure DevOps:
# azure-pipelines.yml
schedules:
- cron: "0 2 * * *"
branches: { include: [main] }
always: true
steps:
- script: uv sync
- script: uv run spsync run replication.yaml
env:
SPSYNC_DB_CONNECTION: $(SPSYNC_DB_CONNECTION)
SPSYNC_LICENCE_KEY: $(SPSYNC_LICENCE_KEY) Windows (PowerShell + Task Scheduler):
# Windows Task Scheduler action (see /docs/cli/automation/)
$env:SPSYNC_DB_CONNECTION = (Get-Content C:\spsync\db.env)
uv run spsync run C:\spsync\replication.yaml
schtasks /Create /SC DAILY /ST 02:00 /TN "SPSync" /TR "powershell -File C:\spsync\run.ps1" macOS (launchd):
# ~/Library/LaunchAgents/io.spsync.run.plist, then: launchctl load ~/Library/LaunchAgents/io.spsync.run.plist Secrets (licence key, connection strings) come from the environment, so never write them into the YAML. See scheduling and secrets.