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:
- Billing cancellation — Stripe subscription cancelled (if applicable).
- Snapshot deletion — snapshots and their payloads removed in batches.
- Watch deletion — watches and any orphaned snapshot data cleaned up.
- 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.
redirectOnUnauthorizeddisabled on the/auth/meendpoint 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_KEYwas not set. - Fixed workspace deletion timing out on large workspaces by moving to batched background processing.
- Fixed
originfield crash on Operations page for older deletion jobs created before the field existed. - Fixed ErrorBoundary “Go to dashboard” button not navigating (was using
pushState+reloadinstead oflocation.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.