v0.13.256
Released 31 March 2025.
Highlights
Background workspace exports
Workspace backups are now built entirely in the background. Click Export Backup (ZIP) on the Settings page to start a background export job that collects all watches, tags, settings, and snapshot history. Progress is shown in real time, and the finished ZIP is assembled and downloaded in your browser. Download links expire after one hour.
If workspace notification URLs are configured (Slack, Discord, Telegram, Teams, email, or webhooks), DeltaWatch sends a notification when the backup is ready.
Content extraction improvements
- Page chrome stripping β opt-in removal of navigation, headers, footers, sidebars, and menus before text extraction. Focuses monitoring on the main content area.
- Hidden element stripping β removes elements with
hidden,aria-hidden="true",display: none, orvisibility: hiddenbefore extraction. - Global subtractive selectors β workspace-level CSS selectors that remove matching elements before any other processing. Useful for stripping cookie banners, ad containers, or dynamic sidebars across all watches.
- Blank-line filtering β changes consisting only of blank lines are automatically ignored as non-substantive. Only real text differences trigger notifications and appear in the diff viewer.
Bulk operations improvements
- Mark viewed β new bulk action to clear the unviewed indicator on all selected watches.
- Filtered select-all β when search or status filters are active, βSelect allβ only selects watches matching the current filters.
Operations page enhancements
- Watch check queue β the watch check backlog now shows per-watch context (title, URL) alongside job status. Completed and failed checks can be dismissed.
- Export job tracking β background exports appear in the Operations page with preparing and building phases.
- Noise reduction β completed watch check jobs are hidden by default to reduce visual clutter.
Diff viewer
- Blank lines are collapsed in both inline and side-by-side views.
- Side-by-side highlights extend to the full content width.
Watch check reliability
- Watch check dispatch no longer crashes the scheduler when background function handoffs time out. Failures are logged and jobs stay queued for the next cycle.
- Stale watch locks are recovered before new checks are queued, preventing indefinite lock-outs.
- Background watch check workers now process jobs directly instead of proxying back through the API function.
Database and storage
- Connection pool hardened with
max=5,idleTimeoutMillis=30000, andconnectionTimeoutMillis=10000to prevent staleECONNRESETerrors on Neon. - Backend detection caches its result to avoid repeated fallback warnings during store initialisation.
- Blob store
list()now paginates correctly through all results (previously capped at 1000).
Platform administration
- Scan runner and active watch queue panels sit side by side on desktop.
- Orphaned snapshot metadata and export jobs are cleaned up during the admin audit.
- Platform workspace deletion state is shown on the dashboard with pending status indicators.
Security
- SSRF protection expanded: DNS rebinding TOCTOU closed with pinned IP dispatcher, IPv6 validation covers
::ffff:mapped addresses,::,100::,fec0::, andffmulticast. - XPath expressions capped at maximum length and result node count.
- Non-PDF response bodies capped at 5 MB.
- Export job read paths no longer perform expensive blob artifact cleanup (preventing 502 timeouts).
Bug fixes
- Fixed side-by-side diff columns overlapping after layout regression.
- Fixed change navigation scrolling the entire page instead of within the diff container.
- Fixed sticky change nav not pinning in the side-by-side grid layout.
- Fixed snapshot selection resetting during auto-refresh polling.
- Fixed bulk recheck worker dispatch timeout on Netlify.
- Fixed export job stalling at 22/62 watches due to excessive progress writes.
- Fixed Settings page loading for 80 seconds due to export artifact cleanup on the read path.
- Fixed dispatch timeout cascade crashing the API function with concatenated error messages.
- Fixed
clampImportedIntervalsloading all workspace watches when given specific import IDs.