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.
Native PNG export
Section titled “Native PNG export”A .png output path, or --format png, rasterises the map without a headless browser or any system library:
nf-metro render rnaseq.mmd -o rnaseq.png --mode light --scale 2Rasterisation 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.
Looping video export
Section titled “Looping video export”-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.
Routing and layout fixes
Section titled “Routing and layout fixes”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.