v0.31.0

rishikanthc/Scriberrv0.31.0Jul 2, 2026by github-actions[bot]

AI Summary

A major update introducing table branches, OAuth configuration, blob v2 schema support, and Polars integration, alongside breaking changes to index statistics and query filter handling.

Key Highlights

  • Introduction of table branch support for version control.
  • Full support for OAuth connection configuration across Python and Node.
  • New Blob v2 schema, read, and materialization APIs.
  • Integration with Polars DataFrames.
  • FM-Index scalar index for substring search.

Breaking Changes

  • drop unused loss field from IndexStatistics
  • combine repeated where filters with AND instead of replacing

New Features

  • unify sync create_index API to match async API
  • support remote tables in PyTorch dataloaders
  • add update_field_metadata to edit per-field metadata
  • add table branch support
  • support FM-Index scalar index for substring search
  • add polars dataframe integration
  • add OAuth connection config
  • add approx mode to vector queries
  • re-export arrow and datafusion crates from lancedb

Full Release Notes

## 🛠 Breaking Changes

- refactor!: drop unused loss field from IndexStatistics by @wjones127 in https://github.com/lancedb/lancedb/pull/3496
- fix!: combine repeated where filters with AND instead of replacing by @wjones127 in https://github.com/lancedb/lancedb/pull/3585

## 🎉 New Features

- feat(python): unify sync create_index API to match async API by @wjones127 in https://github.com/lancedb/lancedb/pull/2882
- feat(table): route merge_insert through the MemWAL LSM write path by @touch-of-grey in https://github.com/lancedb/lancedb/pull/3354
- feat(python): support remote tables in PyTorch dataloaders by @Xuanwo in https://github.com/lancedb/lancedb/pull/3432
- feat: add update_field_metadata to edit per-field metadata by @brendanclement in https://github.com/lancedb/lancedb/pull/3482
- feat: deprecate replace_field_metadata for update_field_metadata by @brendanclement in https://github.com/lancedb/lancedb/pull/3484
- feat(python): support blob modes in query to_pandas by @BubbleCal in https://github.com/lancedb/lancedb/pull/3487
- feat(rust): support datafusion expressions for merge insert predicates by @Ar-maan05 in https://github.com/lancedb/lancedb/pull/3444
- feat(remote): implement set/unset_lsm_write_spec REST variant by @hamersaw in https://github.com/lancedb/lancedb/pull/3501
- feat: add table branch support by @brendanclement in https://github.com/lancedb/lancedb/pull/3490
- feat: support checking out a version on a branch by @brendanclement in https://github.com/lancedb/lancedb/pull/3504
- feat: support FM-Index scalar index for substring search by @jackye1995 in https://github.com/lancedb/lancedb/pull/3532
- feat: adds isin support to the 'Expr' builder by @stumpylog in https://github.com/lancedb/lancedb/pull/3523
- feat: expand IndexConfig with rich per-index metadata by @wjones127 in https://github.com/lancedb/lancedb/pull/3497
- feat(python): accept Expr in Table.delete and merge when_not_matched_by_source_delete by @stumpylog in https://github.com/lancedb/lancedb/pull/3524
- feat: support rename_table on LanceNamespaceDatabase by @nuthalapativarun in https://github.com/lancedb/lancedb/pull/3520
- feat(bindings): expose new IndexConfig fields in Python and Node.js by @wjones127 in https://github.com/lancedb/lancedb/pull/3534
- feat: skills to connect and update column metadata by @dantasse in https://github.com/lancedb/lancedb/pull/3541
- feat: add table branch support to remote tables and Python/TS bindings by @brendanclement in https://github.com/lancedb/lancedb/pull/3540
- feat(query): add approx mode to vector queries by @BubbleCal in https://github.com/lancedb/lancedb/pull/3549
- feat: send read-freshness signal on the lance-namespace path by @brendanclement in https://github.com/lancedb/lancedb/pull/3551
- feat(rust): add blob v2 schema declaration and write path by @geruh in https://github.com/lancedb/lancedb/pull/3528
- feat(rust): add blob read and materialization APIs by @geruh in https://github.com/lancedb/lancedb/pull/3562
- feat(rust): add OAuth header provider by @jackye1995 in https://github.com/lancedb/lancedb/pull/3579
- feat(python): expose OAuth connection config by @jackye1995 in https://github.com/lancedb/lancedb/pull/3586
- feat(node): expose OAuth connection config by @jackye1995 in https://github.com/lancedb/lancedb/pull/3587
- feat: add skill to work with branches better by @dantasse in https://github.com/lancedb/lancedb/pull/3596
- feat: add polars dataframe integration by @westonpace in https://github.com/lancedb/lancedb/pull/3584
- feat(remote): monotonic reads via x-lancedb-min-read-version watermark by @jackye1995 in https://github.com/lancedb/lancedb/pull/3597
- feat(rust): re-export arrow and datafusion crates from lancedb by @wjones127 in https://github.com/lancedb/lancedb/pull/3576

## 🐛 Bug Fixes

- feat(python): support blob modes in query to_pandas by @BubbleCal in https://github.com/lancedb/lancedb/pull/3487
- fix(rerankers/mrr): raise ValueError on empty vector_results list by @devteamaegis in https://github.com/lancedb/lancedb/pull/3469
- fix(rerankers): guard against empty vector_results in RRFReranker.rerank_multivector by @devteamaegis in https://github.com/lancedb/lancedb/pull/3467
- fix(python): route blob query pandas through scanner by @BubbleCal in https://github.com/lancedb/lancedb/pull/3491
- fix(python): make LanceDBClientError pickleable by @hashwnath in https://github.com/lancedb/lancedb/pull/3470
- fix(python): run AsyncTable.search embeddings on a dedicated executor by @Ar-maan05 in https://github.com/lancedb/lancedb/pull/3459
- fix(python): push down namespace full reads by @BubbleCal in https://github.com/lancedb/lancedb/pull/3516
- fix(util): convert numpy scalars in value_to_sql by @devteamaegis in https://github.com/lancedb/lancedb/pull/3522
- fix(nodejs): treat NAPI_RS_FORCE_WASI as truthy only when set to 'true' by @nuthalapativarun in https://github.com/lancedb/lancedb/pull/3519
- fix: support LargeList label list indexes by @Xuanwo in https://github.com/lancedb/lancedb/pull/3529
- fix(python): raise clear TypeError for bare List/Tuple in pydantic schema conversion by @Ar-maan05 in https://github.com/lancedb/lancedb/pull/3511
- fix(rust): report local write progress bytes from Lance by @GHX5T-SOL in https://github.com/lancedb/lancedb/pull/3422
- fix(util): escape single quotes in struct field names in value_to_sql by @JSap0914 in https://github.com/lancedb/lancedb/pull/3548
- fix(python): clarify single dictionary input error by @whitewooood in https://github.com/lancedb/lancedb/pull/3537
- fix(rust): return typed errors instead of panicking in Bedrock embedding path by @Ar-maan05 in https://github.com/lancedb/lancedb/pull/3512
- fix(ci): allow shell pre-commit hooks in bumpversion configs by @wjones127 in https://github.com/lancedb/lancedb/pull/3554
- fix: overflow using sys.maxsize for k in query with namespace connection by @rpgreen in https://github.com/lancedb/lancedb/pull/3561
- fix: parse RFC 3339 created_at and improve IndexConfig repr by @wjones127 in https://github.com/lancedb/lancedb/pull/3558
- fix: add missing stacklevel=2 to warnings.warn() and fix broken message concatenation (Fixes #3563) by @rtmalikian in https://github.com/lancedb/lancedb/pull/3564
- fix(remote): omit empty api key header by @jackye1995 in https://github.com/lancedb/lancedb/pull/3573
- fix(remote): support namespace clients with dynamic headers by @jackye1995 in https://github.com/lancedb/lancedb/pull/3574
- fix: ensure read freshness provider is built into namespace client by @rpgreen in https://github.com/lancedb/lancedb/pull/3571
- fix(python): raise clear error when permutation API is used on remote tables (Fixes #2934) by @rtmalikian in https://github.com/lancedb/lancedb/pull/3591
- fix: add missing stacklevel=2 to warnings.warn() calls (Fixes #3589) by @rtmalikian in https://github.com/lancedb/lancedb/pull/3590
- fix(python): route sync namespace connections through rust by @jackye1995 in https://github.com/lancedb/lancedb/pull/3598
- fix(python): route async namespace connections through rust by @jackye1995 in https://github.com/lancedb/lancedb/pull/3603
- fix!: combine repeated where filters with AND instead of replacing by @wjones127 in https://github.com/lancedb/lancedb/pull/3585
- fix(python): average MRR reciprocal ranks over all rankings by @Ar-maan05 in https://github.com/lancedb/lancedb/pull/3599

## 📚 Documentation

- docs: add cross-SDK parity guidance for code review by @brendanclement in https://github.com/lancedb/lancedb/pull/3464
- docs(python): add missing parameter documentation for when_matched_update_all by @Neo-X7 in https://github.com/lancedb/lancedb/pull/3536

## 🚀 Performance Improvements

- perf: migrate list_indices to use Lance's describe_indices by @wjones127 in https://github.com/lancedb/lancedb/pull/3108
- perf: drop N+1 in RemoteTable::list_indices by @wjones127 in https://github.com/lancedb/lancedb/pull/3535

## Other Changes

- refactor: extract create_index module from table.rs by @wirybeaver in https://github.com/lancedb/lancedb/pull/3521

## 🔧 Build and CI

- ci: fix pypi publish on mac/windows/arm by @wjones127 in https://github.com/lancedb/lancedb/pull/3449
- ci: drop manylinux2_17 wheel builds by @wjones127 in https://github.com/lancedb/lancedb/pull/3455
- ci: move Lance dependency bump flow into skill by @Xuanwo in https://github.com/lancedb/lancedb/pull/3475
- ci: update python lockfile weekly by @wjones127 in https://github.com/lancedb/lancedb/pull/3498
- ci: update deprecated GitHub Actions to latest versions (Fixes #3577) by @rtmalikian in https://github.com/lancedb/lancedb/pull/3608