alterlab-lamindb — independently scanned and version-tracked by SaferSkills.
SaferSkills independently audited alterlab-lamindb (Agent Skill) and scored it 100/100 (green). The audit ran 55 deterministic rules across Security, Supply Chain, Maintenance, Transparency, and Community; it found 0 high-severity and 0 lower-severity findings. The full rule-by-rule trace and per-finding evidence are below. Free, methodology-open.
Findings & checks · 0 flagged
Every scanned point with the score it earned and what moved between them.
First recorded scan — no prior version to compare against.
The primary manifest — the file an agent reads to learn what this artifact does.
LaminDB is an open-source data framework for biology designed to make data queryable, traceable, reproducible, and FAIR (Findable, Accessible, Interoperable, Reusable). It provides a unified platform that combines lakehouse architecture, lineage tracking, feature stores, biological ontologies, LIMS (Laboratory Information Management System), and ELN (Electronic Lab Notebook) capabilities through a single Python API.
Core Value Proposition:
Use this skill when:
| Scenario | Use Instead |
|---|---|
| Analysing an scRNA-seq AnnData (QC, clustering, DE) rather than registering it | alterlab-scanpy |
| Wrangling the AnnData object itself (slicing, concat, h5ad/zarr I/O) | alterlab-anndata |
| Pulling reference cells from the public CELLxGENE Census | alterlab-cellxgene |
| A lab ELN/LIMS (Benchling) as the system of record | alterlab-benchling |
| Depositing a finished dataset in a public repository with a DOI | alterlab-open-science |
LaminDB provides six interconnected capability areas, each documented in detail in the references folder.
Core entities:
Key workflows:
ln.track() and ln.finish()artifact.view_lineage()Reference: references/core-concepts.md - Read this for detailed information on artifacts, records, runs, transforms, features, versioning, and lineage tracking.
API names that changed. Query results are materialized with `.to_dataframe()` (the old.df()), artifacts are annotated with `features.set_values({...})` /features.remove_values([...])(the oldadd_values), and a remote instance is opened as a database object —db = ln.DB("account/instance"), thendb.Artifact.filter(...)— rather than by importing its registries.ln.track()/ln.finish()and theln.Artifact.from_dataframe/from_anndataconstructors are unchanged.
Query capabilities:
get(), one(), one_or_none()__gt, __lte, __contains, __startswith)Key workflows:
Reference: references/data-management.md - Read this for comprehensive query patterns, filtering examples, streaming strategies, and data organization best practices.
Curation process:
Schema types:
Supported data types:
Key workflows:
DataFrameCurator or AnnDataCurator for validation.cat.standardize().cat.add_ontology()Reference: references/annotation-validation.md - Read this for detailed curation workflows, schema design patterns, handling validation errors, and best practices.
Available ontologies (via Bionty):
Key workflows:
bt.CellType.import_source()Reference: references/ontologies.md - Read this for comprehensive ontology operations, standardization strategies, hierarchy navigation, and annotation workflows.
Workflow managers:
MLOps platforms:
Storage systems:
Array stores:
Visualization:
Version control:
Reference: references/integrations.md - Read this for integration patterns, code examples, and troubleshooting for third-party systems.
Installation:
uv pip install lamindb (2.10.x as of 2026-09)uv pip install lamindb-coregcp, fcs, zarr-v2 (zarr v3 is the default now — the old bare zarr extrais gone), e.g. uv pip install 'lamindb[gcp,fcs]'
lamin init --storage ./mydata --modules bionty
Instance types:
Storage options:
Configuration:
Deployment patterns:
Reference: references/setup-deployment.md - Read this for detailed installation, configuration, storage setup, database management, security best practices, and troubleshooting.
import lamindb as ln
import bionty as bt
import anndata as ad
# Start tracking
ln.track(params={"analysis": "scRNA-seq QC and annotation"})
# Import cell type ontology
bt.CellType.import_source()
# Load data
adata = ad.read_h5ad("raw_counts.h5ad")
# Validate and standardize cell types
adata.obs["cell_type"] = bt.CellType.standardize(adata.obs["cell_type"])
# Curate with schema
curator = ln.curators.AnnDataCurator(adata, schema)
curator.validate()
artifact = curator.save_artifact(key="scrna/validated.h5ad")
# Link ontology annotations (validated CellType records)
cell_types = bt.CellType.from_values(adata.obs.cell_type)
artifact.cell_types.add(cell_types) # typed accessor: <registry-name-plural>.add(...)
ln.finish()import lamindb as ln
# Register multiple experiments
for i, file in enumerate(data_files):
artifact = ln.Artifact.from_anndata(
ad.read_h5ad(file),
key=f"scrna/batch_{i}.h5ad",
description=f"scRNA-seq batch {i}"
).save()
# Annotate with features. Current API is set_values / remove_values
# (add_values was renamed).
artifact.features.set_values({
"batch": i,
"tissue": tissues[i],
"condition": conditions[i]
})
# Query across all experiments
immune_datasets = ln.Artifact.filter(
key__startswith="scrna/",
tissue="PBMC",
condition="treated"
).to_dataframe()
# Load specific datasets
for artifact in immune_datasets:
adata = artifact.load()
# Analyzeimport lamindb as ln
import wandb
# Initialize both systems
wandb.init(project="drug-response", name="exp-42")
ln.track(params={"model": "random_forest", "n_estimators": 100})
# Load training data from LaminDB
train_artifact = ln.Artifact.get(key="datasets/train.parquet")
train_data = train_artifact.load()
# Train model
model = train_model(train_data)
# Log to W&B
wandb.log({"accuracy": 0.95})
# Save model in LaminDB with W&B linkage
import joblib
joblib.dump(model, "model.pkl")
model_artifact = ln.Artifact("model.pkl", key="models/exp-42.pkl").save()
model_artifact.features.set_values({"wandb_run_id": wandb.run.id})
ln.finish()
wandb.finish()# In Nextflow process script
import lamindb as ln
ln.track()
# Load input artifact
input_artifact = ln.Artifact.get(key="raw/batch_${batch_id}.fastq.gz")
input_path = input_artifact.cache()
# Process (alignment, quantification, etc.)
# ... Nextflow process logic ...
# Save output
output_artifact = ln.Artifact(
"counts.csv",
key="processed/batch_${batch_id}_counts.csv"
).save()
ln.finish()To start using LaminDB effectively:
references/setup-deployment.md)lamin loginlamin init --storage ./mydata --modules bionty(add --db postgresql://... for a Postgres-backed instance)
references/core-concepts.md)ln.track() and ln.finish() in workflowsreferences/data-management.md)references/annotation-validation.md)references/ontologies.md)references/integrations.md)Follow these principles when working with LaminDB:
ln.track() at the start of every analysis for automatic lineage captureproject/experiment/batch/file.h5ad)view_lineage() to understand data provenanceThis skill includes comprehensive reference documentation organized by capability:
Read the relevant reference file(s) based on the specific LaminDB capability needed for the task at hand.
Part of the AlterLab Academic Skills suite.
~30 seconds. Free. No account. Every finding cites a rule and a line of evidence.