Releases: dhoconno/lungfish-genome-explorer
Release list
v2026.8.14
Lungfish 2026.8.14
Channel: Preview
Previous versioned release: v2026.8.13
Stable baseline: v2026.8.13
Dependency set: 2026.2
Lungfish 2026.8.14 is a preview release focused on reliable MiSeq genotype
publication and compatibility with legacy IPD-MHC reference identifiers.
Preview builds are under rapid iterative development. Features may be incomplete, change quickly, or require additional feedback.
Highlights
Legacy IPD-MHC references publish with their original identifiers
FASTA-only reference bundles can now resolve structured legacy IPD-MHC sequence
identifiers, including allele aliases and group labels used by older macaque MHC
datasets. Lungfish preserves those identifiers as display names while deriving
the correct MHC locus for exact joins between genotype calls and reference rows.
Malformed identifiers remain rejected instead of being interpreted loosely.
MiSeq genotype publication accepts platform-native CSV line endings
Scientific-artifact and reviewable-row publication now normalize CRLF and CR
line endings before parsing genotype and sample-summary CSV files. This prevents
valid producer output—including rows where passed alignment and unique-read
counts are equal—from being lost or misread during publication.
Genotype CSV headers are validated before indexing. Empty or duplicate column
names now produce an explicit malformed-CSV error rather than an ambiguous
dictionary failure.
Known issues
- The 20260626 Kraken2 indexes display taxid 3418604 as
Betacoronavirus pandemicum; identifiers are unchanged. - The Apple Silicon bioconda Bracken compatibility package lacks a usable
driver. Fresh installs receive the managed Bracken 3.1 source overlay, while
existing working environments are preserved. bioconda::bwa-mem2=2.3=hda5e58c_0self-reports 2.2.1 because of an upstream
packaging defect; Lungfish verifies the package identity from conda metadata.
Dependency versions
Dependency set 2026.2 (2026-08-18) is unchanged from v2026.8.13.
Core managed tools: Nextflow 26.04.6, Snakemake 9.25.2, BBTools 40.02,
fastp 1.3.6, deacon 0.16.0, samtools 1.24, bcftools 1.24, htslib 1.24,
seqkit 2.13.0, cutadapt 5.2, Trim Galore 2.3.0, vsearch 2.31.0, pigz 2.8,
SRA Tools 3.4.1, UCSC bedGraphToBigWig 482, pysam 0.24.0, and openpyxl 3.1.5.
Plugin tools: minimap2 2.31, bwa-mem2 2.3, Bowtie 2 2.5.5, Savont 0.6.3,
BLAST 2.16.0, LoFreq 2.1.5, iVar 1.4.4, Medaka 2.2.2, Clair3 2.0.2,
GATK 4.6.2.0, WhatsHap 2.3, SPAdes 4.3.0, MEGAHIT 1.2.9, SKESA 2.5.1,
Flye 2.9.6, hifiasm 0.25.0, MAFFT 7.526, IQ-TREE 3.1.3, Kraken2 2.17.1,
Bracken 3.1 source overlay, EsViritu 1.3.3, RiboDetector 0.3.3, and Freyja 2.0.3.
Pipelines and data: TaxTriage v3.3.8 at revision
e10bfebda32a62711f38a4e23ab03b61725a9675, nf-core/viralrecon 3.0.0,
Kraken2 indexes 20260626 (plus EukPathDB 20230407), EsViritu viral database
v3.2.4, NCBI taxonomy 2025-03, human scrubber 20260706v2, deacon panhuman
panhuman-1, and ribokmers bbmap-ribokmers-k31w15. The bootstrap is
micromamba 2.9.0-0.
Swift packages: Sparkle 2.9.6, swift-argument-parser 1.8.2,
swift-protobuf 1.35.0, swift-nio 2.101.3, swift-nio-ssl 2.37.2,
swift-nio-http2 1.45.0, grpc-swift 1.27.5, async-http-client 1.36.0,
swift-collections 1.6.0, swift-crypto 3.15.1, swift-certificates 1.19.4,
swift-system 1.8.1, swift-service-lifecycle 2.12.0, containerization 0.24.5,
zstd 1.5.7, and ViewInspector 0.10.3. Remaining transitive pins are recorded
exactly in Package.resolved.
v2026.8.13
Lungfish 2026.8.13
Channel: Stable
Previous versioned release: v2026.8.12
Stable baseline: v2026.8.7
Dependency set: 2026.2
Lungfish 2026.8.13 promotes the work validated across previews 2026.8.8 through
2026.8.12 to the stable channel. This release improves large metagenomics
projects, deep alignment viewing, FASTQ processing, external-volume workflow
execution, and consensus generation. It also lets Preview and Stable installs
live side by side as Lungfish Preview.app and Lungfish.app.
Included preview releases
- v2026.8.8
- v2026.8.9
- v2026.8.10
- v2026.8.11
- v2026.8.12
Highlights
Metagenomics projects use less storage and preserve clearer provenance
Kraken2 classifications now reference durable imported FASTQ inputs instead of
copying them into each analysis. Bracken outputs and degraded negative-control
profiles are represented accurately in results and provenance. Taxon search,
Bracken count columns, sample-correct BLAST verification, and transactional
FASTQ/FASTA extraction improve review of multi-sample classifications.
Deep alignment viewing remains responsive and scientifically complete
Alignment viewers open at the full contig, show reference differences at every
read-visible zoom, and pack reads off the main thread. A visible-read budget
keeps extreme-depth samples interactive without changing depth, coverage, or
consensus calculations. Detached viewers restore read hit-testing and visible
interval selections, transient evidence state clears promptly, and failed
depth queries retry rather than leaving a permanently blank plot.
Coverage tracks can now use linear, log10, or square-root display scaling.
The selected scale changes presentation only; underlying depth values and
exports remain unchanged.
FASTQ processing is faster and more predictable
Read Processing adds a BBTools entropy-based low-complexity filter with GUI and
CLI parity. Operations preserve gzip compression where the underlying tool can
write it safely, report live per-sample phases, and use seqkit aggregates plus
sampled distributions for fast post-operation statistics. Streaming FASTQ and
gzip readers now apply backpressure and bounded child-process teardown, and
BBTools heap sizing leaves memory available for concurrent work.
Workflows behave correctly across local and external volumes
Nextflow scratch placement is selected by probing real file locks and native
extended attributes. APFS/HFS+ project volumes can host scratch locally, while
exFAT, FAT, and incompatible network volumes use local scratch to avoid
AppleDouble sidecar failures. Empty stderr no longer hides useful pipeline
errors because the stdout tail is used as a fallback.
Consensus, controls, and application behavior
Whole-contig consensus generation now accepts the bare FASTA headers emitted
by samtools consensus, including contig names that themselves contain colons.
Every slider has direct numeric entry with range clamping and step snapping.
Dock activation restores minimized windows, scrolling follows macOS direction
settings, read tracks remain clipped to their viewport, and stale overlays or
deleted results no longer remain displayed.
Stable and Preview installations
The stable DMG contains Lungfish.app; preview DMGs contain
Lungfish Preview.app. Both may be installed in /Applications at once.
They intentionally retain the same bundle identifier for Sparkle compatibility,
while their filenames, visible names, release-channel metadata, and feed URLs
remain channel-specific.
Storage and migration notes
Existing classification analysis folders are not rewritten. Older
.lungfish-provenance/intermediates/classification-inputs copies may be removed
manually after confirming their recorded replay commands are no longer needed.
Legacy Bracken output names remain readable. Existing preview installations
continue updating in place; installing a current preview DMG is what establishes
the side-by-side Lungfish Preview.app filename.
Known issues
- The 20260626 Kraken2 indexes display taxid 3418604 as
Betacoronavirus pandemicum; identifiers are unchanged. - The Apple Silicon bioconda Bracken compatibility package lacks a usable
driver. Fresh installs receive the managed Bracken 3.1 source overlay, while
existing working environments are preserved. bioconda::bwa-mem2=2.3=hda5e58c_0self-reports 2.2.1 because of an upstream
packaging defect; Lungfish verifies the package identity from conda metadata.
Dependency versions
Dependency set 2026.2 (2026-08-18) is unchanged from the stable baseline.
Core managed tools: Nextflow 26.04.6, Snakemake 9.25.2, BBTools 40.02,
fastp 1.3.6, deacon 0.16.0, samtools 1.24, bcftools 1.24, htslib 1.24,
seqkit 2.13.0, cutadapt 5.2, Trim Galore 2.3.0, vsearch 2.31.0, pigz 2.8,
SRA Tools 3.4.1, UCSC bedGraphToBigWig 482, pysam 0.24.0, and openpyxl 3.1.5.
Plugin tools: minimap2 2.31, bwa-mem2 2.3, Bowtie 2 2.5.5, Savont 0.6.3,
BLAST 2.16.0, LoFreq 2.1.5, iVar 1.4.4, Medaka 2.2.2, Clair3 2.0.2,
GATK 4.6.2.0, WhatsHap 2.3, SPAdes 4.3.0, MEGAHIT 1.2.9, SKESA 2.5.1,
Flye 2.9.6, hifiasm 0.25.0, MAFFT 7.526, IQ-TREE 3.1.3, Kraken2 2.17.1,
Bracken 3.1 source overlay, EsViritu 1.3.3, RiboDetector 0.3.3, and Freyja 2.0.3.
Pipelines and data: TaxTriage v3.3.8 at revision
e10bfebda32a62711f38a4e23ab03b61725a9675, nf-core/viralrecon 3.0.0,
Kraken2 indexes 20260626 (plus EukPathDB 20230407), EsViritu viral database
v3.2.4, NCBI taxonomy 2025-03, human scrubber 20260706v2, deacon panhuman
panhuman-1, and ribokmers bbmap-ribokmers-k31w15. The bootstrap is
micromamba 2.9.0-0.
Swift packages: Sparkle 2.9.6, swift-argument-parser 1.8.2,
swift-protobuf 1.35.0, swift-nio 2.101.3, swift-nio-ssl 2.37.2,
swift-nio-http2 1.45.0, grpc-swift 1.27.5, async-http-client 1.36.0,
swift-collections 1.6.0, swift-crypto 3.15.1, swift-certificates 1.19.4,
swift-system 1.8.1, swift-service-lifecycle 2.12.0, containerization 0.24.5,
zstd 1.5.7, and ViewInspector 0.10.3. Remaining transitive pins are recorded
exactly in Package.resolved.
v2026.8.12
Lungfish 2026.8.12
Channel: Preview
Previous versioned release: v2026.8.11
Stable baseline: v2026.8.7
Dependency set: 2026.2
Preview builds are under rapid iterative development. Features may be
incomplete, change quickly, or require additional feedback.
Lungfish 2026.8.12 is an expedited preview fixing consensus generation
from classifier alignment evidence, which failed for every whole-contig
request. It also adds direct numeric entry to every slider and a
rescalable coverage track. The dependency set is unchanged at 2026.2.
Changes since 2026.8.11
Consensus generation works again for whole-contig scope
Generating a consensus from classifier BAM evidence failed with
"Consensus output does not project exactly onto the requested reference
interval", and no consensus was produced. samtools consensus writes a
FASTA header of >chrom:start-end for a sub-region but a bare >chrom
when the requested region spans the whole contig. The header parser only
recognized the coordinate form, so it reported no start position and the
projection check rejected the caller's output.
Because whole contig is the default consensus scope, this affected every
default extraction, which made a consistent failure look intermittent.
Adjusting the depth, MAPQ, or base-quality thresholds appeared to do
nothing for the same reason: the sliders were applied correctly, but the
run failed afterward at any value.
A bare header is now read as the contig origin. The region suffix is
parsed from the final colon-delimited field and must be a numeric range,
so a contig whose own name contains colons (for example HLA:A*01:01)
is not misread as coordinates. Regression tests cover the bare header,
the colon-in-name case, and a full whole-contig extraction.
Any slider value can be typed directly
Every slider in the app now pairs with an editable numeric field, so an
exact threshold can be entered instead of dragged. Typed values are
clamped into the slider's range and snapped to its step; text that names
no number leaves the current value unchanged. This covers the consensus
evidence thresholds, read display settings, annotation dimensions,
assembly and classification wizard options, and genotype dropout
thresholds.
Coverage tracks can be rescaled to log10 or square root
A viral genome routinely mixes a few very deep peaks with long shallow
stretches. On a linear axis the peak sets the scale and low-coverage
regions collapse onto the baseline, which is exactly where dropouts need
to be visible. A new "Coverage scale" control in the Inspector's View tab
offers linear (the default), log10, and square root, and applies to every
coverage track.
Uncovered positions stay on the baseline in every mode, and compressed
modes annotate the track legend (for example "Depth (log10)") so a
rescaled track is never misread as linear. The setting is display only:
it changes how depth is drawn, never the depth values, the consensus
evidence, or any exported output.
Dependency versions
Dependency set 2026.2 (2026-08-18), unchanged from 2026.8.11. No tool,
pipeline, database, or bootstrap pins changed in this release.
v2026.8.11
Lungfish 2026.8.11
Channel: Preview
Previous versioned release: v2026.8.10
Stable baseline: v2026.8.7
Dependency set: 2026.2
Preview builds are under rapid iterative development. Features may be
incomplete, change quickly, or require additional feedback.
Lungfish 2026.8.11 is a fast-follow preview addressing a selection
visibility report against 2026.8.10 and renaming the preview app so it
can live alongside a stable install. The dependency set is unchanged at
2026.2.
Changes since 2026.8.10
Interval selections are visible again in BAM viewers
Dragging out an interval in a BAM evidence viewer (classifier alignment
evidence and other full-BAM viewers) selected the range — centering and
extraction acted on it — but nothing appeared on screen. The detached
BAM draw path never painted the column-selection overlay that reference
bundle viewports have always drawn. The overlay now paints above every
track state in detached viewers too, exactly like bundle viewports, and
an offscreen rendering regression test locks the behavior in.
The preview app is now "Lungfish Preview" in Applications
Preview DMGs now ship the app as Lungfish Preview.app (the stable
channel keeps Lungfish.app), so both a stable Lungfish and a preview
build can sit in /Applications side by side, the way VS Code and VS
Code Insiders coexist. Existing preview installs are unaffected:
auto-update keeps updating them in place under their current name, and
only a fresh drag from a new preview DMG picks up the new name. The two
channels intentionally share one bundle identifier so auto-update keeps
working across the rename.
Dependency versions
Dependency set 2026.2 (2026-08-18), unchanged from 2026.8.10. No tool,
pipeline, database, or bootstrap pins changed in this release.
v2026.8.10
Lungfish 2026.8.10
Channel: Preview
Previous versioned release: v2026.8.9
Stable baseline: v2026.8.7
Dependency set: 2026.2
Preview builds are under rapid iterative development. Features may be incomplete, change quickly, or require additional feedback.
Lungfish 2026.8.10 is a fast-follow preview that fixes four problems
reported against 2026.8.9 within a day of its release, all in the BAM
viewport and app activation. Each was reproduced live, traced to its root
cause, and verified fixed in a running build before this release. The
dependency set is unchanged at 2026.2.
Changes since 2026.8.9
Clicking the Dock icon reliably brings Lungfish forward
When every Lungfish window was minimized, clicking the Dock icon did
nothing: the app asked macOS to show a miniaturized window in a way that
neither restores it nor completes activation, so the frontmost app kept
focus. The Dock click now restores the minimized window and activates the
app in every state we could construct: windows minimized, windows hidden
behind other apps, or no windows at all.
Vertical scrolling in read stacks follows your scroll direction
Scrolling vertically through a deep read stack (and through genotype
sample rows) moved the wrong way for anyone whose mouse or trackpad has
"natural scrolling" turned off — and because the wrong direction pinned
the view against the top of the stack, it often felt like scrolling did
nothing at all. The viewer was applying the system scroll-direction
preference a second time on top of deltas macOS had already adjusted.
Read-stack and genotype scrolling now behave exactly like every standard
scroll view on your system, whatever your scroll-direction setting. The
explicit per-bundle Natural/Traditional overrides in Settings now also
mean what they say on both kinds of device.
Read tracks no longer paint over the annotation panel
In viewports with limited vertical space, read rows could draw past the
bottom of the alignment area and over whatever sat below it, most visibly
the annotation table in mapping results. Two causes stacked: the read
track reserved itself a minimum height even when that much space did not
exist, and macOS no longer clips a view's drawing to its own bounds by
default. The track now draws only into the space that actually exists,
scrolling handles the rest, and the viewer clips its drawing to its
bounds again so no track can ever paint over a neighboring panel.
The depth plot no longer sticks blank
If the depth query behind the coverage plot failed transiently (a busy
disk, a momentarily unreadable index), the viewer cached that empty
answer as if it were real coverage and stopped asking — leaving a blank
depth plot until you deselected and reloaded the bundle. A failed depth
fetch is no longer treated as coverage: the viewer retries on the next
redraw, up to three consecutive failures, and a successful fetch resets
the count.
Dependency versions
Dependency set 2026.2 (2026-08-18), unchanged from 2026.8.9. No tool,
pipeline, database, or bootstrap pins changed in this release.
v2026.8.9
Lungfish 2026.8.9
Channel: Preview
Previous versioned release: v2026.8.8
Stable baseline: v2026.8.7
Dependency set: 2026.2
Preview builds are under rapid iterative development. Features may be incomplete, change quickly, or require additional feedback.
Lungfish 2026.8.9 is a preview shaped by a week of real metagenomics work:
BAM viewports that stayed responsive only at low depth, a new tool for
stripping low-complexity reads before classification, EsViritu evidence that
finally knows its own reference, and a TaxTriage failure on exFAT project
drives whose error message blamed the wrong subsystem entirely. The
dependency set is unchanged at 2026.2.
Changes since 2026.8.8
Extreme-depth alignment viewing, everywhere
Every BAM track in the app now opens at the full width of its contig and
shows mismatches against the reference at any zoom where individual reads
are drawn, matching how you would read the pile-up in a dedicated alignment
editor.
Deep pile-ups no longer make the viewer unusable. Rendering keeps a
visible-read budget (50,000 reads per track by default) with a banner
stating how many of the reads in view are drawn and a per-window
Load all escape hatch; depth, coverage, and consensus are always
computed from every read, so nothing scientific changes when the budget
engages. Read packing moved off the main thread with cancellation, and row
assignment switched to a segment tree (oracle-tested to place reads
identically to the old packer) — a 600,000x microsatellite window that
previously hung the app now scrolls. A loading badge shows the fetch and
pack phases, and Esc cancels them.
Clicking a read in a detached classifier evidence viewer selects it again;
a regression had left those viewers with a zero-height clickable area. The
transient "Classifier alignment evidence is unavailable" badge now clears
itself the moment the background evidence checksum finishes instead of
waiting for the next unrelated redraw, and that check no longer cancels
read and depth fetches that started legitimately while it ran.
A low-complexity read filter
Read Processing gains Low-Complexity Filter, a bbduk-based entropy
filter (entropy 0.6 over a 50 bp window with k=5 by default) for removing
homopolymer and tandem-repeat reads before classification. bbduk was chosen
over fastp after benchmarking both against a real readset: fastp's
complexity metric cannot detect tandem repeats at all (0 of 309,432
ATC-repeat reads removed; the analysis is committed at
docs/reports/2026-08-23-low-entropy-filter-benchmark.md). The operation
has full GUI and CLI parity (lungfish-cli fastq entropy-filter),
derivative lineage, and provenance that records bbduk's parsed read/base
summaries.
FASTQ operations: compressed outputs, live progress, fast statistics
- Derivative operations whose tool compresses natively (bbduk, clumpify,
fastp, and friends) now emit.fastq.gzwhen the input was gzipped,
instead of silently decompressing a 6 GB input into a 20 GB output.
Operations that write through Lungfish's own writer deliberately stay
uncompressed — the allowlist is exhaustive so no operation can
mislabel its output. - The Operations panel reports per-sample tool, import, and statistics
phases while a FASTQ operation runs, instead of sitting on the launch
message for the whole run. - Post-operation bundle statistics come from seqkit exact aggregates plus
sampled distributions, with a Swift-reader fallback — importing the
result of a large filter no longer spends most of its wall clock
recounting reads.
EsViritu evidence knows its reference
The EsViritu detail viewport previously reported "reference: not provided"
and could not show differences. The app now resolves the pangenome FASTA of
the managed EsViritu database version the result records (falling back to
the installed version with a visible reason), validates it structurally,
and displays the alignment against it. Records are read through a native
.fai index instead of scanning the multi-hundred-megabyte FASTA, and
snapshot digests are cached (keyed by size, mtime, and an edge probe) so
clicking a detection no longer pays three full-file SHA-256 passes — while
a mid-read file replacement is still detected and rejected.
TaxTriage on exFAT project drives
TaxTriage runs launched from an exFAT project volume failed immediately
with Nextflow's "Can't open cache DB … needs a shared file system that
supports file locks". The lock message is a misreport: the underlying
error is a NumberFormatException on an AppleDouble ._ sidecar file.
exFAT has no native extended attributes, so macOS shims every xattr into a
._ sidecar, and Nextflow's cache database crashes parsing one as a
number — file locks work fine on these volumes.
Lungfish now probes each project volume once with real files: a volume
hosts the Nextflow launch scratch only when fcntl locks succeed and
writing an xattr leaves no sidecar behind. Qualifying volumes (APFS or
HFS+ external SSDs, typically far larger than the boot disk) keep the
multi-gigabyte work trees on the project drive; disqualified volumes
(exFAT, FAT, some network mounts) fall back to local scratch, with results
still publishing into the project. The same placement applies to TaxTriage,
the workflow engine, and the nf-core CLI path.
Tool failures whose stderr is empty now fall back to the stdout tail, so a
failing pipeline reports its actual error instead of an empty message.
Viewport hygiene
Transient overlays (BLAST progress, extraction status, and similar) now
route through a single chokepoint that clears them on every viewport
transition, so overlays from one analysis no longer linger over another.
clearViewport also tears down three child viewports it previously missed
(12S amplicon, genotype, and MHC reference bundle), and deleting or
removing a displayed bundle from disk clears the viewport instead of
leaving stale content — while filesystem churn from background scans stays
suppressed and cannot blank an actively viewed result.
Stability
- The gzip streaming reader's child teardown is bounded: stderr drains
concurrently, waits escalate to SIGKILL, and abandoned children die of
SIGPIPE instead of hanging their consumer (one such hang held a test
gate for 54 minutes). - The FASTQ document viewer's 10,000-record cap is now a named constant
and documents flag themselves as truncated when a larger file was
partially loaded. - An end-to-end regression test pins the BBTools shell-script wrapper's
space-in-path shim, which protects installs under paths containing
spaces.
Dependency versions
Dependency set 2026.2 (2026-08-18), unchanged from 2026.8.8. No tool,
pipeline, database, or bootstrap pins changed in this release. The
low-complexity filter uses the already-bundled BBTools bbduk; statistics
sampling uses the already-managed seqkit.
v2026.8.8
Lungfish 2026.8.8
Channel: Preview
Previous versioned release: v2026.8.7
Stable baseline: v2026.8.7
Dependency set: 2026.2
Preview builds are under rapid iterative development. Features may be incomplete, change quickly, or require additional feedback.
Lungfish 2026.8.8 is a preview focused on three things a large Kraken2 batch
exposed this week: projects that grew by tens of gigabytes, BAM viewports that
hid reads and differences until you zoomed, and a memory blow-up that could
take the whole machine down while an import and a classification ran side by
side. The dependency set is unchanged at 2026.2.
Changes since 2026.8.7
Kraken2 results no longer duplicate your imports
A 55-sample Kraken2 run was copying every input FASTQ into
.lungfish-provenance/intermediates/classification-inputs/ inside the
analysis, adding 18.7 GB of byte-identical files to a project whose imports
already held the same data. The pipeline now references durable inputs in
place and only copies genuinely transient inputs (virtual subset, trim, and
demux bundles materialized into the project's scratch folder). Existing
analyses are left untouched because their recorded replay commands point at
the copies; you can delete those classification-inputs folders by hand once
you are satisfied.
Provenance for classification runs is also correct now:
- The raw
classification.krakenfile, which the pipeline compresses and
deletes, is no longer advertised as a run output. Step history still records
what each tool actually wrote at the time. - Bracken's re-estimated report is written to an explicit path
(classification.bracken.kreport) and declared; older auto-named
classification_bracken_species.kreportfiles are still read. - A sample whose Bracken profile degrades because the Kraken report has no
rows at the requested rank (the normal case for negative controls) is a
completed run with a warning, not a failure, and a batch with two degraded
controls and 53 good samples is no longer marked failed in its provenance.
Kraken2 viewport
- The taxon search field is back. Typing filters the tree to matching taxa
plus their ancestors and whole clades, composes with the column header
filters, and dims the sunburst to match. - When Bracken ran, a Bracken column shows its re-estimated read counts
next to the raw Kraken2 counts; it stays hidden for Kraken2-only results. - BLAST Verify on a multi-sample batch now verifies reads from the sample
that owns the selected taxon. Previously it looked in the first selected
sample and failed with "No sequences provided for BLAST verification". - Extract FASTQ writes its bundle to a top-level
Extractions/folder,
kept apart fromImports/, and FASTA-format extractions produce a bundle the
sidebar can open. A failed extraction no longer leaves a half-written bundle
behind, and samples skipped for missing inputs are reported instead of
silently dropped.
BAM viewers
- Alignment views (classifier evidence, mapping results, any bundle with
reads) open showing the whole contig, so reads mapped anywhere on the
reference are visible before you zoom in. - Differences from the reference are drawn at every zoom level that shows
individual reads, including classifier BAMs loaded without a reference
sequence; mismatch ticks now come from the aligner's MD tag when no
reference is available. - High-depth samples render smoothly. The read layout is packed once and
reused while panning, only the rows and reads inside the viewport are drawn,
and per-read mismatch positions are computed once when reads are loaded.
Stability
- Importing FASTQ files no longer lets the app's memory grow with the size of
the file. The gzip line reader and FASTQ record reader were producer tasks
feeding unbounded buffers, so a fast decompressor and a slower consumer
(read-length statistics) could buffer the whole decompressed file; both now
parse on demand. - The Java heap for bundled BBTools steps is sized so an import can run next
to a Kraken2 classification: about a third of physical memory, further
capped by what is actually free, instead of 60 to 80 percent of RAM. - Project folder watching is volume-aware. On exFAT, FAT, and network volumes
the app subscribes to directory-level file-system events with a longer
latency, handles events off the main thread, and collapses bursts of
thousands of changes into one refresh, so a running classification cannot
make the window unresponsive. - The managed micromamba bootstrap never replaces a working installed binary
with a bundled one that cannot run, compares versions by release rather than
build suffix, and restores the previous binary if a fresh copy fails. Its
error messages now state the command, exit status or signal, and a
code-signature hint instead of "Failed to install package: ".
Release and maintenance
- Debug test builds (
scripts/build-app.sh --debug) re-sign every bundled
tool after path sanitizing and refuse to finish unless the bundled micromamba
runs; the shared release skill documents how debug builds are produced and
that they are never signed, notarized, or uploaded. - Source-text test assertions across the app were converted to behavioral
ViewInspector and AppKit tests, and the attended XCUI diagnostic tier was
repaired and certified green.
Verification
- Unit tier gate: PASS at the release commit (541 tests; two load-sensitive
classes passed via the gate's isolated serial retry). - Integration tier gate and dependency sweep tiers 1 through 3: see the
release report for the PASS lines recorded at the release commit. - Focused release tests (CLI version, help text, managed tool lock, release
build configuration, app version) green.
Dependency versions
The following tables reproduce every current version identity in the bundled
dependency manifest and Package.resolved. Conda identities include their
exact channel, package version, and build string.
Core managed tools
| Manifest id | Exact package identity |
|---|---|
nextflow |
bioconda::nextflow=26.04.6=h2a3209d_1 |
snakemake |
bioconda::snakemake=9.25.2=hdfd78af_0 |
bbtools |
bioconda::bbmap=40.02=he046917_0 |
fastp |
bioconda::fastp=1.3.6=ha1d0559_0 |
deacon |
bioconda::deacon=0.16.0=h314a369_0 |
samtools |
bioconda::samtools=1.24=h36b3a25_1 |
bcftools |
bioconda::bcftools=1.24=h6bd33b9_2 |
htslib |
bioconda::htslib=1.24=hd3c6ec9_0 |
seqkit |
bioconda::seqkit=2.13.0=hd5f1084_0 |
cutadapt |
bioconda::cutadapt=5.2=py313hf513372_2 |
trim_galore |
bioconda::trim-galore=2.3.0=h48b4a6d_0 |
vsearch |
bioconda::vsearch=2.31.0=h0448ff9_0 |
pigz |
conda-forge::pigz=2.8=hfab5511_2 |
sra-tools |
bioconda::sra-tools=3.4.1=h4675bf2_1 |
ucsc-bedgraphtobigwig |
bioconda::ucsc-bedgraphtobigwig=482=h1643cc5_0 |
pysam |
bioconda::pysam=0.24.0=py310hf7cbfa5_1 |
openpyxl |
conda-forge::openpyxl=3.1.5=py312h2a925e6_3 |
Plugin-pack tools
| Pack | Manifest id | Exact package identity |
|---|---|---|
| Read Mapping | minimap2 |
bioconda::minimap2=2.31=h6bd33b9_0 |
| Read Mapping | bwa-mem2 |
bioconda::bwa-mem2=2.3=hda5e58c_0 |
| Read Mapping | bowtie2 |
bioconda::bowtie2=2.5.5=h9e91881_0 |
| Full-Length MHC Genotyping | savont |
bioconda::savont=0.6.3=ha819e4a_0 |
| Full-Length MHC Genotyping | blast |
bioconda::blast=2.16.0=hb260f6e_5 |
| Variant Calling | lofreq |
bioconda::lofreq=2.1.5=py310h9cf5bfa_16 |
| Variant Calling | ivar |
bioconda::ivar=1.4.4=hda5e58c_0 |
| Variant Calling | medaka |
bioconda::medaka=2.2.2=py312h3bb865a_0 |
| Variant Calling | clair3 |
bioconda::clair3=2.0.2=py311h9aa1f4a_0 |
| GATK Core | gatk4 |
bioconda::gatk4=4.6.2.0=py310hdfd78af_1 |
| Phasing | whatshap |
bioconda::whatshap=2.3=py311h1457a19_3 |
| Assembly | spades |
bioconda::spades=4.3.0=hd468e49_1 |
| Assembly | megahit |
bioconda::megahit=1.2.9=h96a01ab_8 |
| Assembly | skesa |
bioconda::skesa=2.5.1=hda5e58c_3 |
| Assembly | flye |
bioconda::flye=2.9.6=py310hba4535a_1 |
| Assembly | hifiasm |
bioconda::hifiasm=0.25.0=h697fd72_0 |
| Multiple Sequence Alignment | mafft |
conda-forge::mafft=7.526=h99b78c6_0 |
| Phylogenetics | iqtree |
bioconda::iqtree=3.1.3=h6cc7423_0 |
| Metagenomics | kraken2 |
bioconda::kraken2=2.17.1=pl5321h158e17b_0 |
| Metagenomics | bracken |
compatibility pin bioconda::bracken=1.0.0=1; fresh installs use source overlay 3.1 with Python 3.11.13, cxx-compiler 1.9.0, and llvm-openmp 21.1.8 |
| Metagenomics | esviritu |
bioconda::esviritu=1.3.3=pyhdfd78af_0 |
| Metagenomics | ribodetector |
bioconda::ribodetector=0.3.3=pyhdfd78af_0 |
| Wastewater Surveillance | freyja |
bioconda::freyja=2.0.3=pyhdfd78af_0 |
Pipelines
| Manifest id | Release | Immutable revision |
|---|---|---|
taxtriage |
v3.3.8 |
e10bfebda32a62711f38a4e23ab03b61725a9675 |
nf-core-viralrecon |
3.0.0 |
3.0.0 |
Databases and managed data
| Manifest id | Current identity |
|---|---|
kraken2-standard |
20260626 |
kraken2-standard-8 |
20260626 |
kraken2-standard-16 |
20260626 |
kraken2-pluspf |
20260626 |
kraken2-pluspf-8 |
20260626 |
kraken2-pluspf-16 |
20260626 |
kraken2-viral |
20260626 |
kraken2-minus-b |
20260626 |
kraken2-eupathdb46 |
20230407 |
esviritu-viral-v3 |
v3.2.4 |
ncbi-taxonomy |
2025-03 |
kraken2-special-silva |
kraken2-special-v1 |
kraken2-special-greengenes |
kraken2-special-v1 |
human-scrubber |
20260706v2 |
deacon-panhuman |
panhuman-1 |
deacon-ribokmers |
bbmap-ribokmers-k31w15 |
The bootstrap identity is micromamba 2.9.0-0; its Apple Silicon payload is
checksum-verified before use.
SwiftPM resolved packages
| Package identity | Version | Re...
v2026.8.7
Lungfish 2026.8.7
Channel: Stable
Previous versioned release: v2026.8.6
Stable baseline: v2026.8.5
Dependency set: 2026.2
Lungfish 2026.8.7 is the stable release of the test-suite optimization campaign
and the correctness fixes it surfaced. It aggregates the complete delta from
stable 2026.8.5 through preview 2026.8.6; the dependency set is unchanged at
2026.2.
Included preview releases
- 2026.8.6
Changes since 2026.8.5 (stable baseline)
This stable release carries the test-suite optimization campaign and the correctness fixes it surfaced. User-visible changes:
Correctness and stability
- Fixed a defect where the genotype viewport's "Save Haplotype Assignment Changes?" confirmation could be presented in contexts with no way to answer it. The dialog now only appears in the interactive app.
lungfish ops statsnow reports real sub-megabyte Peak RAM values (for example "512 bytes") instead of flooring them to "0 MB".- ENA searches now report malformed server responses through the same structured parse error as every other ENA operation, instead of surfacing a raw decoding failure.
Display consistency
- All byte, count, and duration readouts across the app and CLI now use one shared formatter. Sizes consistently use decimal units with adaptive precision; in a few places (Plugin Manager database sizes,
lungfish conda list,lungfish db info) values previously shown as whole binary units now show finer precision (for example "8 GB" becomes "8.59 GB").
Developer and release infrastructure
- The test suite is reorganized into named tiers (smoke, unit, integration, conformance, full) with a parallel unit tier that runs in under 8 minutes; the full suite remains the stable-release gate. Release channels now run tier-appropriate gates.
- Test runs no longer open the system browser or present dialogs; live-network and machine-specific tests are uniformly gated.
Verification
- Full serial suite: 13,535 XCTest + 597 swift-testing tests, zero failures (two load-sensitive classes passed via the gate's isolated serial retry).
- Unit, integration, and script-level gates green at the release commit.
Dependency versions
The following tables reproduce every current version identity in the bundled
dependency manifest and Package.resolved. Conda identities include their
exact channel, package version, and build string.
Core managed tools
| Manifest id | Exact package identity |
|---|---|
nextflow |
bioconda::nextflow=26.04.6=h2a3209d_1 |
snakemake |
bioconda::snakemake=9.25.2=hdfd78af_0 |
bbtools |
bioconda::bbmap=40.02=he046917_0 |
fastp |
bioconda::fastp=1.3.6=ha1d0559_0 |
deacon |
bioconda::deacon=0.16.0=h314a369_0 |
samtools |
bioconda::samtools=1.24=h36b3a25_1 |
bcftools |
bioconda::bcftools=1.24=h6bd33b9_2 |
htslib |
bioconda::htslib=1.24=hd3c6ec9_0 |
seqkit |
bioconda::seqkit=2.13.0=hd5f1084_0 |
cutadapt |
bioconda::cutadapt=5.2=py313hf513372_2 |
trim_galore |
bioconda::trim-galore=2.3.0=h48b4a6d_0 |
vsearch |
bioconda::vsearch=2.31.0=h0448ff9_0 |
pigz |
conda-forge::pigz=2.8=hfab5511_2 |
sra-tools |
bioconda::sra-tools=3.4.1=h4675bf2_1 |
ucsc-bedgraphtobigwig |
bioconda::ucsc-bedgraphtobigwig=482=h1643cc5_0 |
pysam |
bioconda::pysam=0.24.0=py310hf7cbfa5_1 |
openpyxl |
conda-forge::openpyxl=3.1.5=py312h2a925e6_3 |
Plugin-pack tools
| Pack | Manifest id | Exact package identity |
|---|---|---|
| Read Mapping | minimap2 |
bioconda::minimap2=2.31=h6bd33b9_0 |
| Read Mapping | bwa-mem2 |
bioconda::bwa-mem2=2.3=hda5e58c_0 |
| Read Mapping | bowtie2 |
bioconda::bowtie2=2.5.5=h9e91881_0 |
| Full-Length MHC Genotyping | savont |
bioconda::savont=0.6.3=ha819e4a_0 |
| Full-Length MHC Genotyping | blast |
bioconda::blast=2.16.0=hb260f6e_5 |
| Variant Calling | lofreq |
bioconda::lofreq=2.1.5=py310h9cf5bfa_16 |
| Variant Calling | ivar |
bioconda::ivar=1.4.4=hda5e58c_0 |
| Variant Calling | medaka |
bioconda::medaka=2.2.2=py312h3bb865a_0 |
| Variant Calling | clair3 |
bioconda::clair3=2.0.2=py311h9aa1f4a_0 |
| GATK Core | gatk4 |
bioconda::gatk4=4.6.2.0=py310hdfd78af_1 |
| Phasing | whatshap |
bioconda::whatshap=2.3=py311h1457a19_3 |
| Assembly | spades |
bioconda::spades=4.3.0=hd468e49_1 |
| Assembly | megahit |
bioconda::megahit=1.2.9=h96a01ab_8 |
| Assembly | skesa |
bioconda::skesa=2.5.1=hda5e58c_3 |
| Assembly | flye |
bioconda::flye=2.9.6=py310hba4535a_1 |
| Assembly | hifiasm |
bioconda::hifiasm=0.25.0=h697fd72_0 |
| Multiple Sequence Alignment | mafft |
conda-forge::mafft=7.526=h99b78c6_0 |
| Phylogenetics | iqtree |
bioconda::iqtree=3.1.3=h6cc7423_0 |
| Metagenomics | kraken2 |
bioconda::kraken2=2.17.1=pl5321h158e17b_0 |
| Metagenomics | bracken |
compatibility pin bioconda::bracken=1.0.0=1; fresh installs use source overlay 3.1 with Python 3.11.13, cxx-compiler 1.9.0, and llvm-openmp 21.1.8 |
| Metagenomics | esviritu |
bioconda::esviritu=1.3.3=pyhdfd78af_0 |
| Metagenomics | ribodetector |
bioconda::ribodetector=0.3.3=pyhdfd78af_0 |
| Wastewater Surveillance | freyja |
bioconda::freyja=2.0.3=pyhdfd78af_0 |
Pipelines
| Manifest id | Release | Immutable revision |
|---|---|---|
taxtriage |
v3.3.8 |
e10bfebda32a62711f38a4e23ab03b61725a9675 |
nf-core-viralrecon |
3.0.0 |
3.0.0 |
Databases and managed data
| Manifest id | Current identity |
|---|---|
kraken2-standard |
20260626 |
kraken2-standard-8 |
20260626 |
kraken2-standard-16 |
20260626 |
kraken2-pluspf |
20260626 |
kraken2-pluspf-8 |
20260626 |
kraken2-pluspf-16 |
20260626 |
kraken2-viral |
20260626 |
kraken2-minus-b |
20260626 |
kraken2-eupathdb46 |
20230407 |
esviritu-viral-v3 |
v3.2.4 |
ncbi-taxonomy |
2025-03 |
kraken2-special-silva |
kraken2-special-v1 |
kraken2-special-greengenes |
kraken2-special-v1 |
human-scrubber |
20260706v2 |
deacon-panhuman |
panhuman-1 |
deacon-ribokmers |
bbmap-ribokmers-k31w15 |
The bootstrap identity is micromamba 2.9.0-0; its Apple Silicon payload is
checksum-verified before use.
SwiftPM resolved packages
| Package identity | Version | Revision |
|---|---|---|
async-http-client |
1.36.0 |
9544287b9416c0bc71e58b9f3aead8dd14b16103 |
containerization |
0.24.5 |
c3fe889a2f739ee4a9b0faccedd9f36f3862dc29 |
grpc-swift |
1.27.5 |
6a8927df5a91710b414caba4f8a088dead4633db |
sparkle |
2.9.6 |
ac2def288cbff5cfc7df3ffef6abdf45b72bcb0a |
swift-algorithms |
1.2.1 |
87e50f483c54e6efd60e885f7f5aa946cee68023 |
swift-argument-parser |
1.8.2 |
6a52f3251125d74daf04fcbd5e6f08a75d074382 |
swift-asn1 |
1.7.1 |
a9a5efd40eaf558a2bcd48d64b1d1646be686008 |
swift-async-algorithms |
1.1.5 |
3da39bbc4e687d4192af7c9cf4eab805745a0b9c |
swift-atomics |
1.3.1 |
0442cb5a3f98ab802acb777929fdb446bda11a34 |
swift-certificates |
1.19.4 |
449dbbecd0f31e82b510ada227ca152caa8b5e98 |
swift-collections |
1.6.0 |
a0cb0954ecb21e4e31b0070e6ed5674e8556685a |
swift-configuration |
1.2.0 |
be76c4ad929eb6c4bcaf3351799f2adf9e6848a9 |
swift-crypto |
3.15.1 |
95ba0316a9b733e92bb6b071255ff46263bbe7dc |
swift-distributed-tracing |
1.4.1 |
dc4030184203ffafbb2ec614352487235d747fe0 |
swift-http-structured-headers |
1.7.0 |
933538faa42c432d385f02e07df0ace7c5ecfc47 |
swift-http-types |
1.6.0 |
db774a277f60063a32d854f2980299caf06da041 |
swift-log |
1.15.0 |
3ffafb9722d5d918c614feb496c8789a3b59d222 |
swift-nio |
2.101.3 |
0b18836bd8b0162e7e17a995a3fbee20ed8f3b2b |
swift-nio-extras |
1.34.3 |
88a51340f59cf181ebde888bd1b749296b3ec029 |
swift-nio-http2 |
1.45.0 |
45bdf670248be5f16ec0340e125dca285536f0fb |
swift-nio-ssl |
2.37.2 |
d930168b86f46ca51a4bc09c5ca45c1833db8067 |
swift-nio-transport-services |
1.28.0 |
67787bb645a5e67d2edcdfbe48a216cc549222d5 |
swift-numerics |
1.1.1 |
0c0290ff6b24942dadb83a929ffaaa1481df04a2 |
swift-protobuf |
1.35.0 |
9bbb079b69af9d66470ced85461bf13bb40becac |
swift-service-context |
1.3.0 |
d0997351b0c7779017f88e7a93bc30a1878d7f29 |
swift-service-lifecycle |
2.12.0 |
7f9326b0326ff86e3646295ea6e891f68c471c5e |
swift-system |
1.8.1 |
869129b7bf4ecc57b97d0193ad29690ca2134750 |
zstd |
1.5.7 |
f8745da6ff1ad1e7bab384bd1f9d742439278e99 |
viewinspector |
0.10.3 |
e9a06346499a3a889165647e3f23f8a7b2609a1c |
Known issues and compatibility notes
- Preview and Stable cannot be installed side by side; install the desired
channel's DMG to switch the one shared application installation. - The 20260626 Kraken2 indexes display species-level taxid 3418604 as
Betacoronavirus pandemicum. Classification identifiers are unchanged, but
searches or notes relying on the former SARS-CoV-2 display name should be
checked. - The Apple Silicon bioconda Bracken compatibility package has no real driver
and does not support domain-level profiling through its synthesized
launcher. Fresh installs receive the managed Bracken 3.1 source build;
existing working environments are preserved. bioconda::bwa-mem2=2.3=hda5e58c_0self-reports 2.2.1 because of an upstream
packaging defect. Lungfish verifies that pin from conda package metadata.
v2026.8.6
Lungfish 2026.8.6
Channel: Preview
Previous versioned release: v2026.8.5
Stable baseline: v2026.8.5
Dependency set: 2026.2
Preview builds are under rapid iterative development. Features may be incomplete, change quickly, or require additional feedback.
Changes since 2026.8.5
This preview carries the test-suite optimization campaign and the correctness fixes it surfaced. User-visible changes:
Correctness and stability
- Fixed a defect where the genotype viewport's "Save Haplotype Assignment Changes?" confirmation could be presented in contexts with no way to answer it. The dialog now only appears in the interactive app.
lungfish ops statsnow reports real sub-megabyte Peak RAM values (for example "512 bytes") instead of flooring them to "0 MB".- ENA searches now report malformed server responses through the same structured parse error as every other ENA operation, instead of surfacing a raw decoding failure.
Display consistency
- All byte, count, and duration readouts across the app and CLI now use one shared formatter. Sizes consistently use decimal units with adaptive precision; in a few places (Plugin Manager database sizes,
lungfish conda list,lungfish db info) values previously shown as whole binary units now show finer precision (for example "8 GB" becomes "8.59 GB").
Developer and release infrastructure
- The test suite is reorganized into named tiers (smoke, unit, integration, conformance, full) with a parallel unit tier that runs in under 8 minutes; the full suite remains the stable-release gate. Release channels now run tier-appropriate gates.
- Test runs no longer open the system browser or present dialogs; live-network and machine-specific tests are uniformly gated.
Verification
- Full serial suite: 13,535 XCTest + 597 swift-testing tests, zero failures (two load-sensitive classes passed via the gate's isolated serial retry).
- Unit, integration, and script-level gates green at the release commit.
Dependency versions
The following tables reproduce every current version identity in the bundled
dependency manifest and Package.resolved. Conda identities include their
exact channel, package version, and build string.
Core managed tools
| Manifest id | Exact package identity |
|---|---|
nextflow |
bioconda::nextflow=26.04.6=h2a3209d_1 |
snakemake |
bioconda::snakemake=9.25.2=hdfd78af_0 |
bbtools |
bioconda::bbmap=40.02=he046917_0 |
fastp |
bioconda::fastp=1.3.6=ha1d0559_0 |
deacon |
bioconda::deacon=0.16.0=h314a369_0 |
samtools |
bioconda::samtools=1.24=h36b3a25_1 |
bcftools |
bioconda::bcftools=1.24=h6bd33b9_2 |
htslib |
bioconda::htslib=1.24=hd3c6ec9_0 |
seqkit |
bioconda::seqkit=2.13.0=hd5f1084_0 |
cutadapt |
bioconda::cutadapt=5.2=py313hf513372_2 |
trim_galore |
bioconda::trim-galore=2.3.0=h48b4a6d_0 |
vsearch |
bioconda::vsearch=2.31.0=h0448ff9_0 |
pigz |
conda-forge::pigz=2.8=hfab5511_2 |
sra-tools |
bioconda::sra-tools=3.4.1=h4675bf2_1 |
ucsc-bedgraphtobigwig |
bioconda::ucsc-bedgraphtobigwig=482=h1643cc5_0 |
pysam |
bioconda::pysam=0.24.0=py310hf7cbfa5_1 |
openpyxl |
conda-forge::openpyxl=3.1.5=py312h2a925e6_3 |
Plugin-pack tools
| Pack | Manifest id | Exact package identity |
|---|---|---|
| Read Mapping | minimap2 |
bioconda::minimap2=2.31=h6bd33b9_0 |
| Read Mapping | bwa-mem2 |
bioconda::bwa-mem2=2.3=hda5e58c_0 |
| Read Mapping | bowtie2 |
bioconda::bowtie2=2.5.5=h9e91881_0 |
| Full-Length MHC Genotyping | savont |
bioconda::savont=0.6.3=ha819e4a_0 |
| Full-Length MHC Genotyping | blast |
bioconda::blast=2.16.0=hb260f6e_5 |
| Variant Calling | lofreq |
bioconda::lofreq=2.1.5=py310h9cf5bfa_16 |
| Variant Calling | ivar |
bioconda::ivar=1.4.4=hda5e58c_0 |
| Variant Calling | medaka |
bioconda::medaka=2.2.2=py312h3bb865a_0 |
| Variant Calling | clair3 |
bioconda::clair3=2.0.2=py311h9aa1f4a_0 |
| GATK Core | gatk4 |
bioconda::gatk4=4.6.2.0=py310hdfd78af_1 |
| Phasing | whatshap |
bioconda::whatshap=2.3=py311h1457a19_3 |
| Assembly | spades |
bioconda::spades=4.3.0=hd468e49_1 |
| Assembly | megahit |
bioconda::megahit=1.2.9=h96a01ab_8 |
| Assembly | skesa |
bioconda::skesa=2.5.1=hda5e58c_3 |
| Assembly | flye |
bioconda::flye=2.9.6=py310hba4535a_1 |
| Assembly | hifiasm |
bioconda::hifiasm=0.25.0=h697fd72_0 |
| Multiple Sequence Alignment | mafft |
conda-forge::mafft=7.526=h99b78c6_0 |
| Phylogenetics | iqtree |
bioconda::iqtree=3.1.3=h6cc7423_0 |
| Metagenomics | kraken2 |
bioconda::kraken2=2.17.1=pl5321h158e17b_0 |
| Metagenomics | bracken |
compatibility pin bioconda::bracken=1.0.0=1; fresh installs use source overlay 3.1 with Python 3.11.13, cxx-compiler 1.9.0, and llvm-openmp 21.1.8 |
| Metagenomics | esviritu |
bioconda::esviritu=1.3.3=pyhdfd78af_0 |
| Metagenomics | ribodetector |
bioconda::ribodetector=0.3.3=pyhdfd78af_0 |
| Wastewater Surveillance | freyja |
bioconda::freyja=2.0.3=pyhdfd78af_0 |
Pipelines
| Manifest id | Release | Immutable revision |
|---|---|---|
taxtriage |
v3.3.8 |
e10bfebda32a62711f38a4e23ab03b61725a9675 |
nf-core-viralrecon |
3.0.0 |
3.0.0 |
Databases and managed data
| Manifest id | Current identity |
|---|---|
kraken2-standard |
20260626 |
kraken2-standard-8 |
20260626 |
kraken2-standard-16 |
20260626 |
kraken2-pluspf |
20260626 |
kraken2-pluspf-8 |
20260626 |
kraken2-pluspf-16 |
20260626 |
kraken2-viral |
20260626 |
kraken2-minus-b |
20260626 |
kraken2-eupathdb46 |
20230407 |
esviritu-viral-v3 |
v3.2.4 |
ncbi-taxonomy |
2025-03 |
kraken2-special-silva |
kraken2-special-v1 |
kraken2-special-greengenes |
kraken2-special-v1 |
human-scrubber |
20260706v2 |
deacon-panhuman |
panhuman-1 |
deacon-ribokmers |
bbmap-ribokmers-k31w15 |
The bootstrap identity is micromamba 2.9.0-0; its Apple Silicon payload is
checksum-verified before use.
SwiftPM resolved packages
| Package identity | Version | Revision |
|---|---|---|
async-http-client |
1.36.0 |
9544287b9416c0bc71e58b9f3aead8dd14b16103 |
containerization |
0.24.5 |
c3fe889a2f739ee4a9b0faccedd9f36f3862dc29 |
grpc-swift |
1.27.5 |
6a8927df5a91710b414caba4f8a088dead4633db |
sparkle |
2.9.6 |
ac2def288cbff5cfc7df3ffef6abdf45b72bcb0a |
swift-algorithms |
1.2.1 |
87e50f483c54e6efd60e885f7f5aa946cee68023 |
swift-argument-parser |
1.8.2 |
6a52f3251125d74daf04fcbd5e6f08a75d074382 |
swift-asn1 |
1.7.1 |
a9a5efd40eaf558a2bcd48d64b1d1646be686008 |
swift-async-algorithms |
1.1.5 |
3da39bbc4e687d4192af7c9cf4eab805745a0b9c |
swift-atomics |
1.3.1 |
0442cb5a3f98ab802acb777929fdb446bda11a34 |
swift-certificates |
1.19.4 |
449dbbecd0f31e82b510ada227ca152caa8b5e98 |
swift-collections |
1.6.0 |
a0cb0954ecb21e4e31b0070e6ed5674e8556685a |
swift-configuration |
1.2.0 |
be76c4ad929eb6c4bcaf3351799f2adf9e6848a9 |
swift-crypto |
3.15.1 |
95ba0316a9b733e92bb6b071255ff46263bbe7dc |
swift-distributed-tracing |
1.4.1 |
dc4030184203ffafbb2ec614352487235d747fe0 |
swift-http-structured-headers |
1.7.0 |
933538faa42c432d385f02e07df0ace7c5ecfc47 |
swift-http-types |
1.6.0 |
db774a277f60063a32d854f2980299caf06da041 |
swift-log |
1.15.0 |
3ffafb9722d5d918c614feb496c8789a3b59d222 |
swift-nio |
2.101.3 |
0b18836bd8b0162e7e17a995a3fbee20ed8f3b2b |
swift-nio-extras |
1.34.3 |
88a51340f59cf181ebde888bd1b749296b3ec029 |
swift-nio-http2 |
1.45.0 |
45bdf670248be5f16ec0340e125dca285536f0fb |
swift-nio-ssl |
2.37.2 |
d930168b86f46ca51a4bc09c5ca45c1833db8067 |
swift-nio-transport-services |
1.28.0 |
67787bb645a5e67d2edcdfbe48a216cc549222d5 |
swift-numerics |
1.1.1 |
0c0290ff6b24942dadb83a929ffaaa1481df04a2 |
swift-protobuf |
1.35.0 |
9bbb079b69af9d66470ced85461bf13bb40becac |
swift-service-context |
1.3.0 |
d0997351b0c7779017f88e7a93bc30a1878d7f29 |
swift-service-lifecycle |
2.12.0 |
7f9326b0326ff86e3646295ea6e891f68c471c5e |
swift-system |
1.8.1 |
869129b7bf4ecc57b97d0193ad29690ca2134750 |
zstd |
1.5.7 |
f8745da6ff1ad1e7bab384bd1f9d742439278e99 |
viewinspector |
0.10.3 |
e9a06346499a3a889165647e3f23f8a7b2609a1c |
Known issues and compatibility notes
- Preview and Stable cannot be installed side by side; install the desired
channel's DMG to switch the one shared application installation. - The 20260626 Kraken2 indexes display species-level taxid 3418604 as
Betacoronavirus pandemicum. Classification identifiers are unchanged, but
searches or notes relying on the former SARS-CoV-2 display name should be
checked. - The Apple Silicon bioconda Bracken compatibility package has no real driver
and does not support domain-level profiling through its synthesized
launcher. Fresh installs receive the managed Bracken 3.1 source build;
existing working environments are preserved. bioconda::bwa-mem2=2.3=hda5e58c_0self-reports 2.2.1 because of an upstream
packaging defect. Lungfish verifies that pin from conda package metadata.
v2026.8.5
Lungfish 2026.8.5
Channel: Stable
Previous versioned release: v2026.8.4
Stable baseline: v2026.8.4
Dependency set: 2026.2
Lungfish 2026.8.5 supersedes the first Stable CalVer build after its automatic
release board exposed a mismatch in the MEGAHIT conformance test. The shipped
assembly pipeline was already using its supported Apple Silicon command, but
the test bypassed that command builder and invoked raw MEGAHIT without
--no-hw-accel, selecting an accelerated core that aborted on the CI host.
This release contains no scientific workflow, parser, storage, database, or
dependency-pin change from 2026.8.4. It rebuilds the Stable app from the
corrected validation source, with a new version, build number, signature,
notarization record, DMG, and Sparkle item.
Included preview releases
None. No Preview release falls between Stable v2026.8.4 and this Stable
replacement.
Release validation correction
- The MEGAHIT conformance test now constructs its invocation through
ManagedAssemblyPipeline.buildCommand, the same path used by the shipped
application. - On Apple Silicon the test asserts the production safeguards explicitly:
--no-hw-accelis present and the requested four threads are capped to two. - The test executes that production command and still requires successful
assembly, a non-emptyfinal.contigs.fa, normalized output, and recorded
command provenance.
The 2026.8.4 Stable artifact passed its Fast gate and Build/smoke job; the
Toolset conformance job failed only at the obsolete raw test invocation.
2026.8.5 is issued so the immutable release tag, shipped source, and automatic
Stable validation board all describe the same verified state.
Reproducibility and provenance
Dependency set 2026.2 and every scientific tool, pipeline, database, bootstrap,
and SwiftPM pin remain unchanged. Scientific operations continue to record the
executed tool and version, exact arguments and resolved defaults, runtime
identity, input and output paths, checksums, sizes, exit status, wall time, and
useful diagnostics. The MEGAHIT conformance test now verifies the production
command line that feeds that provenance instead of maintaining a divergent
hand-written command.
Platform and release infrastructure
This is a fresh Stable-channel build. It is displayed as Lungfish Genome
Explorer (short name Lungfish), reports release channel stable, and
polls sparkle-stable/appcast-stable.xml. It does not relabel or reuse the
2026.8.4 app or DMG.
Dependency versions
The following tables reproduce every current version identity in the bundled
dependency manifest and Package.resolved. Conda identities include their
exact channel, package version, and build string.
Core managed tools
| Manifest id | Exact package identity |
|---|---|
nextflow |
bioconda::nextflow=26.04.6=h2a3209d_1 |
snakemake |
bioconda::snakemake=9.25.2=hdfd78af_0 |
bbtools |
bioconda::bbmap=40.02=he046917_0 |
fastp |
bioconda::fastp=1.3.6=ha1d0559_0 |
deacon |
bioconda::deacon=0.16.0=h314a369_0 |
samtools |
bioconda::samtools=1.24=h36b3a25_1 |
bcftools |
bioconda::bcftools=1.24=h6bd33b9_2 |
htslib |
bioconda::htslib=1.24=hd3c6ec9_0 |
seqkit |
bioconda::seqkit=2.13.0=hd5f1084_0 |
cutadapt |
bioconda::cutadapt=5.2=py313hf513372_2 |
trim_galore |
bioconda::trim-galore=2.3.0=h48b4a6d_0 |
vsearch |
bioconda::vsearch=2.31.0=h0448ff9_0 |
pigz |
conda-forge::pigz=2.8=hfab5511_2 |
sra-tools |
bioconda::sra-tools=3.4.1=h4675bf2_1 |
ucsc-bedgraphtobigwig |
bioconda::ucsc-bedgraphtobigwig=482=h1643cc5_0 |
pysam |
bioconda::pysam=0.24.0=py310hf7cbfa5_1 |
openpyxl |
conda-forge::openpyxl=3.1.5=py312h2a925e6_3 |
Plugin-pack tools
| Pack | Manifest id | Exact package identity |
|---|---|---|
| Read Mapping | minimap2 |
bioconda::minimap2=2.31=h6bd33b9_0 |
| Read Mapping | bwa-mem2 |
bioconda::bwa-mem2=2.3=hda5e58c_0 |
| Read Mapping | bowtie2 |
bioconda::bowtie2=2.5.5=h9e91881_0 |
| Full-Length MHC Genotyping | savont |
bioconda::savont=0.6.3=ha819e4a_0 |
| Full-Length MHC Genotyping | blast |
bioconda::blast=2.16.0=hb260f6e_5 |
| Variant Calling | lofreq |
bioconda::lofreq=2.1.5=py310h9cf5bfa_16 |
| Variant Calling | ivar |
bioconda::ivar=1.4.4=hda5e58c_0 |
| Variant Calling | medaka |
bioconda::medaka=2.2.2=py312h3bb865a_0 |
| Variant Calling | clair3 |
bioconda::clair3=2.0.2=py311h9aa1f4a_0 |
| GATK Core | gatk4 |
bioconda::gatk4=4.6.2.0=py310hdfd78af_1 |
| Phasing | whatshap |
bioconda::whatshap=2.3=py311h1457a19_3 |
| Assembly | spades |
bioconda::spades=4.3.0=hd468e49_1 |
| Assembly | megahit |
bioconda::megahit=1.2.9=h96a01ab_8 |
| Assembly | skesa |
bioconda::skesa=2.5.1=hda5e58c_3 |
| Assembly | flye |
bioconda::flye=2.9.6=py310hba4535a_1 |
| Assembly | hifiasm |
bioconda::hifiasm=0.25.0=h697fd72_0 |
| Multiple Sequence Alignment | mafft |
conda-forge::mafft=7.526=h99b78c6_0 |
| Phylogenetics | iqtree |
bioconda::iqtree=3.1.3=h6cc7423_0 |
| Metagenomics | kraken2 |
bioconda::kraken2=2.17.1=pl5321h158e17b_0 |
| Metagenomics | bracken |
compatibility pin bioconda::bracken=1.0.0=1; fresh installs use source overlay 3.1 with Python 3.11.13, cxx-compiler 1.9.0, and llvm-openmp 21.1.8 |
| Metagenomics | esviritu |
bioconda::esviritu=1.3.3=pyhdfd78af_0 |
| Metagenomics | ribodetector |
bioconda::ribodetector=0.3.3=pyhdfd78af_0 |
| Wastewater Surveillance | freyja |
bioconda::freyja=2.0.3=pyhdfd78af_0 |
Pipelines
| Manifest id | Release | Immutable revision |
|---|---|---|
taxtriage |
v3.3.8 |
e10bfebda32a62711f38a4e23ab03b61725a9675 |
nf-core-viralrecon |
3.0.0 |
3.0.0 |
Databases and managed data
| Manifest id | Current identity |
|---|---|
kraken2-standard |
20260626 |
kraken2-standard-8 |
20260626 |
kraken2-standard-16 |
20260626 |
kraken2-pluspf |
20260626 |
kraken2-pluspf-8 |
20260626 |
kraken2-pluspf-16 |
20260626 |
kraken2-viral |
20260626 |
kraken2-minus-b |
20260626 |
kraken2-eupathdb46 |
20230407 |
esviritu-viral-v3 |
v3.2.4 |
ncbi-taxonomy |
2025-03 |
kraken2-special-silva |
kraken2-special-v1 |
kraken2-special-greengenes |
kraken2-special-v1 |
human-scrubber |
20260706v2 |
deacon-panhuman |
panhuman-1 |
deacon-ribokmers |
bbmap-ribokmers-k31w15 |
The bootstrap identity is micromamba 2.9.0-0; its Apple Silicon payload is
checksum-verified before use.
SwiftPM resolved packages
| Package identity | Version | Revision |
|---|---|---|
async-http-client |
1.36.0 |
9544287b9416c0bc71e58b9f3aead8dd14b16103 |
containerization |
0.24.5 |
c3fe889a2f739ee4a9b0faccedd9f36f3862dc29 |
grpc-swift |
1.27.5 |
6a8927df5a91710b414caba4f8a088dead4633db |
sparkle |
2.9.6 |
ac2def288cbff5cfc7df3ffef6abdf45b72bcb0a |
swift-algorithms |
1.2.1 |
87e50f483c54e6efd60e885f7f5aa946cee68023 |
swift-argument-parser |
1.8.2 |
6a52f3251125d74daf04fcbd5e6f08a75d074382 |
swift-asn1 |
1.7.1 |
a9a5efd40eaf558a2bcd48d64b1d1646be686008 |
swift-async-algorithms |
1.1.5 |
3da39bbc4e687d4192af7c9cf4eab805745a0b9c |
swift-atomics |
1.3.1 |
0442cb5a3f98ab802acb777929fdb446bda11a34 |
swift-certificates |
1.19.4 |
449dbbecd0f31e82b510ada227ca152caa8b5e98 |
swift-collections |
1.6.0 |
a0cb0954ecb21e4e31b0070e6ed5674e8556685a |
swift-configuration |
1.2.0 |
be76c4ad929eb6c4bcaf3351799f2adf9e6848a9 |
swift-crypto |
3.15.1 |
95ba0316a9b733e92bb6b071255ff46263bbe7dc |
swift-distributed-tracing |
1.4.1 |
dc4030184203ffafbb2ec614352487235d747fe0 |
swift-http-structured-headers |
1.7.0 |
933538faa42c432d385f02e07df0ace7c5ecfc47 |
swift-http-types |
1.6.0 |
db774a277f60063a32d854f2980299caf06da041 |
swift-log |
1.15.0 |
3ffafb9722d5d918c614feb496c8789a3b59d222 |
swift-nio |
2.101.3 |
0b18836bd8b0162e7e17a995a3fbee20ed8f3b2b |
swift-nio-extras |
1.34.3 |
88a51340f59cf181ebde888bd1b749296b3ec029 |
swift-nio-http2 |
1.45.0 |
45bdf670248be5f16ec0340e125dca285536f0fb |
swift-nio-ssl |
2.37.2 |
d930168b86f46ca51a4bc09c5ca45c1833db8067 |
swift-nio-transport-services |
1.28.0 |
67787bb645a5e67d2edcdfbe48a216cc549222d5 |
swift-numerics |
1.1.1 |
0c0290ff6b24942dadb83a929ffaaa1481df04a2 |
swift-protobuf |
1.35.0 |
9bbb079b69af9d66470ced85461bf13bb40becac |
swift-service-context |
1.3.0 |
d0997351b0c7779017f88e7a93bc30a1878d7f29 |
swift-service-lifecycle |
2.12.0 |
7f9326b0326ff86e3646295ea6e891f68c471c5e |
swift-system |
1.8.1 |
869129b7bf4ecc57b97d0193ad29690ca2134750 |
zstd |
1.5.7 |
f8745da6ff1ad1e7bab384bd1f9d742439278e99 |
Known issues and compatibility notes
- Preview and Stable cannot be installed side by side; install the desired
channel's DMG to switch the one shared application installation. - The 20260626 Kraken2 indexes display species-level taxid 3418604 as
Betacoronavirus pandemicum. Classification identifiers are unchanged, but
searches or notes relying on the former SARS-CoV-2 display name should be
checked. - The Apple Silicon bioconda Bracken compatibility package has no real driver
and does not support domain-level profiling through its synthesized
launcher. Fresh installs receive the managed Bracken 3.1 source build;
existing working environments are preserved. bioconda::bwa-mem2=2.3=hda5e58c_0self-reports 2.2.1 because of an upstream
packaging defect. Lungfish verifies that pin from conda package metadata.