24.04.2026
A bug-fix release with dependency updates, concurrency fixes, and a fair bit of hardening across the formatters and webhook delivery.
A small confession upfront
This update has been sitting on my machine for a while because I simply forgot to push it. The silver lining: it got an unusually long real-world test run on my own instance before going public.
Dependencies & Container
- Updated
golang.org/x/{crypto,net,sys,text}andgoquery - Pinned Alpine from
latestto3.22and addedTARGETARCHfor multi-arch builds - Moved
VOLUMEafterUSERso ownership is preserved - Switched
HEALTHCHECKtopgrepsincepidofisn't available in current Alpine - Replaced deprecated
mem_limit/cpuswithdeploy.resources
Concurrency & Resource Fixes
- Guarded the scheduler stop channel with
sync.Onceto prevent double-close panics - Protected
feedTypeMapandlastConfigTimeunderconfigMu - Dropped the brittle worker-send timeout in the RSS parser
- Drain API response bodies so the HTTP connection can be reused
- Cache compiled regex patterns instead of recompiling per match
- Lazy-persist API/RSS status via a dirty flag to cut down on disk writes
Formatter & Webhook Fixes
- Honor Slack's
Retry-Afterheader on429responses - Cap Slack messages at 50 blocks (the Block Kit limit)
- Deduplicate URL fields in the Slack ransomware formatter
- Truncate Discord titles and URLs to per-field limits, Unicode-safe
- Accept legacy
discordapp.comwebhooks; strip query and fragment in tokens
Validation & Robustness
- Use a typed
net.Errorfor retry classification - Stricter ISO-2 country code validation (uppercase ASCII only)
- Validate
field_orderentries in the format config - Warn when API key values still look like placeholders
- More time-format fallbacks when sorting RSS parsed items
- Trim whitespace and trailing slashes in RSS entry keys
- Preserve format defaults when merging overrides
Miscellaneous
- Fixed the
RANSOMEWARELIVEtypo in the config placeholder - Added
Todo.txtto.gitignore - Log completion messages before closing the logger so they actually make it to the file