i18n: - Expanded from 6 to 31 languages (no Hebrew per policy) - Added: pt, ru, ja, ko, hi, tr, it, nl, pl, sv, id, uk, th, vi, fa, cs, ms, ro, el, bn, hu, fi, da, no, ur - RTL support for ar, fa, ur - Language selector dropdown wired into dashboard navbar Disk Safety: - New backend route /api/v1/disk-settings (GET/POST/cleanup) - Frontend modal with sliders for health interval, max entries, retention days - Clean Up Now button triggers immediate cleanup - Wired into dashboard navbar Desktop Auto-Updater (from timed-out subagent): - electron-updater installed and configured - Checks get.dashcaddy.net/release/ for updates - Publish config added to package.json VM Uninstall: - Wizard calls vmDestroy before regular uninstall - Cleans up VM/disk sandbox on uninstall Cleanup: - Recursive data nesting guard (nesting-guard.js) - Removed 242MB of data/data/data/ duplicates
DashCaddy Onboarding System
This directory contains the JavaScript modules for the user onboarding tooltip system.
Files
- onboarding.js - Main entry point, initializes the onboarding system
- tour-manager.js - Orchestrates the onboarding flow and manages tour state
- progress-tracker.js - Manages persistent storage of user progress
- tooltip-definitions.js - Defines all tooltip content and positioning
- dns-template-selector.js - Presents DNS server template options
- theme-adapter.js - Ensures tooltips match the current dashboard theme
Load Order
The scripts are loaded in the following order (as defined in status/index.html):
- progress-tracker.js
- theme-adapter.js
- tooltip-definitions.js
- dns-template-selector.js
- tour-manager.js
- onboarding.js (main initialization)
Dependencies
- Driver.js - Loaded from CDN (https://cdn.jsdelivr.net/npm/driver.js@1.3.1/)
- Dashboard CSS variables (for theming)
- Browser localStorage API (for progress tracking)
Integration
The onboarding system integrates with:
- Dashboard theme system (via CSS variables)
- App template selector (for DNS server deployment)
- Local storage (for progress persistence)
Development
Each module is wrapped in an IIFE (Immediately Invoked Function Expression) to avoid global namespace pollution. Modules communicate through well-defined interfaces and the window object where necessary.