Five ways to stream Usenet: the rematch
Benchmark of five servers that mount Usenet as a filesystem and stream articles on demand. 18 August 2026, one day after the first round. Same box, same news account, same test files. One server running at a time, so nobody fights over the 20-connection budget.
Versions: zurg 97b658e5 (yesterday: 47224207), decypharr v2.5, AltMount v0.3.2, InfiniDysk v1.1.2, nzbdav-dev v0.6.4. Host: my test server zen, 2 cores, 7.6 GB RAM.
TL;DR
Yesterday: AltMount was fastest, zurg was the only one that could repair a broken release. Today zurg is fastest AND still the only one that repairs. One day, 35 commits, all seven of yesterday's zurg defects fixed.
zurg wins throughput (43 MB/s), press-play latency (0.14 s to first byte), scrubbing (0.31 s), warm re-reads (0.05 s), and ffprobe (1.55 s). CPU cost is now tied with AltMount. Zero failed reads.
AltMount still kills the first long read after a restart about half the time (3 of 6 tonight). Your first play after a reboot is a coin flip.
decypharr is still the smallest by far: 53 MB of RAM. That is the one number zurg does not beat.
InfiniDysk and nzbdav-dev did not change. The fork still beats the original everywhere.
Every number below was re-measured tonight in one interleaved run, all five servers, rotating order. Not recycled from yesterday.
What changed in zurg overnight
Repairs are atomic. A read during a PAR2 rebuild gets clean silence or the finished bytes, never garbage. Yesterday it could return corrupt data with a 206.
Dead articles are remembered on disk. First hit answers in 0.72 s (was 85 s). After that: instant, even across restarts.
File sizes are exact. No more "Filesize mismatch" spam in your player logs.
Releases are named after the NZB file, not the poster's spam subject line.
Obfuscated PAR2 volumes are detected by content and hidden instead of showing up as fake videos.
HEAD and PROPFIND now work on files inside RAR archives. ffprobe and players that size a URL before playing stopped breaking.
The NNTP path was rebuilt: single-pass decoding, pipelined article requests, bytes served while an article is still downloading, smarter read-ahead.
Memory is capped. The process holds about 830 MB with the default 512 MB cache. PAR2 repair peaked at 2.6 GB yesterday; now under 1 GB.
Throughput
256 MB cold reads, 6 per server, untouched offsets, rotating order.
* AltMount's mean counts only the 3 reads that finished. The other 3 returned a 206 with the full Content-Length, then closed the socket partway. Same cold-start bug as yesterday, same 50% rate. Your client sees no error, just a dead stream.
Yesterday AltMount won because it pipelines NNTP requests and zurg did not. zurg pipelines now (pipeline_depth, default 4), plus a rewritten decoder that does one pass instead of two. CPU per GB went from 28.1 to 9.9.
Latency
What pressing play, seeking, and library scans actually feel like.
Why: zurg now serves an article's bytes while the rest is still downloading, so play starts after one round trip instead of one full 4 MiB article. And a scrub no longer triggers a full read-ahead burst that competes with itself.
Note the warm re-read row. AltMount, InfiniDysk and nzbdav-dev are all SLOWER the second time you read the same range. They cache nothing. Only zurg and decypharr keep anything, and that matters every time Plex re-scans something.
A dead article
Article 21 of 1,576 is gone from the news server. About 40 seconds of film. What happens when you play across it:
zurg is still the only one with actual Reed-Solomon repair code. The others route around damage or give up. If you keep a library long enough for releases to rot, this is the feature.
Obfuscated releases
Yesterday zurg fumbled these four ways. All fixed:
Streaming out of an 11-volume RAR: sustained 200 MiB read at 15.5 MB/s (yesterday: 2.9-6.3, AltMount's recorded probe: 12.1). Short 16 MiB reads average lower (7.5) because startup cost dominates a read that small. zurg still preserves the archive's folder structure where AltMount and decypharr flatten it.
Which one should you run
zurg. It now holds every speed number except RAM, and it is the only one that can fix a rotting release instead of serving you silence. If your library is the point, this stopped being a trade-off. Also the only one with Plex, Jellyfin and Emby hooks.
decypharr if RAM is tight. 53 MB resident is genuinely impressive. You give up speed, caching and repair for it. (zurg can also be slimmed: lower cache_size_mb and its memory cap follows.)
AltMount only if the cold-start truncation gets fixed. It was the speed king yesterday. Today it has no win left, and the first stream after every restart is still a coin flip.
InfiniDysk if you want built-in indexer search and arr automation. Turn usenet.pipelining.enabled on immediately. Do not deploy nzbdav-dev for anything new; the fork is better on every axis.
2026-08-18, host zen (2 cores), one news account, 20 connections, TLS. Corpus: a 6.61 GB WEB-DL (1,576 x 4 MiB articles), one copy with a killed article, one fully obfuscated, plus an 11-volume RAR release. One server at a time, identical byte ranges, rotating order, single interleaved run. Competitor damage and obfuscation behaviour carried from yesterday's round; their code did not change. Follow-up to the 17 August five-way round.
Comments (6)
Thank you so much for this! I'm currently using Decypharr to stream the usenet, supported by the other arrs. I know you're working on arr automation for zurg, but do you have suggestions to drop zurg into my stack without manually moving nzbs around?
does zurg rename files for scanning? or create symlinks? that was a huge issue for me with the debrid set up.
Does Zurg scan for broken archives upfront and repair in the background while still playing working stuff?
Yes sir that is correct
Will Zurg eventually have Arr automation?
Yes those are planned
