Not affiliated with IceWhale. This is an independent, community-maintained distribution of CasaOS. It is not produced, endorsed, sponsored, certified or supported by Shanghai IceWhale Technology Limited or by any of the upstream CasaOS maintainers.
CASAOS is a trademark of Shanghai IceWhale Technology Limited. The name is used here only to identify the upstream project that this software is a distribution of, as permitted for referential use; no rights in the CasaOS name or logo are claimed, and no affiliation is implied.
The original project is IceWhaleTech/CasaOS. Please do not report problems with this distribution to IceWhale — open them at ReCasaOS/CasaOS/issues.
ReCasaOS is a maintained release of CasaOS, the personal-cloud OS, after upstream IceWhaleTech/CasaOS stopped shipping in 2025. It builds on alvins82's fork, which kept CasaOS installable on Docker 29 and Ubuntu 26, and goes on from there: backups, alerts, apps from git, RAID, virtual machines, statistics, a safer account and network model, and a release pipeline that installs every release from scratch in CI before anyone else does.
This repository holds the installer, the release pipeline and the documentation. The parts of CasaOS live in their own repositories (Components). Every change since the fork is in the changelog.
The screenshots are the dashboard rendered with sample data.
curl -fsSL https://github.com/ReCasaOS/CasaOS-Install/releases/latest/download/install.sh | sudo bashArchitectures: amd64, arm64 and arm/v7, detected at run time. Running the same command on an existing install upgrades it; installs made from alvins82's or IceWhale's installers are migrated the same way, and the in-app updater then follows this distribution's releases. Do not use get.casaos.io/update afterwards: it installs IceWhale's frozen component bundle.
What is tested. Each release is installed from scratch by CI right after it is published, and exercised end to end (apps, backup and restore, storage, alerts):
- Ubuntu 22.04 on amd64 and arm64, with Docker 28 and with the current Docker that get.docker.com gives a machine that has none;
- Ubuntu 24.04 and 26.04, Debian 12 and Debian 13, in virtual machines (amd64);
- Debian 11 (amd64) is out of support and its security repository still lists packages it no longer serves, so a fresh install would stop at the first one it needs from there. The installer says so and offers to take that repository from archive.debian.org (
--use-debian-archiveanswers yes in advance); CI installs it that way.
The Fleet over a relay is checked on the Ubuntu runners too (the Fleet relay step: a recasaos-relay started on the runner, the master turned on over it, the box seen online), once the relay is published. To turn it on, set the repository variable RELAY_REPO (Settings, Secrets and variables, Actions, Variables) to the relay's owner/name on GitHub, and RELAY_REF to a branch or tag if not main; until then the step says it did not run. The release checked must have a core with the relay.
The installer accepts Docker 20 or later and leaves a Docker that is already there as it is. Other versions are not tested on every release.
The installer also installs tailscale and never starts tailscaled: it is stopped and disabled after install, and only the Fleet turns it on, when the box joins a fleet or becomes its master over a relay, and turns it off when the box leaves. A tailscale or a tailnet already present (the host's CLI, a container, a snap) is left untouched: nothing is installed or stopped. On apt systems whose distribution has no tailscale package, the installer adds Tailscale's package source (/etc/apt/sources.list.d/tailscale.list and its keyring); the installer also runs for an update from the dashboard, so an existing box gets that source on its next update too. It is optional: an install that cannot get it goes on without it, and the Fleet then works only with a master address typed by hand.
What is verified. Every package the installer downloads comes from a ReCasaOS release and is checked against a SHA-256 digest before extraction. The digests are written into install.sh at release time from the checksums each component publishes, or, for the dashboard and the App Store seed whose releases publish none, computed from the package as published; none is typed by hand. The uninstall script is checked the same way. Docker is the exception: when the box has none, the installer installs it with get.docker.com, apt verifies its packages against Docker's own key, and ReCasaOS neither pins nor checksums them. On a derivative of Ubuntu or Debian the installer adds Docker's own repository and key itself (downloaded over HTTPS from download.docker.com, with no fingerprint check: the same trust as get.docker.com), and apt verifies the packages against that key. tailscale is the same: from the system's repositories, or from Tailscale's (added with Tailscale's key when the system has none), verified by the package manager.
| Tested at every release | Not tested yet | Seen in service | Not supported |
|---|---|---|---|
| Debian 11, 12, 13; Ubuntu 22.04 (amd64, arm64), 24.04, 26.04; Armbian x86 (Trixie); DietPi x86 (Trixie); Linux Mint 22.3 (its os-release on Ubuntu 24.04) | Raspberry Pi OS 64-bit; Raspberry Pi OS 32-bit (Docker 28 at most); LMDE, Pop!_OS, Zorin, elementary | none yet | Alpine, OpenWrt, Devuan (no systemd), TrueNAS SCALE (apt is locked, it runs its own apps), Proxmox VE host, Proxmox Backup Server, Proxmox Mail Gateway |
- The Armbian and DietPi legs install the newest image of their project. The Ubuntu 22.04 arm64 runner stands in for a Raspberry Pi. The Linux Mint leg is an Ubuntu 24.04 with Linux Mint 22.3's
os-release: it proves how the installer handles a derivative, not Mint itself, and it is green from the first release that carries this change. - Seen in service will list systems whose installs complete and whose boxes keep reporting, read from
osandos_variantbelow. It does not mean every feature was checked. - On a derivative of Ubuntu or Debian (Linux Mint, LMDE, Pop!_OS, Zorin, elementary), the installer adds Docker's own apt repository for the base release instead of running get.docker.com. If the
os-releaseof an Ubuntu derivative names no base release, it stops at the Docker step and says to install Docker by hand. - The refusals apply to a first install only; an existing installation is updated anyway, with a warning. On a Proxmox VE host, Docker cuts the network of its virtual machines and containers: install ReCasaOS in a Debian or Ubuntu VM on it, or pass
--allow-proxmox-hostto install on the host anyway. - OpenMediaVault gets a warning, not a stop: it manages samba itself, so shares may conflict.
- A Compose editor and a
.envfor every app. Write or paste a compose file and edit it, and its.env, in the dashboard. An app whose start fails after a.envchange goes back to the previous one.${VAR:-default}works in a pasted file, and an app installed with its.envgets the profiles thatCOMPOSE_PROFILESnames. - Your own stacks are apps. A compose file you wrote by hand, or a stack started with
docker compose up(built from a Dockerfile, with an override file or a relativeenv_file), is listed as an app whose settings and.envcan be saved. - Apps from git. Deploy an app from a repository, or adopt a folder that already is one. It follows a branch or the highest release tag (optionally within a pattern such as
v2.*), rebuilds new commits without stopping the running version, and rolls back a version that does not start. A webhook (GitHub, Gitea, Forgejo, GitLab) makes the box check at once instead of waiting for the poll. The compose file and the profiles named byCOMPOSE_FILEandCOMPOSE_PROFILESin the app's.envare honoured. - Updates that say what they will do. The status dot and the update badge mean what the button will do. Update every app lists, image by image, what an update would change and then updates the apps you ticked one after the other. Opt-in automatic updates run at night, one day after a release and never during a backup.
- Apps and the box itself, to S3 (in a bucket you name), SFTP, FTP, WebDAV, OneDrive, Google Drive, Dropbox or anything else rclone speaks, optionally encrypted, on a schedule with a retention, with a history and a restore. An app that is no longer installed is put back from the compose file its backup holds. The box's own backup carries its users, shares and their accounts, schedules and destinations.
- A backup that is a consistent copy. The app is held still for the copy and started again whatever happened; a DNS server such as AdGuard Home or Pi-hole is copied running instead, so the network keeps resolving. A backup asked for while the app is busy waits for its turn, and one that failed in the night is said at the next open of the dashboard.
- restic, if you want it. A destination can be switched to a restic repository (Keep with restic... in the destinations). Each backup then costs only what changed since the last one, and files keep their owners and permissions, which a plain copy loses. The password is made on the box and shown once: write it down, without it the repository cannot be read. The repository is checked once a week and an alert says when it does not check out. Opt-in per destination; the runs, schedules, retention and restores are the same. A destination can go back to rclone (Switch back to rclone...) with nothing deleted, and a restore can put back only the files you tick (Choose files...).
A notification on your phone or an e-mail when a backup fails, a disk fails or fills up, a RAID array loses a disk, an app crashes, a container, a virtual machine or the machine stays above a threshold, or an update pauses (ntfy, Telegram, e-mail, Discord, Gotify, Matrix and more). Nothing is sent until you add a channel.
- Software RAID from the Storage manager. See the state of an array and be alerted when it loses a disk; repair it (add a blank disk, take a failed one out); create one (RAID 0, 1, 5, 6 or 10, after you type the storage's name again, and with a consent for RAID 0); delete one (after you type its name again; everything on it is erased and its disks come back blank); change a RAID 1 of two or three drives to a RAID 5, then grow its filesystem.
mdadmis installed for you when it is missing. The commands are proven on realmdadmarrays in CI. - Protection against the loss of a disk, with SnapRAID. Create one in a single dialog from the Storage manager (tick the drives to merge, the biggest drive left is suggested to hold the protection, and the merged storage appears in a folder of your choice,
/media/Poolby default), or, on the Merged Storage tab of a merge you already have, pick one or two storages of their own as parity: if a merged disk dies, a new one is rebuilt from the parity, while every disk stays an ordinary disk. The box syncs every night and checks the disks on Sundays; a sync that finds many files removed is held back instead of overwriting the parity, and nothing runs while a disk is not mounted.snapraidis installed for you the first time. A repaired file comes back owned by root and readable by root only. The commands are proven on loop-backed disks in CI. - A trash in Files. What you delete stays thirty days and can be put back where it was.
- Shared folders that ask. Sharing a folder asks who can open it, a guest or an account, and the list tells which, with the shares open to everyone in warning colours. Share accounts are managed from the dashboard, and Time Machine shares are supported.
- Merged storage (mergerfs) restored across restarts, SMB discovery over mDNS and Windows Web Service Discovery, renaming a storage volume, accurate usage of nested filesystems. Encrypted disks (a locked LUKS container, a BitLocker volume) are not offered for formatting.
- Opt-in settings, mostly contributed by @ppenguin: a file manager confined to the folders you choose, a first administrator created on the machine, Samba configuration owned by the host, and a mode for hosts whose system image owns updates.
- Virtual machines, as the optional
virtmodule: create and run machines from the dashboard, upload an ISO or a disk image, console in the browser. Each machine has a tile in the app grid, with its state and the mark of its system, that opens its console. - A Statistics app. Processor, memory, network, disk and health of every container (including the ones you started by hand), every virtual machine and the machine itself, live and over the last 7 days, with a common cursor, zoom and a table for every chart. The history is kept in fixed-size files (about 3 MB per item) and survives restarts.
- Resource alerts. Each container, virtual machine and the machine has its own rules (processor above 90 % for 10 minutes and memory above 90 % for 5 minutes by default, editable from the app), and a virtual machine that crashes raises one too. They show as a banner, a count on the Statistics icon and a pop-up, and reach your phone under the resources category.
- The in-app updater, and the System packages update in the dashboard. Docker is left out of it and shown on a line of its own: updating Docker restarts it and stops every container until it is back, so it is done only when you confirm, with a list of what will happen. See Updating Docker.
- Modules. Optional components are installed, updated (with a plan to read first, a backup, and the old version put back on failure) and removed from the Modules window or with
casaos module. See Optional modules. - Support of the operating system. The dashboard says when your Debian or Ubuntu release has run out of security support, checks about 55 points to tell whether the machine could move to the next release, and a wizard moves a Debian 11 machine to Debian 12 (beta, off by default): readiness report, rehearsal, upgrade, restart, check.
- Passwords are stored with argon2id (each account is upgraded the first time it signs in), and two-factor authentication is available. A session survives a restart.
- Nothing on the message bus without signing in; a refresh token does not open any route; the loopback address is no longer an identity.
- HTTPS on 443 without configuring anything (a self-signed certificate: the browser warns once, and
httpsport=0turns it off). - Nothing this distribution installs asks a third party where you are, and the dashboard takes no package from IceWhale.
- Moving files can no longer delete them, a leaked download link no longer gives write access, and cloud tokens stay out of the logs.
- Every service is built with a supported Go and the dependencies with known vulnerabilities are updated or removed.
Moved to Vue 3, with a dark theme, a complete French translation, a settings panel that is grouped and compact, dialogs that share one layout, and a home page that fits a phone. System apps (App Store, Files, Virtual Machines, Statistics) carry a small gear mark so they are not taken for apps you installed. A new dashboard is offered as a beta in Settings: a health strip across the top and the system apps in a row of their own; the classic one stays the default and comes back with one button.
Some components are optional: they live in a repository of their own, ship their own releases and are installed only when you ask. A box that does not ask downloads and runs none of it. docs/modules.md is the contract for a module's author and says what is checked before anything is written to your box.
curl -fsSL https://github.com/ReCasaOS/CasaOS-Install/releases/latest/download/install.sh | sudo bash -s -- --module <name>- One module is offered:
virt(virtual machines, from CasaOS-VirtManagement). It is in the core tier: maintained here and installed, run, updated and removed in CI on real guests (Debian 12, Ubuntu 22.04 and Ubuntu 24.04, with libvirt's test driver) before a release carries it. Install it from the Modules window, withcasaos module install virt, or with--module virt. - The catalogue is pinned. Every release carries a catalogue of the modules it can install, pinned by a SHA-256 written into
install.shlike the packages. A module that is not in it cannot be installed, and one that cannot be installed is reported with the step that failed and why, without failing the install of ReCasaOS.sudo casaos module remove <name>cleans up what a failed install left. - Installed modules follow the release. When ReCasaOS is updated, every installed module that the new release's catalogue has at a later version is updated too, so a new dashboard never runs beside a module built for the old one. Nothing is installed that was not, and no module goes back to an earlier version. A module whose update fails is put back at its old version, keeps running, and can be retried from the Modules window. Run the installer by hand with
--no-module-update, or withRECASAOS_MODULE_UPDATE=0on the install line, to leave the modules where they are; the dashboard's update and the automatic updates have no such opt-out. They hand the module updates tocasaos-update-modules.service, which waits up to 10 minutes for the update to finish and adds its lines to/var/log/casaos/upgrade.log.
ReCasaOS does not update Docker for you, and the installer never changes a Docker that is already there. Updating it restarts the Docker daemon, and that stops every container until it is back: apps with a restart policy of always or unless-stopped start again on their own, the others stay stopped. Do it when that suits you, and keep the output of docker ps first.
If your Docker came from Docker's own repository, which is what the installer sets up on Debian and Ubuntu, this updates it within its major version:
sudo apt-get update && sudo apt-get install --only-upgrade docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-pluginA new major version (28 to 29) is a bigger step: read Docker's release notes first. A Docker from your distribution's own packages (docker.io) or from snap is updated with the tools of that system.
Since v0.5.19 the dashboard's System packages update leaves Docker out and shows it on a line of its own, with the command above for the packages it lists. Before, it ran a plain apt-get upgrade, which included Docker's packages when Docker's repository was configured, and so could restart Docker and move it to a newer version.
A ReCasaOS box sends anonymous statistics, so that the maintainers know how many boxes are running, which release they run, how fast they update after a release, and on what hardware: what GitHub's download counters cannot tell. They are on by default, and they say so: at the end of every install and upgrade, in a notice the dashboard shows once, and here. Any one of the three ways below turns them off.
Who receives them. PostHog Cloud, in its EU region. The CasaOS core posts them to https://eu.i.posthog.com/i/v0/e/; the dashboard sends nothing.
When. Two events: heartbeat, at most once every three hours, which counts the boxes running, and version_changed, once after an install or an upgrade, which measures how fast boxes update. A failed send waits for the next hourly check; nothing is queued.
Which box. A random UUID, made on first use and kept in /var/lib/casaos/telemetry.json (root only). It derives from nothing on the machine; a reinstall that removes /var/lib/casaos makes a new one.
What is sent. These properties, on both events, previous_distribution on version_changed only. See what is sent, in the dashboard's settings, shows the values this box would send, built by the code that sends them.
The properties, one by one
| Property | Example | Source |
|---|---|---|
distribution |
v0.5.0 |
/var/lib/casaos/fork-release, trimmed; unknown if absent |
previous_distribution |
v0.4.99, new, upstream |
/var/lib/casaos/upgraded-from, written by the installer: the release it replaced, new on a machine without CasaOS, upstream on a box coming from IceWhale's CasaOS |
core |
v0.4.59 |
"v" + common.VERSION |
arch |
amd64, arm64, arm-7 |
runtime.GOARCH, plus GOARM from the build info for arm |
os |
ubuntu 24.04, debian 12, arch |
/etc/os-release: ID and VERSION_ID (ID alone when there is no VERSION_ID); unknown if unreadable |
os_variant |
raspberrypi, armbian, dietpi, proxmox, openmediavault, truenas, proxmox_backup, proxmox_mail, none |
What a box that says ID=debian or ubuntu really is, from fixed marker files (/etc/rpi-issue, /etc/armbian-release, /boot/dietpi.txt, /usr/bin/pveversion, /etc/openmediavault, /usr/sbin/proxmox-backup-manager, /usr/bin/pmgversion, /usr/bin/middlewared); none for plain Debian or Ubuntu and for any other ID (Raspberry Pi OS 32-bit too: its ID, raspbian, shows in os); unknown if os-release is unreadable |
kernel |
6.8 |
uname release, major.minor |
virtualization |
none, kvm, lxc, wsl, unknown |
systemd-detect-virt output; unknown if it cannot run |
model |
Raspberry Pi 5 Model B Rev 1.0, ZimaBoard |
/proc/device-tree/model, else /sys/class/dmi/id/product_name; NUL and spaces trimmed, 64 characters max; unknown if empty or a known placeholder (To Be Filled By O.E.M., System Product Name, Default string, Not Specified) |
docker |
28.3.1 |
GET /version on /var/run/docker.sock, field Version; unknown if unavailable |
cpu_cores |
4 |
runtime.NumCPU() |
ram_gb |
"8" (a string, because of 128+) |
MemTotal from /proc/meminfo, rounded to the nearest of 1, 2, 4, 8, 16, 32, 64, then 128+ |
disks |
3 |
entries of /sys/block whose resolved path is not under /sys/devices/virtual/, excluding sr* and mmcblk*boot* |
storage_tb |
4-8 |
sum of those disks' sizes (/sys/block/<d>/size × 512 bytes), bucketed: <0.5, 0.5-1, 1-2, 2-4, 4-8, 8-16, 16-32, 32+ (TB, 10^12 bytes) |
raid |
true |
/proc/mdstat lists an active md array |
Every event also carries $process_person_profile: false, so PostHog makes no person profile, and $lib: "recasaos-core". PostHog derives the country from the address the event comes from: the project discards that address, and keeps the country and the continent only, every finer location being dropped before anything is stored.
Never sent: IP address (discarded by the project setting), hostname, MAC address, serial numbers, disk names, labels or paths, installed apps, user accounts, anything about the local network.
Any one of these; an upgrade never turns them back on.
-
With the installer:
--no-telemetry, orRECASAOS_TELEMETRY=0, on an install or on an upgrade.curl -fsSL https://github.com/ReCasaOS/CasaOS-Install/releases/latest/download/install.sh | sudo bash -s -- --no-telemetry curl -fsSL https://github.com/ReCasaOS/CasaOS-Install/releases/latest/download/install.sh | sudo RECASAOS_TELEMETRY=0 bash
-
In the dashboard: the Anonymous usage statistics switch in the settings. It takes effect at once.
-
By hand: stop the core (
sudo systemctl stop casaos), set"enabled": falsein/var/lib/casaos/telemetry.json(or create the file holding{"enabled": false}if it is not there yet), and start it again (sudo systemctl start casaos).
Each component is released from its own repository. The versions a release pins are in release/components.env and in the components.lock asset of that release.
| Component | What it is |
|---|---|
| CasaOS | The core: files, storage, shares, the system |
| CasaOS-UI | The dashboard |
| CasaOS-AppManagement | Apps, Compose, git deployments, backups, statistics |
| CasaOS-Gateway | The front door: routing, HTTPS |
| CasaOS-UserService | Accounts and sessions |
| CasaOS-MessageBus | Events between the services |
| CasaOS-LocalStorage | Disks, storage volumes, RAID |
| CasaOS-VirtManagement | The optional virt module |
| rclone | The transport of backups and cloud drives |
| restic | The repositories of backups kept with restic |
The installer downloads every package from a ReCasaOS release. The App Store seed, the snapshot a new box needs for its store to be populated before the first refresh, is IceWhale's, mirrored into our release at release time and pinned by the digest of the copy we serve; nothing about the catalogue changes, AppManagement keeps polling IceWhale's live store feed and IceWhale keeps curating it. IceWhale's CasaOS-CLI is no longer installed: nothing in the distribution ever called it.
Nothing is built on a workstation.
- Each component is tagged and its own workflow publishes tarballs and, except the dashboard, a
checksums.txt. - Those tags and commits are pinned in
release/components.env. - This repository is tagged. Its workflow checks out the six components at the pinned commits, packages their setup scripts as the compatibility overlay, fetches the published digest of every package that has one, mirrors the App Store seed, computes the digest of the dashboard and of the mirrored seed from the packages themselves and of the uninstall script it ships, writes every tag and digest into
install.sh, and publishes the result. It refuses to produce an installer with a placeholder left unfilled, and to build a module catalogue for a release whose core is older than the first one that hascasaos module, or that does not read the catalogue it is built with when it is built and run.
scripts/build-release-bundle.sh is that step. It can be run locally: WORKSPACE_ROOT names the directory holding the six component checkouts at the pinned commits, CHECKSUMS_BASE_URL is where the six components' checksums.txt and the dashboard tarball are downloaded from, and UPSTREAM_BASE_URL is where the App Store seed tarball is downloaded from. Both default to GitHub; a file:// URL pointing at a local tree laid out as <repo>/releases/download/<tag>/ exercises the whole chain before any release exists.
A large part of the code, the tests and the documentation of this distribution is written with an AI coding assistant. The maintainer runs the result on their own machines, decides what is merged and tags every release; nothing is published automatically.
Who or what wrote a line says little about whether it works, so what stands between a change and your machine does not depend on it:
- each release is installed from its published bundle and used end to end by CI, on amd64 and arm64;
- every package is verified against a SHA-256 digest before extraction, and the release workflow refuses to produce an installer with a placeholder left in it;
- the components' CI builds them and runs their tests.
If something in the code looks wrong, please open an issue: reading it is the review this project most needs.
sudo casaos-uninstallIf optional modules are installed, the uninstaller first removes each one with casaos module remove <name> --yes and shows what it says; a module that cannot be removed is reported with the step and the reason, and the uninstall goes on. What stays on purpose: the packages the module needed and its data (for the virtual machines module, /DATA/VM). The uninstaller prints, at its end, the commands that purge them by hand, and does not run them.
This distribution started from alvins82's v0.4.39. His release notes are kept here because his work is what made CasaOS installable again on current systems:
alvins82's fork changelog (v0.4.26 – v0.4.39)
- 2026-08-20 — v0.4.39: No functional code changes; re-pins components to the commits merged into fork
main: CasaOS LocalStoragev0.4.28(republish after PR #10 merge, byte-identical sources to v0.4.27) and CasaOS AppManagementv0.4.19at the merge commit (first tagged release of the AppManagement fork). Core packages and the v0.4.39 overlay are republished. - 2026-08-20 — v0.4.38: Supersedes v0.4.37 by fixing a crash loop found in the first reboot test: the AppManagement recovery sweep called
SetStatuswith a cron context carrying no event properties, panicking on a nil map. Bumps CasaOS AppManagement tov0.4.19(commitbd428f9), which attaches event properties in the sweep and adds a defensive guard inSetStatus. Core packages are republished unchanged. - 2026-08-20 — v0.4.37: Published the full fork bundle with CasaOS LocalStorage
v0.4.27, which restores all persisted merge mounts during the before-docker init step, and AppManagementv0.4.18, which starts apps that were abandoned because storage was not ready at boot while respecting apps the user stopped. Core packages are republished unchanged from v0.4.36. - 2026-08-20 — v0.4.36: Published the full fork bundle with CasaOS LocalStorage
v0.4.26, which keeps restoring merge mounts until their source disks appear, fails loudly with the offending entries when a merge mount point is not empty, and surfaces the last restore failure in the merge status endpoint. Core and AppManagement packages are republished unchanged from v0.4.35. - 2026-08-15 — v0.4.35: Supersedes v0.4.34 with exact 64-character SHA-256 values for every architecture, including the amd64 and arm/v7 AppManagement packages.
- 2026-08-15 — v0.4.34: Corrected the SHA-256 values used to verify the fork packages and republished the compatibility overlay with the matching release marker. This fixes upgrades that stopped during package verification after v0.4.33.
- 2026-08-15 — v0.4.33: Published the full fork bundle with CasaOS core
v0.4.28and CasaOS UIv0.4.30. It fixes shutdown and restart handling by using explicit systemd power actions, keeping the UI from reloading after shutdown, and surfacing power-command failures. PRs: CasaOS #26, CasaOS-UI #15. - 2026-08-14 — v0.4.32: Published the full fork bundle with CasaOS LocalStorage
v0.4.25, which restores persisted mergerfs mounts before creating default/DATAdirectories so updates and restarts retain the configured merged storage. PR: CasaOS-LocalStorage #9. - 2026-08-14 — v0.4.31: Published the full fork bundle with CasaOS core
v0.4.27, CasaOS UIv0.4.29, and CasaOS LocalStoragev0.4.24. It adds host-level SMB zeroconf discovery through mDNS/DNS-SD and Windows Web Service Discovery, with optional Avahi/wsdd dependencies handled without blocking installation or upgrades. - 2026-08-13 — v0.4.30: Published the full fork bundle with CasaOS core
v0.4.26, CasaOS UIv0.4.29, and CasaOS LocalStoragev0.4.24. It creates missingDocuments,Downloads,Gallery, andMediadirectories in external merged storage while preserving systemAppDatabehavior. PR: CasaOS-LocalStorage #7. - 2026-08-13 — v0.4.29: Published the full fork bundle with CasaOS core
v0.4.26, CasaOS UIv0.4.29, and CasaOS LocalStoragev0.4.23. It includes the Files App Store-style dialog, one-surface dashboard scrolling, corrected hidden-files icons, storage-volume rename controls, and the matching LocalStorage rename API. PRs: CasaOS #21, CasaOS-UI #11, CasaOS-UI #12, CasaOS-UI #13, CasaOS-UI #14, CasaOS-LocalStorage #6. - 2026-08-13 — v0.4.26: Added in-dashboard system package updates, accurate nested filesystem usage and disk ownership, and the persistent widget search setting. This bundle pins CasaOS core
v0.4.25, CasaOS UIv0.4.28, and CasaOS LocalStoragev0.4.22. PRs: CasaOS #16, CasaOS #17, CasaOS #18, CasaOS #19, CasaOS #20, CasaOS-UI #8, CasaOS-UI #9, CasaOS-UI #10, CasaOS-LocalStorage #5.
The CasaOS components are published under the Apache License 2.0 and keep their upstream copyright notices. The dashboard repository has never carried a licence file of its own; it is distributed here as part of CasaOS releases, as upstream distributed it.


