SharePoint to LanceDB

LanceDB tables on local disk or object storage, filled from SharePoint lists and opened in place by a Python or Rust app, with no server. Tables hold columns, not vectors.

Book a call

Talk through your use case, see further walkthroughs or demos, and set up a trial in your own environment.

Last updated

One way: SharePoint stays the system of record, and SPSync keeps a read-only copy of your lists current in LanceDB.

Status: Shipped · product: SPSync for Search & Vector Stores

SPSync fills LanceDB tables from SharePoint lists, one way and one row per item, with the replicated columns and no vector column. To run a vector search over them, add your own step that embeds the text you choose and writes the vectors to a table of yours keyed on the item ID. Embeddings on sync for LanceDB are under consideration, not scheduled; SPSync generates them today for Postgres with pgvector and Azure AI Search.

LanceDB is a table format and library with no server. An application opens a Lance table from a folder or an object-store path and queries it in process, which makes it a natural fit for a desktop tool, a notebook or a small service.

Where the tables live

Set one location:

SPSync also keeps a local state file between runs, which needs a stable path.

The tables

A field survey list, env_samples, with a Site lookup, a Collector person column and a multi-choice Contaminants column produces three Lance tables: env_samples, env_samples__contaminants and the shared sp_users. The item table carries site_id, site_value and collector_user_id, so an application can show the site name and join to sp_users for the collector. LanceDB’s SQL-style filters work on any replicated column, for example site_value = 'North Quarry'.

Updates are merge_insert upserts keyed on the item ID, and a child table merges on the item ID and the value’s position together. When a SharePoint item is deleted, SPSync deletes its row from the item table and its rows from every child table. A table can only gain fields in place, so a SharePoint column that changes type sends writes to a new _v2 table.

What each run sends

Each run pushes only rows whose content changed since the last successful push, plus deletions. A reconcile, weekly by default, writes everything again, which repairs rows changed by hand. A push that fails is retried on the next run.

Uses

Developers building a desktop tool or small service over SharePoint content open the tables with the LanceDB client library. Agent frameworks running on one machine use them for a filtered lookup tool; see AI agents and tools over SharePoint. Retrieval with vectors needs pgvector or Azure AI Search; see RAG on SharePoint lists.

Steps

  1. Sign in with your own SharePoint account, or use an app registration with Sites.Selected on the chosen sites if no one will be signed in when it runs.
  2. Choose a local folder or object-store URI, with storage options if needed.
  3. Choose the lists and run; the first run creates the tables and loads every item.
  4. Open the tables from your application.

A local table should have one writer, so let SPSync’s schedule do the writing and read from other processes. Object storage adds request charges on top of storage, and SharePoint permissions do not travel with the data, so access to the folder or bucket 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 LanceDB?

A set of Lance tables: one for the list's items, one for each multi-value column and one shared users table, the same tables SPSync writes to a database. There is no vector column.

Does SPSync write embeddings to LanceDB?

No. The tables hold the replicated columns only. SPSync generates embeddings for Postgres with pgvector and for Azure AI Search; see SharePoint to pgvector or SharePoint to Azure AI Search.

Does LanceDB need a server?

No. LanceDB is embedded: an application opens the table from a folder or an object-store path with the LanceDB library, which pairs well with the desktop app on the same machine.

Can several applications share one LanceDB table?

Yes, when the table lives on object storage that each process can read. A table in a local folder serves one machine.

Talk to us about LanceDB

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 LanceDB setup guide to create the database user and open the connection for LanceDB. 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 lancedb --prefix lancedb --destination-kind lancedb --connection-string-env SPSYNC_DB_CONNECTION --dataset-name lancedb --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: lancedb
prefix: lancedb
auth:
  mode: delegated
  client_id: 00000000-0000-0000-0000-000000000000
  tenant_id: common
destination:
  kind: lancedb
  connection_string_env: SPSYNC_DB_CONNECTION
  dataset_name: lancedb
scopes:
  - site_url: https://contoso.sharepoint.com/sites/example
    mode: entire_site
reconcile_interval_days: 7
create_reporting_views: false

Cron (LanceDB 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.

Book a call

Tell us about your lists and where they need to go: we will talk through your use case, show further walkthroughs or demos, and set up a trial in your own environment.