New step-based update workflow for offline/self-hosted deployments. The Backup upload endpoint detects archives where manifest.type == "update" and manifest.software == "flatboard", validates the manifest (edition, semver version, checksum), and routes them to storage/updates/ instead of storage/backups/. The admin/updates page scans storage/updates/, displays a card for each valid archive that is newer than the installed version, and lets the admin apply it via a 5-step progress UI (verify → backup → extract → deploy → cleanup). Each step is executed over a separate CSRF-protected AJAX call with retry logic; a full automatic backup is created before any file is deployed; protected paths (stockage/, uploads/, .env, .htaccess, install.php) are never overwritten. Archives older than the current version are listed separately and can be deleted. Translation keys added for all 5 languages.
- Local update: plugin.json / theme.json preservation: The
deployUpdateFiles()step previously overwroteplugin.jsonandtheme.jsonwith a plaincopy(), erasing user data such as"active"state, plugin settings stored under the"plugin"key, and customised theme colours in"variables". These files are now merged instead of replaced: existing keys are preserved, new keys introduced by the archive are added, and nested associative arrays (e.g.form_config.fields) are deep-merged recursively. Indexed arrays (e.g. hook lists) are union-merged without duplicates. A direct copy fallback is used if either JSON file is unreadable or invalid.
Edited on Mar 11, 2026 By Fred .
- solved
- Like(1)
arpinux