OUR STORY FEATURES EDITIONS CONTACT KIKO

GWS
Backup

By KIKO
Solutions

v0.9.7

Upcoming

🚧 In development — changelog will be published on release.

v0.9.6

April 26 — May 2, 2026 Latest
🔴

Critical Bug Fixes

Backup Engine — Full Re-download Regression

May 1 Enterprise & Family

Every scheduled backup was creating a brand new Google Drive folder and re-uploading the entire dataset from scratch, instead of incrementally updating the existing one.

  • scheduler.ts — Scheduled cron callback now queries the most recent job and passes incrementalFromJobId
  • scheduler.ts — Health Watcher auto-recovery now passes incrementalFromJobId from the stalled job
  • Eliminated redundant full backups consuming 824 GB across 12 clients

Manual Backup Trigger — 500 Error

May 2 Enterprise & Family

The "Backup Now" button returned a 500 error. The API route ordered jobs by createdAt — a field that doesn't exist in the schema.

  • Updated orderBy from createdAt to startedAt
  • Wrapped auto-inference query in try-catch for graceful degradation
  • Manual backups now correctly auto-infer incrementalFromJobId

Google Quota ("Parked") Jobs — Silent Hang

May 1 Enterprise & Family

When a backup hit Google's daily API quota, workers would park but the job kept running silently for ~5 minutes until the Health Watcher killed it.

  • job-runner.ts — Added [Parked] detection in both completion and fatal catch blocks
  • Jobs now exit cleanly within seconds with a distinct "parked" status
  • The parked status preserves runFolderId and counters for incremental continuation

Backup Cancellation — Memory Leaks & Zombie Threads

May 2 Enterprise & Family

Cancelling a running backup left zombie threads alive — long-running Google API requests continued consuming RAM, eventually crashing the server.

  • Replaced boolean cancellation flag with AbortController registry in cancel-store.ts
  • Threaded AbortSignal throughout the entire pipeline
  • All HTTP sockets now tear down immediately upon cancellation

Client Deletion — Silent 500 Error

Apr 26 Enterprise

Permanently deleting a client appeared to succeed but the client remained. Multiple missing columns and methods in the DB wrapper caused silent crashes.

  • Added telemetry columns to AuditLog schema migration
  • Added count() and aggregate() methods to backupFileIndex
  • Fixed getGlobalAuth import and TypeScript type casting

Client List — Filter Removed All Clients

Apr 26 Enterprise & Family

The custom node:sqlite wrapper didn't support the not operator and silently coerced the filter object to "[object Object]".

  • Added not operator support to buildWhere() in lib/db.ts
  • Archived clients now correctly hidden from the main list
⚙️

Backup Engine Improvements

Clean "Parked" Status & UI

May 1 Enterprise & Family
  • New distinct amber "Parked (Quota)" badge in the StatusBadge component
  • "Parked" option added to the Runs tab status filter
  • Client card displays parked status with warning colour
🗄️

Database & Storage Optimization

Enhanced Vacuum Tool — Deep Housekeeping

May 1 Enterprise & Family

The optimization tool was only running SQLite VACUUM, which reported "already optimised" even with 400 MB of bloat.

  • Phase 1: Purges soft-deleted BackupJob rows (500 KB–5 MB each)
  • Phase 2: Sweeps orphaned BackupFileIndex rows
  • Phase 3: Clears stale AuditLog entries older than 90 days
  • Phase 4: Runs VACUUM to rebuild the SQLite file
  • Phase 5: Runs PRAGMA wal_checkpoint(TRUNCATE) to shrink WAL to zero

Pre-Vacuum Safety Backup

May 1 Enterprise & Family
  • Creates a timestamped .pre-vacuum.bak safety backup before destructive operations
  • Includes WAL and SHM files in the backup
  • If backup creation fails, the vacuum is aborted entirely

WAL File Truncation

May 1 Enterprise & Family
  • Added PRAGMA wal_checkpoint(TRUNCATE) after VACUUM
  • WAL file now shrinks to zero bytes after optimization

Missing Schema Columns — lastVacuumAt

Apr 26 Enterprise & Family
  • Added ALTER TABLE bootstrap migrations for lastVacuumAt, vacuumTargetHour, and masterScheduleEnabled
👤

Client Management & Archival

Archive vs. Permanent Delete Workflow

Apr 26 Enterprise

Clients can now be archived (soft-deleted with configurable retention) before permanent destruction.

  • New "Destruction Modal" — choose between Archive or Permanent Delete
  • Archive Hub (/clients/archive) with countdown timers and restore capability
  • Custom glassmorphic modals for Restore and Force Deletion

Suspended Client UX

Apr 26 Enterprise
  • "Settings" button renamed to "Delete Account" and repositioned in the page header
  • Delete button directly opens the Destruction Modal

Duplicate Client Detection

Apr 26 Enterprise & Family
  • Checks against both business name and domain when creating clients
  • Clean, human-readable error messages replacing JSON parse failures
🎨

UI/UX Enhancements

DB Optimization Timer Redesign

Apr 26 Enterprise
  • Timeline labels permanently visible (no hover required)
  • Compact dropdown replacing manual number input
  • Busy time slots hard-disabled and unclickable

Recovery Wizard

May 2 Enterprise & Family

Replaced the legacy 3-step restore modal with a comprehensive 5-step Recovery Wizard.

  • Three dedicated modes: Disaster Recovery, Point-in-Time Rollback, Migration/Clone
  • "Type RESTORE" safety confirmation gate
  • Pre-flight validation via /preflight API
📦

Deployment & Packaging

Update Script — Database Backup Fix

Apr 26 Enterprise
  • update.php now searches a cascade of DB paths before extraction

Standardized Build Pipeline

May 1–2 Enterprise & Family
  • npm run pack generates update.zip (Enterprise) and update-family.zip (Family)
  • Resolved TypeScript strictness errors in production builds
📋

Files Modified

AreaFilesApps
Schedulerlib/scheduler.tsBoth
Job Runnerlib/backup/job-runner.tsBoth
Cancel Storelib/backup/cancel-store.tsBoth
Backup APIapp/api/clients/[id]/backup/route.tsBoth
Client APIapp/api/clients/[id]/route.tsEnterprise
Clients APIapp/api/clients/route.tsBoth
Archive APIapp/api/clients/archive/route.tsEnterprise
Databaselib/db.tsBoth
Backup Consoleapp/(admin)/backup/[id]/page.tsxBoth
Settings UIapp/(admin)/settings/page.tsxBoth
Recovery WizardRecoveryWizard.tsxBoth
Update Scriptinstall/server/update.phpEnterprise