## Changelog 2026

Note:

 Get notified by watching releases for git repositories: lamindb,
  laminhub-public, laminr, nf-lamin, and bionty. For other years, see:
  2025 · 2024 · 2023 · 2022

# 2026-04-21 hub 1.29.2

* 🚸 Sheets: bulk row addition and CSV template download PR
  @chaichontat

* 🐛 Fix projects page highlighting and pagination PR @chaichontat

# 2026-04-20 db 2.4.0

-[ ⚠️ Run "lamin migrate deploy" ]-

* 🗃️ Add "branch" and "created_on" fields to "BaseBlock" and the
  "_aux" field to "Branch" PR @falexwolf

* 🗃️ Make "feature" nullable on "RunRecord" PR @falexwolf

All instances connected to LaminHub have been migrated and there is no
need to act.

If you are an admin of a self-managed instance, please migrate your
database with "lamin migrate deploy".

For details see the Compatibility Matrix and the source code.

Highlights:

* ✨ Allow users to transfer artifacts between storage locations PR
  @Koncopd

* ✨ Add "Record.from_dataframe()" and bulk saving of records PR
  @falexwolf

* ✨ Saving markdown notes as records PR @falexwolf

UX:

* 🚸 Enable "lamin connect --here" to scope instance to a development
  directory parallel to git PR @falexwolf

* 🚸 Scope a "lamindb" connection to a development directory PR
  @falexwolf

* 🚸 Skip hash lookup on empty files when creating an "artifact" PR
  @Koncopd

* 🚸 Remove duplicated logging in "ln.connect()" if already connected
  PR @falexwolf

* 🚸 Allow users to pass kwargs to "write_h5ad" and "write_zarr" in
  "Artifact.from_anndata(...)" PR @Koncopd

* 🚸 Warn if working with a non-latest version of an artifact PR
  @Koncopd

* 🚸 Do not error, only warn if running outside "dev-dir" PR
  @falexwolf

Integrations:

* 🚸 Overhaul the "lightning" integration (v3) PR @jorenretel

Bugs:

* 🐛 Invoke original signal handlers in "LogStreamTracker.cleanup()"
  PR @Koncopd

* 🐛 Except only specific import error in "with_package_obj" and
  "with_package" PR @Koncopd

* 🐛 Fix single file directory upload when saving an "artifact" PR
  @Koncopd

* 🐛 Fix "record.to_artifact()" export in case "maximal_set" is "True"
  and record names are not populated PR @falexwolf

Dependencies:

* ⬆️ Python 3.14 PR @Koncopd

* ⬆️ Allow "aiobotocore" 3 PR @Koncopd

* ⬆️ Upgrade s3fs PR @danplischke

* ⬇️ Upper bound "s3fs" by 2026.1.0 due to a bug with connection
  refresh PR @Koncopd

Refactors:

* ♻️ In the "lamidb.core.storage" module, lazily import heavy
  dependencies like "anndata" PR @jorenretel

* ♻️ Avoid unnecessary "pandas" and "anndata" imports on "Artifact"
  initialization PR @Koncopd

* ♻️ Also save README as block, prepare transitioning away from README
  artifacts PR @falexwolf

* ♻️ Do not show instance settings content on validation error PR
  @Koncopd

* ♻️ Enable "to_dataframe(include='features')" also for "Run" PR
  @falexwolf

Docs:

* 📝 Recommend "FeatureManager.set_values()" and warn that
  "FeatureManager.add_values()" can invalidate the "dtype" of
  categorical feature annotations under certain circumstances PR
  @ishitajain9717

* 📝 Document dtype "bool" and improve documentation of "DtypeStr" PR
  @falexwolf

* 📝 Prettify and simplify spatialdata schema creation script PR
  @falexwolf

* 📝 Improve documentation for "Artifact.from_anndata(...)" PR
  @Koncopd

* 📝 README v5.6: Added new features of lamindb 2.4 + clean ups PR
  @falexwolf

# 2026-04-20 hub 1.29.0

* ✨ Support GitHub-flavored markdown PR @chaichontat

* 🐛 Fix faceted filter narrowing in projects and reference PR
  @chaichontat

# 2026-04-19 hub 1.28.0

* 🚸 Default sheets to card view PR @chaichontat

* ⚡️ Faster sheet saving PR @chaichontat

* ⬆️ Upgrade lamindb to 2.4 PR @falexwolf

# 2026-04-16 hub 1.27.0

* ✨ Query records by features PR @chaichontat

* ✨ Feature-based record linking workflow PR @chaichontat

* 🚸 Add the delete action to the records dropdown menu PR
  @chaichontat

* 🚸 Improve robustness of organization management pages PR
  @chaichontat

# 2026-04-12 hub 1.26.0

* 🚸 Rename Merge Requests to Change Requests and polish design PR
  @keller-mark

* 🐛 Fix space information in new sheet workflow PR @chaichontat

* 🐛 Fix overflow behavior in main navigation tabs PR @chaichontat

# 2026-04-10 hub 1.25.0

* ✨ Card view for sheets PR @chaichontat

* ✨ Record page: transform links PR @chaichontat

* ✨ Drag-and-drop reordering for sidebar records PR @chaichontat

* 🚸 Simplify record creation modal, advocate "Type" also for notes
  pages PR @falexwolf

* 🚸 Move the "ULabels" page under the "Features" tab PR @falexwolf

* 🚸 Inline title/description editing PR @chaichontat

* 🐛 Fix display of record type / page descriptions PR @falexwolf

# 2026-04-08 hub 1.24.0

* 🚸 Redesign the run cards and add a tabular view indexed by params
  and features PR @chaichontat

* 💄 Move records number and schema info to the right and do not
  display 'Root' in breadcrumbs PR @falexwolf

* 🐛 Fix data fetch error on "collection" page PR @falexwolf

# 2026-04-06 hub 1.23.1

* 🐛 Fix request for "space" on "User" in sheet edit mode PR
  @falexwolf

# 2026-04-06 hub 1.23.0

* ✨ General support for managing access with spaces in the UI PR
  @chaichontat

* ✨ Make runs searchable PR @chaichontat

* ✨ Add support for R source code highlighting PR @falexwolf

* 🛂 Enable linking objects in a protected space for users who have
  read access to them PR @Koncopd

* 🚸 Mention "lamin save" in notebook preview PR @falexwolf

* 💄 Harmonize markdown font size PR @chaichontat

# 2026-03-31 hub 1.22.0

* ✨ Add a simple feature detail page PR @chaichontat @falexwolf

* ⚡️ Eliminate a multi-second p100 for multiple REST endpoints PR
  @fredericenard

* 🚸 Add option to show non-zero status code runs for data lineage PR
  @chaichontat

* 🚸 Separate markdown editing from data editing PR @chaichontat

* 🚸 Improve responsiveness of nav bar PR @chaichontat

* 🚸 Unnamed records are marked as unnamed PR @chaichontat

* 🐛 Fix "record.to_artifact()" export in case "maximal_set" is "True"
  and record names are not populated PR @falexwolf

* 🐛 Fix duplicated features in artifact detail PR @chaichontat

* 🐛 Fix admin self-assignments in access pages PR @chaichontat

Experimental beta:

* ✨ Initial space support in the UI PR @chaichontat

# 2026-03-27 nf 0.6.0

✨ This release adds support for spaces and branches, configurable
artifact keys, and manual path tracking. @rcannood

* **Space & Branch support**: New "space_uid" and "branch_uid" top-
  level config options to scope transforms, runs, and artifacts into a
  specific space and branch (PR).

 lamin {
 space_uid  = "abcdef1234"
 branch_uid = "abcdef1234"
 }

* **Configurable artifact keys**: New "key" option on
  "output_artifacts", "input_artifacts", and individual rules to
  control how artifact keys are derived. Accepts a string template, a
  closure, or a "[relativize: ...]" map shorthand (PR, PR).

 lamin {
 output_artifacts {
 key = [relativize: params.outdir]
 }
 }

* **Manual path tracking**: New "include_paths" setting on
  "input_artifacts", "output_artifacts", and individual rules to
  explicitly specify files that should be tracked — useful for files
  consumed in Groovy that are invisible to the task listener (PR).

 lamin {
 input_artifacts {
 include_paths = { params.input }
 }
 }

* **Name-based references**: UID fields ("project_uids",
  "ulabel_uids", "space_uid", "branch_uid") now accept prefixed names
  ("?name", "!name", "+name") for convenience and cross-environment
  testing (PR). Note that this is experimental and may be subject to
  change in future releases.

Bug fixes.

* Fixed key relativization to work uniformly across "file://",
  "s3://", "gs://", and "az://" paths using "URI.relativize()" PR
  @rcannood

* Fixed assets directory detection for users with custom "NXF_HOME" or
  "NXF_ASSETS" by using "nextflow.Const.DEFAULT_ROOT" instead of a
  hardcoded path PR @rcannood

Breaking changes.

* "project_uids" inside "run {}", "transform {}", and artifact rules
  is removed. Use the top-level field only PR @rcannood

Others.

* ♻️ Restructured instance API functions and added tests PR @rcannood

* 📝 Refactored documentation PR @rcannood

# 2026-03-20 db 2.3.1

* 🐛 Fix incorrect read-only warning for "ln.DB(...)" PR @Koncopd

* 📝 Coin the term "sync" instead of "transfer" for syncing data
  between databases PR @falexwolf

# 2026-03-18 db 2.3.0

Architecture:

* 🏗️ Create "lamindb-core" to distribute "lamindb" without optional
  dependencies PR @ap-- @falexwolf

UX improvements:

* 🚸 Improve "ln.connect()" performance and robustness PR @falexwolf

* 🚸 Enable feature-based query expressions PR @falexwolf

* 🚸 Allow semantic queries by run & branch status PR @falexwolf

* 🚸 "FeatureManager.add_values()", "set_values()", and
  "remove_values()" accept feature objects, not just feature name
  strings PR @falexwolf

* 🚸 Enable configuring env modules PR @falexwolf

* 🚸 Refresh federated AWS credentials on the "botocore" level PR
  @Koncopd

* 🚸 Add informative "record.describe()" PR @falexwolf

* 🚸 Print warning if truncating a query result PR @falexwolf

* 🚸 Refactor agent plan saving to strip TODOs from description PR
  @falexwolf

* 🚸 Treat composite suffixes with ".zarr" at the end differently from
  other unspecified composite suffixes PR @Koncopd

* 🚸 Allow users to enforce ignoring local aws credentials via
  "system.env" PR @Koncopd

* 🚸 Optimize DB interactions in "lightning" integration PR @falexwolf

* 🚸 Warn when connecting the default database to a non-writable
  connection PR @Koncopd

* 🚸 Adapt logging to refreshable credentials PR @Koncopd

* 🚸 Do not issue track warning on clones PR @Koncopd

Database:

* 🗃️ Make "feature_id" on "TransformRecord" link model nullable PR
  @falexwolf

Bug fixes:

* 🐛 Fix model field tracking via "_populate_tracked_fields" for
  deferred fields PR @Koncopd

* 🐛 Fix root inference for "huggingface" paths PR @Koncopd

* 🐛 Fix synchronization of directory artifacts when the destination
  directory exists but is empty PR @Koncopd

* 🐛 Fix feature collisions in lightning integration PR @falexwolf

* 🐛 Account for host database in "FeatureManager.__getitem__" PR
  @sunnyosun

MappedCollection:

* 🚸 Improve data retrieval in "MappedCollection" PR @mojtababahrami

* 🚸 Allow users to specify partially available keys in
  "MappedCollection" and retrieve "raw.X" PR @Koncopd

Ontologies:

* 🍱 Support CELLxGENE 7.0.0 PR @Zethson

Docs:

* 📝 Improve the "lamindb.record" document PR @falexwolf

* 📝 Document refresh behavior of federated s3 credentials for
  "tiledbsoma" PR @Koncopd

# 2026-03-16 hub 1.21.0

* ✨ Enable linking transforms to a record PR @chaichontat

* 🚸 Enhance artifact and transform cards on record page with
  pagination and filtering PR @chaichontat

* 🚸 Enable searching for "str"-dtype features in sheets PR @falexwolf

* 🚸 Set default sorting to "updated_at" descending for artifacts PR
  @chaichontat

* 🐛 Resolve "ULabel" types in sheets' "dtype" display and enforce
  these types during edit mode PR @chaichontat

* 🐛 Disambiguate categorical values in CSV parser PR @chaichontat

* 💄 Remove root element from typed sidebars for records, ulabels,
  features & schemas PR @falexwolf

* 💄 Do not display schema names on records sidebar PR @falexwolf

# 2026-03-13 R 1.3.0

🚸 Simplify connecting to an instance PR @lazappi

Connecting via the main module object now works with "lamindb>=2.3":

 ln <- laminr::import_module("lamindb")
 ln$connect("<owner>/<instance>")

Other changes:

* ⬆️ Bump expected lamindb version to 2.3.0 PR @lazappi

* ✨ Add "silent" arguments to "get_current_lamin_*()" utils PR
  @lazappi

* ✨ Add "ignore_none" argument to "get_current_lamin_instance()" PR
  @lazappi

* 🚸 Add "as.list()" coercion method for "BasicQuerySet" PR @lazappi

* 🚸 Use absolute files paths for tracking PR @ap--

* 🚸 Warn that Python messages will be lost on Jupyter PR @lazappi

# 2026-03-12 hub 1.20.0

* ✨ Show features in records list PR @chaichontat

* ✨ Link artifacts to records PR @chaichontat

* 🐛 New features default to being nullable as in "lamindb" PR
  @chaichontat

# 2026-03-05 hub 1.19.0

* ✨ Add sheet column filtering PR @chaichontat

* 🐛 Fix truncated run counts PR @chaichontat

# 2026-03-02 blog

* 📝 A data lakehouse for biology's sparse measurements PR @jejomath

# 2026-03-04 hub 1.18.0

* ✨ A more detailed record page PR @chaichontat @cydneyn @sunnyosun

* ✨ Display README on the Artifact, Collection, Transform, and Schema
  detail page PR @sunnyosun

# 2026-03-03 hub 1.17.0

Features & major design improvements:

* ✨ Merge Requests v0.1 under new Changes tab includes Database
  Writes log PR @keller-mark

* ✨ Overhaul the design of the Records page PR @cydneyn @sunnyosun
  @chaichontat

GUI polish:

* 💄 Improve nested scrolling behavior PR @chaichontat

* 💄 Increase artifact dialog size PR @chaichontat

* 💄 Simplify Team page PR @falexwolf

Frontend routes:

* 🚚 Rename the "write-logs/" route to "dbwrites/" PR @falexwolf

Bug fixes:

* 🐛 Fix instance deletion in on-prem infra due to missing permissions
  PR @Koncopd

* 🐛 Improve pagination in artifact tables PR @chaichontat

* 🐛 Invalidate instance README display cache on artifact upload PR
  @chaichontat

* 🐛 Fix instance deletion in on-prem infra due to missing permissions
  PR @falexwolf

# 2026-03-02 blog

* 📝 Interactive visualization of multimodal and spatial data with
  Vitessce PR @keller-mark

# 2026-02-27 blog

* 📝 Symbolic memory for biological R&D PR @falexwolf

# 2026-02-26 hub 1.16.5

* 🐛 Fix allowed suffixes in launch input selection PR @sunnyosun

# 2026-02-25 hub 1.16.4

* 🚸 Respect Nextflow MIME suffix behavior in Launch page inputs form
  PR @sunnyosun

* 💄 Account for recreated artifacts and recreated collections in
  lineage explorer PR @falexwolf

* 💄 Display run entrypoints in transform, run, and lineage views PR
  @falexwolf

* 💄 Pricing page v2 PR @falexwolf

# 2026-02-24 db 2.2.1

* 🚸 Add backward compat for "lamin switch --branch" PR @falexwolf

* 🚸 Improve logging during "@ln.flow()" and "@ln.step()" PR
  @falexwolf

* 🚸 Enable defining a feature that restricts to a subset of artifacts
  PR @falexwolf

* 🚸 Better handling of problematic access token refreshes PR @Koncopd

* ⚡️ Call database RPC functions as read-only PR @Koncopd

# 2026-02-19 db 2.2.0

-[ ⚠️ Run "lamin migrate deploy" ]-

* 🗃️ Add a "_status_code: int" field to "Branch" and "BaseBlock" PR
  @falexwolf

All instances connected to LaminHub have been migrated and there is no
need to act.

If you are an admin of a self-managed instance, please migrate your
database with "lamin migrate deploy".

For details see the Compatibility Matrix and the source code.

-[ Examples: Change management with branching, merging, and Merge
Requests ]-

To create a contribution branch and switch to it, run:

 lamin switch -c my_branch

To merge a contribution branch into "main", run:

 lamin switch main  # switch to the main branch
 lamin merge my_branch  # merge contribution branch into main

To see the current branch along with other information, run:

 lamin info

To annotate the current branch with a "README.md", run:

 lamin annotate branch --readme README.md

To comment on the current branch, run:

 lamin annotate branch --comment "I think we should revisit this, tomorrow, WDYT?"

To describe the current branch (optionally include comments), run:

 lamin describe branch --include comments

To trace on which branch a "SQLRecord" object was created, run:

 sqlrecord.created_on.describe()

To open a Merge Request for a branch:

 lamin update branch --status draft  # for current branch
 lamin update branch --name my_branch --status review  # for any branch

Just like Pull Requests on GitHub, branches are never deleted so that
the provenance of a change stays traceable.

For more info, see: docs.lamin.ai/lamindb.branch

-[ Examples: Agent plan traceability ]-

Saving an agent plan automatically tags with "artifact.kind = "plan""
and infers a "key" starting with ".plans/":

 lamin save /path/to/.cursor/plans/my_task.plan.md
 lamin save /path/to/.claude/plans/my_task.md

Link an agent plan against a run:

 ln.track(plan=".plans/my-agent-plan.md")

This will link the "plan" artifact to a run in the same way in which
"transform", an initiating run ("initiated_by_run") and
"report"/"environment" artifacts are linked to the run.

While the "transform" acts as the deterministic source code for the
run and "initiated_by_run" enables higher-level runs in workflow
orchestration, the agent "plan" complements these two by allowing the
linkage of plan that steers a non-deterministic agent.

Highlights:

* ✨ Add "lamin merge" command, add "lamin switch -c" option &
  simplify "lamin switch" syntax PR @falexwolf

* ✨ Add agent plan traceability PR @falexwolf

* ✨ Enable linking a "README.md" to and commenting for any entity PR
  @falexwolf

* ✨ Introduce Merge Request states on branches PR @falexwolf

* ✨ Add "lamin update" and homogenize "lamin get" with other commands
  PR @falexwolf

* ✨ Add "UPath.from_auth(...)" PR @Koncopd

UX:

* 🚸 Quality of life improvements for saving via the CLI: saving
  plans, sync with git, annotating with version tags PR @falexwolf

* 🚸 Extend "lamin describe" to more entities PR @falexwolf

* 🚸 Prettier display for "dtype" for "Record" and "ULabel" sub types
  in "schema.describe()" PR @falexwolf

* 🚸 Track "record_type.to_dataframe()" as an input for the current
  run PR @falexwolf

* 🚸 Make it easier to query for all output artifacts including
  recreated ones PR @falexwolf

* 🚸 Include comments in "SQLRecord.describe()" when passing "include
  = "comments"" PR @falexwolf

* 🚸 Include comments in "lamin describe" upon "--include comments" PR
  @falexwolf

* 🚸 Re-raise "InvalidArgument" in "lamin annotate" as
  "ClickException" PR @falexwolf

* 🚸 Nicer error for "lamin switch" to non-existing branch PR
  @falexwolf

Performance:

* ⚡ Speed-up lamindb import by lazily importing pandas, anndata &
  pyarrow PR @falexwolf @Zethson @Koncopd

Architecture:

* 🏗️ Reconcile "is_latest" state across branches PR @falexwolf

Bux fixes:

* 🐛 Fix bracket handling of describe PR @Zethson

* 🐛 Scope feature query by schema member types in "Curator" PR
  @Zethson

* 🐛 Fix DB snapshot sync PR @Zethson

Docs:

* 📝 Add videos to docs, polish typos and wording PR @falexwolf

Security:

* 🔒️ Scope AWS credential caches to users PR @Koncopd

Dependencies:

* ⬆️ Relax AnnData version constraint PR @Zethson

# 2026-02-19 hub 1.16.3

* 🐛 Fix between-page sidebar type navigation PR @chaichontat

* 🐛 Fix pagination bar position in sheets PR @sunnyosun

* 🐛 Run metadata settings includes the dtype sheet when a feature has
  the same dtype PR @chaichontat

# 2026-02-18 hub 1.16.2

* ⬆️ Upgrade to LaminDB v2.2a3 PR @falexwolf

# 2026-02-17 hub 1.16.1

* 🚸 Fix clunky UX in left sidebar of typed entities PR @chaichontat

* 💄 Simplify features header in artifact detail page, should be
  "Values" not "Categories / Values" PR @falexwolf

# 2026-02-15 hub 1.16.0

* ⬆️ Enable compatibility with lamindb 2.2

* 💄 Do not show "pertdb" link tables PR @sunnyosun

* 💄 Fix text truncation in list cells of sheets PR @sunnyosun

* 💄 Fix badge for recreated output artifacts PR @sunnyosun

# 2026-02-12 hub 1.15.2

* 🚸 Support more path types from nextflow schema PR @sunnyosun

* 🐛 Fix "pertdb" copy button content PR @sunnyosun

# 2026-02-11 hub 1.15.1

* 🐛 Fix "Project" feature link PR @sunnyosun

# 2026-02-11 nf 0.5.1

* 🐛 Exclude work dir and assets from input artifacts PR @rcannood

# 2026-02-10 hub 1.15.0

High-level organization of the top navbar:

* 💄 Move "Records" tab to the left of "Features" PR @sunnyosun

* 💄 Move "ULabels" under "Records" tab PR @sunnyosun

* 💄 Fix string truncation display in sheets PR @sunnyosun

# 2026-02-09 db 2.1.2

UX:

* 🚸 Broaden curation to dtypes that are unions PR @Zethson

* 🚸 More debug logging in case instance creation on hub fails due to
  quota exceeded PR @Koncopd

Performance:

* ⚡️ Download large single files from s3 with "boto3" by default in
  "artifact.cache()" PR @Koncopd

Bug fixes:

* 🐛 Fix initializing an instance with a cloud storage and the db
  parameter passed PR @Koncopd

# 2026-02-09 hub 1.14.0

* 🚸 Better experience saving markdown notes PR @chaichontat

* 🐛 Fix text overflow for sheet names on "Launch" page PR
  @chaichontat

* 🐛 Fix the count & filtering for recreated artifacts in the run
  input/output panes PR @sunnyosun

* 🐛 More robust error handling for account handle suggestions PR
  @chaichontat

* 🐛 Properly show a 404 response for artifacts when non-existent PR
  @chaichontat

* 💄 Polish the "Overview" page PR @ninhja01 @chaichontat

* 💄 Display run params PR @falexwolf

* 💄 Add the story to the About page PR @falexwolf @chaichontat

# 2026-02-02 db 2.1.1

UX:

* 🚸 Better detection of read-only connections for write errors and
  tracking PR @Koncopd

* 🚸 A "lamin settings cache-dir reset" CLI command for resetting the
  cache directory to the default path PR @Koncopd

* 🚸 A "S3QueryPath.is_bucket_versioned()" method to check if the
  bucket in an s3 path is versioned PR @Koncopd

Bug fixes:

* 🐛 Fix edge case in Django reset during "ln.setup.init(...)" PR
  @Koncopd

# 2026-02-03 nf 0.5.0

This release revamps the configuration ("nextflow.config") for more
control over which artifacts are registered and which metadata is
attached ("kind", "projects", "ulabels"). Here is an example Nextflow
config:

 lamin {
 instance = "laminlabs/lamindata"
 api_key = secrets.LAMIN_API_KEY
 output_artifacts {
 rules {
 output {
 pattern = ".*"
 order = 1
 type = "include"
 project_uids = ["AbCdEfGhIjKl"]
 ulabel_uids = ["AbCd0123"]
 }
 // don't publish state.yaml files
 yaml {
 pattern = ".*\\.state\\.yaml"
 type = "exclude"
 order = 10
 }
 }
 }
 }

New functionality:

* ✨ Control which files are registered as artifacts using pattern-
  based rules PR @rcannood

* ✨ Link projects and ulabels to transforms, runs, and artifacts with
  new "run" and "transform" config sections for granular control PR
  @rcannood

* ✨ New "api" section for connection settings replaces root-level
  fields PR @rcannood

UX:

* 🚸 Better mapping of HTTP error codes from the LaminDB API PR
  @rcannood

Bug fixes:

* 🐛 Fixed edge case in tracking input files and improved S3 path
  rendering PR @rcannood

Deprecations: The following API components are now deprecated and are
scheduled for removal in v0.6

| --- | --- | --- |
| Type | Deprecated | Replacement |
| =================================== | =================================== | =================================== |
| Config | "project" | "project_uids" |
| --- | --- | --- |
| Config | "supabase_api_url", | "api { ... }" section |
| "supabase_anon_key", |
| "max_retries", "retry_delay" |
| --- | --- | --- |
| Function | "getArtifactFromUid()" | "file('lamin://owner/instance/ar |
| tifact/uid')" |
| --- | --- | --- |

# 2026-02-02 db 2.1.0 | bionty 2.1.0

MLOps:

* 🚸 Overhaul the pytorch "lightning" integration PR @Zethson
  @jorenretel

Notebooks, scripts, workflows:

* 🚸 Recognize packaged python source code across "track()",
  "@flow()", and "@step()" PR @falexwolf

* 🚸 Default to creating a global run context in "ln.flow()" PR
  @falexwolf

* 🚸 Serialize "Path", "UPath", and handle "None" in transform
  "params" PR @falexwolf

* 🚸 Reflect user CLI calls in transform description PR @falexwolf

* 🚸 Improve error message for running a script or notebook outside
  the development directory PR @falexwolf

Validation:

* 🚸 Unify validating features with and without the presence of a
  schema, fix parsing ISO-format strings as datetime if mapped on a
  feature with "dtype=str" PR @falexwolf

CLI:

* 🚸 Delete records via CLI PR @falexwolf

* 🚸 Better error behavior in "lamin save" when transform is on a
  different branch PR @sunnyosun

General UX:

* 🚸 Enable convenient re-upload of local file after upload failure PR
  @falexwolf

* 🚸 Return information about deleted objects rather than "None" upon
  hard delete PR @falexwolf

* 🚸 Introduce safe-guards in updating the space of artifacts PR
  @Koncopd

* 🚸 Switch on SQL logging if "ln.settings.verbosity" is ""debug"" PR
  @sunnyosun

* 🚸 Raise canonical "InstanceNotFoundError" in "Registry.connect()"
  PR @falexwolf

* 🚸 Allow users to pass ids of foreign keys in "Artifact()"
  constructor PR @Koncopd

* 🚸 Check local path existence on "artifact.save()" PR @Koncopd

Performance:

* ⚡️ Much faster permanent run & transform deletion PR @falexwolf

* ⚡️ 1 sec speed-up for basic CLI calls through optimized
  "lamindb_setup" import time PR @falexwolf

Ontology updates in "bionty":

* 🚸 Default the "CellLine" source to "cellosaurus" PR @sunnyosun

* 🚸 More robust "add_source" PR @sunnyosun

* 🚸 Allow users to set "bionty" root dir via "BIONTY_ROOT_DIR" env
  variable PR @Koncopd

* 🍱 New ontology version: Gene, release-114 PR PR @sunnyosun @Zethson

* 🍱 New ontology version: Gene, release-113 PR @sunnyosun

* 🍱 New ontology version: Organism PR @sunnyosun

* 🍱 Update standard ontologies PR @sunnyosun

Better conventions in CLI (backward compatible):

* 🚚 Support "key"-based deletion in "lamin delete" PR @falexwolf

* 🚚 "lamin cache" is now "lamin settings cache-dir", refactor
  settings managemennt PR @falexwolf

* 🚚 More consistent "lamin switch" and "lamin create" commands PR
  @falexwolf

The "wetlab" plugin was renamed to "pertdb" (backward compatible):

* 🚚 Rename "wetlab" to "pertdb" PR @falexwolf

Bugs:

* 🐛 Refactor & fix feature-based queries for records PR @falexwolf

* 🐛 Fix PyYAML serialization of NotebookNode PR @Zethson

* 🐛 Fix "Artifact.from_dataframe()" to support path input PR @Zethson

* 🐛 Fix "standardize()" ignoring passed source PR @Zethson

Docs:

* 📝 Convert guides to markdown format PR @falexwolf

* 📝 Legible API reference for "lamindb.models" PR @falexwolf

* 📝 Consistent reference to Python/R alternative for all CLI
  commands, expand "lamin annotate" PR @falexwolf

* 📝 Document backward relationships and add "RelatedManager[T]" to
  "ManyToMany" type annotations PR PR @falexwolf

* 📝 README improvements PR @falexwolf

Refactoring:

* ♻️ Rather flag "_storage_ongoing" than "_storage_completed" PR
  @falexwolf

* ♻️ Efficiently encode uploading information PR @falexwolf

* ♻️ Fully leverage "Context" to manage the run context of function
  executions PR @falexwolf

* ♻️ Use publishable LaminHub key PR @Koncopd

* ♻️ Remove internal "use_proxy_db" option PR @Koncopd

# 2026-01-31 hub 1.13.0

* ⚡ Update JWT signing from HS256 to ES256 for better performance PR
  @fredericenard

* 💄 Display output and input records on run detail page PR @falexwolf

# 2026-01-27 hub 1.12.1

* 🐛 Fix an issue in the Seqera Launch connector PR @chaichontat

# 2026-01-26 hub 1.12.0

* ✨ Configurable default Seqera workspace and compute environment PR
  @chaichontat

* ✨ Two new endpoints to help users authenticate and interact with
  instances through the API PR @fredericenard

* 🐛 Fix attaching a space to an instance in case an org admin isn't a
  collaborator of that space PR @fredericenard

* 🐛 Prevent empty results when searching Artifacts PR @chaichontat

* 💄 Landing page: re-format taglines and update schematic PR
  @chaichontat

# 2026-01-21 nf 0.4.0

✨ This release allows for the automatic tracking of input artifacts
by discovering their remote URIs, using functionality implemented in
Nextflow 25.10. Hence, it requires Nextflow >=25.10.0 PR @rcannood

 export NXF_VER=25.10.2
 nextflow run <pipeline> \
 --input "https://raw.githubusercontent.com/..." \
 -with-report report.html

# 2026-01-20 hub 1.11.0

* ✨ Beta: A Logs page with "DbWrite" events PR - frontend:
  @chaichontat backend: @Koncopd

* ✨ Support children type in record registration PR @chaichontat

* 🚸 Handle suggestions when adding users PR @chaichontat

* 🐛 Fix run metadata selection state PR @chaichontat

* 💄 Show records on the overview page PR @falexwolf

# 2026-01-14 hub 1.10.0

* ✨ Add "/artifacts/by-path" endpoint PR @fredericenard

* 🐛 Write run annotations on the Launch page into the "RunRecord"
  registry PR @falexwolf

* 📝 Improve landing page - metadata and lakehouse sections PR
  @falexwolf

# 2026-01-13 hub 1.9.1

* 🐛 More strictly enforce schema during UI-based record creation PR
  @chaichontat

* 🐛 Broaden database server access permissions to include shared
  database servers PR @fredericenard

* 📝 Improve landing page - introduce tags and improve language PR
  @falexwolf

# 2026-01-13 R 1.2.2

* ⬆️ Update minimal "lamindb" version to 2.0.0 PR @falexwolf PR
  @lazappi

# 2026-01-12 nf 0.3.0

* ✨ Implement "FileSystem" for "lamin://" URIs PR @rcannood

* ⬆️ Bump "lamindb" to v2 PR @falexwolf

* 🚸 Update formatting of "source_code" when a new transform is
  created PR @rcannood

* 📝 Add version compatibility table PR @rcannood

# 2026-01-12 hub 1.9.0

* ✨ Transform search bar also understands run names and UIDs PR
  @chaichontat

* 🚸 Default to not listing inferred schemas without names PR
  @chaichontat

* 🐛 Fix the broken "New schema" button on the records page due to
  "lamindb" v2 PR @chaichontat

* 🐛 Fix the broken pipeline "Launch" button due to "lamindb" v2 PR
  @sunnyosun

# 2026-01-11 db 2.0.1

* 🚸 Backward compatibility for querying features by "dtype" PR
  @falexwolf

# 2026-01-11 db 2.0.0

This release makes the database schema fully consistent and thereby
improves UX, integrity, and enables long-term stability.

-[ ⚠️ With the exception of previous deprecations, your code continues
to run as is, but you will receive new warnings about renamed API
components. ]-

Main changes:

| --- | --- | --- | --- |
| What | Before | After | Backward compatible |
| =========================== | =========================== | =========================== | =========================== |
| Function tracking | "@ln.tracked()" | "@ln.flow()", | ✓ |
| "@ln.step()" |
| --- | --- | --- | --- |
| "Feature" field | "dtype" | "_dtype_str" | ✓ |
| --- | --- | --- | --- |
| "Schema" field | "n" | "n_members" | ✓ |
| --- | --- | --- | --- |
| "IsVersioned" field | "version" | "version_tag" | ✓ |
| --- | --- | --- | --- |
| "Transform" field | "type" | "kind" | ✓ |
| --- | --- | --- | --- |
| "Artifact" field | "feature_sets" | "schemas" | ✓ |
| --- | --- | --- | --- |
| "Feature" field | "coerce_dtype" | "coerce" | ✓ |
| --- | --- | --- | --- |
| "Schema" field | "coerce_dtype" | "coerce" | ✓ |
| --- | --- | --- | --- |
| "FeatureValue" registry | "FeatureValue" | "JsonValue" | ✓ |
| --- | --- | --- | --- |

Private fields that are now public:

| --- | --- | --- | --- |
| What | Before | After | Backward compatible |
| =========================== | =========================== | =========================== | =========================== |
| "Artifact" field | "_subsequent_runs" | "recreating_runs" | ✗ |
| --- | --- | --- | --- |
| "Artifact" field | "_feature_values" | "json_values" | ✗ |
| --- | --- | --- | --- |
| "Run" field | "_recreated_artifacts" | "recreated_artifacts" | ✗ |
| --- | --- | --- | --- |
| "SQLRecord" field | "_branch_code" (only on | "branch_id" | ✗ |
| DB-level) |
| --- | --- | --- | --- |

Changes to auxiliary (JSON) fields:

| --- | --- | --- | --- |
| What | Before | After | Backward compatible |
| =========================== | =========================== | =========================== | =========================== |
| "Run" field | "cli_args" (in "_aux") | "cli_args" ("CharField(m | ✓ |
| ax_length=1024)") |
| --- | --- | --- | --- |
| "Feature" field | "default_value" (in | "default_value" | ✓ |
| "_aux") | ("JSONField") |
| --- | --- | --- | --- |
| "Feature" field | "nullable" (in "_aux") | "nullable" | ✓ |
| ("BooleanField") |
| --- | --- | --- | --- |
| "Schema" field | "flexible" (in "_aux") | "flexible" | ✓ |
| ("BooleanField") |
| --- | --- | --- | --- |
| "Artifact" field | "_is_saved_to_storage_lo | "_save_completed" (in | ✗ |
| cation" (in "_aux") | "_aux") |
| --- | --- | --- | --- |

On link models with labels:

| --- | --- | --- | --- |
| What | Before | After | Backward compatible |
| =========================== | =========================== | =========================== | =========================== |
| "IsLink" model | "feature_ref_is_name" | removed | ✗ |
| --- | --- | --- | --- |
| "IsLink" model | "label_ref_is_name" | removed | ✗ |
| --- | --- | --- | --- |

For completeness, changes in recently introduced unused API
components:

| --- | --- | --- | --- |
| What | Before | After | Backward compatible |
| =========================== | =========================== | =========================== | =========================== |
| "RootBlock" registry | "RootBlock" | "Block" | ✗ |
| --- | --- | --- | --- |
| "Block" field | "context" | "key" | ✗ |
| --- | --- | --- | --- |
| "BaseBlock" field | "type" | "kind" | ✗ |
| --- | --- | --- | --- |
| "Run" field | "_logfile" | removed | ✗ |
| --- | --- | --- | --- |
| "Transform" field | "config" | removed | ✗ |
| --- | --- | --- | --- |
| "Transform" field | "flow" | removed | ✗ |
| --- | --- | --- | --- |
| "Transform" field | "is_flow" | removed | ✗ |
| --- | --- | --- | --- |
| "Transform" field | "_template" | removed | ✗ |
| --- | --- | --- | --- |

Changes in the "bionty" and "wetlab" modules:

| --- | --- | --- | --- |
| What | Before | After | Backward compatible |
| =========================== | =========================== | =========================== | =========================== |
| "BioRecord" registry | "uid" (X chars) | "uid" (14 chars) | "*" ".get()" of the X |
| chars uid continues to |
| work |
| --- | --- | --- | --- |

"*" uids are re-encoded to 14 chars with the first X chars conserved.

Changes in the "wetlab" module:

| --- | --- | --- | --- |
| What | Before | After | Backward compatible |
| =========================== | =========================== | =========================== | =========================== |
| "Experiment" registry | "Experiment" | removed | ✗ |
| --- | --- | --- | --- |
| "BioSample" registry | "BioSample" | removed | ✗ |
| --- | --- | --- | --- |
| "TechSample" registry | "TechSample" | removed | ✗ |
| --- | --- | --- | --- |
| "Donor" registry | "Donor" | removed | ✗ |
| --- | --- | --- | --- |
| "Well" registry | "Well" | removed | ✗ |
| --- | --- | --- | --- |
| "GeneticPerturbation" | "system" | "type" | ✗ |
| field |
| --- | --- | --- | --- |
| "CompoundPerturbation" | "targets" | removed | ✗ |
| field |
| --- | --- | --- | --- |
| "Compound" field |  | "targets" | ✓ |
| --- | --- | --- | --- |

If you have data in removed registries you'll see a warning that your
data gets exported to parquet files. You can import these parquet
files into the "Record" registry under an "Experiment" type without
losing of functionality.

-[ ⚠️ After migrating databases to v2 via "lamin migrate deploy"
"lamindb" package installations with v1 will raise errors. This is the
last planned database migration that breaks older clients. ]-

All instances connected to LaminHub have been migrated and there is no
need to act.

If you are an admin of a self-managed instance, please migrate your
database with "lamin migrate deploy".

For details see the Compatibility Matrix and the source code.

-[ ⚠️ For "laminr" and "nf-lamin" users ]-

For "laminr" users with an *auto-managed reticulate environment*,
please run this:

 reticulate::py_require("lamindb>=2.0.1") # DO THIS FIRST
 ln <- laminr::import_module("lamindb")

For "nf-lamin" users, please upgrade to "0.3.0".

Removals:

* 🔥 Remove deprecated v1 API components PR @falexwolf

Features:

* ✨ Track shell scripts PR @falexwolf

* ✨ Enable managing workflows by decorating functions with
  "@ln.flow()" and "@ln.step()" and deprecate "@ln.tracked()" PR
  @falexwolf

Architecture:

* 🏗️ For more robustness and to convey the field's special nature in
  the API and the database schema, replace "Feature.dtype" with
  "Feature._dtype_str" to now hold a serialization that links object
  types ("Record" + "ULabel") based on their "uid" instead of their
  "name" and type hierarchy PR @falexwolf

UX:

* 🚸 Add "feature.dtype_as_object" PR @sunnyosun

* 🚸 Add "description" argument to "Transform.from_git()" PR
  @falexwolf

* 🚸 Allow passing "_key_is_virtual" on "Artifact" creation PR
  @Koncopd

* 🚸 Raise "SystemExit" upon "InstanceNotFound" only from CLI PR
  @falexwolf

* 🚸 Raise error for init or import issues in "lamin io snapshot" PR
  @Zethson

* 🚸 Do not track inputs when calling "collection.artifacts.all()" PR
  @Koncopd

* 🚸 Raise a clear error if calling "CanCurate" and similar registry
  class methods on objects PR @falexwolf

* 🚸 Sort features in "describe()" PR @falexwolf

Database-level changes:

* 🗃️ Rename "RootBlock" to "Block" with a column "key" akin to
  "Artifact" and "Transform" PR @falexwolf

* 🗃️ Refactor "_storage_completed" mechanism and remove unique
  constraints on type names PR @falexwolf

* 🗃️ Migrate most auxiliary fields to SQL columns PR @falexwolf

* 🗃️ Simplify "Transform" PR @falexwolf

* 🗃️ Rename "IsVersioned.version" to "IsVersioned.version_tag",
  "Transform.type" to "Transform.kind", "FeatureValue" to "JsonValue",
  "BaseBlock.type" to "BaseBlock.kind", delete "Transform._template"
  and "Run._logfile" PR @falexwolf

* 🗃️ Rename "Artifact._subsequent_runs" to "Artifact.recreating_runs"
  and "Run._recreated_artifacts" to "Run.recreated_artifacts" PR
  @falexwolf

* 🗃️ Rename "SQLRecord._branch_code" to "SQLRecord.branch_id" and
  remove "feature_ref_is_name" and "label_ref_is_name" fields from
  link models PR @falexwolf

* 🗃️ Rename "Artifact.feature_sets" to "Artifact.schemas" PR
  @falexwolf

* 🗃️ Migrate the "Feature" and "Schema" database tables to LaminDB v2
  PR @falexwolf

* 🗃️ Swap accessor names for "SchemaComponent" links, consistent
  "ManyToMany" field names for "RecordRecord" links PR @falexwolf

* 🗃️ Better names for the "ManyToMany" fields for the annotating runs
  and artifacts of an "Artifact" PR @falexwolf

Bug fixes:

* 🐛 Account for size 0 environments PR @falexwolf

Bionty:

* 🎨 Re-encode BioRecord uid to 14 chars PR @sunnyosun

* 🗃️ Migrations for bionty v2 PR @sunnyosun

* ♻️ Refactor require_organism PR @sunnyosun

* 🗃️ Migrations for LaminDB v2 PR @falexwolf

* 🔥 Remove deprecated "display_available_sources" PR @falexwolf

Wetlab:

* 🗃️ Migrations for wetlab v2 PR @sunnyosun

* 🗃️ Migrations for LaminDB v2 PR @falexwolf

* 🗃️ Create a composite index for "artifact", "perturbationtarget"
  fields in "ArtifactPerturbationTarget" PR @Koncopd

* 🗃️ Create a composite index for "artifact", "geneticperturbation"
  fields in "ArtifactGeneticPerturbation" PR @Koncopd

Docs:

* 📝 Improve the "Space" document PR @falexwolf

* 📝 Improve the "Artifact.replace()" docs PR @falexwolf

* 📝 Improve FAQ doc on trashing and archiving PR @falexwolf

* 📝 Render return type annotations of "Artifact.open()" in docs PR
  @falexwolf

Config:

* 🔧 Introduce "InstanceSettings.is_managed_by_hub" PR @falexwolf

* 🔧 Rename "zarr" extra to "zarr_v2" PR @Koncopd

* 🔧 Add ".vitessce.json" to loaders PR @namsaraeva

Refactoring:

* ♻️ Refactor "require_organism" PR @sunnyosun

* ♻️ Better re-use Django's "ObjectDoesNotExist" and
  "MultipleObjectsReturned" PR @falexwolf

* ♻️ Return file size in "hash_file()" PR @falexwolf

* ♻️ Squash migrations and re-build SQLite init database PR @falexwolf

* ♻️ More verbose migration integrity check PR @falexwolf

* ♻️ Call "lamin migrate deploy" even if initializing from pre-built
  sqlite file PR @falexwolf

Dependencies:

* ⬆️ Bump "fsspec" packages upper bound PR @Koncopd

* ⬆️ Bump "anndata" upper bound PR @Koncopd

* ⬆️ Set the correct lower bound for "websockets" PR @Koncopd

# 2026-01-11 hub 1.8.0

* 🐛 Fix special character handling in filters PR @chaichontat

* 🐛 Fix filtering state leakage across different pages PR
  @chaichontat

* 🐛 Fix feature hover card not functioning correctly PR @chaichontat

# 2026-01-03 hub 1.7.0

* 🚸 Infinite scroll for transform list PR @chaichontat

* 📝 Update data validation video PR @namsaraeva

* 📝 Improve language on landing page PR @falexwolf