Skip to content

v2.1.0

2026-09-15 · GitHub release · Diff

nf-metro render now writes PNG and looping video directly, alongside a long tail of routing and layout fixes.

A .png output path, or --format png, rasterises the map without a headless browser or any system library:

Terminal window
nf-metro render rnaseq.mmd -o rnaseq.png --mode light --scale 2

Rasterisation moved from cairosvg (which needed system libcairo) to resvg-py, whose wheels are self-contained. The PNG path bakes one concrete palette, drops the var() chrome, and draws with the bundled Inter, so the same map rasterises to the same bytes on any machine — which is what makes a committed PNG reviewable in a diff. --scale sets the pixel multiplier (default 2, for retina) and --raster-width pins an exact width.

-o map.gif, .webp, .mp4, or .webm (or --format) exports the --animate motion as a loop, for the places a CSS animation will not run: a README, a slide, a conference talk. The loop runs one animation cycle and stops a frame short of repeating it, so it wraps seamlessly. --fps and --duration compress a long map’s cycle into a shorter loop, and frames are sampled from the same motion paths the animated SVG uses, so a ball is where a browser would draw it. av (PyAV) joins the runtime dependencies for this, shipping its own FFmpeg so nothing needs to be on PATH.

Nothing is capped: a large export quotes its frame count and frame size before it starts, then shows a progress bar. The new Output formats page compares SVG, HTML, PNG and the four video formats on what each is good at.

-o also now repeats on any single render, so one run writes several formats at once: -o map.svg -o map.png.

A long tail of routing and layout fixes: fan-branch loop-side stations now recenter correctly for multi-line edges, convergence landings record their real cross-run start, exit-turn and perp-entry feeder ordering, bottom-entry fan mirroring, single-word section headers no longer abort the render, bundle corner-radius derivation is now unified across concentric fans, flat (sectionless) graphs get an implicit section so skip-line bypass detours resolve, and several others.

  • variant_calling.mmd has a known layout defect (#1863)
  • variantbenchmarking.mmd / variantbenchmarking_auto.mmd: an sv_stats/bcftools_stats label collision nudge (#1863)
  • legend_combo.mmd: a Somatic Calling label collision nudge (#1863)