## Changelog 2026

Note:

 Get notified by watching releases for git repositories: lamindb ·
  laminhub · laminr · nf-lamin · bionty Follow updates on social
  media: LinkedIn · X · BlueSky See updates in other years: 2025 ·
  2024 · 2023 · 2022

# 2026-08-10 hub 1.52.0

* ✨ Show spaces in feature lists PR @chaichontat

* ✨ Show organism beside gene symbols PR @chaichontat

* 🚸 Show branch changes on detail pages PR @chaichontat

* 🐛 Make compact feature summaries expandable PR @chaichontat

* 🐛 Fix record search on the database writes page PR @chaichontat

# 2026-08-07 nf 0.9.0

* ✨ Store the Seqera Platform watch url on the run PR @rcannood

* ✨ Allow annotating artifacts PR @rcannood

* ✨ Resolve lamin uris anonymously PR @rcannood

* ✨ Resolve toRealPath() to the underlying storage path PR @rcannood

* ⚡️ Upsert link records instead of get-then-create PR @rcannood

* ⬆️ Update lamin-api-client to 0.1.0 PR @rcannood

* 🐛 Mark cancelled runs as aborted instead of errored PR @rcannood

# 2026-08-04 db 2.9.1

* 🐛 Fix "schema.slots" when no instance is configured PR @Koncopd

# 2026-08-03 db 2.9.0

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

🗃️ Add fields: "Schema.suffix" and "Collection.schema"; more stringent
unique constraints when "feature is NULL" PR PR PR @falexwolf

All databases that are connected to LaminHub have been migrated and
there is no need to act.

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

For details see the Compatibility Matrix and the source code.

Features:

* ✨ Track GitHub Copilot sessions PR @Ebad371

* ✨ Track token counts, agent steps, and tool calls in addition to
  agent transcripts PR @falexwolf

* ✨ Process http directories correctly for hashes & sizes PR @Koncopd

API:

* 🚸 Deprecate "Schema.add_optional_feature()" in favor of
  "Schema.add()" PR @falexwolf

* 🚸 Simplify output of "schema.describe()" PR @falexwolf

* 🚸 More robust ".describe()" for corrupted schemas PR @falexwolf

* 🚸 Expose ".cache()" on "UPath" PR @falexwolf

* 🚸 Avoid double logging if passing "--here" to "lamin connect" PR
  @falexwolf

* 🚸 Check key on init of "sqlrecord" and saving "artifact" PR
  @Koncopd

* 🚸 Error for leading slash in key PR @Koncopd

* 🚸 Relax key checks PR @Koncopd

* 🚸 Clean CLI surface for finishing a tracked session PR @falexwolf

Database:

* 🗃️ Add field ".schema" to "Collection", parallel to "Artifact" and
  "Record" PR @falexwolf

* 🗃️ Add field ".suffix" to "Schema", parallel to "Artifact.suffix" PR
  @falexwolf

Bug fixes:

* 🐛 Fix error on large uploads and lacking progress print for "gcsfs"
  PR PR @Koncopd

* 🐛 Skip hash for http if no ETag present PR @Koncopd

* 🐛 Check expiration of the db token from "LAMIN_DB_TOKEN" env
  variable PR @Koncopd

* 🐛 Clear instance context ("branch", "space") cache from "settings"
  on re-connect PR @Koncopd

* 🐛 Fix user messages missing from transcript HTML report PR @Ebad371

* 🐛 Harden Copilot/Claude session tracking with hard errors PR
  @Ebad371

Security:

* 🔒 Keep cached files inside the cache directory PR @amkram

* 🔒 Absolute path checks for cache PR @Koncopd

Dependencies:

* ⬆️ Bump "anndata" upper bound to "0.13.2", remove "scipy" upper
  bound PR @Koncopd

Docs:

* 📝 Fix agent-specific skill path and document the Copilot
  Local/Copilot toggle PR @Ebad371

* 📝 Simplify section on versioning and branching PR @falexwolf

# 2026-08-03 bionty 2.4.3

* 🍱 Update EFO URL to use GitHub release link PR @sunnyosun

* 🏷️ Mark as py.typed PR @falexwolf

# 2026-08-03 hub 1.51.0

* ✨ Show validating schemas on collection pages PR @chaichontat

* 💄 Consolidate run views to be consistent with record views and show
  ULabels on runs PR @falexwolf

# 2026-08-03 blog

* 📝 Agentic variant analysis of the 1000 Genomes Project using
  Polars, DuckDB, and lakehouses PR @Raaghav-Pillai

# 2026-07-30 atlas

* 🍱 Add atlas "1000genomes" PR

* 🍱 Add EWAS Data Hub PR

# 2026-07-20 hub 1.50.0

* ✨ Add scalar feature filters to artifact lists PR @chaichontat

* ✨ Add scalar sheet editing to experiment registration PR
  @chaichontat

* 🚸 Display schema information for collections PR @falexwolf

* 🍱 New video: Trace data, code & agents PR @sunnyosun

# 2026-07-17 hub 1.49.0

* ✨ Add drag-and-drop uploads to the markdown editor PR @sheetalgiri

* ✨ Add service accounts under organization settings PR @Ebad371

* 🐛 Fix project hierarchy navigation, search, and metadata PR
  @chaichontat

* 💄 Change layout of artifacts page, adjust fonts to be more
  consistent and style of parquet preview table PR @sheetalgiri

# 2026-07-17 db 2.8.1

* 🚸 Support parallel Claude Code sessions and prettify agent traces
  PR @Ebad371

* 🐛 Schema members should take precedence over flexible features PR
  @ishitajain9717

* 📝 Clearer "acid.md" doc PR @falexwolf

* 📝 Clearer organization of system "design.md" doc PR @falexwolf

# 2026-07-13 hub 1.48.0

* ✨ Show orchestrating runs in lineage graph PR @falexwolf

* 🚸 Distinguish spaces by shape and color PR @chaichontat

* 💄 Add icons for registries PR @sunnyosun

# 2026-07-13 db 2.8.0

Features:

* ✨ Track Claude Code sessions PR @Ebad371

API:

* 🚸 Make behavior of "to_dataframe(include="features')" consistent
  across "QuerySet" and "Registry" PR @falexwolf

* 🚸 More strictly enforce "CanonicalSuffix" PR @Koncopd @falexwolf

* 🚸 Do not treat the bionty default space differently from other
  entities PR @falexwolf

* 🚸 Merge branches without requiring global branch switch PR
  @sheetalgiri

* 🚸 Actually label reverse accessor for "output_transforms" PR
  @falexwolf

* 🚸 Add "to_artifact()" to "RecordSet" PR @falexwolf

* 🚸 Fix type annotations of "@strict_classmethod" and
  "@instance_or_classmethod" PR @falexwolf

* 🚸 More concise warning upon missing or surplus modules PR
  @falexwolf

* 🚸 Expose high-level field names on queries through M2M fields PR
  @falexwolf

* 🚸 Simplify lineage during record export via "to_dataframe()" PR
  @falexwolf

* 🚸 Add and use "SetupSettings.is_configured" PR @Koncopd

* 🚸 Handle reports of erroring runs in "@ln.flow()" better PR
  @falexwolf

CLI:

* 🚸 Speed up and prettify output of "lamin list branch" PR @falexwolf

* ⚡️ Speed up "lamin switch" by a factor 3 PR @falexwolf

Bug fixes:

* 🐛 Retain empty columns in "Record.from_dataframe()" PR
  @ishitajain9717

* 🐛 Fix "lamin create branch" hub path PR @falexwolf

* 🐛 Less stringent unique constraint in "ArtifactSchema" PR
  @falexwolf

* 🐛 Fix stale instance reference in "lamin connect --here" PR
  @falexwolf

* 🐛 Also save source code in "Transform.from_path()" PR @falexwolf

Docs:

* 📝 Dedicated agent skills via https://github.com/laminlabs/lamin-
  skills PR @falexwolf

* 📝 Add screenshots to the "Manage changes" guide PR @sheetalgiri

# 2026-07-10 hub 1.47.0

* ✨ Versioned notes as in LaminDB PR @chaichontat

* ✨ Implement exchange jwt exchange edge function and endpoint PR
  @Koncopd

* ✨ Support URL dtype PR @chaichontat

* ⚡️ Speed up scrolling in wide record tables PR @chaichontat

* 🐛 Allow clearing optional launch enums PR @chaichontat

# 2026-07-10 blog

* 📝 Scaling anndata training to the terabyte scale with annbatch PR
  @felix0097

# 2026-07-08 hub 1.46.0

* ✨ Introduce a preview for folder-like artifacts PR @sheetalgiri

* ⚡ Speed up loading of the artifact page PR @chaichontat

* 💄 Pricing page v4: Announce Beta Pro Plan at $10/month and spell
  out collaborator tiers PR @Ebad371

* 💄 Support tagging records with emojis PR @sunnyosun

# 2026-07-07 R 1.3.1

* 🚸 Support path detection in R Jupyter notebooks PR @lazappi

* 🚸 Enable wrapping python arguments with leading underscores PR
  @Koncopd

# 2026-07-06 hub 1.45.0

* ✨ Update branch page to display objects, comments, and a sidebar to
  change the branch status PR @sheetalgiri

* 🚸 Use project-aware sheet default names PR @chaichontat

* 🚸 Indicate ongoing upload PR @falexwolf

* 💄 A provenance header for all pages PR @falexwolf

* 💄 A more minimal design for the page headers across the app PR
  @sunnyosun

* 💄 Show records in lineage graph PR @falexwolf

# 2026-06-29 nf 0.8.3

* ✨ Add "max_workers" setting PR @rcannood

* 🚸 Improve permission denied errors PR @rcannood

* ⚡️ Use upsert behaviour to avoid additional api call PR @rcannood

* ⚡️ Add exponential backoff with jitter to API calls PR @rcannood

* ♻️ Refactor internals of the API interface PR @rcannood

* ⚗️ Add stress testing workflow PR @rcannood

# 2026-06-29 db 2.7.0

Features:

* ✨ Recognize "schema.index" in the "Record" API PR @sunnyosun

* ✨ Support schema transfer with related objects PR @falexwolf

UX:

* 🚸 Expose notes as a ".notes" attribute PR @falexwolf

* 🚸 Introduce "Feature.is_null()" as a predicate for filtering
  objects by whether they measure or do not measure a feature PR
  @falexwolf

* 🚸 Introduce "RecordSet" to allow exporting arbitrary sets of
  records PR @falexwolf

* 🚸 Throw an error if categorical values would be read from
  "RecordJson" PR @ishitajain9717

* 🚸 Reduce the default value for limit in "to_dataframe()" from 100
  to 20 PR @falexwolf

* 🚸 Allow passing urls to "lamin load" for records PR @falexwolf

* 🚸 Early fallback to SQLite clone PR @falexwolf

* 🚸 Add validation check for union dtypes PR @ishitajain9717

* 🚸 Expose "Transform.from_path()" PR @falexwolf

* 🚸 Display run URL instead of transform URL PR @falexwolf

* 🚸 Export sheet artifacts to the sheet's space PR @sunnyosun

CLI:

* 🚸 Speed up some CLI commands via the hub REST API PR @fredericenard

* 🚸 Catch "NoWriteAccess" in CLI PR @falexwolf

* 🚸 Catch "CurrentInstanceNotConfigured" in CLI PR @falexwolf

Performance:

* ⚡️ Speed up "Record.from_dataframe()" by a factor ~2 PR
  @ishitajain9717

* ⚡️ Speed up "Record.from_dataframe()" in presence of indexes PR
  @ishitajain9717

Bug fixes:

* 🐛 Fix ambiguous match in "sheet.to_artifact()" for duplicate names
  PR @sunnyosun

* 🐛 Reorder schema features on update from "features" input PR
  @sunnyosun

* 🐛 Fix single-key dict collapse in "get_values()" PR @sunnyosun

* 🐛 Fix edge cases in version handling PR @Koncopd

* 🐛 Fix edge cases for getting artifacts by path PR @Koncopd

Legacy API:

* 🔥 Remove backward compat for legacy "ln.Param" call pattern from v1
  PR @falexwolf

Docs:

* 📝 Add "space" and "branch" arguments to signatures PR
  @ishitajain9717

* 📝 More clearly document dynamic registries PR @falexwolf

# 2026-06-23 hub 1.44.0

* ✨ Add Excel support to sheet imports PR @chaichontat

* ✨ Implement schema index feature handling in CSV editor and related
  components PR @chaichontat

* 🚸 Hide sheet index for sheets without a schema index PR
  @chaichontat

* 🚸 Scope sheet import auto-create to writable target spaces PR
  @chaichontat

* 🚸 Add single-space record type controls PR @chaichontat

* 🚸 Constrain single-space records to their type space PR
  @chaichontat

* 🐛 Fix XLSX upload failures with worksheet selection PR @chaichontat

* 🐛 Keep sheets editable with union dtype columns PR @chaichontat

* 🐛 Prevent list registry selectors from creating missing values PR
  @chaichontat

# 2026-06-10 hub 1.43.0

* ✨ Remember each sheet’s last view PR @chaichontat

* 🐛 Fix recursive data lineage expansion PR @chaichontat

# 2026-06-10 db 2.6.1

* 🚸 Enable passing arbitrary spaces to the
  "SQLRecordSettings.single_space" setting PR @falexwolf

* 🚸 Print index as the first element in "schema.describe()" if it
  exists PR @falexwolf

# 2026-06-09 blog

* 📝 Simpler queries for the 2.5B transcriptional profiles of the Arc
  Virtual Cell Atlas PR @falexwolf

# 2026-06-09 hub 1.42.0

* ✨ Pricing page v3: Add a preview of the upcoming Pro plan PR
  @Ebad371

# 2026-06-08 db 2.6.0

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

🗃️ Add fields: "Artifact.extra_data" and "Run.extra_data" JSON fields,
"Transform.run" and "TransformTransform.run", "Feature._ounit_str" PR
@falexwolf

All databases that are connected to LaminHub have been migrated and
there is no need to act.

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

For details see the Compatibility Matrix and the source code.

* ✨ Constrain the content of dynamic registries to be in the same
  space as the registry PR @falexwolf

* 🚸 Store "index"-like features in the "name" field of "Record" PR
  @sunnyosun

* 🚸 No input tracking warning if no default database PR @falexwolf

* 🚸 Inherit space from "storage.space" in Artifact constructor if
  "storage" is passed and "space" is not passed PR @falexwolf

* 🚸 Improve typing of "Feature()" constructor PR @ishitajain9717

* 🚸 Upon exporting records, link each single record as an input
  rather than their type, always link record exports against a run of
  "__lamindb_record_export__" PR1 PR2 PR3 @falexwolf

* 🚸 Enable pre-filtering records before export PR @falexwolf

* 🏷️ Fix type annotation of "SQLRecord.filter()" to be LaminDB's
  "QuerySet", not Django's PR @falexwolf

Performance:

* ⚡️ Disable http2 in httpx client PR @Koncopd

Refactor:

* ♻️ Homogenize branch and space treatment in constructors PR
  @falexwolf

* ♻️ Refactor the "Run" constructor, set run status upon start and
  completion of transfer and export functions PR @falexwolf

Docs:

* 📝 Refer to "SQLRecord" types as (dynamic) registries PR @falexwolf

* 📝 Advocate feature objects over feature names PR @falexwolf

# 2026-06-08 hub 1.41.0

* ✨ Add compact density for sheets and record lists PR @chaichontat

* ✨ In transfer, visualize the incoming artifact as a new node and
  make it clickable to lead to the source database PR @falexwolf

* 🚸 Add CSV index selection for sheet imports PR @chaichontat

# 2026-06-05 hub 1.40.0

* 🚸 Make record creation harder to trigger accidentally PR
  @chaichontat

* 🚸 Prettier display of special transforms & more minimal transform
  design overall by removing display of unnecessary information PR
  @falexwolf

# 2026-06-04 nf 0.8.2

* ⚡️ Implement asynchronous artifact creation PR @rcannood

* 📝 Update config docs PR @rcannood

* 🔊 Trace log responses on error PR @rcannood

# 2026-06-01 hub 1.39.0

* 🚸 Better design for the space selector PR @chaichontat

* 🚸 Better design for artifacts filter sidebar PR @falexwolf

* 🐛 Fix artifact storage paths after upload and sheet export PR
  @chaichontat

* 🐛 Fix explicit display fields in selectors PR @chaichontat

# 2026-06-01 db 2.5.1

* 🚸 Better organize the logging about query result truncation PR
  @falexwolf

* 🐛 Fix passing "is_type=False" to the "cat_filters" argument of
  "Feature" PR @falexwolf

* 🐛 Avoid duplication of "__lamindb_record_export__" under
  concurrency PR @falexwolf

* 🐛 Populate "run.finished_at" for transfer and export functions PR
  @falexwolf

# 2026-05-31 hub 1.38.0

* ⚡️ Speed up frontend queries on large databases by orders of
  magnitude when "order_by" or "search_in" are not needed PR @Koncopd

* 🐛 Fix write-space selection across creation flows PR @chaichontat

* 🐛 Fix record value dtype filter handling PR @chaichontat

# 2026-05-31 nf 0.8.1

* 🔊 Improve logging when API is called PR @rcannood

* 🔇 Avoid local file warnings for work dir and asset dir paths PR
  @rcannood

* 🐛 Fix branch assignment PR @rcannood

# 2026-05-26 db 2.5.0

-[ ⚠️ No longer deduplicate existing files when registering them from
managed storage locations. ]-

Given a file or folder is *already present* in a managed storage
location when passing an S3 path to "Artifact()", the constructor will
no longer attempt deduplicating it ("skip_hash_lookup = True").

Newly ingested artifacts will still be deduplicated based on hash
equivalence ("skip_hash_lookup = False").

The default value for the "skip_hash_lookup" in "Artifact()" changes
from "False" to "None".

See PR @Koncopd

-[ ⚠️ Drop support for passing semantic type names in v1 string-based
dtypes. ]-

For example: "ln.Feature(name="perturbation",
dtype="cat[Record[Perturbation]]")" will no longer work. You have to
pass a Python object now, e.g., a "Record" type "perturbation".

Passing strings raised a warning since lamindb "1.17.0", but will
otherwise continue to work.

See PR @falexwolf

Features:

* ✨ Compatibility of "ln.track()" and "ln.finish()" with Marimo
  notebooks PR @ishitajain9717

* ✨ Enable "lamin load" for notes PR @falexwolf

* ✨ Allow changing the real storage key by moving the artifact within
  the storage location PR1 PR2 @Koncopd

* ✨ Support timezone-ware datetimes as dtype PR @falexwolf

* ✨ Use existing artifacts for "s3" and "gs" paths in ".lamindb/"
  when creating an artifact PR @Koncopd

* ✨ Add public "key_is_virtual" argument to "Artifact(...)" PR
  @Koncopd

UX:

* 🚸 Print warnings on instance module mismatch with environment
  during "ln.connect()" and "ln.DB()" PR @falexwolf

* 🚸 Simplify the curator logs and advocate explicit object
  construction instead of "add_new_from()" PR @falexwolf

* 🚸 Warn about reducing the default value for "limit" in
  ".to_dataframe()" from 100 to 20 PR @falexwolf

* 🚸 Clearer error on reading old versions of artifacts with
  "overwrite_versions=True" PR @Koncopd

* 🚸 Improve the UX around auto-selecting managed storage locations
  for a space PR @falexwolf

* 🚸 Show login confirmation PR @Koncopd

* 🚸 Raise an informative error for unmanaged storages in storage
  settings setters PR @Koncopd

* 🚸 Raise an error on write streaming for artifacts with
  "overwrite_version=False" PR @Koncopd

* 🚸 Add safeguards against non-latest "revises" argument on saving a
  versioned sqlrecord PR @Koncopd

Bugs:

* 🐛 Use etag for gs when md5 hash is not available, do consistent
  hashing of cloud directories PR @Koncopd

* 🐛 Fix de-duplication of feature names within
  ".to_dataframe(include="features")" PR @falexwolf

Dependencies:

* ⬆️ Upgrade "universal_pathlib" to "0.3.10" PR @Koncopd

Docs:

* 📝 Document and test features where the "dtype" is a sheet PR
  @falexwolf

* 📝 Document cell output stripping of "ln.finish()" in a Jupyter
  notebook PR @falexwolf

* 📝 Document the string serialization of "dtype" objects PR
  @falexwolf

* 📝 More visibility for branching on the "manage-changes" document PR
  @falexwolf

* 📝 Better document collection vs folder and clarify that
  "ArtifactSet" can also be streamed PR @falexwolf

# 2026-05-26 hub 1.37.0

* ✨ Run general Python scripts from the "Transforms" tab PR
  @sheetalgiri

* ✨ Support schema-restricted sheet dtypes PR @chaichontat

* 💄 Route instance roots to the configured default tab PR
  @chaichontat

# 2026-05-21 nf 0.8.0

* 📝 Improve documentation for usage of closures when referring to
  params PR @rcannood

* 🐛 Fix key resolution; deprecate uploading local paths PR @rcannood

* ♻️ Add support for Nextflow 26.04 PR @rcannood

* 🎨 Uniformise redaction of sensitive information PR @rcannood

# 2026-05-17 hub 1.36.0

* ✨ Add organization account creation endpoint PR @fredericenard

# 2026-05-13 hub 1.35.2

* 🐛 Fix typed-record feature filters on sheet-backed records PR
  @chaichontat

* 🐛 Fix sheet filters for paginated rows PR @chaichontat

# 2026-05-12 blog

* 📝 Re-engineering the PerturBench benchmarking tasks with data
  lineage PR @ishitajain9717 @namsaraeva

# 2026-05-11 hub 1.35.0

* 💄 Simplify the records/labels section of the overview page PR
  @falexwolf

* 💄 Simpler and more consistent design of the artifact page PR
  @falexwolf

* 💄 Showcase runs on overview page PR @falexwolf

# 2026-05-10 hub 1.34.0

* ✨ Improve API key management with named keys, expiration date, and
  revocation PR @Ebad371

* ⚡️ Speed up queries for large databases PR @Koncopd

# 2026-05-07 hub 1.33.0

* 🚸 Enforce name requirement for new record dialog PR @chaichontat

* 🚸 Clear search on folder navigation in bucket table PR @chaichontat

* 🐛 Fix space selector in sheet creation PR @chaichontat

# 2026-05-06 nf 0.7.0

* ✨ Support federated tokens for input files PR @rcannood

* ♻️ Refactor artifact creation PR @rcannood

* ♻️ Refactor testing setup PR @rcannood

# 2026-05-06 hub 1.32.0

* 🚸 Clean up project detail page PR @chaichontat

* 🚸 Experiment page launch improvements PR @chaichontat

* 🐛 Fix sorting and pagination in access management pages PR
  @chaichontat

# 2026-05-05 docs

* 📝 New guide: Organize datasets PR @falexwolf

# 2026-05-04 hub 1.31.0

* 🚸 Launch workflows from records with auto-completed metadata PR
  @chaichontat

* 🚸 Add a dedicated project page PR @falexwolf

* 🚸 Enable ordering and hiding tabs on the instance navbar PR
  @chaichontat @falexwolf

* 🚸 Prevent password managers from autocompleting fields PR
  @chaichontat

* 🚸 Support more data types in the feature creation modal PR
  @chaichontat @falexwolf

* 🚸 Show download button for problematic HTMLs PR @chaichontat

* 🚸 Add "nf-lamin" plugin detection and alert in launch form PR
  @chaichontat

* 🐛 Enhance Nextflow schema validation and parsing logic PR
  @chaichontat

# 2026-04-27 db 2.4.2

* 🚸 Support "dtype" URL PR @falexwolf

* 🐛 Fix deletion of folder artifacts from trash PR @Koncopd

# 2026-04-25 hub 1.30.0

* ✨ Support the bool "dtype" for CSV upload PR @chaichontat

* 🚸 Improve sheet keyboard handling PR @chaichontat

* 🚸 Standardize instance settings and org collab settings PR
  @chaichontat

* 🚸 Canonical run URLs PR @falexwolf

* 🚸 Transform link inheritance PR @chaichontat

* 🐛 Fix audit log rendering PR @chaichontat

* 🐛 Fix double scroll bars in the transform page PR @chaichontat

# 2026-04-24 nf 0.6.2

* 🐛 Defer param evaluation PR @rcannood

* 🐛 Fix include_paths for output artifacts PR @rcannood

* 📝 Clean up documentation PR @rcannood

# 2026-04-23 blog

* 📝 How I managed thousands of datasets to build the scPRINT family
  of scRNA-seq foundation models PR @falexwolf

# 2026-04-23 bionty 2.4.0

-[ ⚠️ Run "bionty.core.sync_public_sources()" ]-

This will update the "Source" registry with the new organisms of
"Protein".

* 🍱 9 new organisms from "Uniprot", "v2026-01" PR @sunnyosun
  @ishitajain9717

* 🍱 Update "Uniprot" to "v2026-01" for organisms "human" & "mouse" PR
  @sunnyosun

# 2026-04-23 db 2.4.1

* 🔒️ Obfuscate user secrets in params and source code PR @falexwolf

* 🚸 Detect "project", "space" & "branch" args in "@ln.flow()" and
  detect "LAMIN_INITIATED_BY_RUN_UID" in "ln.track()" PR @falexwolf

* 🚸 Validated transfer of artifacts to other storage locations PR
  @Koncopd

* 🐛 Fix cleanup of internal files on instance init failures PR
  @Koncopd

# 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 and upper bound "s3fs" by 2026.1.0 PR1 PR2 @Koncopd
  @danplischke

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-15 blog

* 📝 Managing spatial omics datasets with SpatialData & LaminDB PR
  @Zethson

# 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.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

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

# 2026-04-02 blog

* 📝 An introduction to LaminR PR @falexwolf

# 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 bionty 2.3.1

* 🐛 Fix duplicates in Ensembl prefixes for organisms PR @falexwolf

# 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 bionty 2.3.0

Bionty now depends on "lamindb-core" instead of "lamindb".

# 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-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 bionty 2.2.0

* 🗃️ Add "created_on" field for LaminDB v2.2 PR @falexwolf

* ⚡️ Lazily import pandas PR @falexwolf

# 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-15 hub 1.16.0

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

* 🚸 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

* 💄 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

* 💄 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

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

* 🐛 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-11 nf 0.5.1

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

# 2026-02-10 hub 1.15.0

* 💄 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

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

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

* 🐛 Fix "Project" feature link 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-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

* 🐛 Fix an issue in the Seqera Launch connector 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 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

* 🐛 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-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