v2026.8.9
Pre-releaseLungfish 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.