Query and manage Linear issues, projects, teams, cycles, labels, and comments through a managed OAuth GraphQL endpoint.
Memory
lance-format
Try itPinned reference for Lance v11.0.0-beta.6 and the Rust/Python engine, with v10.0.0 as the stable line.
What it does
Reference for the lance-format/lance repo tracked at v11.0.0-beta.6, with v10.0.0 as the stable pin. Splits coverage across a deep reference (file format, table format, indexes, MemWAL, namespaces), a verbatim mirror of upstream docs, and a dedicated performance guide. Surfaces concrete schema, parameter, proto, and constraint detail, the v11 deltas (fragment-id high-water mark, manifest flag 128, FileWriter as enum, LanceFileVersion losing Ord), and the v7 through v11 version landscape.
When to use it
- Reading or writing .lance datasets directly through the lance Rust crate
- Tracking v11 breaking API and format changes for migration work
- Tuning vector, scalar, or FTS indexes or diagnosing slow scans
- Implementing a custom namespace or object-store integration
The skill document
Lance v11 reference
Lance is an open columnar format for multimodal AI - "a columnar data format that is 100x
faster than Parquet for random access." It is not one format but a stack of interoperating
specs: a file format, a table format, index formats, catalog specs, and a
namespace client spec. The Rust workspace at lance-format/lance implements all of them
plus Python (pylance) and Java bindings.
This skill tracks v11.0.0-beta.6 (the lance-format/lance git tag), the current
development frontier; v10.0.0 is the stable pin. Pin against tags, not main - Lance ships
beta tags every few days and next-format encodings can change. Version landscape below.
Three layers of reference, load what the task needs:
-
The deep reference - any concrete schema, parameter, proto, or constraint. Split by topic:
File in references/Covers Sections format-file.mdWhat Lance is, the 26 crates, file format, data types 1-4 format-table.mdDataset layout, manifests, fragments, schema evolution, versioning/tags/branches, row IDs, transactions + OCC, MemWAL 5-10 indexes.mdVector / scalar / FTS / geo indexes, distributed builds 11-12 ops.mdObject store, capability matrix, source map 13, 15, 16 changelog-v7-v11.mdThe full v7 -> v11 delta 14 Cross-references written as "section N" resolve through
references/lance-reference.md. -
references/performance.md- ALL performance guidance. Part A routes to the official text and adds the source-derived changes upstream has not documented; Part B is field-verified remote-storage practice. Load for any performance, tuning, maintenance-cost, or "why is this slow" question. -
references/docs/- a verbatim mirror of the official docs (docs/srcat the tracked tag): every guide, quickstart, and format spec, unedited. Load when you need the full official text. Directory map below.
references/maintenance.md covers refreshing this skill against a new upstream tag.
Lance vs LanceDB
These are two different things and conflating them produces wrong answers.
- Lance - the format and engine. The
lance-format/lancerepo; thelance/lance-*Rust crates;pylance. It gives you datasets, the file/table format, indexes, commits, scans. Consumed directly by DuckDB, Polars, Ray, Spark, PyTorch, DataFusion, or your own Rust/Python code. This skill is about Lance. - LanceDB - a separate database product (
lancedb/lancedb) built on top of Lance. It adds a query-builder API, an embedding registry, rerankers-as-API, multi-language SDK parity, and managed Cloud / Enterprise tiers. Not covered here.
The wider ecosystem (separate repos, own version lines, none covered here): Flink streaming
writes (lance-flink), PostgreSQL reads via pglance, a Cypher graph engine (lance-graph), a
dataset browser (lance-data-viewer), agentic context management (lance-context), and
namespace catalog implementations for Hive, Polaris, Gravitino, Unity Catalog, and AWS Glue.
Generated per-language SDK docs live at lance-format.github.io/lance-{python,java}-doc.
If you are linking the lance crate in Cargo.toml, you are using Lance directly - use this
skill. If a question is about LanceDB internals, the storage layer underneath it is still
Lance, so this skill remains the authority for the format itself.
The crate workspace
26 crate directories under rust/. lance is the public entry point - Dataset, scanner,
indexes, commits; everything else (lance-table, lance-file, lance-encoding, lance-index,
lance-io, lance-core, lance-datafusion, lance-linalg, lance-namespace*, ...) is a layer
beneath it. Edition 2024, MSRV 1.91.0, arrow 58, datafusion 54; Python bindings need 3.10+. Full
table with roles, versions, and every workspace dep in references/format-file.md section 2.
If you depend on anything below lance, v11 will break you - PRs #8020-#8026 deleted
lance-encoding::version with no re-export (LanceFileVersion and ConcreteFileVersion both
live in lance-file::version now), removed lance_io::encodings and the previous namespaces,
and gave each current format its own versions/v2_{0,1,2,3} module. Section 2.1.
File format versions
The file format carries a single major.minor version. Selected per-dataset at creation via
data_storage_version and fixed once the dataset exists (to change it, rewrite the
dataset).
| Version | Status | Notes |
|---|---|---|
0.1 (legacy) | read-only | Original format; no longer writable |
2.0 | stable | Removed row groups; null support for lists/FSL/primitives |
2.1 | current default (stable) | Adaptive structural encodings; better integer/string compression; nulls in struct fields; better nested random access. Default since Lance 5.0.0 |
2.2 | unstable | Map type, Blob v2, VariablePackedStruct, larger mini-blocks. Required for Map and Blob v2; the real experimental frontier - encodings may still change |
2.3 | unstable (next) | The current next alias target (V2_3 in the enum). Ships sparse structural pages, which the 2.3 writer now auto-selects under a rep/def budget heuristic |
stable resolves to the default (2.1); next now resolves to 2.3, not 2.2 - pin an
explicit number for deterministic behavior. In the version ladder 2.2 sits below next, so
the code does not flag 2.2 as unstable even though the docs version table lists only 2.3 as the
unstable row. The release selectors (LanceFileVersion) are a type distinct from the
persisted identity (ConcreteFileVersion). Details, plus the sparse auto-selection rules, in
references/format-file.md sections 3.1 and 3.6.
Version landscape
The major is bumped by a bot, not a human: ci/publish_beta.sh re-roots at MAJOR+1 whenever
any PR since the release root carries the GitHub breaking-change label - the marker is the
label, not a conventional-commit !. A major bump therefore means "some labeled breaking
change landed", not a redesign. It has fired on two consecutive lines, which is why neither
v9.1.0 nor v10.1.0 was ever released - the 10.1 line exists only as
v10.1.0-beta.{1,2}, after which the train re-rooted to 11 off the same base.
The v10 line did ship a final: v10.0.0 was tagged 2026-08-08 (annotated, "Release version
10.0.0") on the release/v10.0 stabilization branch, which is not an ancestor of main.
Finals are cut on those branches, so "not on main" is normal, not a sign the release is
unofficial.
| Major | Its breaking theme |
|---|---|
v11 (current, v11.0.0-beta.6) | Fragment ids became a dataset-lifetime high-water mark; large internal reorganization of lance-file / lance-encoding; the first new manifest feature flag since v7. Delta below |
| v10 | Blob APIs preserve null selections; cache keys became opaque BLAKE3 digests (every warm or persisted cache cold-misses, no legacy fallback); async create_remapper; MemWAL renamed generation -> SSTable, merge -> compaction (wire-compatible, symbol-breaking) |
| v9.1 (never released; renamed into v10) | FTS/inverted creation took a block_size param. Net-new: Data Overlay Files (cell-level updates without base-file rewrite, unstable + env-gated), sparse structural pages, lance-index-core |
| v9 | Python 3.9 dropped; alter_columns fails fast when casting an indexed column; FM-Index proto rename made existing FM indexes unreadable; FTS/inverted defaults to on-disk format v2 |
| v8 | All index builds unified onto one segment-based lifecycle. Net-new: lance-derive, FM-Index, multi-bit IVF_RQ, public approx_mode, TOS + GooseFS object stores |
| v7 | MemWAL, branches, the geo/RTree index, the lance-select crate, ICU FTS |
v10.0.0 is the stable pin (2026-08-08, superseding v9.0.1), and it is what GitHub
Releases marks Latest. crates.io carries finals only (newest is lance 10.0.0; no 11.x,
and the only pre-release in ~186 versions is the ancient 0.0.1-alpha0); PyPI pylance is
likewise at 10.0.0. So a beta pin means a git dependency - beta wheels publish to fury.io
instead, under the renamed org (https://pypi.fury.io/lance-format).
Full per-tag deltas, with every PR citation: references/changelog-v7-v11.md.
The v11 delta
222 commits from v10.0.0-beta.7, with 13 breaking-change-labeled PRs. Most structural
invariants held: 26 crates, 16 transaction ops, CommitConfig.num_retries 20,
file-format enum still next => 2.3 / default 2.1 (no 2.4), arrow 58 / datafusion 54, MSRV
1.91.0, Edition 2024, Python 3.10+, and no new LANCE_* env vars.
The manifest feature flags did change - the first new bit since v7.
FLAG_MEM_WAL_INDEX_CATCHUP = 128 was added and FLAG_UNKNOWN moved 128 -> 256. Both reader
and writer must hold the bit or refuse the table, and setting it is one-way (never cleared
as a rollback). Without it, a missing index_catchup entry reads as "fully caught up", so an
index-only query could answer without the SSTables holding the newest rows. Section 7.
Breaking:
- Fragment ids are now a dataset-lifetime high-water mark (#8206) - the sharpest change,
because it is a format invariant, not just an API. Overwrite no longer restarts ids at 0, so
"an id must never name two different sets of rows". An overwrite fragment carrying a deletion
file is now rejected (that file's path embeds the old id), and any commit producing
duplicate ids is rejected - datasets written by Lance 0.16 and earlier may already contain
duplicates: still readable, no longer committable.
dataset.get_fragment(0)after an overwrite must read ids from the manifest instead. - The file-version types and the whole reader/writer composition moved (#8020-#8026) - see
the crate-workspace note above.
FileWriterbecame an enum with all constructors removed;FileReader::version()returnsConcreteFileVersion. Only two of these carry a!in the commit subject; the rest break silently at compile time. Section 3.6. DataBlockBuilder::appendis fallible (#8172) - malformed variable-width offsets yieldError::CorruptFile, so some files that previously "read" now error. HNSW construction changed (#8188) -m < 4rejected, persisted level layout corrected; expect different graphs and different recall.MemWalIndex::force_seal_activereturnsSealFence(#8051);MiniBlockCompressor::compresstakes a context parameter (#8038), breaking out-of-tree codecs but not persisted bytes;CacheBackend::deep_size_of_entries(#8159) makes reported cache sizes shrink, so anything budgeting againstLanceCache::deep_size_of()sees new numbers.LanceFileVersionlost its ordering (#8027, #8028) -PartialOrd/Ordare gone, sov >= LanceFileVersion::Nextno longer compiles;resolve()is nowconst fn resolve(self) -> ConcreteFileVersion;iter_non_legacy(),support_add_sub_column()andsupport_remove_sub_column()were deleted, as were bothFromconversions between selector and concrete version. New:stable_file_version()(V2_1) andnext_file_version()(V2_3). Version decisions are now exhaustive matches at declared boundaries, not>=/maxcomparisons. Section 3.6.Operation::Project/Mergegainedpreserves_nullability: bool(#8347). Defaultfalsemeans "no assertion". A nullability tightening must not set it - its producer proved the claim by scanning at its read version, so a concurrent write can falsify it, and such a projection now conflicts with any value-write in either commit order. This closed a real hole:alter_columnsproved NOT NULL by scanning, then committed aProjectthat conflicted with nothing, so a racing write could land nulls unreadable under the tightened schema. Section 9.2.- MemWAL index validation replaced (#8360) - public
is_maintainable_index_type(&str)is gone; usevalidate_maintained_indexes(dataset, index_names). Type-URL filtering was unsound (an IVF-PQ overFixedSizeListpassed, then made the table unwritable). The new validator is all-or-nothing: it errors on the first unmaintainable index rather than returning a usable subset. Section 10.
Net-new:
- FTS gained a document-boundary axis (#7788) -
DocumentGranularity(ROW/LIST_ELEMENT), aposting_format_versiondistinct fromindex_version, a_doc_indexcolumn.document_granularity="list_element"is a third trigger requiring FTS on-disk format v3, independent ofblock_size=256and the code-analyzer tokenizer. Section 11.3. - Large transactions spill out of the manifest (#7881) - above
MAX_INLINE_TRANSACTION_BYTES(20 MiB; the 64 KiB figure in the PR text is the#[cfg(test)]value, so every non-test build gets 20 MiB) the transaction lives solely in its external file. Measured: a full-commit manifest shrank 1576 MiB -> ~790 MiB. No new configuration. Note this cuts read round trips, not write ones - the separate.txnfile is still written either way. - A posting-backed compound FTS scoring core (#8092-#8094, #8131, #8299) - every clause combined
with
ANDis a scoringMUSTclause, so all must match and every matching clause contributes to_score; exact-null zone maps over every type (#8088, #8017); pluggable cache backends (#7683); theaws_provider_schemestorage option (#8103);goosefs://onConditionalPutCommitHandler(#8134 - if-not-exists only holds once every writer is upgraded); multipart uploads keeping part identity across retries (#8174). No newLANCE_*env vars landed in v11. - MemWAL catch-up is now derived, not declared (#8481, superseding #8263) - a commit no
longer carries a claim about index coverage; coverage is derived from the version the
transaction read. #8263's
IndexCatchupAdvanceproto message was added and then removed within the same beta window, so it never shipped in a final. Also new: memtable backpressure stats (#8241),ShardWriter::deleteagainst non-nullable base columns (#8352), andMemWalIndexDetails.index_catchup(table.proto field 10). Section 10. - Transaction proto field 9 is deprecated -
updated_fragment_offsetsgives way to field 10updated_fragment_offset_bitmaps(portable RoaringBitmap bytes, #7432). Writers emit field 10 only; readers prefer 10 and fall back to 9 for older manifests. Section 9. - Smaller API additions:
LanceFragment.validate()(#8428),BlobFile.read_ranges()(#8319),lance.fragment.RowIdSequence(#8356 - duplicate ids now rejected instead of silently mis-encoded),write_fragments(session=...)(#8034),lance.tokenize(#8415), and Java cache-backend selection (#8446) plusIndex.getSizeBytes()(#8355).
Eleven silent-corruption and wrong-results fixes landed in v11 - several invalidate advice
that was safe to give at v10, including cleanup irreversibly deleting live overlay data (#8267)
and optimize_indices leaving duplicate rows ranked by a stale vector (#8342). The full list,
with the conditions that trigger each, is in references/changelog-v7-v11.md.
Full delta including the Python/Java surface: references/changelog-v7-v11.md.
Performance questions
For anything performance-shaped - slow scans or searches, remote/object-storage cost, index
maintenance cost, memory sizing, version bloat, benchmarking - load
references/performance.md first. Part A routes to every official performance recommendation
plus the undocumented source-derived changes; Part B is field-verified practice from running
Lance against S3-compatible storage. The governing rule stays minimize remote calls - fewer
commits, fewer scans, fewer round trips - because that is where the order-of-magnitude wins are.
v11 added an official "Tuning remote scans" section giving a concrete starting point
(LANCE_IO_THREADS=8, fragment_readahead=1, batch_readahead=2, io_buffer_size=64MB) for
cross-region or public-internet access, where the cloud default of 64 concurrent requests is too
aggressive; treat it as a legitimate second move once call volume is already minimized.
Official docs mirror
references/docs/ mirrors docs/src of lance-format/lance at the tracked tag, verbatim -
45 markdown files plus 4 diagrams, every one directly readable.
| Directory | Files | Covers |
|---|---|---|
guide/ | 14 | CRUD, performance, object store, distributed write + indexing, JSON, tokenizers, data types, data evolution, blob, arrays, tags/branches, migration, observability |
quickstart/ | 4 | First dataset, vector search, full-text search, versioning |
format/ | 1 | Spec-stack overview |
format/file/ | 3 | Container spec, structural encodings + compression, format versions |
format/table/ | 9 | Layout, schema, transactions (conflict-resolution matrix), versioning, row-id lineage, branch/tag, MemWAL, data overlay files |
format/index/ | 1 + 4 svg | Index lifecycle, fragment coverage, compaction interplay |
format/index/scalar/ | 9 | fts, fmindex, ngram, btree, bitmap, bloom_filter, label_list (array_has_any/all), zonemap, rtree |
format/index/vector/ | 1 | IVF / PQ / SQ / RQ / HNSW concepts and storage layout |
format/index/system/ | 2 | Fragment reuse index, MemWAL system index |
integrations/ | 1 | DataFusion SQL over Lance, incl. JSON functions |
Not mirrored: docs/src/images/ (the PNG/GIF diagram assets). Image links inside the
mirrored pages therefore do not resolve - the surrounding prose is self-contained, and the four
index-lifecycle .drawio.svg diagrams under format/index/ are mirrored. Also outside the
mirror by design: the community/, examples/, and integrations/{pytorch,tensorflow} pages;
the landing/index stubs (index.md, sdk_docs.md, integrations/index.md) and the
contributor files (format/AGENTS.md, format/CLAUDE.md); and format/catalog +
format/namespace, which are assembled at build time from sibling repos with their own
version lines. The Spark / Ray / Trino integrations are no longer in the checked-in nav at all -
#8419 deleted them so the committed file matches what make-full-website.sh produces when the
external docs are absent.
Questions people ask
- What is the difference between Lance and LanceDB?
- Lance is the format and engine (the lance-format/lance repo, the lance and lance-* Rust crates, and pylance). LanceDB is a separate database product (lancedb/lancedb) built on top, which adds a query-builder API, an embedding registry, rerankers-as-API, and managed Cloud / Enterprise tiers. The storage layer underneath LanceDB is still Lance, so this skill covers the format itself.
- Which version should I pin against?
- v10.0.0 is the stable pin (tagged 2026-08-08 on the release/v10.0 stabilization branch, which is not an ancestor of main). crates.io and PyPI carry 10.0.0 only; pre-release v11.0.0-beta.6 requires a git dependency, with beta wheels published to https://pypi.fury.io/lance-format instead of PyPI. Always pin against tags rather than main because next-format encodings can change.
- What broke between v10 and v11?
- v11 carries 222 commits from v10.0.0-beta.7 with 13 breaking-change-labeled PRs. Fragment IDs became a dataset-lifetime high-water mark so any commit producing duplicate IDs is rejected; FileWriter became an enum with all constructors removed; DataBlockBuilder::append is now fallible; HNSW construction changed and m < 4 is rejected; LanceFileVersion lost PartialOrd/Ord; Operation::Project and Merge gained a preserves_nullability field. The manifest feature flag FLAG_MEM_WAL_INDEX_CATCHUP = 128 was added (and FLAG_UNKNOWN moved 128 to 256), which is one-way and requires both reader and writer …
Related skills
Read and write Excel workbooks, worksheets, ranges, tables, and charts in OneDrive through Microsoft Graph with managed OAuth.
Write, debug, and tune Playwright specs with locator strategy, trace diagnosis, and CI-aware timeouts.
Trade crypto, manage a multi-chain wallet, and query an AI analyst from one CLI.
Generate and edit Draw.io, Mermaid, and Excalidraw diagrams from natural language using a structured JSON spec.
Adaptive web scraping in Python that bypasses anti-bot systems and scales from single requests to concurrent crawls.
More from tenequm
Browse all skillsReference patterns for TanStack Query, Router, and Start in full-stack React apps.
Build HTTP 402 machine-to-machine payments with the MPP protocol across TypeScript, Python, and Rust SDKs.
Opinionated guide to building Agent Skills for any agent, covering layout, frontmatter, descriptions, and Claude Code specifics.
Build and deploy JavaScript, TypeScript, Python, or Rust code on Cloudflare's global edge network using the Wrangler CLI.
Build native macOS apps with Swift 6.3, SwiftUI, SwiftData, concurrency, and on-device AI.
Wire up Privy auth, embedded wallets, and agent payments (x402, MPP) in React or Node apps.