# Maison vs casa-img — Feature Comparison Spec-level (feature) comparison. Deliberately **not** implementation-level — no language, runtime, supervision, or transport is chosen yet. Rows that were purely about *how* (message bus, process supervision, bundled engine) have been removed and folded into the behaviour they deliver. **Legend:** ✅ in scope · ❌ out of scope · 🔶 in scope but **diverges** from casa-img | # | Feature | casa-img | Maison | Notes | | ---------------------------------------- | -------------------------------------------------------------------------------------------------------- |:--------:|:--------:| ---------------------------------------------------------------------------------------------------------------------------------------------- | | **Dashboard / home** | | | | | | 1 | App grid home screen | ✅ | ✅ | The core of Maison | | 2 | App tiles with burger menu (open, **restart, stop, start**, uninstall…) | ✅ | ✅ | Same options as CasaOS | | 3 | Drag-to-reorder tiles | ✅ | ✅ | | | 4 | Add external link (bookmark tile) | ✅ | ✅ | | | 5 | Promo / onboarding cards | ✅ | ❌ | Dropped | | 6 | Global search bar | ✅ | ❌ | Dropped | | **Apps — model** | | | | | | 7 | An "app" = a multi-service Docker Compose stack | ✅ | ✅ | Full compose stacks, same as CasaOS | | 8 | Same on-disk app file structure as CasaOS | ✅ | ✅ | App data / compose layout matches CasaOS | | 9 | Store apps: compose copied **as-is** and brought up | ✅ | ✅ | Maison does not rewrite the store's yml | | 10 | Unmanaged-app discovery: detect an external Compose stack carrying `x-casaos` and show it as an app tile | 🔶 | ✅ | Not store-linked = "unmanaged app". Replaces the manual "install customized app" form | | 11 | Manual "Install a customized app" form | ✅ | ❌ | Replaced by #10 (auto-discovery) | | **App configuration (per-app settings)** | | | | | | 12 | App settings/config window (ports, env, volumes…) | ✅ | 🔶 | **Diverges:** Maison keeps a CasaOS-style config window, but writes a **separate override compose file** instead of editing the original yml | | 13 | Restart / stop / start / uninstall controls | ✅ | ✅ | Via the burger menu (#2) | | 14 | Live per-app logs | ✅ | ✅ | | | 15 | Live per-container stats | ✅ | ✅ | | | 16 | Real-time app status updates on the dashboard | ✅ | ✅ | Live updates in scope; transport intentionally unspecified | | **App Store** | | | | | | 17 | CasaOS App Store UI (browse, category, featured, detail) | ✅ | ✅ | 100% CasaOS-compliant | | 18 | CasaOS-compliant store format (`x-casaos` metadata) | ✅ | ✅ | Unchanged format | | 19 | Multi-store support | ✅ | ✅ | In scope | | 20 | Install from store | ✅ | ✅ | | | 21 | Automated app updates | ✅ | ✅ | In scope | | **Backups** | | | | | | 21a | Archive an app's data + config on uninstall (never delete) | ❌ | ✅ | casa-img deletes the compose dir on uninstall; Maison archives the whole folder into `maison/.backups//` | | 21b | On-demand backup of an installed app | ❌ | ✅ | **No casa-img equivalent.** Two-pass copy (live → stop → delta → start → zip) so downtime is seconds, not minutes. See `docs/lifecycle.md` | | 21c | List / restore / delete backups, per app and box-wide | ❌ | ✅ | App Settings → Backups, plus Settings → Backups for archives of apps that no longer exist | | 21d | Scheduled or automated backups, retention policy | ❌ | ❌ | Manual only for now | | 21e | Offsite / second-disk backup targets | ❌ | ❌ | Backups sit on the data disk: rollback, **not** disaster recovery | | **Widgets** | | | | | | 22 | Clock / date widget | ✅ | ✅ | | | 23 | System status widget (CPU %, temp, RAM) | ✅ | ✅ | | | 24 | Storage widget (health, used/total) | ✅ | ✅ | Read-only stats, not a disk manager | | 25 | Widget settings (toggle widgets) | ✅ | ✅ | | | **Global settings & platform** | | | | | | 26 | Configurable background / wallpaper | ✅ | ✅ | In scope | | 27 | Light / dark theme | ✅ | ✅ | Part of UX parity | | 28 | i18n / multi-language | ✅ | ✅ | In scope | | 29 | Single dashboard container + host Docker socket | ✅ | ✅ | Same deployment model | | **Out of scope (dropped from casa-img)** | | | | | | 30 | Authentication / login / users | ✅ | ❌ | Trusted-network boundary instead | | 31 | File manager / Files app | ✅ | ❌ | Dashboard-only | | 32 | Multi-user / RBAC | ✅ | ❌ | | | 33 | Terminal / SSH | ✅ | ❌ | | | 34 | Disk / RAID management | ✅ | ❌ | | | 35 | Network shares (Samba/SMB), rclone remotes, ntfs tools | ✅ | ❌ | | ## Key divergences from casa-img (not just subtractions) - **App config → override file (#12).** Maison never mutates the compose file it got from the store. User edits in the settings window are written to a *separate override compose file* that is layered on top, so the original stays pristine and updates stay clean. - **Unmanaged apps (#10, #11).** No manual custom-install form. Instead Maison watches Docker: any Compose stack that carries `x-casaos` metadata — even one it didn't install — surfaces as an app tile, marked as unmanaged (not tied to a store entry). - **Backups (#21a–c) are an addition, not parity.** casa-img has no backup feature at all — its only "backups" are a `.bak` of the compose file during an update and log rotation. Maison's flat app model is what makes this cheap: the folder *is* the app, so one archive holds the compose, the override, the `.env` and the data, and restores into a working app on its own.