Weaver 0.15.0 release notes
Everything below is new since 0.14.7. This is a pre-release.
Highlights
- Advanced networking. Each Usenet server and each RSS feed now has its own
route: a ladder of legs that can be the system egress, a chosen interface
or source address, a SOCKS5, HTTP or SSH proxy, a userspace WireGuard hop,
a chain of proxies, or a pool. Legs carry weights and health; a leg that
is unknown or down takes no traffic. The Networking screen shows the live
flow from every consumer through its legs to the network. - Download quotas per egress. Each egress, the System egress included, can
carry a download quota with the same periods and reset settings a server
quota has. A download that would go past it is refused at that egress,
the leg goes down with "Quota reached" and its share moves to the other
legs of the route; a job with no leg left parks as blocked by the egress
quota until the window resets. Raising the limit lifts the block at once.
The egress editor, the egress table, the Bandwidth panel, Monitoring and
the jobs list show usage against the quota. This replaces the
instance-wide ISP bandwidth cap. - Scripts are wired as jobs. A script job is one script on one trigger
(post-processing, a queue event, scan, schedule or feed) with its own
inputs, categories, blocking flag and time limit. The script header is a
preset that fills the form; after that the job is the truth. One Scripts
table lists every job, grouped by trigger, with a Test dialog. A running
script can call back into weaver with a run-scoped token. The Runs table
opens each run in place and shows its full output in the log viewer. - Secrets are their own records. A token or password is typed once under a
name on the new Secrets screen, kept encrypted, and linked from any script
job input that needs it; the same secret can serve many jobs, and a
secret stays linked when the job is pointed at another script. A secret's
value is never read back out. Deleting one is refused while a job links
it. A job input can also hold its own encrypted secret without creating a
shared named secret; these sealed values are never returned by the API. - Schedules control download and post-processing pauses, watch-folder and
RSS pauses, speed limits, hardware profiles, quota metering, history
pruning, and server activation. Script jobs carry their own schedules. - Archives that posters obfuscate, misnumber, repost or post short now
finish where 0.14 failed them. Hex-named RAR volumes are grouped by the
member chain their headers describe, obfuscated 7z parts are named by
their PAR2 descriptions and stay in direct store, a volume the post never
carried is rebuilt from the recovery set, a one-volume 7z repairs itself
from the PAR3 it carries, and an archive found inside a directly stored
7z is extracted instead of published as is. See "Archives and recovery". - Archive passwords have a home. Settings → General keeps a list of
passwords to try, encrypted, and a password file to read more from. An
encrypted archive is tried with the job's own password first, then the
NZB's password, then the filename convention, then the list and the file. - The legacy web UI is gone. The Next UI is the only interface.
Kill switch
Choosing "Kill switch" when creating a server or feed starts it with nothing
allowed out: no proxy leg and no direct fallback, so it cannot reach the
network until you give it a route under Networking and enable it. That is a
starting state, not a lasting guarantee. A later edit of the route can add a
direct leg or a direct fallback, and weaver will follow the route as saved.
If a server must never leave except through a VPN or proxy, keep its route
free of direct legs and fallbacks, and check it after any change. An
enforced never-direct setting is planned for a later release.
Archives and recovery
- RAR volumes with no number in their names are placed by the member chain
their headers describe. A RAR5 volume that states no number is volume 0.
A set with no first volume waits for volumes instead of failing to open,
and two obfuscated sets a job cannot tell apart are never merged. - Split 7z parts that arrive under obfuscated names are held until the PAR2
descriptions name them, then laid out as a direct set. An obfuscated
single-file 7z is named by the PAR2 description whose hash matches its
first 16 KiB. A 7z set whose end header cannot arrive is demoted as soon
as that is known instead of holding every byte until the set settles. - A one-volume 7z that carries PAR3 recovery packets after its end header is
accepted, and a lost member article is repaired from that embedded set.
PAR3 embedded in a split 7z recovers across the parts, and a verified
PAR3 tail on the final part is accepted. - A volume the NZB never listed but the recovery set describes is taken on
by its set and rebuilt in place, the same as a volume lost after posting.
A hole in a run of numbered parts asks the recovery set for the part
instead of failing on it. A 7z set posted short of its part count waits
for the described tail. - The missing-part check waits for downloads to drain and for the restore
from recovery volumes (.rev) to have its turn, and it no longer counts a
part an eager extraction already consumed as missing. When an opened RAR
set still cannot finish, the failure names each awaited volume number and
the last volume seen before it. - Parts posted under one another's names, or under duplicate names, are
read by what PAR2 says they are. Every PAR2-identified archive input lands
on its described name before cleanup, so a completed job no longer shows
alias or duplicate names. - Malformed, truncated or wrongly signed RAR headers go to PAR2 repair
instead of ending the job. Encrypted-header RAR sets repair their
decryptable edges independently. A restored direct image is read before
it is trusted as verified. - A job with several archive sets fails as a whole when one set cannot be
recovered, and publishes nothing. A healthy direct set waits for a
demoted neighbour's conventional extraction before it finalizes. - A byte-identical repost never displaces a set that is already extracting.
A late decode write after delivery has started is rejected, and extracted
members alone get their permissions normalized. - After a restart, a file the previous process started conventionally is
never renamed onto a live direct set's volume, and PAR3 restored prefixes
are published for verification. A split 7z part rebuilt and named after
the topology was built is added to it instead of waiting forever. - A part the recovery set wrote is never chased by direct unpack; the set
is already whole on disk and is joined conventionally. - The hardware profile decides how a 7z chase widens once complete runs
pile up behind the decoding thread: Efficient adds a thread per waiting
run and looks every 200 ms, Balanced every 100 ms, Performance widens to
its ceiling on the first waiting run and looks every 50 ms. A profile put
in force reaches the next chase; a running chase keeps what it started
with. - uuencoded posts whose last line declares more bytes than it carries no
longer gain a zero byte at every article boundary. - RAR3 recovery volumes are restored with a derived decode matrix applied
to whole regions instead of one byte column at a time. - A conventional 7z extraction of a non-solid archive decodes its folders
on parallel workers when the hardware profile grants more than one thread,
reading the archive through a second handle charged to the same budget.
A chase keeps its single ordered reader. - 7z members are written straight from the decoder to the member file
while the CRC is taken, instead of through a copy buffer, on both the
conventional and chase paths. - A RAR member's PPMd model is bound to the same ceiling as its dictionary.
A block that asks for more fails before the model is allocated instead
of growing past the member's reservation. - The archive crates ship their current releases: sevenz 0.27, lzma 0.9,
unrar 0.11, par3 0.5.1 and reedsolomon 0.4.10. PPMd in RAR and 7z now
decodes through one shared engine, and lzma-rust2 is no longer linked.
What changed
- A script run's token may read queue items, history items and its own run.
Other guarded queries and every mutation exceptscriptRunrefuse it. - Changing the scripts directory disables every script job until you
explicitly enable the jobs you want to run from the new directory. - Script statuses reported to Sonarr, Radarr and nzb360 through the NZBGet
compatibility API follow NZBGet's own rule: only blocking post-processing
runs count; a missing or failed script reports FAILURE, a skipped script
NONE. - Global scripts cascade: a download's category scripts run after the global
ones instead of replacing them. A new setting, "global scripts run", chooses
between always and only when the category has no scripts of its own. The
upgrade picks the second when category lists existed. - The completed folder is named after the release as it was posted, not the
display name. The display name is unchanged. A collision still gets the
job-id suffix. - Commands that open the database prepare a pre-migration backup when
automatic backups are enabled with a key.
Automatic backups default to off, so the 0.14.x upgrade does not take one.
Configure encrypted automatic backups and their
schedule in settings.--require-upgrade-backupor
WEAVER_REQUIRE_UPGRADE_BACKUP=truerequires a successful backup before
migration when a backup is attempted; these switches do not enable
disabled backups.--skip-upgrade-backupexplicitly skips preparation.
With that skip flag,--reset-automatic-backup-settingsdisables
automatic backups and discards their stored password for recovery.
Upgrade backups have no fixed execution timeout. Every command that
opens the database records the version that started, so a one-shot
command that migrated does not cause a second pre-migration backup on
the next start. - Script output is kept by count, not by size. Each run keeps its last
32 KB of output, stdout and stderr together in the order they arrived,
compressed hard. A run that printed more shows a "Truncated" chip on the
Runs table and in the Test dialog. Each download keeps its newest runs
(default 32) plus its newest failed runs past that (default 8, new
setting "Retain failed runs"); runs that belong to no download are kept
the same way per scan, schedule or feed. Lowering either count deletes
the older runs in the background as soon as you save. The "captured
output per run", "compressed output budget" and "compressed output cap
per run" settings are gone. Deleting a script job keeps its runs. - The NZB analyzer caps its input while reading instead of after, and
refuses a file above the 256 MiB NZB limit before reading it. The server
refuses an inline NZB above that limit before decoding it. - A RAR chase counts the articles after a short first one.
- On Windows, a route leg cannot bind to an interface by name; choose a
source address instead, and Windows sends through the adapter that owns
it. That adapter needs its own default gateway, as Windows picks the way
out by the source address alone. Proxies, WireGuard, chains, pools and
the kill switch work the same on every platform. - An idle daemon does almost nothing. With no download moving, the job
snapshot is published only when something changes, gauges are sampled
once a second instead of ten times, finished jobs are shared between
publishes instead of rebuilt, completion checks run only for jobs that
could have changed, egress health is recomputed only when an interface
or a quota moved, and quota usage is written only when bytes moved.
Feeds, schedules and script jobs are no longer reloaded in full
just to decide whether anything is due. Metrics history still writes a
sample every ten seconds; script-output retention sweeps run hourly. - Executables are refused by default. The unwanted extension list, which
shipped empty, now starts as exe, bat, cmd, com, scr, msi, vbs, ps1, lnk
and js. A job that holds one fails with the reason "unwanted extension
'.exe' in ''", at RAR open and before publication, so Scryer sees
a failed grab and moves on instead of parking an import. The delivery
rename never names a job after a file the list refuses, nor after an
executable even when the list is empty. Clearing the list turns the
check off. - A "Set speed limit" schedule names the limit for every target at once:
Global, each egress and each provider, each with its own value. A blank
leaves that target as it is and 0 removes its limit. The lowest limit
that applies to a download is the one in force; the two waits are no
longer added together. A speed rule takes one time of day. - Schedules can pause and resume RSS. While paused, no feed is polled.
- A script job that runs on a schedule carries its own run times, days and
"also run at startup" on the job itself. The Schedules table no longer
lists scripts. - "Quota metering" schedules target every egress or one egress; one egress's
rule wins over the rule for every egress. Active schedule tracks are
evaluated again at startup. An egress quota's usage can be reset from
its editor without clearing lifetime usage. - NNTP rate limits allow 50 ms of burst credit instead of one second.
The sustained limit is unchanged, including at low rates. - Interface and source-address bindings constrain connections, but system
DNS lookup traffic is not bound to that egress and may use the default
route. Use a routed resolver when DNS must follow a tunnel. - Containers drop
NET_RAWunlessWEAVER_RETAIN_NET_RAWexplicitly opts
into retaining it, including whenPUIDis 0. - The settings search box searches every settings panel, not only the open
one. Matches show under a heading per panel; the open panel stays
editable and another panel's result opens that panel with the query
kept. Every word of the query must match, in any order. - A script job set to run at startup gets
WEAVER_API_URLand
WEAVER_RUN_TOKENon that first run. - A job waiting on its queue scripts is listed with the active downloads.
- A support report for a job that has just finished is built from its
history entry. - The route editor offers only targets the route can use: an RSS route
lists only proxies and pools with DNS servers, a proxy already used
elsewhere in the route is not offered again, and a disabled egress is
not offered for a new leg. A route that repeats a proxy or uses a
disabled egress cannot be saved. - A proxy pool holds 2 to 16 members.
- A quota allowance that is not a number is treated as missing, so the
quota cannot be switched on with it. - A job whose route keeps its only connections on a leg past its egress
quota parks as blocked by the quota instead of retrying. A retry that
exhausts its egress parks as well. - A
.gofile in the scripts directory runs as a script. It is built
offline into a cache under the data directory, so it may import the
standard library only. Thegocommand sits beside the other
interpreters in the scripts settings. - A script cut off by a restart is recorded as interrupted, a status of its
own in the API, the NZBGet compatibility API and the Runs table. After a
restart, a failed job's unstarted scripts resume with the same outcome
they would have been told; a started script is never rerun. - A script that exits 95 leaves the previous script's status unchanged, so
the next script does not see SUCCESS after a skip. - A job that has queue-event script jobs but no post-processing job still
waits for its queue events before it leaves the queue. - A download submitted by URL passes that URL to its post-processing
scripts. Script job events keep their own event kinds in the API. - A script destination that does not exist, or a delivery worker that
fails, is reported as an operational failure instead of a security
refusal. - A one-shot schedule, such as a history prune, missed while weaver was
stopped runs once on the first tick after start. A schedule that names an
unknown weekday is refused instead of firing on the wrong days. A speed
limit set from the queue becomes the configured limit, so the queue
state reports it. A watch-folder resume that fails no longer leaves
scanning paused in memory. - A leg reads down while every rung of its ladder is cooling, so a revoked
route shows blocked instead of idle. A chain names the hop that could
not be reached rather than the hop that answered, and the flow reports
the first failing hop on each rung with its reason. - A WireGuard hop stacked on another WireGuard hop is sized to carry it: the
lower session runs at the MTU the carried tunnel needs, and a chain the
cap cannot carry at full size reports a warning on its leg. Saving refuses
a WireGuard proxy that reaches one egress by two different paths, since a
WireGuard server accepts one connection per key. - Leg throughput counts bytes once their rate wait is over, so a leg's
sample no longer reads above the egress limit. - A new feed is polled only once its route is installed. Items a feed
returned before it had any rule are not marked seen, so the first accept
rule still gets them. - The folder picker can pick a file. The archive password file field uses
it. GraphQL:browseDirectoriestakesincludeFilesand returnsfiles. - A job archived to History with a password is marked as having had one,
never with the secret. The password shows on the job page. - Prometheus: script run counts, durations and last-run gauges, slot
occupancy and queue-event backlog; schedule evaluations, actions, replays
and per-rule fire state; route leg, egress, pool, proxy-hop, DNS and
ladder families. The Grafana dashboard has a row for each. - Backup restore accepts an older bundle whose table set differs from the
current catalog. Newer-version backups are kept and failed ones pruned.
Removed
- GraphQL:
setScriptLists,setScriptOptions,testScript,
ScriptOption.valueandSchedule.scriptare gone. Script wiring is the
scriptInstancesquery and thecreateScriptInstance,
updateScriptInstance,deleteScriptInstanceandtestScriptInstance
mutations. Scheduled script jobs store their run times on the job. - GraphQL:
scriptOutputCeilingBytes,scriptOutputRingBytesand
scriptOutputRunCapBytesare gone from the post-processing settings and
their input;scriptOutputFailedRunsPerJobis new. - Implicit schedules derived from a script's
### TASK TIME:header are
gone. "Set up from header" saves the run times on the script job instead.
After a host sleep or long stall, scheduled script jobs run the latest
missed occurrence once. - The NZBGet
<Script>:=noopt-out and<Script>:=yesopt-in are not
supported per download. - The schedule actions "scan watch folder", "fetch RSS", "run script" and
"use configured speed limit" are gone. GraphQL:Schedule.instanceId,
Schedule.runAtStartupandSchedule.feedIdare removed;
Schedule.speedLimitsandSchedule.quotaEgressIdare new, with
ScheduleSpeedLimitInputon the input;Schedule.speedLimitBytesstays,
deprecated, mirroring the Global value.ScriptInstance.scheduleand
ScriptInstanceScheduleInputcarry a job's run times. - The ISP bandwidth cap is gone, replaced by the System egress's download
quota. GraphQL:GeneralSettings.ispBandwidthCap,
GeneralSettingsInput.ispBandwidthCap, theIspBandwidthCapSettings,
IspBandwidthCapSettingsInput,IspBandwidthCapPeriodandQuotaWeekday
types,DownloadBlockKind.ISP_CAPandDownloadBlock.capEnabled,
periodandreservedBytesare removed. New:EgressInterface.downloadQuota
anddownloadQuotaUsage,EgressInterfaceInput.downloadQuota, the
DownloadQuotaUsagetype,DownloadBlockKind.EGRESS_QUOTAand
DownloadBlock.egressIdandegressName. Prometheus: the
weaver_bandwidth_cap_*gauges and the ISP cap alerts are replaced by
weaver_egress_download_quota_*{egress_id},
weaver_download_quota_block_window_end_secondsand the
WeaverDownloadsGatedByEgressQuotaandWeaverEgressQuotaNearlyExhausted
alerts.
Upgrade notes
- An install whose unwanted extension list was empty gets the default list
once, on this upgrade, because an empty list could not be told apart from
the old default. A list cleared after the upgrade stays cleared, and a
list that already named extensions is kept. - The database moves from schema 50 to 59 in one step. The 0.14.7
post-processing script lists, options and category assignments become
post-processing script jobs. Other triggers in a script's header are
not enabled by the upgrade. A pause or resume
rule that used to fall back to the configured speed limit becomes a
Global entry pinned to the limit saved at upgrade time. Each secret option a script had saved
becomes one named secret, "<script> ", linked by every job of that
script. The upgrade stops with a message if the
saved scripts directory exists but cannot be read; make it readable and
start again. A script named in a list but missing from the directory is
carried over turned off, with a warning in the log. Schemas 57 and 58
record which post-processing scripts of a job have started and how its
download ended, so a pass interrupted by a restart resumes with the
scripts it had not started and tells them the same outcome. A saved
script concurrency below 32 is raised to 32, the new default, because
the setting now bounds every script weaver runs, not only the ones a
download waits for. Schema 59 keeps a script job's runs when the job is
deleted. - Category script lists that were empty, or had every script turned off, no
longer keep scripts from running for that category. The log names each
such category on upgrade. - Routes default to the direct route through the system egress for every
existing server and feed. - An enabled ISP bandwidth cap becomes the System egress's download quota,
and the bytes already counted in its current window carry over, so the
quota resumes where the cap left off. A cap that was turned off is dropped.