0.13.179

v0.13.179

Released 28 March 2025.

Highlights

Operations page

Long-running operations now have a dedicated page in the main navigation. Workspace deletions and data imports are tracked here with live progress, smart polling (every 2 seconds while jobs are active, every 30 seconds when idle), and clear status badges for each phase.

Failed workspace deletion jobs now show a Retry button, and completed or failed import jobs can be dismissed with a single click.

Background workspace deletion

Workspace deletion is now a background job with phased progress:

  1. Billing cancellation — Stripe subscription cancelled (if applicable).
  2. Snapshot deletion — snapshots and their payloads removed in batches.
  3. Watch deletion — watches and any orphaned snapshot data cleaned up.
  4. Finalisation — tags, memberships, audit logs, import jobs, and the workspace record itself removed.

Each phase updates in real time on the Operations page. If a job fails mid-way, it can be retried from where it left off — already-deleted data is not re-processed.

Platform workspace management

Platform owners can now delete any workspace directly from the Platform admin area, with the same background job system and progress tracking. A new admin-gap detection system flags workspaces that have lost all administrators (for example, after an account deletion) and provides a one-click Repair action to restore admin access.

Auth recovery

If a workspace is deleted while a user is logged in, the session automatically falls back to another available workspace. If no other workspace exists, a fresh personal workspace is created — users are never locked out due to a background deletion job.

Error boundary

Unhandled application errors now display a branded error page with the error message, a Refresh page button, and a Go to dashboard option, replacing the previous blank screen.

Import improvements

  • Imports now run as background jobs with per-watch progress tracking and cooperative cancellation.
  • Batch writes are aligned to backend chunk sizes (100 for Directus) for fewer round-trips.
  • Snapshot count accuracy improved when buffer flushes occur mid-watch.
  • Import preview enforces a 64 MB cap with decompression bomb guards.
  • Six import formats supported: changedetection.io, DeltaWatch backup, CSV, JSON, Distill.io, and URL lists.

Platform administration

  • Admin-gap audit — a scheduled function detects workspaces with zero administrators and alerts platform owners.
  • Orphan membership cleanup — orphaned memberships (referencing deleted workspaces) are pruned by a background audit, not during user-facing requests.
  • Platform delete job visibility — platform owners see system-initiated deletion jobs (from account or platform user deletions) in a separate section on the Operations page.

Security improvements

  • CSRF protection added to all Operations mutation endpoints (retry and dismiss).
  • Error persistence in the deletion job system wrapped to prevent losing original error context.
  • Auth middleware workspace recovery creates a personal workspace as a last resort rather than returning a 401.
  • redirectOnUnauthorized disabled on the /auth/me endpoint to prevent redirect loops for unauthenticated visitors.

Performance

  • Backend auto-detection from configured credentials (Directus URL, PostgreSQL connection string).
  • Batch operations (setMany, deleteMany) added to database and blob storage backends.
  • Index rebuilds avoided during high-frequency delete operations.
  • Per-request context cache reduces redundant store reads on authenticated routes.

Bug fixes

  • Fixed billing phase never advancing past “Cancelling billing” when STRIPE_SECRET_KEY was not set.
  • Fixed workspace deletion timing out on large workspaces by moving to batched background processing.
  • Fixed origin field crash on Operations page for older deletion jobs created before the field existed.
  • Fixed ErrorBoundary “Go to dashboard” button not navigating (was using pushState + reload instead of location.href).
  • Fixed inconsistent delta symbol across loading screens.
  • Fixed database getAll() decrypt bug that could corrupt records.
  • Fixed binary export corruption and import hang on large archives.
  • Fixed concurrent import stalling when multiple imports targeted the same workspace.
  • Fixed stale closure in import restore guard causing missed cancellation signals.
  • Fixed duplicate detection bypassing the repository layer during imports.
  • Fixed snapshot content being parsed as object instead of string on Directus backend.