v0.13.218
Released 30 March 2025.
Highlights
Bulk check interval
The dashboard bulk actions bar now includes a Check interval option. Select multiple watches, pick a frequency, and apply it in one click. Interval presets below the workspace plan minimum are disabled — Ping plan users see “(requires Pulse or Sentinel)” on the 5-minute and 15-minute options. The chosen interval is enforced server-side via enforceCheckInterval, and if the plan clamps the value, the original request is preserved as originalCheckInterval so it can be restored automatically on plan upgrade.
Diff viewer improvements
- Stable container — the diff area now renders at a fixed minimum height with a loading spinner inside it while computing, eliminating the layout jump that occurred when switching snapshots.
- Container-scoped change navigation — the Previous/Next buttons now scroll within the diff panel rather than moving the entire page. The navigation bar stays pinned at the top of the diff container in both inline and side-by-side views.
- Side-by-side layout fix — restored the two-column grid layout after a regression that caused overlapping columns. Cells now use
overflow-hiddento prevent content bleed.
Durable watch check queue
Watch checks have been rearchitected around a durable job queue:
- Queued jobs as source of truth — every scheduled or manual check creates a persistent job record before dispatch, surviving serverless context freezes.
- Claim-before-run semantics — jobs are atomically claimed with a token before processing, preventing duplicate execution.
- Stale job recovery — running jobs that exceed a 10-minute timeout are automatically reset to queued and retried.
- Single-watch batches on serverless — multi-watch job batches are split into individual jobs on Netlify to stay within function time limits.
Platform page layout
The Scan runner and Active watch queue panels on the Platform admin page now sit side by side on desktop, instead of the queue being nested inside the runner card.
Bulk operations
- Added Notification settings bulk action — overwrite email, mute, and webhook notification preferences for all selected watches at once.
- Bulk action panels are mutually exclusive — opening Check interval closes Notification settings and vice versa.
Notification improvements
- Modified lines now appear with a distinct highlight in notification diffs.
- Blank-line rendering in notification diffs fixed.
- Workspace-level email notification defaults added.
- Notification section reorganised in watch settings.
Watch management
- Auto-refresh preservation — manual snapshot selections in the history view are no longer reset by the 15/60-second polling cycle.
- Page chrome stripping — opt-in removal of navigation, headers, and footers for text-mode watches.
- Preferred language — workspace-level language preference setting for content extraction.
- Tag management — stale store indexes repaired for workspaces with corrupt tag data.
Backend and storage
setManyandgetManyadded to the filesystem backend for parity with Blobs, Database, and Directus.- Backend auto-detection now uses
getEnv()to resolve environment variables through bothprocess.envand the Netlify runtime API. - Detection result is cached per process to eliminate repeated fallback warnings during store initialisation.
Security
- Internal routes hardened: cron secret always rejected when unconfigured, header-only authentication (no query string), GET-only for due-watch lookups.
- SSRF timestamp validation tightened.
- Error handler returns generic messages for 5xx responses, preserving detail only for 4xx.
Performance
- History list diffs are no longer recomputed on every page load — cached results are reused.
- Import upload chunks reduced for Netlify ingress limits.
- Large backup uploads chunked before queuing imports.
- Watch check concurrency raised with pending backlog visibility on the platform overview.
Bug fixes
- Fixed side-by-side diff columns overlapping after layout regression.
- Fixed change navigation scrolling the entire page instead of 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 import snapshot preflight scanning all watches instead of only touched ones.
- Fixed concurrent import stalling from stale closure in cancellation guard.
- Fixed duplicate version update notifications firing on every deploy.