Redun¶
Here, we’ll see how to track redun workflow runs with LaminDB.
Note
This use case is based on github.com/ricomnl/bioinformatics-pipeline-tutorial.
# pip install lamindb redun git+http://github.com/laminlabs/redun-lamin-fasta
!lamin init --storage ./test-redun-lamin
Show code cell output
→ initialized lamindb: testuser1/test-redun-lamin
Amend the workflow¶
import lamindb as ln
import json
Show code cell output
→ connected lamindb: testuser1/test-redun-lamin
Let’s amend a redun workflow.py to register input & output artifacts in LaminDB:
To track the workflow run in LaminDB, add (see on GitHub):
ln.track(params=params)
To register the output file via LaminDB, add (see on GitHub):
ln.Artifact(output_path, description="results").save()
Run redun¶
Let’s see what the input files are:
!ls ./fasta
Show code cell output
KLF4.fasta MYC.fasta PO5F1.fasta SOX2.fasta
And call the workflow:
!redun run workflow.py main --input-dir ./fasta --tag run=test-run 1> run_logs.txt 2>run_logs.txt
Inspect the logs:
!cat run_logs.txt
Show code cell output
→ connected lamindb: testuser1/test-redun-lamin
→ script invoked with: run workflow.py main --input-dir ./fasta --tag run=test-run
→ created Transform('GetkML6ddQwO0000', key='workflow.py'), started new Run('CHkRVeo4yLKvfLxB') at 2026-01-21 14:13:52 UTC
→ params: input_dir='./fasta', amino_acid='C', enzyme_regex='[KR]', missed_cleavages=0, min_length=4, max_length=75, executor=<Executor.default: 'default'>
9[redun] Run Job 86cdfb79: bioinformatics_pipeline_tutorial.lib.digest_protein_task(input_fasta=File(path=/home/runner/work/redun-lamin/redun-lamin/docs/test-redun-lamin/.lamindb/NDGn1AHnJVLoL6k10000.fasta, hash=f0194bee), enzyme_regex='[KR]', missed_cleavages=0, min_length=4, max_length=75) on default
[redun] Run Job a1a6c3f9: bioinformatics_pipeline_tutorial.lib.digest_protein_task(input_fasta=File(path=/hoFile(path=/home/runner/work/redun-lamin/redun-lamin/docs/test-redun-lamin/data/results.tgz, hash=36aa35be)
4d0c), enzyme_regex='[KR]', missed_cleavages=0, min_length=4, max_length=75) on default
[redun] Run Job e2625ed7: bioinformatics_pipeline_tutorial.lib.digest_protein_task(input_fasta=File(path=/home/runner/work/redun-lamin/redun-lamin/docs/test-redun-lamin/.lamindb/anYEAKqv0fyYs3M30000.fasta, hash=4b4d0ac9), enzyme_regex='[KR]', missed_cleavages=0, min_length=4, max_length=75) on default
[redun] Run Job 967fdd29: bioinformatics_pipeline_tutorial.lib.digest_protein_task(input_fasta=File(path=/home/runner/work/redun-lamin/redun-lamin/docs/test-redun-lamin/.lamindb/uZ0CCdMwjnsJt59G0000.fasta, hash=e3710452), enzyme_regex='[KR]', missed_cleavages=0, min_length=4, max_length=75) on default
[redun] Run Job 500dc9a2: bioinformatics_pipeline_tutorial.lib.count_amino_acids_task(input_fasta=File(path=/home/runner/work/redun-lamin/redun-lamin/docs/test-redun-lamin/.lamindb/NDGn1AHnJVLoL6k10000.fasta, hash=f0194bee), input_peptides=File(path=/home/runner/work/redun-lamin/redun-lamin/docs/test-redun-lamin/data/NDGn1AHnJVLoL6k10000.peptides.txt, hash=333f7c69), amino_acid='C') on default
[redun] Run Job f95ad4c0: bioinformatics_pipeline_tutorial.lib.count_amino_acids_task(input_fasta=File(path=/home/runner/work/redun-lamin/redun-lamin/docs/test-redun-lamin/.lamindb/IEoCeUF0UUnrfQnB0000.fasta, hash=fe284d0c), input_peptides=File(path=/home/runner/work/redun-lamin/redun-lamin/docs/test-redun-lamin/data/IEoCeUF0UUnrfQnB0000.peptides.txt, hash=b72f1c88), amino_acid='C') on default
[redun] Run Job ea5b1b17: bioinformatics_pipeline_tutorial.lib.count_amino_acids_task(input_fasta=File(path=/home/runner/work/redun-lamin/redun-lamin/docs/test-redun-lamin/.lamindb/anYEAKqv0fyYs3M30000.fasta, hash=4b4d0ac9), input_peptides=File(path=/home/runner/work/redun-lamin/redun-lamin/docs/test-redun-lamin/data/anYEAKqv0fyYs3M30000.peptides.txt, hash=52fb23a4), amino_acid='C') on default
[redun] Run Job 285e6b93: bioinformatics_pipeline_tutorial.lib.count_amino_acids_task(input_fasta=File(path=/home/runner/work/redun-lamin/redun-lamin/docs/test-redun-lamin/.lamindb/uZ0CCdMwjnsJt59G0000.fasta, hash=e3710452), input_peptides=File(path=/home/runner/work/redun-lamin/redun-lamin/docs/test-redun-lamin/data/uZ0CCdMwjnsJt59G0000.peptides.txt, hash=c6b27105), amino_acid='C') on default
[redun] Run Job 81997d6b: bioinformatics_pipeline_tutorial.lib.plot_count_task(input_count=File(path=/home/runner/work/redun-lamin/redun-lamin/docs/test-redun-lamin/data/NDGn1AHnJVLoL6k10000.count.tsv, hash=6447a1d4)) on default
[redun] Run Job a364b839: bioinformatics_pipeline_tutorial.lib.plot_count_task(input_count=File(path=/home/runner/work/redun-lamin/redun-lamin/docs/test-redun-lamin/data/IEoCeUF0UUnrfQnB0000.count.tsv, hash=f3decf3f)) on default
[redun] Run Job d2f1367d: bioinformatics_pipeline_tutorial.lib.plot_count_task(input_count=File(path=/home/runner/work/redun-lamin/redun-lamin/docs/test-redun-lamin/data/anYEAKqv0fyYs3M30000.count.tsv, hash=8219727a)) on default
[redun] Run Job e1737513: bioinformatics_pipeline_tutorial.lib.plot_count_task(input_count=File(path=/home/runner/work/redun-lamin/redun-lamin/docs/test-redun-lamin/data/uZ0CCdMwjnsJt59G0000.count.tsv, hash=4692bf8a)) on default
[redun] Run Job 6085c050: bioinformatics_pipeline_tutorial.lib.get_report_task(input_counts=[File(path=/home/runner/work/redun-lamin/redun-lamin/docs/test-redun-lamin/data/NDGn1AHnJVLoL6k10000.count.tsv, hash=6447a1d4), File(path=/home/runner/work/redun-lamin/redun-lamin/docs/test-redun-l...) on default
[redun] Run Job 86d0be64: bioinformatics_pipeline_tutorial.lib.archive_results_task(inputs_plots=[File(path=/home/runner/work/redun-lamin/redun-lamin/docs/test-redun-lamin/data/NDGn1AHnJVLoL6k10000.plot.png, hash=aa546873), File(path=/home/runner/work/redun-lamin/redun-lamin/docs/test-redun-la..., input_report=File(path=/home/runner/work/redun-lamin/redun-lamin/docs/test-redun-lamin/data/protein_report.tsv, hash=6203469f)) on default
[redun] Run Job e0860eee: redun_lamin_fasta.finish(results_archive=File(path=/home/runner/work/redun-lamin/redun-lamin/docs/test-redun-lamin/data/results.tgz, hash=36aa35be)) on default
[redun]
[redun] | JOB STATUS 2026/01/21 14:14:08
[redun] | TASK PENDING RUNNING FAILED CACHED DONE TOTAL
[redun] |
[redun] | ALL 0 0 0 0 16 16
[redun] | bioinformatics_pipeline_tutorial.lib.archive_results_task 0 0 0 0 1 1
[redun] | bioinformatics_pipeline_tutorial.lib.count_amino_acids_task 0 0 0 0 4 4
[redun] | bioinformatics_pipeline_tutorial.lib.digest_protein_task 0 0 0 0 4 4
[redun] | bioinformatics_pipeline_tutorial.lib.get_report_task 0 0 0 0 1 1
[redun] | bioinformatics_pipeline_tutorial.lib.plot_count_task 0 0 0 0 4 4
[redun] | redun_lamin_fasta.finish 0 0 0 0 1 1
[redun] | redun_lamin_fasta.main 0 0 0 0 1 1
[redun]
[redun]
[redun] Execution duration: 16.54 seconds
View data lineage:
artifact = ln.Artifact.get(key="data/results.tgz")
artifact.view_lineage()
Show code cell output
Track the redun execution id¶
If we want to be able to query LaminDB for redun execution ID, this here is a way to get it:
# export the run information from redun
!redun log --exec --exec-tag run=test-run --format json --no-pager > redun_exec.json
# load the redun execution id from the JSON and store it in the LaminDB run record
with open("redun_exec.json") as file:
redun_exec = json.loads(file.readline())
artifact.run.reference = redun_exec["id"]
artifact.run.reference_type = "redun_id"
artifact.run.save()
Run(uid='CHkRVeo4yLKvfLxB', name=None, entrypoint=None, started_at=2026-01-21 14:13:52 UTC, finished_at=2026-01-21 14:14:08 UTC, params={'input_dir': './fasta', 'amino_acid': 'C', 'enzyme_regex': '[KR]', 'missed_cleavages': 0, 'min_length': 4, 'max_length': 75, 'executor': 'default'}, reference='8b7aae3c-a953-44b3-b29f-1abd5e758890', reference_type='redun_id', cli_args='run workflow.py main --input-dir ./fasta --tag run=test-run', branch_id=1, space_id=1, transform_id=1, report_id=7, environment_id=1, created_by_id=3, initiated_by_run_id=None, created_at=2026-01-21 14:13:52 UTC, is_locked=False)
Track the redun run report¶
While lamindb tracks logs of the main python process, the redun logs currently don’t get tracked and artifact.run.report is an empty text file.
This is how you can manually attach a report.
report = ln.Artifact(
"run_logs.txt",
description=f"Redun run report of {redun_exec['id']}",
run=False,
kind="__lamindb_run__", # mark as auxiliary artifact for the run
).save()
artifact.run.report = report
artifact.run.save()
Run(uid='CHkRVeo4yLKvfLxB', name=None, entrypoint=None, started_at=2026-01-21 14:13:52 UTC, finished_at=2026-01-21 14:14:08 UTC, params={'input_dir': './fasta', 'amino_acid': 'C', 'enzyme_regex': '[KR]', 'missed_cleavages': 0, 'min_length': 4, 'max_length': 75, 'executor': 'default'}, reference='8b7aae3c-a953-44b3-b29f-1abd5e758890', reference_type='redun_id', cli_args='run workflow.py main --input-dir ./fasta --tag run=test-run', branch_id=1, space_id=1, transform_id=1, report_id=8, environment_id=1, created_by_id=3, initiated_by_run_id=None, created_at=2026-01-21 14:13:52 UTC, is_locked=False)
View transforms and runs in LaminHub¶

View the database content¶
ln.view()
Show code cell output
Artifact
| uid | key | description | suffix | kind | otype | size | hash | n_files | n_observations | version_tag | is_latest | is_locked | created_at | branch_id | space_id | storage_id | run_id | schema_id | created_by_id | |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| id | ||||||||||||||||||||
| 6 | j8qS0k3HYGM32YjR0000 | data/results.tgz | None | .tgz | None | None | 94331 | PLgZpTlex_hTxCOel4fBPQ | None | None | None | True | False | 2026-01-21 14:14:08.654000+00:00 | 1 | 1 | 3 | 1.0 | None | 3 |
| 5 | uZ0CCdMwjnsJt59G0000 | fasta/KLF4.fasta | None | .fasta | None | None | 609 | LyuoYkWs4SgYcH7P7JLJtA | None | None | None | True | False | 2026-01-21 14:13:53.121000+00:00 | 1 | 1 | 3 | NaN | None | 3 |
| 4 | anYEAKqv0fyYs3M30000 | fasta/PO5F1.fasta | None | .fasta | None | None | 477 | -7iJgveFO9ia0wE1bqVu6g | None | None | None | True | False | 2026-01-21 14:13:53.120000+00:00 | 1 | 1 | 3 | NaN | None | 3 |
| 3 | IEoCeUF0UUnrfQnB0000 | fasta/MYC.fasta | None | .fasta | None | None | 536 | WGbEtzPw-3bQEGcngO_pHQ | None | None | None | True | False | 2026-01-21 14:13:53.120000+00:00 | 1 | 1 | 3 | NaN | None | 3 |
| 2 | NDGn1AHnJVLoL6k10000 | fasta/SOX2.fasta | None | .fasta | None | None | 414 | C5q_yaFXGk4SAEpfdqBwnQ | None | None | None | True | False | 2026-01-21 14:13:53.119000+00:00 | 1 | 1 | 3 | NaN | None | 3 |
Run
| uid | name | entrypoint | started_at | finished_at | params | reference | reference_type | cli_args | is_locked | created_at | branch_id | space_id | transform_id | report_id | environment_id | created_by_id | initiated_by_run_id | |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| id | ||||||||||||||||||
| 1 | CHkRVeo4yLKvfLxB | None | None | 2026-01-21 14:13:52.369438+00:00 | 2026-01-21 14:14:08.689929+00:00 | {'input_dir': './fasta', 'amino_acid': 'C', 'e... | 8b7aae3c-a953-44b3-b29f-1abd5e758890 | redun_id | run workflow.py main --input-dir ./fasta --tag... | False | 2026-01-21 14:13:52.370000+00:00 | 1 | 1 | 1 | 8 | 1 | 3 | None |
Storage
| uid | root | description | type | region | instance_uid | is_locked | created_at | branch_id | space_id | created_by_id | run_id | |
|---|---|---|---|---|---|---|---|---|---|---|---|---|
| id | ||||||||||||
| 3 | oEwaELVLOWvy | /home/runner/work/redun-lamin/redun-lamin/docs... | None | local | None | iQlBPgD8uaqR | False | 2026-01-21 14:13:42.584000+00:00 | 1 | 1 | 3 | None |
Transform
| uid | key | description | kind | source_code | hash | reference | reference_type | version_tag | is_latest | is_locked | created_at | branch_id | space_id | environment_id | created_by_id | |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| id | ||||||||||||||||
| 1 | GetkML6ddQwO0000 | workflow.py | None | script | """workflow.py."""\n\n# This code is a copy fr... | Qn4m7TedTE04S_x3VFxq8w | None | None | None | True | False | 2026-01-21 14:13:52.341000+00:00 | 1 | 1 | None | 3 |
Delete the test instance:
Show code cell content
!rm -rf test-redun-lamin
!lamin delete --force test-redun-lamin