CHANGELOG.md
Rama main · réplica de lectura del repositorio original.
# Changelog
All notable changes to this project will be documented in this file.
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/),
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
## [Unreleased]
### Added
- **Name conflicts ask what to do**: copying or moving onto a name already taken
asks to replace the existing item, keep both (the new one is numbered) or skip
it, for one item or all the remaining conflicts. Replacing needs the right to
delete the existing item; in a place with a trash it goes there first.
- **Undo a move**: after a move, the toast offers Undo, which puts the items back
where they were, under their former names.
- **Percent and time left** for copies, compressions and extractions in the
Activity panel.
- **Keyboard in the file manager**: arrows (Shift extends the selection), Home and
End, Backspace for the parent folder, and typing a name's first letters jumps
to it.
- **Drag preview**: a drag shows the item's name, or how many items.
### Changed
- **Double click opens, a slow click renames**: a double click on a name opened
its rename box; it now opens the item, like the rest of the row. A click on
the name of the item already selected alone renames it, as do F2, the menu and
the pencil.
- **Long copies go on in the background**: a copy or move still running after a
while was reported as failed in the file manager. It now carries on, followed
in the Activity panel.
### Fixed
- **Folders of thousands of files**: a folder of 10,000 files froze the page.
Only the rows in view are rendered now: it opens in under half a second, and
End or a typed name jumps there at once.
- **Abandoned uploads left on disk**: the staging file of an upload abandoned
across a server restart (every update) stayed forever. The NAS removes the
ones nobody wrote to for a day.
- **First click on a window behind**: on the desktop, the first click on a window
in the background only brought it forward; it now also does what it was for.
- **Keys in several Files windows**: with two Files windows open, a key (Delete,
Ctrl+V) acted in both. Only the window in front answers now.
- **Toast buttons**: the Undo and View logs buttons of a toast were vue-sonner's
black pill, in a font that was not the interface's. They are now small primary
buttons in the app's style, and toasts use its font.
## [1.83.0] - 2026-11-10
### Fixed
- **Path squeezed in a narrow Files window**: on a wide screen, a small Files
window showed its path cut to a few letters ("p" for "ui-up"). The file
manager's toolbar now follows the width of its own window: when narrow, the
path gets its own row, and the buttons of a selection wrap instead of being
cut off (on a phone too).
## [1.82.0] - 2026-11-10
### Added
- **Background tasks tracked on the server**: copies, moves, deletions,
archives, container operations, backups and HSI updates can be listed from
any device, with what they work on and since when they run, instead of only
in the browser tab that started them.
- **Activity page**: the bell opens an Activity app with three tabs, running
tasks, notifications and the history of the last 7 days. On a phone the bell
opens it directly.
- **Cancel a background task**: your own copies, moves, compressions and
extractions can be cancelled from the Activity panel. The NAS stops within a
second or so and removes what the task wrote (an extraction keeps the files
it had already replaced); a task still waiting never starts.
- **A notification when your task ends**: "Copy finished" or "Copy failed"
with the reason, for your own copies, moves, deletions, archives and app
operations, even when the tab was closed. It opens the folder concerned.
Only you see it, and it stays in HSI (no e-mail or webhook).
- **Drag between file manager windows**: items dragged from one window onto
the list of another move into the folder it shows (Ctrl or Alt held copies
them). Every window showing a folder that changed refreshes.
### Changed
- **Uploads and background tasks in the Activity panel**: the bell panel has a
"In progress" section (uploads with their percent and remaining time, NAS
tasks with how long they have been running) above the notifications. The
transfers tray at the bottom of the file manager is gone; a bar under the
bell fills while files are sent.
### Fixed
- **Backend restart during a long copy**: the job was marked failed although
the NAS kept copying. It now stays running and is only given up once the
worker no longer holds it.
- **Creating a folder during an upload**: it waited until the upload was
verified (a whole-file checksum, minutes for a large file) or a copy had
finished, 28 s on a real NAS. New folders and files no longer wait behind
file jobs, and the file manager sees a finished job within a fraction of a
second instead of 1.5 s.
## [1.81.0] - 2026-11-06
### Added
- **Create and start an app**: the container manager can save a new app and
start its containers in one reviewed operation. Save without starting remains
available, and existing apps keep their separate save and apply actions.
- **Deployment tracking**: follow the real Docker task, open its logs, and retry
a failed start without losing the saved configuration. Long jobs and status
checks interrupted by a connection error stay pending instead of appearing
to fail. Pending jobs remain visible when returning to the container list,
with concurrent container changes blocked until their outcome is known.
### Changed
- **Container management**: consistent DaisyUI controls and feedback, summary
counts, search by app name, image or port, visible actions, clearer status
badges and retryable loading errors. Mobile cards also offer Apply, and
advanced settings, Compose editing and unmanaged containers remain available.
### Fixed
- **Container state after an action**: refresh Docker's observed state after
starting, stopping, restarting or applying an app instead of guessing it.
- **Container settings**: advanced controls and capability additions now update
the form correctly. Environment variables entered in raw mode are included
when saving, and read-only volume settings are preserved and editable.
- **Uploads**: reject planted symbolic links, hard links and special files used
as upload part files; anchor chunk writes and finalization to a directory
descriptor while preserving resumable uploads.
- **Assistant Markdown**: code fences with punctuation or extra options no
longer trap the renderer in an infinite loop.
- **Pinned app links**: accept only HTTP and HTTPS URLs and filter unsafe
legacy values before rendering links.
- **Public shares**: an incorrect share password no longer signs an already
authenticated dashboard user out. Expired sessions are still rejected, and
a response to an older request cannot clear a newer login.
## [1.80.5] - 2026-11-05
### Fixed
- **Tap on iPhone**: a tap on a folder or a file selected it instead of
opening it. Safari can report the click that follows a tap as a mouse
click; the finger is now told by the touch that starts it.
- **Long press on iPhone**: the system callout (copy, look up) no longer
takes over a long press on a file or folder.
- **Renaming on a touch screen**: each file and folder has a pencil button,
and the name field takes the focus at once (also after F2), so a phone
opens its keyboard.
## [1.80.4] - 2026-11-05
### Fixed
- **"More" menu on iPhone**: it spread its items over the whole screen in
Safari. Menus and popovers are now as tall as their content in every
browser.
- **Clearing the Activity panel**: an administrator's button now reads Clear
all and empties the panel. Before, it only marked notifications as read, so
read ones stayed. Other accounts still mark them as read, since the
notifications are shared.
## [1.80.3] - 2026-11-05
### Added
- **PDF preview**: a PDF opens in the file manager instead of the text editor,
shown in place on a computer, with buttons to open it in a new tab or
download it (the way to read it on a phone).
### Fixed
- **English left in the French interface**: storage counts, redundancy and
usage, free space, disk roles, health and names, the LVM explanation, RAID
status in the overview, the user Save button, notification switches and why
the network cannot be changed are now translated.
- **Select arrows over their text**: a select with its own padding no longer
slides its text under the arrow.
- **Deleting a user who never had write access**: the plan failed with
"group.steps is not iterable", so the account could not be removed.
- **File manager on a phone or tablet**: a tap opens a folder or previews a
file; once something is selected (checkbox or long press), taps add to the
selection. The selection bar and the long-press menu have View for a file
(its preview) and Open for a folder, and the checkboxes and
preview buttons that only showed on hover now show on touch screens.
- **Long press on a touch screen**: it opens the menu of the item under the
finger and selects it. A finger held still no longer cancels it, and lifting
it no longer picks the menu item under it.
- **File manager path on a phone**: the current folder shows on its own row
instead of being squeezed out by the actions.
- **Row actions on touch screens**: the actions of an app, a place or a group
member that only showed on hover are now visible on touch screens.
- **Narrow screens**: section titles no longer squeeze into a thin column next
to their buttons (storage, places, users, groups, sharing diagnostics), and
RAID cards, notification connectors and rules, App Store cards and the apps
table on a tablet no longer cut their content.
## [1.80.2] - 2026-11-05
### Added
- **App Store catalog updated online**: new apps and image updates now come from
the public repository kittyruntime/home-server-interface-apps, checked every
12 hours and on demand from the App Store, without waiting for an HSI release.
HSI only uses a catalog signed with the key it ships, never goes back to an
older one, keeps the last one for offline restarts, and falls back on the
catalog of its release. Fetching it sends nothing about what is browsed or
installed.
### Changed
- **App Store logos are drawn as images**: they can now come from outside HSI,
so an SVG logo never runs anything in the page.
## [1.80.1] - 2026-11-04
### Changed
- **Faster VM test of a failing volume**: it waits seconds instead of minutes for
HSI to react.
- **Activity panel reworked**: new notifications come first with an unread dot,
read ones move under Earlier, each shows an icon for its kind and two lines of
detail, a click marks one as read, and administrators reach the notification
settings from it.
- **File manager menus in a familiar order, with shortcuts**: the context menu and
the toolbar go open and download, cut and copy, rename, share and compress,
trash or delete, then permissions and properties. Enter opens, F2 renames,
Ctrl+X, Ctrl+C and Ctrl+V cut, copy and paste, Ctrl+A selects everything,
Delete removes and Alt+Enter shows the properties; the menu shows them.
- **Drag and drop inside the file manager**: drag files and folders onto a folder,
a place, a bookmark or a folder of the breadcrumb to move them there, and drag
a folder onto the Bookmarks group to bookmark it. Files dragged from the
computer still upload.
- **A click selects only what it clicks**: Ctrl or Cmd adds to the selection and
Shift selects a range, as in a desktop file manager; the checkboxes still add
and remove.
- **No permanent delete where there is a trash**: in a place with a trash,
deleting (the menu, the toolbar, Delete or Shift+Delete) always moves items
there; they are deleted for good from the Trash.
### Fixed
- **Menus opened in the corner or off screen**: the Activity panel, the file
manager's sort menu and the place icon picker now open next to their button,
and a long menu opened low in the window stays on screen.
- **Mark all as read did nothing visible**: read notifications stayed listed like
new ones and this browser's finished operations kept the badge up; now they
move under Earlier and the badge clears.
## [1.80.0] - 2026-11-04
### Added
- **Sort and display settings in the file manager**: a sort menu (A-Z, Z-A, last
modified, first modified, size, type), a choice of columns including a new Type
column, a default view, and hidden files, which are hidden unless you turn them
on (Ctrl+H). They are kept with your account.
- **File manager settings in one place**: a Settings entry at the bottom of its
sidebar opens Display and Shared links as two tabs.
- **Copy a path in one click**: click the path in a file's properties or the
current folder in the breadcrumb, or use **Copy path** in the context menu.
It also works when the NAS is opened over plain HTTP.
- **More in the properties of a file or folder**: the exact size in bytes, the MIME
type, the creation and access dates, where a symlink points, and on request the
size of a folder, a file's SHA-256, and the dimensions, duration and codecs of
images and videos (duration and codecs need `ffprobe` on the NAS). A place also
shows the volume and filesystem it lives on.
- **Bookmarks in the file manager**: bookmark a folder from its context menu or
the star in the toolbar; bookmarks sit in the sidebar under the places, can be
renamed and reordered, follow your account, and show dimmed when the folder is
gone or out of reach.
- **Trash per place**: an administrator turns it on for a place in Settings >
Places, with an optional emptying of items older than a number of days.
Deleting there moves items to the trash with an Undo; Shift+Delete still
deletes for good. The Trash in the file manager restores items where they
were (or under a new name when something took their place) and empties it.
Each person's trash is their own, in a folder HSI makes for them: only they
(and administrators) see and restore what they deleted. The trash is hidden from listings and shares,
cannot be opened by its path, and is left out of backups.
- **Free space per place**: the file manager shows how much room is left on the
current folder's disk next to the item count, and Settings > Places shows it
for each place.
### Changed
- **VM tests look up the latest release reliably**: from the release page's
redirect, with retries, instead of the API that limits anonymous calls.
- **New folder and file icons**: folders are filled, two-tone and take the theme's
color; files are tinted by kind (images, videos, audio, archives, code,
documents), so a folder is quicker to scan.
- **File manager follows the theme more closely**: its progress bars are daisyUI's
and its tiles use the theme's corner radius.
### Fixed
- **Permissions from a place's properties**: **Edit** did nothing. A place now shows
**Manage access**, which opens its access settings, since HSI sets the owner and
rights of a place's folder itself. Files and folders inside still open the
permissions dialog, for the entry shown whatever is selected.
## [1.79.3] - 2026-11-03
### Security
- **Updated glob and minimatch**: fixes a file search that could keep running after
being cancelled (GHSA-3g3m-2fjr-6pw4) and a pattern that could make matching very
slow (GHSA-g3hv-75wg-m249).
## [1.79.2] - 2026-11-03
### Changed
- **Shared links have their own Settings group** at the bottom of the file
manager's sidebar, apart from the places.
- **Sidebar header cleaned up**: the arrow badge at the top of the app sidebar is
gone.
- **Segmented choices are tabs**: the file manager's list/grid switch, the history
period, the disk view, the network addressing, roundness and density use one
tab-style control.
- **Cleaner Advanced options**: each option is one row with its name, a short hint
and its switch, and the whole row toggles it.
- **Selection checkboxes are easier to see**: slightly larger, and no longer faded
in the file manager.
### Fixed
- **Your theme comes back right after signing in**: the account's look no longer
waits behind slower dashboard requests, which could leave the previous
account's theme on screen for a long time. If it cannot be read, it is retried,
and the previous account's look is never saved over yours.
## [1.79.1] - 2026-11-03
### Changed
- **Settings are tidier**: Appearance and a new Advanced options group (confirm
before deleting, advanced mode) are collapsed sections, closed by default, and
the language is picked from a list.
- **Shared links moved to the file manager**: they now sit under the places in the
file manager's sidebar instead of in Settings.
### Fixed
- **Theme picker no longer scrolls the page**: choosing a theme from the lower part
of the list used to jump the page down, and now it stays where it is.
- **One font per line of text**: disk names, sizes, paths and counts inside a
sentence or next to a label no longer switch to the monospace font (for example
the free disks line in Volumes). Code, logs and identifiers shown on their own
keep it.
## [1.79.0] - 2026-11-03
### Added
- **Appearance settings**: choose among 35 themes (or Auto, which follows your
system), an accent color, the roundness of corners and the density of the
interface in Settings. Your choices follow your account.
### Changed
- **New look built on daisyUI**: every screen now takes its colors, corner
roundness and density from the active theme, and the default primary color
is the theme's own. Buttons, forms, tables, tabs, sidebars, windows, the dock
and the launchpad all follow it. Active items, focus rings and colored text
stay readable in every theme.
- **Dialogs use the browser's native dialog**: focus stays inside and returns
to where you were, Escape closes them (except during an update or a running
operation), the page behind cannot be scrolled, and toasts still show above.
- **Menus, popovers and tooltips are no longer clipped**: they show above
windows, scrolling lists and open dialogs, fade in and out, and follow the
reduced motion setting. Tooltips appear on hover and keyboard focus only, so
they never get in the way of a tap. Tab now leaves a menu or popover and
closes it, and inputs keep the browser's own context menu.
- **Selects and pickers use native controls**: the section selector on narrow
layouts, the app store sort and the alerts source filter are the browser's
own select, and the group and user picker is a searchable list driven with
the arrow keys. Its search ignores accents.
- **Charts and the code editor follow the theme**, including chart tooltips.
- **Storage and sharing dialogs are translated**: the logical volume and RAID
screens, the format wizard and the share link dialog no longer show English
in a French interface.
## [1.78.4] - 2026-11-02
### Fixed
- **Rolling back an update works again**: v1.78.3 was never published because
rolling back from it left the previous version unable to start. File and
app jobs still run side by side, now without changing anything that
outlives the update. This release ships everything listed under v1.78.3.
## [1.78.3] - 2026-11-02
### Added
- **Audit log retention**: entries older than a year are removed. Set
`retention_days` under `[audit]` in the new `/etc/hsi/hsi.toml` to keep
them longer, shorter, or forever (`0`).
### Changed
- **Lighter lists**: the users, apps and connections lists render either as
cards (phone) or as a table, no longer both with one hidden, and the users
list works out each person's groups once instead of on every row.
- **Faster app actions**: starting, restarting or pinning an app reads only
that app's file instead of every app's.
- **Steadier live usage, quieter background tabs**: the dashboard widgets and
Monitoring share one live usage feed, so their CPU and network figures no
longer disturb each other, and a hidden tab stops refreshing usage,
notifications and alerts until it is shown again.
### Fixed
- **A long copy no longer delays an app**: file jobs (copies, moves,
archives) and app jobs (start, stop, update) run side by side, and a job
that takes long is no longer run a second time.
- **Container logs**: at most 16 log views stream at once, and reopening a
log view no longer stops the new stream.
- **A dying disk no longer freezes storage pages**: disk and mount queries
on the host (lsblk, blkid, findmnt, smartctl, mdadm) give up after a minute
instead of hanging, which could leave a storage page loading forever.
## [1.78.2] - 2026-10-31
### Fixed
- **A replaced RAID disk no longer breaks the array at boot**: removing a disk
from an array now erases its RAID signature. Before, the old disk could be
taken for a member at the next boot and keep the array from starting.
## [1.78.1] - 2026-10-30
### Fixed
- **Release checks**: v1.78.0 was never published because its install tests
still created accounts through an endpoint that version removed. This
release ships the same changes as v1.78.0.
## [1.78.0] - 2026-10-30
### Changed
- **Faster first load**: the sign-in page no longer downloads the whole
dashboard, and the French translation, the upload hasher and the compose
file parser load only when they are needed. The main bundle is about four
times smaller.
- **Faster history and audit log**: the metrics history and the audit log are
indexed by date, so the minute-by-minute cleanup of old metrics and the
audit log pages no longer scan the whole table as they grow.
### Removed
- **Unused code**: an unused dev sudo script, the former data migration
scripts (replaced by the update cutover), and functions, components and
translations nothing used anymore in the dashboard and the worker.
- **Old direct storage, app, user and sharing endpoints**: the API entry
points the dashboard stopped using when changes moved to preview and confirm
are gone, so formatting a disk, creating an array or an account always goes
through a preview first.
## [1.77.1] - 2026-10-30
### Security
- **File operations run as the right user only**: a file action done on
behalf of a user no longer changes the identity of other operations running
at the same time, such as a storage change running as root.
- **Signing out revokes the session**: the token is invalidated on the server
and the page fully reloads, so the next person on the same browser no longer
sees the previous session's notifications, alerts or uploads.
## [1.77.0] - 2026-10-30
### Added
- **AI assistants manage Places**: an administrator's assistant, built-in or
over MCP, can create a Place (with its folder if needed), rename it or remove
it, each time once approved. A Place never overlaps another, and removing one
keeps its folder and files.
### Changed
- **The assistant keeps working when you leave**: its turns run on the
server. Leaving the chat or closing the page no longer stops it, coming back
follows it where it is, and it goes on by itself once a request is approved
or rejected, in the chat or in the requests panel. Stop is the only way to
end a turn early.
### Fixed
- **Confirmations answered "no" even when confirmed**: deleting an assistant
conversation, revoking an access token, deleting a notification connector or
rule, and every other step that asks "are you sure?" did nothing after the
confirm button. The dialog closed itself before the choice was recorded.
- **A new Place's folder belonged to root**: a Place created in Settings, for
an app or from the App Store kept its folder owned by root:root until someone
was given write access to it, so nobody could write in it. Its folder now
joins the share group at once (setgid, group-writable), like every other
Place. A Place made with a volume keeps the access chosen for the volume.
- **Power cut while restoring a configuration, again**: the storage
descriptions, app definitions, maintenance settings, backup and HTTPS
settings are now replaced in one step, and the copy kept before the restore
no longer takes the file away first. A cut at the wrong moment could leave a
storage description unreadable, or no HTTPS settings at all.
## [1.76.0] - 2026-10-30
### Added
- **The built-in assistant**: a new Assistant app is a chat with an AI that
looks after the NAS, with the same tools as MCP assistants, as the account
that chats. An administrator picks the AI provider in Settings > AI access:
OpenRouter, OpenAI, Anthropic, Mistral AI, a local Ollama or any
OpenAI-compatible service, with its API key (encrypted on the server) and
model, who may use it, a read-only mode and a daily limit of tokens per
account. The assistant loads only the tools a question needs, which keeps
each call small. Deletions and changes to storage, apps, accounts
or shares wait for approval right in the chat, and the conversation goes on
once they are decided. Its actions are marked as the built-in assistant's in
the audit log.
- **Places closed to AI assistants**: an administrator can pick Places that no
AI assistant, built-in or over MCP, may list, read or change, whatever the
account's rights. Their files never reach an AI provider.
## [1.75.0] - 2026-10-30
### Added
- **AI assistants over MCP**: HSI is now an MCP server (`/mcp`), so Claude or
another MCP client can browse files and check apps, storage, accounts,
backups and the audit log in plain language, as the account that made its
access token. Tokens are made in Settings > AI access, read-only by default,
limited by scope and expiry, shown once and revoked at once; they never go
beyond the account's rights and work nowhere else than `/mcp`. What an
assistant does or reads is in the audit log, which can show only the AI
assistants' actions. See "Connect an AI assistant" in the documentation
(#138).
- **Changes by AI assistants, with your approval**: an assistant can make
folders and new files, rename, move and copy (never overwriting), and start,
stop or restart apps. Deleting files, replacing a file, and every storage,
app, account, share, access or update change wait for you: the assistant
previews the plan, and a card in the dashboard shows each request with its
steps and what it erases until you approve or reject it. Exactly the
previewed plan runs, as your account; a plan that went stale is refused.
An assistant can never approve its own requests (#138).
### Fixed
- **Power cut right after HSI writes its settings**: HTTPS settings and
certificates, mount and RAID configuration, backup settings and storage
descriptions now reach the disk before HSI moves on. A power cut a few
seconds after the first start could lose the HTTPS settings, and HSI then
came back on plain HTTP.
- **Power cut while restoring a configuration**: the restored database
replaces the current one in a single step, once it is on disk. A power cut
at the wrong moment could leave no database at all.
- **Restoring a configuration right after HSI starts**: a restore begun in
the first seconds after a start could fail with "Incorrect password or
corrupted backup", as HSI was clearing what an earlier run left behind.
## [1.74.0] - 2026-10-29
### Added
- **An app's address at install**: the App Store install can record where
the app's web port is reached behind your own reverse proxy or tunnel, with
HTTPS or not, so Open goes there from the start. HSI does not set up the
proxy (#26).
- **Sort the App Store**: installed first, by name, or the latest added
first. Apps that joined the catalog in the last 60 days are marked New,
never ranked by popularity (#26).
- **More about each App Store app**: its page shows the license, links to
the documentation and the source code, and its first steps (first sign-in,
where to put files, what to set up first, such as a reverse proxy with
HTTPS for Vaultwarden).
After an install, the App Store shows that page (#26).
- **Choose what happens to an app's data when deleting it**: the deletion
preview names the Docker volumes it keeps (databases, caches) and the
folders that stay in their Places. A new option also deletes the Docker
volumes, and the preview then shows them as erased. Folders in Places are
never deleted (#26).
### Fixed
- **Installing and updating with a noexec /tmp**: the installer, which also
applies updates from the dashboard, now prepares the release under
`/var/lib/hsi` instead of `/tmp`, so it no longer stops with "Release
archive is incomplete" on servers where `/tmp` is mounted `noexec`.
- **Power cut right after installing or updating**: the installer now
writes its secrets, credentials and services to disk before starting HSI.
A power cut within half a minute of an install could leave them empty, and
the next update then failed ("NATS_BACKEND_PASS: unbound variable") or HSI
did not start. An installer run on a server already in that state
regenerates the lost NATS credentials and sign-in secret.
- **Uploading to a full volume**: the file manager now says the volume is out
of space instead of showing a server error, and the upload can go on once
there is room. A refused write for lack of permission is reported as such
too.
- **Write access to shared folders**: one HSI account without a Linux account
(removed by hand, for example) no longer takes write access away from every
other account in the file manager and over SMB.
- **Shares after restoring a configuration**: the restored shares and folder
access are written out when HSI restarts, instead of only after the next
change to a share or a permission (#1).
- **Expanding a volume in use**: the preview no longer goes stale at once with
"The server changed since this preview" when the volume's array is being
written to (#7).
## [1.73.0] - 2026-10-29
### Added
- **Maintenance screen**: while an update, an HSI restart or a server reboot
runs, every open dashboard, for every user and also after a reload, is
covered by a full-screen screen with the steps in large text, until the
server is back. Meanwhile the server refuses changes (signing in and out
stays open). After an update, admins see the result before the page
reloads; a failed or rolled back update stays on screen (#132).
- **Confirmation before deleting files**: the file manager asks before
deleting files or folders, since deletion is permanent. The dialog offers
"Don't ask again", and the confirmation can be turned back on in the
profile; the choice follows the account (#134).
### Fixed
- **Volumes inside a container**: the storage pages no longer fail with
"Cannot read properties of null (reading 'map')" on a server without LVM,
such as an LXC container (#133).
## [1.72.0] - 2026-10-29
### Added
- **French interface**: the dashboard is available in English and French.
The language follows the browser at first, is chosen in the profile, and
follows the account to every device. Translations live in
`apps/dashboard/src/i18n/locales`; a missing French text shows in English.
The App Store descriptions and messages coming from the server are still in
English.
- **Network settings** (Settings > Network): IPv4 addressing (DHCP or manual
address and gateway) and DNS servers of each interface, through
NetworkManager. A change is applied under a NetworkManager checkpoint: it
has to be kept within two minutes, from the new address when it moved, or
NetworkManager puts the previous settings back by itself, even if the
dashboard can no longer be reached. Inside a container (such as LXC) the
page explains that the container host sets the network.
- **App Store apps with several containers**: a catalog app can run a
database or a cache beside it, installed and removed with it, with shared
generated passwords. The store page lists what an app installs with, and
the app's own settings stay editable in the forms. Two new apps use it:
**Paperless-ngx** (with Redis) and **Nextcloud** (with MariaDB).
- **Telemetry in Settings**: Settings > Telemetry shows whether the daily
anonymous heartbeat is sent, lets an administrator turn it off, and shows
the exact data sent, including the installation ID to quote for a deletion
request. `HSI_TELEMETRY_ENABLED=false` still turns it off for good.
### Changed
- **Telemetry release channel**: heartbeats report their channel (`stable`,
`beta` or `dev`, overridable with `HSI_TELEMETRY_CHANNEL`), so development
runs no longer count in the statistics. The first heartbeat after a start
waits a random delay of up to an hour.
## [1.71.0] - 2026-10-28
### Added
- **Place icons**: an administrator can give each place an emoji in
Settings > Places (a few suggestions, or any emoji). It replaces the folder
icon in the file manager, the permissions list and the place properties.
- A file or folder named `nyan` looks a little different in the file manager.
### Changed
- **Dashboard sidebars and remaining controls on shadcn-vue**: the section
menus of Settings, Storage, Monitor and Sharing and the places list of the
file manager use the shadcn-vue sidebar. Breadcrumbs, avatars, notices,
progress bars, dividers and the file selection boxes use the matching
components too.
- **File icons by type**: the file manager shows a distinct icon for images,
videos, audio, archives, disk images, spreadsheets, presentations, code,
configuration, scripts, keys, fonts and documents.
## [1.70.0] - 2026-10-28
### Changed
- **Dashboard fully on shadcn-vue**: the last hand-made controls move to the
shared components. Icon buttons show a styled tooltip instead of the
browser's, disk filters and store categories are toggles, lists of disks,
volumes, snapshots and search results use one item style, the panels and
cards use the card component, usage bars use the progress component, and the
container logs open in a regular dialog (Escape, focus and the desktop window
mode behave like every other dialog).
## [1.69.0] - 2026-10-28
### Changed
- **Dashboard on shadcn-vue**: the whole dashboard interface moves to
shadcn-vue components (Reka UI, Tailwind CSS v4) and Lucide icons, in one
release. Buttons, fields, selects, checkboxes, radios, switches, tabs,
tables, badges, dialogs, menus, context menus, popovers, tooltips and toasts
now share one look and one keyboard behavior: `Escape` and outside clicks
close only the topmost layer, and focus returns to what opened it. The
sidebar, the desktop (windowed) mode, the light and dark themes and the
accent color picker are kept; a dialog opened in a desktop window still only
blocks that window.
### Fixed
- **Update refused with "unrecognized SQLite schema"**: installations that went
through v1.35.0 still carry the old names of a few constraints and indexes
from the Role to Group rename. The update check now reads them as the
current names, so these installations update like any other.
## [1.68.2] - 2026-10-28
### Security
- **Dependencies**: zod 4.6.7, where validating an oversized list or set with
size limits no longer exhausts memory (high severity, in the backend, the
Compose and catalog packages and the release runtime).
### Changed
- **Dependencies**: bcryptjs 3 and @fastify/rate-limit 11 (#110). New
password hashes use the `$2b$` prefix; existing hashes still verify.
- **Dependencies**: the backend moves from the deprecated `nats` package to
`@nats-io/transport-node` and `@nats-io/jetstream` (#109).
- **Dependencies**: vue-router 5 in the dashboard (#108).
- **Dependencies**: zod 4 (#106). Validation messages written for HSI are
unchanged; the generic ones (wrong type, too short, invalid pattern) use the
zod 4 wording.
- **Dependencies**: tRPC 11 (#105). tRPC 11 reserves the name `apply`, so the
API procedures that run a previewed plan are renamed `execute`
(`storage.execute`, `apps.execute`, `sharing.execute`, `user.execute`,
`container.app.execute`, `update.execute`). Audit log entries recorded under
the former names keep their labels.
- **Dependencies**: TypeScript 6, vite 8, vite-node 6 and @vue/tsconfig 0.9
for the build and tests (#107).
### Fixed
- **Update to 1.68.1 refused or rolled back**: the 1.68.1 installer refused
its own archive because it still required the Prisma query engine, which
Prisma 7 no longer has. Past that check, the 1.68.1 server stopped at
startup because the SQLite driver had been bundled into it. Both are fixed,
and the build smoke test now runs a database query.
## [1.68.1] - 2026-10-28
### Changed
- **Versioned database migrations** (#9b, #104): the database moves to Prisma 7
and to versioned migrations, starting from a v1.68.0 baseline. An update from
any earlier published release first checks the database fingerprint,
integrity and migration ledger, then converts it with a versioned SQL
conversion and runs `prisma migrate deploy`. The database, its WAL, the
configuration and the Compose files of apps are part of the update snapshot,
so a failure at any step, including the health check, restores the previous
release with its data. An unknown or partially migrated database stops the
update with a diagnostic and its fingerprint instead of being modified. See
`docs/migrations.md`.
### Added
- **Skipped app settings after an update**: when an old app has unreadable
settings or a volume pointing to a deleted place, the update converts the
rest of the app, ends as partial, and Settings lists each skipped setting or
volume with the fix to apply in its Compose file.
### Fixed
- An interrupted first install that left an empty `hsi.db` no longer blocks
the next install.
## [1.68.0] - 2026-10-23
### Security
- **Dependencies**: vite 7.3.7 (development server fixes, including
launch-editor command execution) and klauspost/compress 1.20.3 in the root
worker (out-of-bounds write in s2). Other dependencies updated within their
current major versions, and the CI actions moved to their Node 24 releases.
## [1.67.0] - 2026-10-23
### Security
- **Signed releases** (#9a): every release ships `SHA256SUMS` and
`SHA256SUMS.sig` (ed25519). The installer and the worker verify the signature
and the checksums of the archive before running anything from it. The update
path no longer fetches anything from `main`. During an update root never runs
code owned by the app user or follows links it owns, and the log directory
is root-owned. Releases or a `current` link the app user could have
created before this version are moved aside instead of trusted, the worker
reads the dashboard's update request itself, and `/health` reports the
version and the database only to local callers.
### Added
- **Safe updates** (#9a): versions install side by side under
`/opt/hsi/releases/<version>/` and `/opt/hsi/current` switches between them.
An update takes a database and configuration snapshot, then waits for the
health of the new version (server and worker) and rolls back automatically
when it does not come up. `sudo hsi-worker update rollback` goes back to the
previous version by hand, and the result of the last update shows in Settings.
Running the installer again on the installed version reinstalls it in
place, without a snapshot. A rollback run by hand is shown as such and
raises no alert. Every refused, failed or rolled-back update is notified
once, as soon as it happens. A version that failed and was rolled back is
removed, and only the two newest previous versions are kept. Known limitation: a first update from a version before this one that is
interrupted before the switch boots the old version, and only the next
installer run rolls back.
## [1.66.0] - 2026-10-22
### Added
- **Versioned backups** (#15): backup plans can now keep history with restic
(downloaded by the installer from the official release at a pinned,
checksum-verified version) in a local folder, over SFTP, on S3-compatible
storage or on a restic REST server. Each plan has its retention, can stop
chosen apps during the snapshot, and runs from its own systemd timer, so
backups run even when the HSI server is down. Repositories are encrypted
with a generated password shown once, and checked for corruption on a
schedule. A file or folder can be restored from any snapshot, to a new
folder by default. Existing rsync plans move to the same page and timers;
one that cannot move is listed until dismissed. A stopped run starts its
apps again and is recorded as interrupted, and a local repository is handed
to restic as a held folder that no symbolic link can redirect.
## [1.65.0] - 2026-10-20
### Security
- **No default account**: new installations no longer create `admin / admin`.
The setup link is a one-time secret only root can read, deleted once the
administrator exists. Existing installations keep their accounts.
### Added
- **Secure access (HTTPS)** (#12): new installations serve HSI over HTTPS on
their port with a local certificate authority created by HSI (its
fingerprint is printed by the installer; download it from Settings > Secure
access to trust it), renewed automatically. Settings > Secure access also
imports a certificate (with expiry reminders), sets a reverse proxy mode
with trusted proxies, and serves ports 443 and 80. Plain HTTP on the HSI
port redirects to HTTPS. Existing installations keep how they are reached
until HTTPS is turned on; nginx is no longer installed or configured for new
installations. `sudo hsi-worker tls reset` restores access.
- **App Store details**: each app opens a page with its full description,
website, release notes, version and what the install asks for (ports,
folders, settings); an installed app shows its version there with Open,
Update and Roll back. Filters for installed apps and updates join the
categories, each with its count; installed apps come first and the search
also looks at descriptions. Cards keep a single action.
- **App updates** (#26): an App Store app whose catalog image is newer than the
one it runs shows "Update available" with a link to the release notes (and an
"Update" badge on the Apps page). The update is previewed like other app
changes: only the image line changes, the previous `compose.yaml` is kept,
and "Roll back" puts the previous image back and starts the app. Uptime Kuma
moves to 1.23.16.
- **Full configuration backup** (#1): a configuration backup now also holds the
Linux account and group ids, each app's definition, the volume descriptions,
the disk check schedule and the key of the notification secrets. Restoring
shows a preview first (contents, warnings) and is blocked while an account id
conflicts with the server, with the command to solve it. Accounts come back
with their ids, apps stopped, volumes as descriptions to Reapply; Samba
passwords must be set again. Older backups (database only) still restore.
- **Restore from the setup assistant** (#1, #12): on a new installation, the
setup link offers "Restore a backup" next to creating the administrator, to
rebuild a server from its configuration backup and sign in with its accounts.
A backup without an administrator is refused.
- **First-run setup assistant** (#12): a new installation prints a one-time
link that opens a setup assistant: create the administrator, name the server
and set its time zone (previewed like other system changes), then links to a
first volume, shares, alerts and backup restore. A reload or a reboot resumes
where it stopped; `sudo hsi-worker setup-token` prints a new link.
- **App Store installs** (#26): a secret setting (such as Vaultwarden's admin
token) can be generated with a strong random value and shown to be noted;
a host port already in use comes with a free port to switch to in one click.
- **SmallTV notifications** (#75): a "SmallTV (smalltv-mod)" webhook preset
shows alerts on a GeekMagic SmallTV desk screen running smalltv-mod. Only the
screen's address is needed; critical alerts show as alert, cleared ones as
done. A new `{{event.smalltvType}}` template variable carries that type.
## [1.64.2] - 2026-10-06
### Changed
- **Clearer navigation**: Settings > Alerts is now Alert thresholds (the active
alerts are in Monitor > Alerts), and Monitor's Overview is now Summary, so it
is no longer confused with the dashboard's Overview.
- **Dashboard consistency** (#90): every form field has the same look (the
backup passwords had no border); errors read the same way everywhere and
are no longer shown in the accent colour; confirmations use the in-app
dialog; dates use one format; button labels and page titles follow the same
rules; the container logs close with Escape.
- **App in the URL**: the open app is in the address (`?app=storage`), so a
reload or a link opens it again and the browser's back button returns to
the previous app.
### Fixed
- **App Store**: no "0 apps" while the catalog loads.
- **Recent activity**: every action has a readable label (some showed their
internal name, such as "update apply").
## [1.64.1] - 2026-10-06
### Security
- **Dependencies**: fastify 5.12.5 (HTTP/2 trailer denial of service), Vue 3.5.43
(server-renderer XSS), and the transitive fast-uri 3.1.8, brace-expansion
5.0.12, source-map-js 1.2.2 and postcss-selector-parser 7.1.6 (CPU and
event-loop denial of service).
- **Root worker**: zip entries are checked with `filepath.IsLocal` before
extraction, file diffs shown in plans are capped in size, and user and group
IDs are bounded before they are used to switch identity.
## [1.64.0] - 2026-10-06
### Added
- **Storage descriptions**: each volume HSI manages is described in
`/etc/hsi/storage/<volume>.yaml` (disks by serial and by-id path, array, LVM,
filesystem, mount), readable without HSI. The volume page shows when the
server no longer matches it, with Reapply (reassemble, activate, restore fstab
and mdadm.conf, mount; never formats) and Accept current state, and a warning
alert is raised. `hsi-worker storage diff` prints the differences.
- **Documentation site**: the documentation is published at
https://kittyruntime.github.io/home-server-interface/ (Astro Starlight), with
an install guide, a page per feature area, Manage without HSI, the
configuration reference and the developer pages.
- **Expand a volume**: from a volume's page (Expand...), grow it in place
without reformatting: into the free space of its volume group, with a disk
added to its RAID 5/6 array or to a volume without redundancy, or into the
larger disks of its mirror. A RAID reshape takes hours: the volume stays
usable and HSI grows LVM and the filesystem (ext4, XFS, btrfs) when it ends,
then sends a notification with the new size. Rewriting an array asks to
confirm that a backup exists.
- **SMART self-test results on Maintenance**: each disk's scheduled or manual
self-test shows as Running (with what is left), then Passed or Failed, on
the Maintenance page instead of only "Started".
- **Found storage on Volumes**: when the disks carry arrays or volume groups
that are not running (moved from another machine, or after a reinstall),
the Volumes page says so and links to the import.
### Fixed
- **Import existing arrays**: when more disks carry an array than it has
(a cloned disk next to its original), it is not offered for assembly; the
page names the disks and asks to disconnect the copy.
- **Scheduled disk checks**: a check whose time slot was missed (server off,
asleep) runs at the next hourly tick instead of a week or a month later; a
check that could not start because an array was rebuilding is retried every
hour, and the page shows why it did not run while keeping the last results;
disks that cannot run SMART self-tests are listed as skipped, not as errors.
- **Import existing arrays**: assembling an array found on the disks failed
("not identified in config file"); its members are now named explicitly,
and HSI picks a name no other array uses, including names kept in
mdadm.conf.
- **Mount**: a logical volume can be mounted from the Volumes page (its device
was looked up under the wrong path), and mounting on a folder where another
volume is already mounted is refused instead of hiding that volume.
- **Arrays**: while an array rebuilds, the disk it rebuilds onto shows as
Rebuilding instead of Active (with a "Mark as failed" button), and the
Volumes page does not count it as missing. An array that carries an LVM
volume group shows that group instead of "not mounted".
- **Remove volume**: the filesystem signature of the volume and the LVM label
inside its array are erased too, so a partition later created on a freed
disk no longer shows the removed volume again.
## [1.63.0] - 2026-10-02
### Added
- **Remove volume**: from a volume's page (Overview > Remove this volume), one
plan stops sharing its Places, unmounts it, removes it from fstab, deletes
its logical volume, and its volume group and RAID array when they serve only
this volume, then erases the disks so they show as free again. The review
names the erased disks and the deleted Places; Remove stays disabled until
the volume name is typed. A volume an app stores data on cannot be removed.
### Fixed
- **RAID arrays**: the mdadm.conf line of a new RAID 5 or 6 no longer records
the disk it was still building onto as a spare, which made the mdadm
monitor report a missing spare once the build ended.
- **Create volume wizard**: when the server refuses the creation as it starts
(a disk in use, a system disk), the wizard shows the reason instead of
saying the creation may still be running.
## [1.62.1] - 2026-10-02
### Fixed
- **Volumes**: a new RAID 5 or 6 that is still building its parity shows as
rebuilding, not as missing a disk.
- **Create volume wizard**: after creating a volume, the breadcrumb goes from
Volumes straight to the new volume; the redundancy step only names the
levels that need more disks.
## [1.62.0] - 2026-10-01
### Added
- **Create volume wizard**: from free disks to a ready-to-use volume in one
flow (Storage > Volumes > Create volume): choose the disks, the redundancy
(mirror, RAID 5, 6, 10, or none), the LVM layout, the filesystem label and
the folder, who owns it, and, for admins, a Place and an SMB share. The size,
redundancy and folder are shown as you choose; one plan lists every command
and file change, and names the erased disks, before anything runs.
### Fixed
- **App plans**: a compose file broken by hand gives a clear error at Apply or
Start; the start summary names every service image; saving an unchanged
file says so; a secret passed as a flag in a command list is masked.
- **Plans**: when a plan can no longer be applied, the dialog shows why (for
example, the name is now taken).
- **Users**: a user whose database write fails after its accounts were set up
is reported with the steps that ran; a password with a line break is refused
in the form.
- **Shares**: an unexpected worker failure is reported as a server error; the
Samba configuration lists shares in a fixed order.
## [1.61.0] - 2026-10-01
### Added
- **Disk labels**: name a physical disk ("bay 3, top") from Storage > Devices.
The label is stored by serial number, so it follows the disk when its
kernel name changes, and the search finds disks by label.
- **Volumes page**: Storage now opens on its volumes, where the data lives:
each data filesystem with its redundancy (mirror, RAID 5...), space, health
(degraded or rebuilding array, missing at boot, nearly full, SMART) and what
uses it (Places, shares, apps), plus free disks and the system disk's free
space. Unmounted volumes can be mounted from there.
- **Volume and disk pages**: each volume and each disk has its own page in
Storage, with Overview, Structure and Activity tabs: what a volume is made
of from the folder down to the disks, what uses it, a disk's identity and
SMART health, the volumes it carries, and the operations recorded on each.
- **Array and volume group pages**: each RAID array and each LVM volume group
has its own page (state, members, what it carries, operations), and every
reference in Storage links to it.
- **Stable disk names**: each disk shows its `/dev/disk/by-id` name next to the
kernel name (`/dev/sdb`), which can change between boots.
### Changed
- **Storage sections renamed**: Disks, Arrays and Volume groups (were Devices,
RAID and LVM).
- **Storage follows its window**: in desktop mode the Storage app lays out by
the width of its window, not of the screen, so a small window gets the
compact layout. Links between Storage sections open the right place (a disk
opens the device list with that disk expanded).
### Fixed
- **Storage pages**: array and volume group pages stay current and have a
Refresh button; their activity includes unmounts; a physical volume that is
not a disk or an array is no longer a dead link; an LVM read error is shown
instead of "no longer there"; a volume keeps its page when it is formatted
again; Mounts links open the device's page; SMART reads are shared between
the Disks and Volumes lists and run three at a time.
- **System disk detection**: a root filesystem on LVM (`/dev/mapper`), a
Raspberry Pi root (`/dev/root`), `/boot/firmware` and `/efi` are recognised
as the system disk.
- **Volumes**: opening Storage no longer runs the volume check that may mount a
returning volume; RAID 4 tolerates one failed disk; a resync is no longer
called a rebuild; a guarded volume that is not mounted keeps its Places.
## [1.60.0] - 2026-09-30
### Changed
- **Loading indicators**: one spinner and one loading state across the
dashboard. A loader appears only after 200 ms (no flash on fast loads),
refreshing a list keeps it on screen, busy buttons all look the same, and
every loader is announced to screen readers and respects reduced motion.
- **Typography**: one type scale across the dashboard (nothing below 11px, one
tracking for uppercase labels). Machine data (paths, devices, sizes, fields)
uses JetBrains Mono; key figures and status lines keep Space Mono. Fonts are
now bundled with HSI instead of loaded from Google Fonts, so the dashboard
renders the same without Internet access.
- **Punctuation**: interface texts, messages and documentation no longer use
em dashes; CI refuses new ones. Empty values in tables show `-`.
## [1.59.0] - 2026-09-30
### Added
- **Preview before storage operations**: formatting, partitions, RAID (including
disk replacement and importing existing arrays and volume groups), LVM and
mounts show the exact plan first (commands, fstab and mdadm.conf diffs, and
the model, serial and contents of any disk that will be erased). Applying runs
exactly that plan, or refuses if the server changed since the preview. The
executed plan is kept in the audit log.
- **Preview before app changes**: saving, applying, starting, installing and
deleting an app show the `compose.yaml` content or diff (secrets masked), the
folders and Places created, and the `docker compose` commands first.
- **Preview before share changes**: creating, editing, enabling, disabling and
removing an SMB share show the `smb.conf` diff and the smbd reload first; the
share is recorded only once that plan ran.
- **Preview before user account changes**: creating a user shows the Linux and
Samba account commands (the password is never shown), and deleting one shows
the `smb.conf` and `hsi-share` group changes.
### Changed
- **A user whose Linux account cannot be created is no longer created in HSI**
(it used to be created without the account backing its files and SMB access).
- **After an App Store install**, HSI shows the new app in Apps with its logs
instead of opening it in a new tab.
### Fixed
- **Failing the last redundant RAID member**: marking a member as failed is
refused when the array has no redundancy left (it would stop the array), and
a disk that was unplugged can now be removed from its array.
### Security
- **HSI no longer sets the password of an existing Linux account that has a
login shell** (the server owner's account, a system account). Before, anyone
allowed to create HSI users could create one with that name and replace the
account's password. HSI accounts have no login shell and are not affected; an
HSI user whose name matches a login account keeps its Linux and Samba
passwords unchanged.
## [1.58.0] - 2026-09-29
### Added
- **Missing volume protection**: a missing data disk no longer stops the boot
in emergency mode, and nothing writes to the system disk in its place (mount
points are made immutable while unmounted). HSI checks volumes every minute,
raises a `storage.volume` alert, stops the apps that use a missing volume,
makes its shares unavailable and refuses backups and file writes under it.
When the disk is back, Storage > Mounts offers Resume.
- **Email notifications**: Settings > Notifications can send alerts by email
over SMTP (STARTTLS, TLS or none; presets for Gmail and Fastmail), with a
live preview and a test send.
- **Reliable delivery**: webhook and email notifications go through a queue
stored in the database. They survive a backend restart, are retried twice,
and each connector sends at most its configured number of messages per minute
(10 by default); extra messages wait instead of being dropped. The delivery
journal shows queued, retrying, sent and failed messages.
- **Failed update alert**: if HSI is still on the old version after an update
was requested, a critical `system.update` notification is sent.
- **View logs of a failed operation**: when a file or app operation fails,
admins get a "View logs" link in the error toast and the activity menu. It
shows the backend and worker log lines of that operation.
- **Command tracing**: with `HSI_LOG_LEVEL=debug`, the worker logs every
external command it runs (`mdadm`, `parted`, `smartctl`...) with its exit
code, duration and output.
### Changed
- **One target for the whole stack**: `systemctl start|stop|restart hsi.target`
controls NATS, the worker and the server; each still works on its own.
Services are renamed `hsi-server` (was `hsi`) and `hsi-worker` (was
`hsi-root-worker`, binary included). Updates migrate existing installs
automatically, and a failed update restores the previous services.
### Fixed
- **Worker private /tmp**: the worker no longer runs with `PrivateTmp`, which
gave it a separate mount namespace.
### Security
- **Encrypted notification secrets**: webhook URLs, header values (except
`Content-Type`) and SMTP passwords are encrypted with a new `HSI_SECRETS_KEY`,
generated by the installer (also on existing installs). They are never shown
again after saving; existing connectors are encrypted on first start. Keep
this key with your configuration backups: without it, saved secrets must be
entered again.
## [1.57.0] - 2026-09-25
### Added
- **Replace a failed RAID disk**: Storage > RAID lists each member as Active,
Failed or Spare with its model and serial number, and can mark a disk as
failed, remove it and add a replacement (only free disks large enough are
offered). Rebuild progress is shown live.
- **RAID capacity in numbers**: the Create RAID wizard shows the usable size of
the selected drives, efficiency, fault tolerance and space wasted by larger
drives; each array shows usable vs raw size and how many more failures it can
take.
- **Import existing storage**: arrays found on disks but not running, and
inactive volume groups, are listed in RAID and LVM and can be assembled or
activated without formatting. A degraded array is only started after a warning.
- **Scheduled disk checks**: Storage > Maintenance schedules SMART short and
extended self-tests and RAID consistency checks. A systemd timer runs them even
when the dashboard is down; sleeping disks are not woken up and no check starts
during a rebuild. RAID mismatches raise a `storage.raid-check` alert.
- **Devices page for many disks**: summary bar, compact table (default from 5
disks) with serial, role, health and temperature, sorting, filters, search,
grouping by role, and multi-select of free disks to create a RAID or a volume
group.
- **Volume owner at mount time**: the mount dialog can make another HSI user the
owner, optionally even on a volume that already holds data (mount point only,
never recursive), and the format wizard offers "Mount now".
## [1.56.0] - 2026-09-25
### Added
- **Docker detection**: the Apps page and the App Store show a full-panel notice
when Docker is not installed, not running or missing the compose plugin, with
the exact command to fix it and a "Check again" button. Apps actions and App
Store installs are refused with the same message until Docker is usable.
- **Clear alerts**: Monitor > Alerts can clear one alert or all of them. An alert
whose condition is still true comes back at the next check.
- **Failed backup notifications**: a failed backup run (scheduled or manual)
sends a `backup.plan` event through notification rules.
- **Create a Place when mounting**: admins can create a Place for a volume from
the mount dialog, so it shows up in Files right away.
- **Clearer permission errors**: "permission denied" now says which account the
operation ran as and who owns the target folder, with its mode.
### Changed
- **One log format**: `app.log` and `root-worker.log` use the same JSON lines
(`time`, `level`, `component`, `msg`, `err`). The backend no longer writes
plain-text lines. See docs/configuration.md for a `jq` one-liner.
### Fixed
- **Deleted RAID arrays came back after a reboot**: member superblocks were
never wiped and `mdadm.conf` kept the array. Deleting an array now wipes its
members, removes its `mdadm.conf` and `/etc/fstab` entries (including lines
written by earlier versions) and refreshes the initramfs. Arrays deleted with
an earlier version reappear after a reboot: delete them again to clean them up.
## [1.55.1] - 2026-09-25
### Fixed
- **Red badges on Alerts and Storage that never went away**: disks without SMART
support (virtio, many USB bridges) kept the false "SMART failed" alert raised
by older versions. Such disks are now counted as checked, so the stale alert is
cleared on the next sampler run; disks in standby are still left alone.
## [1.55.0] - 2026-09-25
### Added
- **Freshly mounted volumes are writable**: the mount dialog asks for access.
The default makes a new, empty volume owned by the user who mounts it and by
the `hsi-share` group (mode 2775), so files can be created from the file
manager right away. Volumes that already hold data are never changed.
- **Missing host tools are explained**: the Storage app lists features that are
unavailable because a package is missing (mdadm, smartmontools, lvm2…), with
the exact `apt install` command, and disables Create RAID / Create VG instead
of failing when the action runs.
- **Installer checks host packages**: every install and update checks the
required packages (storage tools included) and installs missing ones with
`apt-get`; `SKIP_DEPS_INSTALL=1` only checks. Missing optional packages
(Docker, Samba, nginx) are reported. The installer no longer needs `sudo`
itself (it uses `runuser`).
- **Worker logs**: the root worker writes structured JSON logs with a job ID
shared with the backend, logs every job outcome and failed request, and
honours `HSI_LOG_LEVEL` in `/etc/hsi/worker.env`.
### Changed
- **Failed jobs are no longer retried**: a failed file or app operation used to
be redelivered up to three times; it now reports one failure.
- **RAID and LVM members are read-only in the UI**: a disk or partition used by
an array or volume group (including inactive ones) only offers the SMART
check. The worker now reports what each device is used for, and the RAID/LVM
pickers only offer free devices.
### Fixed
- **No feedback on operations (v1.54.0)**: progress and errors of file-manager
and other operations were no longer shown anywhere. They are listed in the
bell menu again, and failures raise an error toast.
- **App Store installs failing with `mkdir /opt/containers/<app>`**: the backend
sandbox could not write to `/opt/containers`.
- **Migrated apps could not be started, stopped or deleted** (`refers to
undefined volume`): named volumes are now declared in `compose.yaml`, keeping
the exact Docker volume so data is preserved. Existing files are repaired on
update.
- **Data safety for RAID/LVM**: creating an array or a PV now refuses devices
that are members, mounted, hold a filesystem, or are disks with partitions
(`mdadm --run` and `pvcreate -f` skipped their own prompts). Partitioning and
mounting a member are refused too.
- **Empty RAID errors**: command failures always carry a message (for example
when `mdadm` is not installed).
- **`/etc/mdadm/mdadm.conf` overwritten**: only the created array's line is
added (and removed when the array is stopped); the initramfs is refreshed so
arrays keep their name at boot.
- **`/etc/fstab` handling**: write errors are reported, entries written by HSI
are marked and no longer duplicated, and unmounting never removes an entry
for another device.
- **Disks without SMART support shown as FAILED** (virtio, many USB bridges):
health is now passed, failed or unknown, and only an explicit failure raises
an alert. Disks whose self-test log has errors are no longer hidden as
"SMART unavailable".
- **Update check failing with EACCES on fresh installs**: the result is stored in
the app-owned data directory.
- **Configuration restore failing when `/tmp` is a separate filesystem**.
- **Switch knobs overflowing their track** in Profile and Notifications.
## [1.54.0] - 2026-09-25
### Added
- **Notifications (feedback #12)**: central notification engine. Alert raises and
clears (including severity changes) flow to rules; each rule filters by source
prefix and minimum severity and targets connectors. Native in-app connector
(bell menu, persistent, all users, unread badge) and a generic webhook
connector with editable `{{vars}}` JSON payload templates, prefilled presets
(Discord, Slack, ntfy), live backend-rendered preview and one-click test send.
A default rule ("All alerts" to the bell) is seeded on first boot.
On upgrade, existing alerts default to warning severity, and the first
sampler tick after updating may re-raise alerts whose true severity differs
(one-time, by design).
## [1.53.1] - 2026-09-25
### Fixed
- **Updates failing with a 502 storm (v1.53.0)**: the release archive did not
ship the compose package, so the 2026-09-23 compose data migration aborted
with `Cannot find package '@app/compose'` on every update. The failed apply
also left the pending-update marker in place, so systemd's path unit
re-ran the (failing) installer every few seconds, bouncing the backend and
causing intermittent 502s. The archive now ships `packages/compose`, the
install creates the `@app/compose` workspace link, `yaml`/`zod` are bundled
into the runtime dependencies, and a failed apply clears the marker instead
of looping.
## [1.53.0] - 2026-09-25
### Added
- **Declarative container apps**: container apps are now Docker Compose projects
in `/opt/containers/<name>/compose.yaml`: the file is the source of truth,
HSI re-reads manual edits (drift + unmanaged-field detection, nothing silently
dropped), and applying is an explicit, validated step. Existing apps are
migrated to compose files on update (zero downtime; each stack is adopted on
its first Apply). Apps keep working with `docker compose` even when HSI is off.
- **User identity status**: a user's edit panel now shows a dedicated Identity
section: HSI identity, real Linux account state (exists / uid / gid / groups,
read from the OS, not assumed from the database), and Samba account state. Flags
the common mismatches (no Linux account yet, Samba enabled but not synced,
Samba disabled but an account still exists) with a plain-language explanation.
- **Samba identity toggle**: each user can now opt out of having a Samba account
synced at all (`sambaEnabled`, default on, no behavior change for existing
accounts). Turning it off stops future password syncs from touching Samba; it
does not delete an account that already exists (see docs/manage-without-hsi.md
for the manual `smbpasswd -x` command). Re-enabling syncs on the user's next
login or password change, same as any first-time account backfill.
### Changed
- **Alerts reorganized**: the dedicated Alerts app is gone. Active alerts are
now listed in Monitor > Alerts (with the source filter and severity dots);
threshold configuration lives in Settings > System > Alerts. The alert badge
moved to the Monitor sidebar/dock icon, and the Settings navigation is
reorganized into four labelled groups (Account, Access control, System,
Backups).
- **Root worker slimmed (compose-only Docker ops)**: `docker.go` no longer
builds privileged container definitions; it only executes `docker compose`
commands against the generated files (up/stop/restart/down + validate).
Networks and volumes live inside each app's compose file; the standalone
Networks/Volumes panels and their DB registries are gone (shared networks via
`external: true`).
- New root-worker capability `root.linux.user.info`: read-only batch lookup of
real Linux (`uid`/`gid`/groups) and Samba account state for a set of usernames.
Reuses the same `pdbedit -L` parsing already used by the sharing diagnostics,
now shared instead of duplicated.
## [1.52.0] - 2026-09-05
### Added
- **Update pre-flight checks**: before installing an update, HSI now runs five
checks: free disk space on the install partition (fails under 500 MB), HSI
systemd services active, no update already pending, current version known, and
release info fetched. The Updates screen lists each check with its status and
blocks the Install button when a check fails (warnings are non-blocking).
## [1.51.0] - 2026-09-05
### Changed
- **Backend router split**: disk, partition, RAID, LVM, mount and SMART procedures
moved from the `system` tRPC router to a dedicated `storage` router
(`trpc.storage.*`); `system` now only carries metrics, metrics history and static
system info. The audit log records new storage actions under their `storage.*`
path; entries logged before this change keep their historical `system.*` action
string and still render with the same labels in the UI.
- **Storage is now a self-contained sub-application**: its data layer
(`store.ts`/`smart.ts`) lives inside `components/storage/`, and the Disks tab
became **Devices**, a physical-first tree where each disk shows its partitions,
their role (filesystem, RAID member or LVM PV with cross-navigation), and the
logical volumes nested under their PV, mirroring the real hardware hierarchy.
RAID arrays display their member devices under the header.
- **Alerts are a first-class app**: the storage alerts tab moved to a dedicated
top-level Alerts app listing alerts from all sources (with a source filter),
alongside the disk-usage threshold configuration.
### Security
- Bumped `fastify` to 5.12.3 (was 5.10.0), resolving 6 Dependabot alerts (4 high,
2 moderate): a schema-validation bypass, X-Forwarded-* spoofing under
`trustProxy` hop-count, and three `fast-uri` host-confusion/SSRF advisories in
fastify's own dependency chain (`@fastify/ajv-compiler` / `fast-json-stringify`
→ `ajv` → `fast-uri`, now resolving to the patched 3.1.7). Also pinned
`fast-uri` via `pnpm.overrides`, same pattern as the existing `deepmerge-ts`/
`nanoid` pins, so a future dependency shuffle can't silently reintroduce an
older copy. `pnpm audit --prod`, backend typecheck/tests/build, and the boot
smoke test are all clean against the bumped version.
## [1.50.3] - 2026-08-21
### Security
- Bumped `deepmerge-ts` (pulled in transitively by Prisma's config loader, in both the main
lockfile and the release runtime's) to 8.0.1 and `nanoid` (via Tailwind's PostCSS pipeline)
to 3.3.18, resolving three Dependabot alerts (stack exhaustion on recursive merges;
indefinite loop on a zero-size custom generator). Neither package ever saw untrusted input
in how this project uses them, but both are pinned via `pnpm.overrides` /
`runtime/package.json` `overrides` now regardless.
## [1.50.2] - 2026-08-20
### Changed
- **File browser toolbar**: "New folder" and "New file" are now a single "New" menu, and the
always-open search field collapses to an icon until clicked; both free up room for the
breadcrumb in a narrow window or on a phone.
- **File list view on phones**: the file table now switches to a card layout below the `sm`
breakpoint instead of squeezing (or horizontally scrolling) a 4-column table, the same
treatment every other table in the app already had.
### Fixed
- **Illegible file name on hover**: the grid view's hover state set file names to hardcoded
white text instead of a theme token, making them unreadable in light theme.
## [1.50.1] - 2026-08-20
### Fixed
- **Broken update trigger**: `install.sh` locks `INSTALL_DIR` itself down to root ownership,
but the unprivileged backend wrote the pending-update marker directly into it, failing with
`EACCES: permission denied, open '.../.pending-update'` whenever an admin applied an update
from the dashboard. The marker now lives in `database/data`, the one directory install.sh
guarantees the app user owns: the update-apply systemd path unit and service, and the
legacy-migration stale-marker cleanup, were updated to match.
## [1.50.0] - 2026-08-20
### Added
- **RAID level diagrams**: the "create RAID" wizard now shows a small block-distribution
diagram for each level (striping, mirroring, parity, mirror+stripe) alongside its
description, with a hint explaining how to read it.
- **"How LVM works" guide**: a dismissible card on the LVM screen walks through the
Disks → Volume Group → Logical Volumes flow and explains when LVM is worth the extra
layer versus formatting a disk directly.
### Fixed
- **French string in the LVM screen**: "Physical volumes, volume groups **et** logical
volumes" leaked untranslated English-only copy. Corrected to "and".
- **Hint tooltip popping open unprompted**: when a hint was the first focusable element in
a dialog, the dialog's initial focus trap opened its tooltip immediately; it now only
reacts to real keyboard focus, and opens downward instead of upward so it can no longer
be clipped by a panel's rounded corners.
- **RAID level picker overflow**: on narrow layouts, the level cards could overflow their
container horizontally.
## [1.49.0] - 2026-08-20
### Added
- **Getting started guidance**: a dismissible card on the Dashboard overview walks new admins
through adding a Place, installing an app and setting up a backup plan, linking straight to
each screen.
- **Docker Networks and Volumes management**: previously-built screens for creating and removing
Docker networks and volumes are now reachable from Apps, alongside Containers.
- **Inline contextual help**: a reusable, keyboard-accessible hint control explains non-obvious
fields (e.g. Docker network driver, volume type) without cluttering the layout.
### Changed
- **Actionable empty states**: networks, volumes, the audit log, users and groups now offer a
direct next step (create, clear filter, clear search) instead of a dead end. The empty-folder
state in the file browser now points at Upload and New folder.
- **Reorganized Settings navigation**: the flat admin section list is now grouped under labeled
headings (Access control, System, Backups) instead of one undifferentiated block.
### Fixed
- **Local dev server routing**: the Vite dev proxy rule for public share links (`/s`) matched by
string prefix and unintentionally also intercepted `/src/*`, breaking the dashboard's local dev
server. Scoped to `/s/`.
- **Settings deep links**: opening Settings on a specific tab (e.g. from the getting-started card)
always landed on My Profile instead of the requested tab on first open.
## [1.48.1] - 2026-08-13
### Security
- **Immediate REST privilege revocation**: file uploads, downloads, container logs and configuration
backups now reload the account's current roles and existence from the database instead of trusting
week-long JWT claims. File tokens remain short-lived and path-scoped, but permission changes and
account deletion now also invalidate their access immediately.
- **Per-user upload isolation**: resumable upload state is bound to its creator across chunk, status,
completion and cancellation requests. Metadata is immutable after creation, permissions are checked
again during long uploads and finalization, and concurrent ID collisions no longer cross accounts.
- **Symlink-safe file operations**: copy, ZIP creation, shared-folder archives and extraction refuse
symbolic links and special files, use no-follow/exclusive opens, and reject symlinked extraction
targets, blocking ordinary link-based escapes from an allowed Place.
### Fixed
- **Production API routing**: the generated nginx configuration now forwards public shares, container
log streams and configuration backup/restore endpoints, preserves client IP information safely, and
honors a custom `BACKEND_PORT` consistently in nginx, systemd and the backend.
- **Reliable upload retries**: transient chunk failures retain staged progress, inactive-upload cleanup
follows actual activity, checksums are validated before queueing, and repeated completion requests
reuse the same job instead of trying to rename an already-finalized temporary file.
- **Reproducible builds and releases**: local, CI, source-install and release builds use the same locked
esbuild command; Prisma generation is automatic; release archives include their fully locked runtime
dependency tree; the built server gets a startup smoke test; and manual releases build the requested
tag rather than the current branch.
### Changed
- CI and the release preflight now run lint, TypeScript/Vue checks, backend security tests, Go tests,
formatting/vet checks and production builds. The dependency lock also pins the patched
`brace-expansion` release reported by the package audit.
## [1.48.0] - 2026-08-10
### Changed
- **Mobile-first frontend pass**: crowded navigation now keeps four primary apps and moves the rest
into an accessible More menu; audit entries, users, containers, Docker networks/volumes, SMB
connections and mounts become cards instead of horizontally scrolling tables on phones.
- **Accessible dialogs and feedback**: dialogs behave as bottom sheets on mobile, trap keyboard
focus, restore focus when closed and expose dialog semantics. Shared loading, error and empty
states, clearer focus rings, touch feedback, accessible icon labels and live toast announcements
make async operations more consistent across the interface.
- **Data backup controls**: rsync plans can now be edited, paused and re-enabled from Settings, with
clearer execution-state badges and responsive action layouts.
- **Frontend polish**: form controls have clearer focus feedback, keyboard focus is consistent, and
mobile cards, headers and action groups have more balanced spacing and touch-friendly layouts.
### Fixed
- **Reliable telemetry delivery**: a heartbeat that fails while network or DNS is still coming up
now retries after one hour instead of silently waiting a full day. The HTTPS timeout is increased
to ten seconds, failures are logged without payload data, and this release forces one corrective
heartbeat from existing installations.
- **Mobile layout overflow**: the bottom navigation now shares the available viewport width instead
of extending the page, wide dashboard widgets collapse to one column on phones, and settings,
storage, monitoring, sharing, App Store, audit and backup screens use responsive spacing and
wrapping. The shell now follows the dynamic mobile viewport and respects safe-area insets.
## [1.47.0] - 2026-08-10
### Added
- **Scheduled rsync data backups**: administrators can back up NAS folders to local or SSH targets,
or pull a remote target onto the NAS, manually or on an hourly, daily or weekly schedule. Plans
support exclusions, compression, bandwidth limits, execution status and an optional mirror mode.
SSH transfers require a pre-provisioned key and strict host-key verification; HSI stores no SSH
passwords and invokes rsync without a shell.
## [1.46.0] - 2026-08-10
### Added
- **Encrypted configuration backup and restore**: administrators can export the complete HSI
configuration from Settings → Backup & restore, protected with AES-256-GCM and a
password-derived key. Restores verify the authenticated encryption, SQLite integrity and schema
compatibility, retain the previous database as a rollback copy, then restart HSI automatically.
Files stored in Places and Docker volume contents are deliberately excluded.
### Fixed
- **Update progress indicators**: update, restart and reconnect actions now use HSI's circular
loading indicator instead of the wedge-shaped inline SVG spinner.
## [1.45.0] - 2026-08-10
### Added
- **Restart controls**: administrators can now restart the HSI application or reboot the entire
host from Settings → Updates. Both actions show a reconnect timeline; host reboot requires two
explicit confirmations, is audited, and is executed only by the privileged root-worker.
## [1.44.1] - 2026-08-10
### Fixed
- **Telemetry hardware and version reporting**: disk discovery now follows the symbolic links
exposed by `/sys/block`, and packaged installations read their version from the installed
`VERSION` file instead of reporting `v0.0.0`. Existing installations send one immediate
corrective heartbeat after upgrading rather than retaining incomplete data for 24 hours.
## [1.44.0] - 2026-08-10
### Added
- **Anonymous telemetry**: the backend now sends a best-effort heartbeat at most once per day
with a random persistent installation ID, the HSI version, Linux distribution, CPU, memory,
and aggregate disk hardware details. It never sends hostnames, addresses, serial numbers,
filesystem paths, or user data; failures time out after three seconds without affecting HSI.
Set `HSI_TELEMETRY_ENABLED=false` to opt out.
## [1.43.0] - 2026-08-10
### Added
- **RAID/SMART alerting**: a red dot now appears on the Storage nav entry (sidebar, mobile, and
desktop-mode Launchpad/Dock) when a RAID array is degraded or a disk's SMART status turns
warning/failed, checked every 5 minutes in the background, so you don't have to open Storage
to notice. Rebuilding arrays also show their resync progress percentage.
## [1.42.0] - 2026-08-10
### Added
- **Storage admin capability**: admins can now grant a non-admin account access to disk/RAID/
LVM/partition management (a new "Storage admin" toggle on the user's account panel) without
making them a full administrator. Revoking it takes effect on the account's very next request.
### Security
- **Storage safety hardening**: formatting a disk or wiping/deleting a partition now refuses if
the device is a live RAID member or LVM physical volume, closing a path that could silently
corrupt an array or volume group. Removing an LVM volume group now also refuses if any of its
logical volumes are still mounted. Mount options are validated more strictly to prevent
malformed `/etc/fstab` entries.
## [1.41.0] - 2026-08-06
### Added
- **New file action**: the file browser can now create an empty file ("New file", next to "New
folder") from the toolbar or the right-click menu, the same way folders are created.
### Fixed
- **One progress bar per upload**: an upload's live progress (bar, percentage, speed) now shows
only in the Transfers tray; it no longer also duplicates as a second live progress bar
inline in the file list/grid.
## [1.40.1] - 2026-08-05
### Security
- Bumped `@fastify/static`, `postcss` and `fast-uri` to their patched versions, closing 5
Dependabot advisories (3 high, 2 moderate: path-traversal/auth-bypass in `@fastify/static`,
source-map path traversal in `postcss`, host confusion in `fast-uri`). None were exploitable
in how this app actually uses them, but the fixes are drop-in.
## [1.40.0] - 2026-08-05
### Added
- **Format action in the text editor**: JSON, YAML, CSS/SCSS/LESS, HTML, Markdown, JS and TS
files can now be reformatted in place from the file browser's text editor, via a toolbar
button or `Shift-Alt-F`. Uses Prettier, loaded lazily per file type so it costs nothing in
the main bundle until used.
## [1.39.0] - 2026-07-24
### Changed
- **The app is now installed under its real name, `hsi`**: systemd services become
`hsi`, `hsi-nats` and `hsi-root-worker` (plus `hsi-update-*`), the install
directory moves to `/opt/hsi` and the service account is renamed to `hsi`.
Existing installs that used the old default name (`app`) are migrated in place
automatically on their next update - services, user, data directory and config
move over with no manual steps and no data loss; a migration log is written to
`/var/log/hsi/migrate-app-to-hsi.log`.
## [1.38.0] - 2026-07-24
### Changed
- **Faster, clearer upload finalization**: uploaded chunks now stream into a single
temporary file instead of a folder of parts, so finishing an upload no longer
rewrites the whole file: the server just verifies the SHA-256 checksum and
atomically renames the file into place. The transfers tray shows this as a new
"Verifying" step, and peak disk usage during an upload drops by half.
- **New loading spinner**: the blinking [Loading] text is replaced by a rotating
arc spinner everywhere (static under reduced motion).
## [1.37.0] - 2026-07-24
### Security
- **Permission changes take effect immediately**: admin and user-manager rights are now checked against the database on every request instead of being baked into the 7-day session token. Demoting an account (or deleting it) cuts its elevated access on the very next request, no more waiting for the session to expire or asking people to sign out and back in after a rights change.
- **Login attempts are rate-limited**: after 5 failed sign-ins for a username (or from one IP address) within 15 minutes, further attempts are blocked until the window expires, and the login page shows how long to wait. Slows credential-guessing to a crawl; a successful sign-in clears the counter.
### Fixed
- **Non-admin dashboards no longer include the Containers widget by default**: the widget needs admin-only data, so non-administrator accounts saw an empty tile they could remove but never re-add. Their default layout now skips it, and the container list is no longer requested (previously a silent permission error on every dashboard load).
## [1.36.0] - 2026-07-23
### Added
- **New dashboard widgets: Storage, System, Disk Health**: the dashboard and desktop widget picker gain three widgets: **Storage** (usage per disk), **System** (hostname, OS, CPU count, load average, uptime), and **Disk Health** (live SMART status per drive). Like the Containers widget, they rely on admin-only data, so they only appear in the widget catalog for administrator accounts.
### Changed
- **Refreshed sign-in page**: the login screen is now a centered card with the app logo, an ambient background, and a show/hide toggle on the password field.
## [1.35.0] - 2026-07-21
### Changed
- **Simpler permissions: Users + Groups, no more Roles**: the old glob-permission role system (`files.write`, `places.*`, `*.*`, plus an auto-created "personal" role per user) is gone. Access is now just: grant **Read / Write / Delete / Share** on each **place**, to a **user** directly or to a **group** the user belongs to. "Roles" in Settings became **Groups**: a group is only a name plus its members. Two account tiers survive as simple switches on a user: **Admin** and **User manager**.
- **Admin means full access, shown as such**: an administrator is now a flag on the account with implicit Read/Write/Delete/Share on every place. In the Permissions matrix, admins appear as a row with all four boxes checked (and locked) instead of being hidden, so "who can do what" is visible at a glance, and the admin account works over SMB and in the web file manager like any other member.
- **One identity**: an account's **username is its Linux and Samba account**; there's no separate "Linux username" field to set anymore. New users are created with a valid Linux account name up front, so sharing "just works" without a second step.
- **Container & app management is admin-only**: installing, editing, starting/stopping containers, apps, networks and volumes (and viewing container logs) now requires the **Admin** flag. Any non-admin who previously had container permissions via a role will lose that access and must be made an admin to keep it. After updating, user-manager accounts should sign out and back in to refresh their session.
### Fixed
- **Admin couldn't write to SMB-enabled places**: the admin account was mapped to the Linux `root` user, which Samba refuses (and which was filtered out of every share's write list), so an administrator silently had no write access over SMB. Admins now have a real, non-root identity and full access everywhere.
## [1.34.1] - 2026-07-19
### Fixed
- **English UI**: the file-transfers tray, sharing diagnostics, and upload/disk error messages shipped with hardcoded French labels; they are now in English like the rest of the interface.
## [1.34.0] - 2026-07-19
### Added
- **Upload integrity checks**: large uploads are now verified end-to-end. The browser computes the whole file's SHA-256 as it reads it, and the server re-computes the same hash while assembling the staged chunks: if they don't match, the file is rejected and the transfer shows "Fichier corrompu pendant le transfert, réessaie" (Retry re-sends and re-verifies). Before the first chunk goes up, HSI checks the destination has room and rejects the upload up front (instead of failing halfway) if it won't fit. Assembly is now an explicit, retryable step, so a dropped response at the very end no longer reports a false success.
- **Robust file transfers**: uploads now survive network blips: each chunk retries with backoff and resumes from where it stopped instead of failing the whole file, and progress moved into a docked **Transfers** tray inside the file browser (out of the notification bell), with full untruncated errors and a **Retry** button. An upload interrupted by a page reload reappears in the tray; re-select the same file to resume from the chunks already uploaded. Copies and moves show in the same tray with their own retry.
- **Sharing diagnostics**: a new **Diagnostics** tab under Sharing shows, per share, who can actually read/write (with a dot marking whether each account has a Samba password), who is permitted but **blocked and why** (no Linux account, or a `root`/system account that can't be used for SMB), and whether the share directory is group-writable. Turns a "why can't I write?" into a glance instead of digging through logs and `smb.conf`.
### Fixed
- **Web file manager couldn't write to places without an SMB share**: writing through the built-in file browser acts as your Linux user (same as SMB), so it hit the same wall: the shared-group/writable-directory setup only ran for SMB shares. Now **every place you're granted write on** is placed in the `hsi-share` group (setgid, group-writable), share or not, so the web file manager can write there too. Applies the next time a permission changes (or on the next sync).
### Security
- **`root` can no longer be an SMB share account**: HSI never adds `root` (e.g. an admin account mapped to the Linux `root` user) to a share's Samba valid-users / write-list, nor to the `hsi-share` group. Writing to shares as root is unsafe and Samba refuses a root login anyway (it falls back to guest → read-only), so mapping an account to root produced a share only "root" could write, which nothing could actually use. Give SMB users a normal (non-root) Linux account.
## [1.33.1] - 2026-07-15
### Fixed
- **Can't write to an SMB share (even as admin)**: writes failed for two reasons: admins were never added to a share's Samba *write list*, and shared directories were created root-owned and not writable by the users granted write (which also affected the web file browser, since both write as your Linux user). Now admins always get read+write on every share, and each writable share directory is placed in a shared `hsi-share` group (setgid and group-writable, with the write-permitted users as members), so both SMB and the web file manager can write. New files are group-writable too. Takes effect on the next share sync; SMB clients may need to reconnect once for the new group membership to apply.
## [1.33.0] - 2026-07-15
### Added
- **Reorderable sidebar**: drag any app icon in the sidebar to arrange the nav in whatever order you like; the order is saved to your account and mirrored in the mobile bottom bar. A plain click still opens the app, and keyboard users can move a focused icon with Alt+↑ / Alt+↓. "Reset sidebar order" (in the profile menu) restores the default.
- **Preferences follow your account**: your theme, accent colour and sidebar order now sync across the browsers and devices you sign in on (loaded on login, saved as you change them; localStorage stays the instant local cache). Device-specific settings like desktop mode remain per-browser.
### Fixed
- **App Store live status**: catalog cards now show each app's real container state (Running / Stopped) read from Docker, instead of a persisted status that was never refreshed after install, so a freshly-installed app correctly moves from "Installing…" to "Running" on its own.
### Security
- **Audit log**: user-submitted secret env **values** (e.g. an `ADMIN_TOKEN` you type at install) are now redacted in the audit log. Previously the redaction matched only the field *name*, so the secret in `value` was written in cleartext; the setting's name is now kept for auditability while its value is masked. (Server-generated secrets were never logged.)
## [1.32.0] - 2026-07-15
### Added
- **Host-port conflict warning**: when you pick a host port for an app (App Store install wizard or the container form), HSI now warns if that port is already taken: by another HSI app, any Docker container (incl. Compose stacks), or a non-Docker process on the host. It's a non-blocking heads-up (the port still binds), so you can fix it before Docker fails to start the second app.
- **Per-port access binding**: each published port can record where it's actually reached: an optional domain, an HTTPS toggle, and an optional external port, set in the app's settings (Ports). HSI doesn't terminate TLS or run a proxy; it just stores the binding so the **Open** button goes to the real URL (e.g. `https://jellyfin.example.com`) instead of `http://<host>:<port>`. Universal because it's plain per-container metadata, whatever handles TLS externally (your reverse proxy, tunnel, or router).
## [1.31.1] - 2026-07-14
### Changed
- **App Store polish**: the catalog now shows each app's **real logo** instead of a generic glyph, and the App Store launcher icon is a storefront (clearer, and distinct from the Apps grid). Each catalog card shows the app's live state (Not installed, Installing…, Running, Stopped or Error) with a contextual **Install** or **Open** action (Open launches the app's web UI on its mapped port). The screen refreshes on its own so a fresh install visibly moves from "Installing…" to "Running", and it now shows a loading skeleton and a "no results" state.
## [1.31.0] - 2026-07-13
### Added
- **App Store**: a new admin-only "App Store" app that installs curated self-hosted apps in one guided flow. Browse a catalog of 10 apps (Jellyfin, Vaultwarden, Navidrome, AdGuard Home, Syncthing, qBittorrent, Uptime Kuma, File Browser, Homarr, IT-Tools) with search and category filters, then install through a wizard that lets you set the app name, remap host ports, fill in settings, and, for each volume, pick an existing Place, create a new Place, use a host path (bind mount), or a named Docker volume. It reuses the existing container-create pipeline: images are pinned (never `:latest`), secrets like admin tokens are generated for you, and installed apps are tagged so the store shows what's already installed. Creating a new Place during install stays admin-only.
- **Read-only volume mounts**: container volumes can now be mounted read-only (`:ro`), used by the App Store for library volumes (e.g. a media folder mounted read-only).
## [1.30.0] - 2026-07-12
### Added
- **Download a shared folder as a zip**: public folder share links now have a "Download all as .zip" button. The worker builds the archive into a private temp dir with a hard disk-space guard (it re-checks free space as it writes and aborts before the (limited) temp filesystem can fill, plus a size cap), streams it to the visitor, then removes it (no temp file ever lands inside the shared tree). Concurrent builds are capped and any orphaned archive is swept periodically.
### Changed
- Relicense the project under the Mozilla Public License 2.0 (`MPL-2.0`), replacing the previous source-available, non-commercial license.
- **User accounts require a Linux-valid username**: creating a user now requires the username to be a valid Linux account name (lowercase letters/digits/`-`/`_`, starting with a letter or `_`), enforced in the create form and server-side. This guarantees every account can back a Linux and Samba (SMB) account; previously an invalid name (uppercase, dots…) silently produced an account with no file-server or SMB access.
## [1.29.2] - 2026-07-11
### Security
- **CodeQL hardening**: bounded the root worker's uid/gid parsing with `strconv.ParseUint(…, 32)` instead of `Atoi` + an unchecked `uint32` cast (clears `go/incorrect-integer-conversion`), and restricted the CI workflow's `GITHUB_TOKEN` to `contents: read` (clears `actions/missing-workflow-permissions`).
## [1.29.1] - 2026-07-11
### Fixed
- **Share action missing from the right-click menu**: the file browser's "Share" action was only on the selection toolbar, not the right-click context menu. It's now in both (for files and folders), acting on the right-clicked item via the same dialog.
- **Metrics history broke on machines with ≥2 GB RAM**: the `MetricSnapshot` RAM and network columns were 32-bit `Int`, so a RAM total in bytes (≥2 GB) overflowed and every metrics sample failed to write (`P2023`), leaving the Monitor → History charts empty. Those columns are now `BigInt`. The updater also now runs `prisma db push --accept-data-loss` (right after its existing automatic DB backup) so column-type changes actually apply on update instead of silently failing.
## [1.29.0] - 2026-07-11
### Added
- **Public file sharing**: share any file or folder over a public link (`/s/<token>`) with no account required for the recipient. Each link supports an optional password, an expiry, and a maximum download count, and can be revoked at any time. Visitors get a page that downloads the file or lets them browse a read-only folder listing; the link inherits the creator's read permission (re-checked on every access) and is contained to the shared path (symlink- and traversal-safe) on the privileged worker. Creating links is gated by a new per-place **Share** permission, grantable to a user or a role like Read/Write/Delete. Manage your links from Settings → Shared links.
### Changed
- **Logs**: the backend and the root worker now write their output to `/var/log/hsi/app.log` and `/var/log/hsi/root-worker.log` (created on install, rotated weekly) instead of only the systemd journal, so operators have plain log files to tail and ship.
### Fixed
- **Samba password sync**: password sync now logs a clear warning when the Samba (`smbpasswd`) or Linux (`chpasswd`) step fails, instead of swallowing it silently, making a refused SMB login diagnosable from the backend log.
## [1.28.6] - 2026-07-10
### Changed
- **License**: strengthened the non-commercial license: an explicit "source-available, NON-COMMERCIAL" header, a definitions section (notably a broad definition of "commercial use"), a clear commercial-use prohibition that reserves a written commercial-license option, and added trademark, termination and full no-warranty clauses. Renamed the project from "Brume" to **HSI (Home Server Interface)** in the license and NATS config (the rest of the codebase already used the current name).
## [1.28.5] - 2026-07-10
### Changed
- **Places settings**: reworked the Places screen to explain what a place is and guide setup: a descriptive header, per-field hints on the add form, a guided empty state, and a short explanation of the read / write / delete permissions (with per-column tooltips and a note that admins always have full access). The "Add place" trigger now uses the shared button style.
### Fixed
- **Update release notes**: the "What's new" panel now renders release notes as formatted text (headings, lists, bold, inline code, links) instead of raw Markdown. The Updates screen also links out to the specific release and to the project on GitHub.
## [1.28.4] - 2026-07-10
### Changed
- **Button consistency**: unified every call-to-action on the shared `.btn` design-token classes (`.btn-primary`/`.btn-outline`/`.btn-ghost`/`.btn-danger`). The primary button is now solid accent (following the accent-colour picker) instead of a mix of punched-out and inline accent styles; LVM wizard CTAs are no longer a stray purple, and destructive confirmations (Format, Create RAID, Destroy…) share one danger style. 82 buttons now use the shared system (was 36); no more inline accent or hard-coded-colour CTAs.
- **Storage app icon**: replaced the single cylinder glyph with a clearer three-bay disk rack (with drive LEDs), in the desktop launcher, sidebar and mobile nav.
## [1.28.3] - 2026-07-09
### Security
- **JWT signing key**: the backend now refuses to start in production (`NODE_ENV=production`) when `JWT_SECRET` is missing or shorter than 32 characters, instead of silently falling back to a public development default that would let anyone forge session tokens. Development keeps the warn-and-fallback behaviour. (The install script already generates a 64-char secret, so existing installs are unaffected.)
- **Default-password warning**: when an account is still signed in with the seeded default password, the dashboard now shows a dismissible banner linking straight to the password-change screen. The check runs server-side (`user.securityStatus`) and never exposes the password hash.
### Changed
- **Linting**: added ESLint (flat config, Vue `flat/essential` + typescript-eslint) over all TS/Vue code and a `gofmt` + `go vet` gate for the Go root-worker, wired into a new CI `lint` job. Fixed the handful of real issues this surfaced (a `String` wrapper type, an unused-expression ternary, a useless assignment, an unused prop binding) and normalised the root-worker's Go formatting. Run locally with `pnpm lint`.
### Fixed
- **Expired sessions**: when a stored session token is rejected (expired or revoked), the dashboard now clears it and redirects to the login screen instead of leaving the user on a silently-failing page. A failed login attempt is unaffected (no redirect loop).
- **Error states**: the Audit Log and the System → History charts now show a distinct error message with a Retry button when their data fails to load, instead of falling through to their "no data" empty state (which misrepresented a failure as an absence of activity).
## [1.28.2] - 2026-07-07
### Security
- **Dependencies**: removed two stale per-app `pnpm-lock.yaml` files left over from the initial import. The repo is a pnpm workspace that only uses the root lockfile (already on patched versions), so these files carried only fossilised vulnerable versions and were the sole source of 24 phantom Dependabot alerts (11 high, 11 moderate, 2 low). Alert count is now 0.
## [1.28.1] - 2026-07-06
### Changed
- **Navigation**: reordered the app nav to a more natural flow: Overview, Files, Apps, then the admin tools (Storage, Monitor, Sharing), with Settings last, consistent across the classic sidebar, mobile bar and Launchpad. The Storage → Disks tab also gets a clearer hard-drive icon.
## [1.28.0] - 2026-07-06
### Changed
- **Storage dialogs**: the format wizard, mount/unmount, LVM/RAID wizards and partition/destroy confirmations now use the shared modal component, so they animate in and out, join the layered-Escape stack, and (in desktop mode) render inside their window instead of covering the whole screen, matching every other dialog in the app.
### Performance
- **Smaller initial load**: the Storage, Monitor, Apps, Settings and Sharing panels are now code-split into separate chunks loaded on first open. The initial JavaScript bundle drops from ~865 KB to ~274 KB.
## [1.27.2] - 2026-07-06
### Security
- Updated dependencies to clear all 25 known vulnerabilities (12 high) reported by `pnpm audit` / Dependabot, notably fastify, vite, rollup and Prisma patch/minor bumps, and `@fastify/static` 8 → 9 which fixes a path traversal and a route-guard bypass in the layer that serves the dashboard.
## [1.27.1] - 2026-07-06
### Added
- **Sharing in classic mode**: the SMB Sharing app is now reachable outside desktop mode: admin-only entry in the classic sidebar and the mobile bottom nav.
### Changed
- **Classic mode animations**: switching apps in classic (non-desktop) mode now cross-fades, matching the motion system introduced in 1.27.0.
### Fixed
- **Windowed modals**: dialogs opened by an app running in a desktop window (file properties, permissions, pin/edit forms…) now display inside that window instead of covering the whole screen. System-level dialogs (confirmations, wallpaper picker) stay fullscreen.
## [1.27.0] - 2026-07-06
### Added
- **Motion system**: the dashboard now animates on design-token durations/easing: modals and confirm dialogs pop in and out, the launchpad zooms, desktop windows animate on open/close/minimize, pinned apps slide into place when added or removed, and route changes cross-fade. Everything collapses to instant under `prefers-reduced-motion`.
### Changed
- **Design tokens**: finished migrating the remaining raw palette colors to semantic status tokens (storage sections, overview, audit log, notifications, profile, permissions, RAID drive-bay illustration), exposed them as Tailwind utilities, and moved all radii to the shared token scale. Destructive/confirm buttons keep a visible hover state; the audit-log `fs` category gets a proper violet token with a dark-mode variant.
### Fixed
- **Escape key**: with stacked overlays (a confirm dialog over the launchpad, or an open role picker inside a modal), Escape now closes only the topmost layer instead of everything at once.
- **Confirm dialogs**: a confirmation requested while the previous one was still animating out could be silently auto-cancelled; it now shows correctly. Confirm/Cancel also play the dialog's leave animation instead of snapping it away.
## [1.26.0] - 2026-07-03
### Changed
- **App icons**: redesigned the seven desktop app glyphs (Dock, Launchpad, window title bars) as a custom monochrome family: consistent rounded stroke on a 24px grid with filled-dot details (drive LEDs, share nodes, slider knobs); Settings trades the cog for three sliders and the dock's Launchpad button becomes a four-dot grid. Icons are now rendered by a shared `AppIcon` component instead of three inline SVG copies.
## [1.25.0] - 2026-07-02
### Added
- SMB network sharing: share any place over the network via Samba, managed from the new admin-only Sharing desktop app (share list with per-place permissions mapping, live connections view, guest access and read-only options). Passwords are kept in sync NAS-style across web, Linux, and Samba accounts. Requires `samba` to be installed on the host; the app detects it and shows the install command otherwise.
## [1.24.0] - 2026-07-01
### Fixed
- **Wallpaper upload**: fixed `ENOENT` failure on every wallpaper image upload in production installs. The backend's bundled `server.js` sits directly at `INSTALL_DIR`'s root, so the storage path fallback (relative to the *unbundled* dev source tree) walked two directories above `INSTALL_DIR` and tried to write to `/data` at the filesystem root, outside the systemd sandbox's writable paths. Now resolves against `INSTALL_DIR` directly.
## [1.23.2] - 2026-07-01
### Fixed
- **Updates**: fixed the update UI getting permanently stuck on "Restarting": it only detected a thrown `fetch()` exception as "server down," so it missed nginx's 502 (backend port closed) and the backend's own 503 (NATS not yet reconnected), both successful HTTP responses. A manual page reload was required after every update; now the UI correctly detects the restart and reloads automatically.
- **Design system**: finished the refresh consistency pass: Overview summary cards now use the shared `.panel-card` (elevation/radius), remaining pill-shaped badges (audit categories, RAID/LVM tags and counters) moved to the moderate radius token, and destructive UI (delete confirmations, danger zone) now uses the fixed `--c-danger` color instead of the user's accent color.
## [1.23.1] - 2026-07-01
### Fixed
- Translated remaining French UI text and code comments to English (Storage → Mounts/Physical Disks/RAID titles, subtitles, and table headers; VolumesTable comments).
## [1.23.0] - 2026-07-01
### Changed
- **Design system refresh**: moved away from the flat/monochrome "Nothing" look toward a warmer, softer balance: Inter replaces Space Mono for buttons, badges, labels, and nav (Space Mono now scoped to technical data values only: metrics, file sizes, IPs, hashes); buttons and badges lose their pill shape for a moderate rounded radius; cards and modals gain a subtle resting/hover shadow; destructive actions now use a fixed danger color independent of the accent picker; backgrounds are slightly warmed in both light and dark mode.
## [1.22.0] - 2026-07-01
### Changed
- **Updates**: reworked update UI: version comparison card, release notes panel (populated after "Check now"), 4-step restart timeline (Scheduled → Restarting → Reconnecting → Ready), and auto-reload countdown once the server is back up.
## [1.21.0] - 2026-07-01
### Changed
- **Storage** is now a dedicated desktop app (Disks, RAID, LVM, Mounts), accessible from the Launchpad and the non-desktop sidebar (admin only).
- **Monitor** is now a dedicated desktop app (Overview, System, Audit Log), accessible from the Launchpad and the non-desktop sidebar (admin only).
- **Settings** is now purely configuration: Profile, Users, Places, Permissions, Roles, Updates.
## [1.20.0] - 2026-07-01
### Added
- **Permissions**: new Settings → Permissions section: per-place access control matrix (read/write/delete) for every role and user.
- **Overview**: new Settings → Overview dashboard: live summary cards for system health (CPU/RAM/uptime), storage (disks, RAID status), containers (running/stopped), LVM, and recent audit activity.
- **File search**: search bar in the file browser: searches by filename within the current place, results navigate to the containing directory.
- **Historical metrics**: Settings → System → History tab: CPU %, RAM, and network charts (Chart.js) with 1h/6h/24h/7d periods; metrics sampled every 60 seconds and retained for 30 days.
## [1.19.1] - 2026-06-30
### Fixed
- Storage nav labels were in French ("Disques", "Montages"); renamed to English ("Disks", "Mounts").
## [1.19.0] - 2026-06-30
### Added
- **Storage split**: replaced the monolithic `DisksSection.vue` (2191 lines, 3 internal tabs) with four independent nav sections under Settings → admin:
- **Disques** (`PhysicalDisksSection`): physical disk cards, S.M.A.R.T. health, partition management.
- **RAID** (`RaidSection`): RAID array creation, destruction, live status, device bay.
- **LVM** (`LvmSection`): PV / VG / LV lifecycle (create, remove, resize).
- **Montages** (`MountsSection`): centralized view of all mounted and unmounted filesystems across disks, RAID arrays, and LVM logical volumes, with mount/unmount/format actions and clickable source badges that navigate to the owning section.
- Shared `useStorageData` singleton composable: one reactive store, one fetch cycle, one `refresh()` shared across all four sections. Navigating between storage sections never triggers duplicate API calls.
- Cross-section navigation: disk used as RAID member → badge links to RAID; disk or RAID used as LVM PV → badge links to LVM; RAID member drives clickable → links to Disques.
## [1.18.2] - 2026-06-29
### Fixed
- Build: AuditLogSection imported `inferRouterOutputs` from `@trpc/server` which is not a dashboard dependency; replaced with `Awaited<ReturnType<...>>` derived from the proxy client.
## [1.18.1] - 2026-06-29
### Fixed
- Build: AuditLogSection used `useQuery` from `@trpc/vue-query` which is not in this project; replaced with vanilla proxy client calls. Removed unused `TRPCError` import in auth router.
## [1.18.0] - 2026-06-29
### Added
- **Audit Log**: every authenticated mutation is now recorded in a persistent SQLite table (`AuditLog`). Captured fields: user, action (tRPC path), primary target resource, sanitized input (sensitive fields redacted recursively), client IP, success/failure, timestamp.
- Failed login attempts are also logged (with the attempted username as target) even though they originate from a public procedure.
- New **Settings → Audit Log** section (admins only): paginated table (50 entries/page) with colour-coded action badges by category (auth, filesystem, system, admin), expandable row detail showing sanitized input JSON, and a free-text action filter.
### Fixed
- Audit meta sanitization now recurses into nested objects/arrays and applies a case-insensitive regex (`password`, `secret`, `token`, `key`, `auth`, `credential`) instead of a flat denylist.
## [1.17.1] - 2026-06-29
### Fixed
- Build: resolved `TS2532` (Object is possibly undefined) errors in SMART panel template; CI now passes vue-tsc strict checks.
## [1.17.0] - 2026-06-29
### Added
- **S.M.A.R.T. health panel** for physical disks: each disk card now has a color-coded health badge (Healthy / Warning / Failed) with live temperature. Clicking the badge expands a panel showing:
- Overall health status, temperature, power-on hours, and power cycle count.
- Device info: model family, serial number, firmware version, drive type (NVMe / SSD / HDD + RPM).
- ATA attribute table with critical attributes highlighted; failed attributes shown in red.
- NVMe health log: critical warning, available spare, percentage used, media errors, and lifetime data read/written in TiB.
## [1.16.0] - 2026-06-29
### Added
- Storage section is now split into three focused tabs: **Disks**, **RAID**, and **LVM**, each with a live count badge.
- LVM wizard: assembled RAID arrays (md devices) can now be selected as Physical Volume candidates, enabling LVM-over-RAID setups. They appear in the picker with a RAID badge.
### Fixed
- RAID wizard: already-assembled md devices and disks that are already RAID members are now excluded from the drive picker.
- LVM wizard: disks that are RAID members are now excluded from the PV picker.
- LVM format and mount operations now send the correct `/dev/vg-name/lv-name` symlink path to the worker instead of a constructed dm name that does not exist as a device file.
- `lvToBlockDev` now correctly resolves the dm device using the LVM double-hyphen naming convention, so filesystem type, mount point, and usage data appear correctly for logical volumes.
- System LVM protection: Volume Groups whose Logical Volumes are mounted at critical paths (`/`, `/boot`, `/var`, etc.) are now correctly detected as system VGs: all destructive actions (Remove VG, Remove LV) are hidden.
- FAT32 formatting now tries `mkfs.fat` first (modern name) before falling back to `mkfs.vfat`.
- Device name validation in Go and tRPC now accepts hyphens and one forward slash, allowing relative LVM paths (`ubuntu-vg/ubuntu-lv`) to pass through.
## [1.15.1] - 2026-06-29
### Fixed
- Disk management UI: redesigned storage section to be more professional and less error-prone. Destructive actions (Destroy RAID, Remove VG) are now hidden behind a ⋯ dropdown menu instead of inline red buttons. Per-partition and per-LV Delete buttons are now invisible by default and only appear on row hover. "Init GPT" (wipes partition table) is now collapsed inside an expandable "Advanced" section at the bottom of each disk card rather than shown inline next to "+ Partition". Cards now have colored left-edge accent stripes for visual type identification.
- Disk management UI: system VGs (Volume Groups that contain a mounted system partition) are now protected: the ⋯ menu and all destructive actions are hidden, and a SYSTEM badge is shown in orange.
- Go worker: `Children` field on block devices was omitted from JSON when empty (due to `omitempty`), causing the dashboard to crash with `TypeError: can't access property Symbol.iterator, G.children is undefined`. The field now always serializes as `[]` instead of being omitted.
## [1.15.0] - 2026-06-29
### Added
- LVM management: create Volume Groups from one or more physical devices, with a 3-step wizard (select PV devices → name VG/LV/optional size → confirm). Logical Volumes appear as manageable entries with Format, Mount/Unmount, and Delete actions. Per-VG controls: Add LV and Remove VG (with typed confirmation). LVM info is loaded in parallel with block devices on page open.
- Partition management: each non-system disk now has an inline partition toolbar with "Init GPT" (wipes partition table, requires typed confirmation) and "+ Partition" (creates a partition spanning all free space). Each partition row gains a "Delete" button (when unmounted and not a system partition).
- Seven new dialogs for all LVM and partition operations: LVM Create Wizard, Add LV, Remove LV, Remove VG, Init GPT, Add Partition, Delete Partition: all include warnings and typed or explicit confirmation before any destructive action.
- LVM Logical Volumes behave as first-class block devices: they show filesystem type, mount point, and usage bar if mounted, and reuse the existing Format/Mount/Unmount wizards.
## [1.14.0] - 2026-06-29
### Added
- Storage management panel: full disk/RAID/mount management UI in Settings → Disks, replacing the read-only disk view.
- Physical drive tree built from `lsblk`, showing every disk and partition with size, filesystem type, mount point, and usage bars.
- Format wizard (3 steps): danger warning → filesystem choice (ext4, xfs, btrfs, FAT32 with descriptions) → type device name to confirm. Runs `mkfs` on the worker.
- Create RAID wizard (3 steps): level selection (0/1/5/10) with redundancy explanations and capacity hints → disk picker → type `CREATE RAID` to confirm. Persists mdadm config for auto-assemble on reboot.
- Destroy RAID dialog: stops the array with `mdadm --stop` and zeroes superblocks on member drives; requires typing the array name to confirm.
- Mount dialog: configurable mount point and options, optional `/etc/fstab` UUID entry for persistence across reboots. Mount directory is created automatically.
- Unmount dialog: optional fstab entry removal.
- System disk protection: the disk containing `/` (and all its partitions) is auto-detected via `/proc/mounts` + `lsblk --pkname`, shown with an orange SYSTEM DISK badge, and all destructive actions are disabled.
### Fixed
- Security: reject fstab structural characters (`\n`, `\r`, `\t`, space, `#`) in mount point and options at both the tRPC Zod schema and Go handler layers, preventing fstab injection that could bypass the system-mount guard.
- TypeScript: removed unused `watch` import in `ContainerLogsPanel.vue` that was causing a build error.
## [1.13.0] - 2026-06-29
### Added
- Container logs: each app row now has a "Logs" button that opens a live terminal overlay streaming `docker logs --follow`. Lines include parsed timestamps, auto-scroll with a "Follow" toggle that pauses when you scroll up, a Clear button, and a line counter. The stream runs through a dedicated NATS inbox so the worker pushes lines directly and the SSE route relays them to the browser.
- File browser: the first available place (Root for admins, first assigned place for users) is now automatically selected when opening the file browser, eliminating the blank "Select a place" screen on first load.
## [1.12.3] - 2026-06-29
- File browser: the first available place is now automatically selected when opening the file browser, so the panel never shows a blank "Select a place" screen on first load.
## [1.12.2] - 2026-06-29
### Added
- File browser: uploads now appear inline as ghost rows/cards in the directory they're targeting. Each shows a live progress bar, transfer speed, and a spinner on the icon, visible immediately when the upload starts, before the file exists on disk. Works for all uploads in the current browser session (any logged-in user). The ghost disappears and is replaced by the real entry once the upload completes.
## [1.12.1] - 2026-06-29
### Added
- File browser: inline loading state on file/folder rows and cards during operations. Deleting, moving, or renaming an item dims its row/card and shows a spinner directly on it. Creating a folder shows a ghost "New Folder…" placeholder at the top of the list/grid while the operation runs.
## [1.12.0] - 2026-06-29
### Added
- Toast notifications: errors and confirmations now appear as floating overlays in the top-right corner, auto-dismissing after a few seconds. Errors persist 7 s; successes 3.5 s.
- Container actions (start, stop, restart, recreate) now show live progress in the Activity bell: a spinner while the job runs, then a green check or red cross on completion.
- Creating an HSI user now automatically provisions a Linux system user (`useradd -M -s /sbin/nologin`) with the same username. The Linux username is stored in `linuxUsername` and shown in the user table. No home directory and no SSH login are created by default.
### Fixed
- All `alert()` browser dialogs (container action errors, network/volume delete failures, unmanaged-container import errors) replaced with toast notifications; no more browser-native popups blocking the page.
## [1.11.5] - 2026-06-29
### Fixed
- Places: creating a directory (via the "Create directory" link) and validating a place path now route through the Go root-worker (`root.fs.mkdirp` / `root.fs.stat`) instead of the Node process, fixing `ENOENT` errors when the target is outside Node's accessible paths (e.g. `/mnt/`).
- Container form: `extraHosts` field was missing from the local `App` type in `AppFormModal.vue`, causing a TypeScript build error.
## [1.11.4] - 2026-06-29
### Added
- Container form: new "Extra Hosts" field in the Advanced tab: adds `--add-host hostname:ip` entries that map to `/etc/hosts` inside the container. Supports tag-based input with `hostname:ip` format validation. Compose import parses `extra_hosts` (array or map form).
## [1.11.3] - 2026-06-29
### Changed
- Container management: editing a container now opens an inline view within the app panel instead of a full-screen modal. The form replaces the list in-place with a back arrow to return.
### Fixed
- Start/Restart on a container that no longer exists in Docker now prompts "Recreate it?" instead of showing a raw error. Confirming triggers a `recreate` job using the stored configuration.
## [1.11.2] - 2026-06-29
### Added
- Places: when creating a place with a path that doesn't exist, a "Create directory and add place" link appears below the error; clicking it runs `mkdir -p` on the path and automatically retries the creation.
## [1.11.1] - 2026-06-29
### Fixed
- Container management broken: NATS subject mismatch between backend (`root.container.*` / `root.network.*` / `root.volume.*`) and root-worker (`root.docker.container.*` etc.) caused all container create/start/stop/restart/remove/network/volume operations to be silently dropped with "unknown subject" errors.
- `container.inspect` and `container.listAll` incorrectly listed as JetStream stream subjects in the backend, causing sync request-reply messages to be intercepted by the pull consumer instead of the registered subscriber.
- Added missing `root.container.listAll` handler in root-worker to list all Docker containers (used by the "import unmanaged container" feature).
## [1.11.0] - 2026-06-27
### Added
- Settings → System: new admin section showing live host information: hostname, platform, architecture, kernel version, uptime, CPU model and core count with usage bar and 1/5/15-minute load averages, memory usage bar, and network interfaces with per-address IPv4/IPv6 badges and live RX/TX throughput. Metrics refresh every 3 seconds.
- Settings → Disks: RAID arrays now rendered as a visual drive bay, each member disk drawn as an illustrated HDD (platter rings, arm, activity LED) with green/red coloring per active/degraded state, chevrons between drives, and an arrow showing the logical RAID output and mount point. Usage bar appears at the bottom when the array is mounted.
### Fixed
- Activity notifications were displayed twice: once as bottom-right toasts (`NotificationsContainer`) and once in the bell menu. `NotificationsContainer` is now removed; the bell panel is the single source.
## [1.10.2] - 2026-06-27
### Changed
- File browser: folders now require a double-click to navigate into them; single click selects the item (consistent with files). Applies to both list and grid views.
- File browser: activity panel (bell menu) redesigned: uploads and job notifications unified into a single flat list with inline progress bars, replacing the previous two-section card layout.
### Fixed
- File browser: filter bar (Cmd/Ctrl+K) was rendering but hiding the file list due to a Vue v-if chain bug; the filter bar and views are now correctly independent.
- File browser: "Paste" option persisted in the context menu after a copy+paste; clipboard is now always cleared after any paste operation.
## [1.10.1] - 2026-06-27
### Security
- Fixed path traversal in `doZip`: a user-supplied archive name containing `..` or path separators could write the zip file outside the intended destination directory. The name is now sanitized to its base component in the Go worker and rejected by the tRPC input schema before reaching the worker.
## [1.10.0] - 2026-06-27
### Added
- File browser: sort controls on list-view column headers (Name / Size / Modified); directories always sort above files; clicking the active column toggles ascending/descending order.
- File browser: Cmd/Ctrl+K filter bar for real-time name filtering within the current directory; shows match count and dismisses on Escape.
- File browser: "Compress to ZIP" context menu action for any selection (single file, folder, or multi-select); creates a `.zip` archive in the current directory.
- File browser: "Extract Here" context menu action for `.zip` files; extracts to a new subdirectory named after the archive with zip-slip path-traversal protection.
- Settings → Disks: new admin section listing all mounted block-device filesystems with per-disk usage bars (turns yellow >75%, red >90%) and a RAID section that parses `/proc/mdstat` to show array health, level, and member devices.
- Go worker: `root.fs.zip` and `root.fs.unzip` JetStream subjects for async archive creation and extraction, running under user impersonation.
- Go worker: `root.sys.disks` request-reply subject returning mounted filesystems (`/proc/mounts` + `syscall.Statfs`) and RAID array info (`/proc/mdstat`).
### Fixed
- Wallpaper image upload failed for real-world images larger than ~64 KB due to `String.fromCharCode(...largeTypedArray)` exceeding V8's maximum argument count; upload now slices the byte array into 8 KB chunks before base64-encoding.
## [1.9.0] - 2026-06-23
### Added
- Chunked large-file downloads for impersonated users: a new `root.fs.read-chunk` NATS subject reads files in 4 MB slices (mirroring the existing chunked-upload path), and the backend streams those slices directly into the HTTP response via a Node `Readable`, no full-file buffering, no NATS payload limit.
### Fixed
- Impersonated file downloads were silently truncated at 64 MB due to the existing `root.fs.read` NATS payload cap; files larger than that now download completely.
- Worker error replies on the new `read-chunk` subject are now correctly distinguished from raw file bytes via a NATS header, so a mid-stream error aborts the connection instead of silently writing JSON into the downloaded file.
- HTTP `Range` requests (used by video seek) are now properly forwarded through the chunked path, so only the requested byte span is fetched from disk.
## [1.8.2] - 2026-06-23
### Fixed
- File list failed to refresh after async filesystem jobs (rename, delete, move) completed.
## [1.8.1] - 2026-06-23
### Fixed
- Crash in environments where `crypto.randomUUID` is unavailable; the app now falls back to `getRandomValues`.
## [1.8.0] - 2026-06-23
### Added
- `RolePicker` chip+dropdown component: clicking a role chip opens an inline picker to reassign a user's role or a role's member list without navigating away.
### Changed
- User role assignment and role member assignment now use `RolePicker` instead of plain dropdowns.
### Fixed
- Default `readonly` and `readwrite` roles were being seeded on every startup even though they are unused.
- Permission list visual hierarchy in the role editor was inconsistent.
## [1.7.1] - 2026-06-22
### Fixed
- Refresh icon in the unmanaged-containers panel now matches the icon used everywhere else in the app.
## [1.7.0] - 2026-06-21
### Added
- Desktop wallpaper: admins can set a personal background image (uploaded via the new wallpaper picker) or a solid color from the accent palette.
- Background widget grid in desktop mode: dashboard widgets render as a decorative layer behind open windows.
- `User.wallpaper` database column and wallpaper tRPC router; wallpaper images are served via scoped read tokens, not session JWTs.
## [1.6.1] - 2026-06-17
### Fixed
- Global rate limiter was incorrectly applied to the chunked upload route, causing large uploads to be throttled; the upload route is now exempt.
## [1.6.0] - 2026-06-17
### Added
- File preview and editor: double-clicking a file in the browser opens it in-place as an image viewer, video/audio player, or text/code editor with syntax highlighting (CodeMirror 6, language auto-detected from filename). Text files can be edited and saved back.
- Binary detection before opening text files: an 8 KB NUL-byte and UTF-8 replacement-character heuristic prevents garbage bytes from being rendered in the editor.
- Desktop mode: a full windowing environment with draggable/resizable windows, a Dock for open applications, and a Launchpad overlay for launching apps.
- File previews open as first-class desktop windows in desktop mode.
### Fixed
- **Security:** closed a sandbox escape in the Go root-worker where a crafted path containing `..` or a symlink could break out of a Place's allowed root.
- File-preview dirty state is now tracked in a shared store, so minimizing a window via the Dock correctly prompts to save unsaved changes.
- File preview and download URLs now use short-lived scoped tokens instead of embedding the long-lived session JWT in the query string.
## [1.5.0] - 2026-06-17
### Added
- User detail panel with full profile view.
- Pagination for the user list and role list.
## [1.4.0] - 2026-06-16
### Fixed
- Theme-aware colors were missing across file browser components and the user/role management screens; all hardcoded slate colors replaced with CSS design tokens.
## [1.3.0] - 2026-06-16
### Added
- Manual "Check for updates" button in settings.
## [1.2.0] - 2026-06-16
### Added
- Maximum upload size raised to 256 GB.
### Changed
- Application renamed to HSI; database file renamed to `hsi.db`.
### Fixed
- UI contrast, container layout, and unmanaged-containers panel redesigned for clarity.
## [1.1.0] - 2026-06-16
### Added
- Responsive layout that adapts to smaller viewports.
### Removed
- Brand name removed from the main UI chrome.
## [1.0.0] - 2026-06-16
First stable release.
## [0.2.0] - 2026-03-13
### Added
- Unmanaged containers: discover and import containers that were started outside the app.
- Automatic daily update check with an in-app notification when a new version is available.
- Profile settings panel with theme toggle and configurable accent color.
- Neutral gray dark theme; accent color is now user-selectable.
## [0.1.2] - 2026-03-06
### Fixed
- `bcryptjs` was missing from runtime dependencies, breaking password hashing after a clean install.
## [0.1.1] - 2026-03-06
### Fixed
- Database seed now always runs on update to keep default data in sync.
- Database is backed up before running migrations.
## [0.1.0] - 2026-03-06
### Added
- Container management: start, stop, view logs; pin custom endpoints per container.
- Docker Compose YAML import for adding apps.
- Container status polling every 10 seconds.
- System overview panel with CPU, memory, and disk metrics.
- Role editor for fine-grained permission management.
## [0.0.2] - 2026-02-21
### Added
- Upload throughput display with a toggle to switch between single and chunked transfer modes.
## [0.0.1] - 2026-02-19
### Added
- Initial release.
[Unreleased]: https://github.com/kittyruntime/home-server-interface/compare/v1.83.0...HEAD
[1.83.0]: https://github.com/kittyruntime/home-server-interface/compare/v1.82.0...v1.83.0
[1.82.0]: https://github.com/kittyruntime/home-server-interface/compare/v1.81.0...v1.82.0
[1.81.0]: https://github.com/kittyruntime/home-server-interface/compare/v1.80.5...v1.81.0
[1.80.5]: https://github.com/kittyruntime/home-server-interface/compare/v1.80.4...v1.80.5
[1.80.4]: https://github.com/kittyruntime/home-server-interface/compare/v1.80.3...v1.80.4
[1.80.3]: https://github.com/kittyruntime/home-server-interface/compare/v1.80.2...v1.80.3
[1.80.2]: https://github.com/kittyruntime/home-server-interface/compare/v1.80.1...v1.80.2
[1.80.1]: https://github.com/kittyruntime/home-server-interface/compare/v1.80.0...v1.80.1
[1.80.0]: https://github.com/kittyruntime/home-server-interface/compare/v1.79.3...v1.80.0
[1.79.3]: https://github.com/kittyruntime/home-server-interface/compare/v1.79.2...v1.79.3
[1.79.2]: https://github.com/kittyruntime/home-server-interface/compare/v1.79.1...v1.79.2
[1.79.1]: https://github.com/kittyruntime/home-server-interface/compare/v1.79.0...v1.79.1
[1.79.0]: https://github.com/kittyruntime/home-server-interface/compare/v1.78.4...v1.79.0
[1.78.4]: https://github.com/kittyruntime/home-server-interface/compare/v1.78.3...v1.78.4
[1.78.3]: https://github.com/kittyruntime/home-server-interface/compare/v1.78.2...v1.78.3
[1.78.2]: https://github.com/kittyruntime/home-server-interface/compare/v1.78.1...v1.78.2
[1.78.1]: https://github.com/kittyruntime/home-server-interface/compare/v1.78.0...v1.78.1
[1.78.0]: https://github.com/kittyruntime/home-server-interface/compare/v1.77.1...v1.78.0
[1.77.1]: https://github.com/kittyruntime/home-server-interface/compare/v1.77.0...v1.77.1
[1.77.0]: https://github.com/kittyruntime/home-server-interface/compare/v1.76.0...v1.77.0
[1.76.0]: https://github.com/kittyruntime/home-server-interface/compare/v1.75.0...v1.76.0
[1.75.0]: https://github.com/kittyruntime/home-server-interface/compare/v1.74.0...v1.75.0
[1.74.0]: https://github.com/kittyruntime/home-server-interface/compare/v1.73.0...v1.74.0
[1.73.0]: https://github.com/kittyruntime/home-server-interface/compare/v1.72.0...v1.73.0
[1.72.0]: https://github.com/kittyruntime/home-server-interface/compare/v1.71.0...v1.72.0
[1.71.0]: https://github.com/kittyruntime/home-server-interface/compare/v1.70.0...v1.71.0
[1.70.0]: https://github.com/kittyruntime/home-server-interface/compare/v1.69.0...v1.70.0
[1.69.0]: https://github.com/kittyruntime/home-server-interface/compare/v1.68.2...v1.69.0
[1.68.2]: https://github.com/kittyruntime/home-server-interface/compare/v1.68.1...v1.68.2
[1.68.1]: https://github.com/kittyruntime/home-server-interface/compare/v1.68.0...v1.68.1
[1.68.0]: https://github.com/kittyruntime/home-server-interface/compare/v1.67.0...v1.68.0
[1.67.0]: https://github.com/kittyruntime/home-server-interface/compare/v1.66.0...v1.67.0
[1.66.0]: https://github.com/kittyruntime/home-server-interface/compare/v1.65.0...v1.66.0
[1.65.0]: https://github.com/kittyruntime/home-server-interface/compare/v1.64.2...v1.65.0
[1.64.2]: https://github.com/kittyruntime/home-server-interface/compare/v1.64.1...v1.64.2
[1.64.1]: https://github.com/kittyruntime/home-server-interface/compare/v1.64.0...v1.64.1
[1.64.0]: https://github.com/kittyruntime/home-server-interface/compare/v1.63.0...v1.64.0
[1.63.0]: https://github.com/kittyruntime/home-server-interface/compare/v1.62.1...v1.63.0
[1.62.1]: https://github.com/kittyruntime/home-server-interface/compare/v1.62.0...v1.62.1
[1.62.0]: https://github.com/kittyruntime/home-server-interface/compare/v1.61.0...v1.62.0
[1.61.0]: https://github.com/kittyruntime/home-server-interface/compare/v1.60.0...v1.61.0
[1.60.0]: https://github.com/kittyruntime/home-server-interface/compare/v1.59.0...v1.60.0
[1.59.0]: https://github.com/kittyruntime/home-server-interface/compare/v1.58.0...v1.59.0
[1.58.0]: https://github.com/kittyruntime/home-server-interface/compare/v1.57.0...v1.58.0
[1.57.0]: https://github.com/kittyruntime/home-server-interface/compare/v1.56.0...v1.57.0
[1.56.0]: https://github.com/kittyruntime/home-server-interface/compare/v1.55.1...v1.56.0
[1.55.1]: https://github.com/kittyruntime/home-server-interface/compare/v1.55.0...v1.55.1
[1.55.0]: https://github.com/kittyruntime/home-server-interface/compare/v1.54.0...v1.55.0
[1.54.0]: https://github.com/kittyruntime/home-server-interface/compare/v1.53.1...v1.54.0
[1.53.1]: https://github.com/kittyruntime/home-server-interface/compare/v1.53.0...v1.53.1
[1.53.0]: https://github.com/kittyruntime/home-server-interface/compare/v1.52.0...v1.53.0
[1.52.0]: https://github.com/kittyruntime/home-server-interface/compare/v1.51.0...v1.52.0
[1.51.0]: https://github.com/kittyruntime/home-server-interface/compare/v1.50.3...v1.51.0
[1.50.3]: https://github.com/kittyruntime/home-server-interface/compare/v1.50.2...v1.50.3
[1.50.2]: https://github.com/kittyruntime/home-server-interface/compare/v1.50.1...v1.50.2
[1.50.1]: https://github.com/kittyruntime/home-server-interface/compare/v1.50.0...v1.50.1
[1.50.0]: https://github.com/kittyruntime/home-server-interface/compare/v1.49.0...v1.50.0
[1.49.0]: https://github.com/kittyruntime/home-server-interface/compare/v1.48.1...v1.49.0
[1.48.1]: https://github.com/kittyruntime/home-server-interface/compare/v1.48.0...v1.48.1
[1.48.0]: https://github.com/kittyruntime/home-server-interface/compare/v1.47.0...v1.48.0
[1.47.0]: https://github.com/kittyruntime/home-server-interface/compare/v1.46.0...v1.47.0
[1.46.0]: https://github.com/kittyruntime/home-server-interface/compare/v1.45.0...v1.46.0
[1.45.0]: https://github.com/kittyruntime/home-server-interface/compare/v1.44.1...v1.45.0
[1.44.1]: https://github.com/kittyruntime/home-server-interface/compare/v1.44.0...v1.44.1
[1.44.0]: https://github.com/kittyruntime/home-server-interface/compare/v1.43.0...v1.44.0
[1.43.0]: https://github.com/kittyruntime/home-server-interface/compare/v1.42.0...v1.43.0
[1.42.0]: https://github.com/kittyruntime/home-server-interface/compare/v1.41.0...v1.42.0
[1.41.0]: https://github.com/kittyruntime/home-server-interface/compare/v1.40.1...v1.41.0
[1.40.1]: https://github.com/kittyruntime/home-server-interface/compare/v1.40.0...v1.40.1
[1.40.0]: https://github.com/kittyruntime/home-server-interface/compare/v1.39.0...v1.40.0
[1.39.0]: https://github.com/kittyruntime/home-server-interface/compare/v1.38.0...v1.39.0
[1.38.0]: https://github.com/kittyruntime/home-server-interface/compare/v1.37.0...v1.38.0
[1.37.0]: https://github.com/kittyruntime/home-server-interface/compare/v1.36.0...v1.37.0
[1.36.0]: https://github.com/kittyruntime/home-server-interface/compare/v1.35.0...v1.36.0
[1.35.0]: https://github.com/kittyruntime/home-server-interface/compare/v1.34.1...v1.35.0
[1.34.1]: https://github.com/kittyruntime/home-server-interface/compare/v1.34.0...v1.34.1
[1.34.0]: https://github.com/kittyruntime/home-server-interface/compare/v1.33.1...v1.34.0
[1.33.1]: https://github.com/kittyruntime/home-server-interface/compare/v1.33.0...v1.33.1
[1.33.0]: https://github.com/kittyruntime/home-server-interface/compare/v1.32.0...v1.33.0
[1.32.0]: https://github.com/kittyruntime/home-server-interface/compare/v1.31.1...v1.32.0
[1.31.1]: https://github.com/kittyruntime/home-server-interface/compare/v1.31.0...v1.31.1
[1.31.0]: https://github.com/kittyruntime/home-server-interface/compare/v1.30.0...v1.31.0
[1.30.0]: https://github.com/kittyruntime/home-server-interface/compare/v1.29.2...v1.30.0
[1.29.2]: https://github.com/kittyruntime/home-server-interface/compare/v1.29.1...v1.29.2
[1.29.1]: https://github.com/kittyruntime/home-server-interface/compare/v1.29.0...v1.29.1
[1.29.0]: https://github.com/kittyruntime/home-server-interface/compare/v1.28.6...v1.29.0
[1.28.6]: https://github.com/kittyruntime/home-server-interface/compare/v1.28.5...v1.28.6
[1.28.5]: https://github.com/kittyruntime/home-server-interface/compare/v1.28.4...v1.28.5
[1.28.4]: https://github.com/kittyruntime/home-server-interface/compare/v1.28.3...v1.28.4
[1.28.3]: https://github.com/kittyruntime/home-server-interface/compare/v1.28.2...v1.28.3
[1.28.2]: https://github.com/kittyruntime/home-server-interface/compare/v1.28.1...v1.28.2
[1.28.1]: https://github.com/kittyruntime/home-server-interface/compare/v1.28.0...v1.28.1
[1.28.0]: https://github.com/kittyruntime/home-server-interface/compare/v1.27.2...v1.28.0
[1.27.2]: https://github.com/kittyruntime/home-server-interface/compare/v1.27.1...v1.27.2
[1.27.1]: https://github.com/kittyruntime/home-server-interface/compare/v1.27.0...v1.27.1
[1.27.0]: https://github.com/kittyruntime/home-server-interface/compare/v1.26.0...v1.27.0
[1.26.0]: https://github.com/kittyruntime/home-server-interface/compare/v1.25.0...v1.26.0
[1.25.0]: https://github.com/kittyruntime/home-server-interface/compare/v1.24.0...v1.25.0
[1.24.0]: https://github.com/kittyruntime/home-server-interface/compare/v1.23.2...v1.24.0
[1.23.2]: https://github.com/kittyruntime/home-server-interface/compare/v1.23.1...v1.23.2
[1.23.1]: https://github.com/kittyruntime/home-server-interface/compare/v1.23.0...v1.23.1
[1.23.0]: https://github.com/kittyruntime/home-server-interface/compare/v1.22.0...v1.23.0
[1.22.0]: https://github.com/kittyruntime/home-server-interface/compare/v1.21.0...v1.22.0
[1.21.0]: https://github.com/kittyruntime/home-server-interface/compare/v1.20.0...v1.21.0
[1.20.0]: https://github.com/kittyruntime/home-server-interface/compare/v1.19.1...v1.20.0
[1.19.1]: https://github.com/kittyruntime/home-server-interface/compare/v1.19.0...v1.19.1
[1.19.0]: https://github.com/kittyruntime/home-server-interface/compare/v1.18.2...v1.19.0
[1.18.2]: https://github.com/kittyruntime/home-server-interface/compare/v1.18.1...v1.18.2
[1.18.1]: https://github.com/kittyruntime/home-server-interface/compare/v1.18.0...v1.18.1
[1.18.0]: https://github.com/kittyruntime/home-server-interface/compare/v1.17.1...v1.18.0
[1.17.1]: https://github.com/kittyruntime/home-server-interface/compare/v1.17.0...v1.17.1
[1.17.0]: https://github.com/kittyruntime/home-server-interface/compare/v1.16.0...v1.17.0
[1.16.0]: https://github.com/kittyruntime/home-server-interface/compare/v1.15.1...v1.16.0
[1.15.1]: https://github.com/kittyruntime/home-server-interface/releases/tag/v1.15.1
[minor]: https://github.com/kittyruntime/home-server-interface/compare/v1.14.0...vminor
[1.14.0]: https://github.com/kittyruntime/home-server-interface/compare/v1.13.0...v1.14.0
[1.13.0]: https://github.com/kittyruntime/home-server-interface/compare/v1.12.3...v1.13.0
[1.12.3]: https://github.com/kittyruntime/home-server-interface/compare/v1.12.2...v1.12.3
[1.12.2]: https://github.com/kittyruntime/home-server-interface/compare/v1.12.1...v1.12.2
[1.12.1]: https://github.com/kittyruntime/home-server-interface/compare/v1.12.0...v1.12.1
[1.12.0]: https://github.com/kittyruntime/home-server-interface/compare/v1.11.5...v1.12.0
[1.11.5]: https://github.com/kittyruntime/home-server-interface/compare/v1.11.4...v1.11.5
[1.11.4]: https://github.com/kittyruntime/home-server-interface/compare/v1.11.3...v1.11.4
[1.11.3]: https://github.com/kittyruntime/home-server-interface/compare/v1.11.2...v1.11.3
[1.11.2]: https://github.com/kittyruntime/home-server-interface/compare/v1.11.1...v1.11.2
[1.11.1]: https://github.com/kittyruntime/home-server-interface/compare/v1.11.0...v1.11.1
[1.11.0]: https://github.com/kittyruntime/home-server-interface/compare/v1.10.2...v1.11.0
[1.10.2]: https://github.com/kittyruntime/home-server-interface/compare/v1.10.1...v1.10.2
[1.10.1]: https://github.com/kittyruntime/home-server-interface/compare/v1.10.0...v1.10.1
[1.10.0]: https://github.com/kittyruntime/home-server-interface/compare/v1.9.0...v1.10.0
[1.9.0]: https://github.com/kittyruntime/home-server-interface/compare/v1.8.2...v1.9.0
[1.8.2]: https://github.com/kittyruntime/home-server-interface/compare/v1.8.1...v1.8.2
[1.8.1]: https://github.com/kittyruntime/home-server-interface/compare/v1.8.0...v1.8.1
[1.8.0]: https://github.com/kittyruntime/home-server-interface/compare/v1.7.1...v1.8.0
[1.7.1]: https://github.com/kittyruntime/home-server-interface/compare/v1.7.0...v1.7.1
[1.7.0]: https://github.com/kittyruntime/home-server-interface/compare/v1.6.1...v1.7.0
[1.6.1]: https://github.com/kittyruntime/home-server-interface/compare/v1.6.0...v1.6.1
[1.6.0]: https://github.com/kittyruntime/home-server-interface/compare/v1.5.0...v1.6.0
[1.5.0]: https://github.com/kittyruntime/home-server-interface/compare/v1.4.0...v1.5.0
[1.4.0]: https://github.com/kittyruntime/home-server-interface/compare/v1.3.0...v1.4.0
[1.3.0]: https://github.com/kittyruntime/home-server-interface/compare/v1.2.0...v1.3.0
[1.2.0]: https://github.com/kittyruntime/home-server-interface/compare/v1.1.0...v1.2.0
[1.1.0]: https://github.com/kittyruntime/home-server-interface/compare/v1.0.0...v1.1.0
[1.0.0]: https://github.com/kittyruntime/home-server-interface/compare/v0.2.0...v1.0.0
[0.2.0]: https://github.com/kittyruntime/home-server-interface/compare/v0.1.2...v0.2.0
[0.1.2]: https://github.com/kittyruntime/home-server-interface/compare/v0.1.1...v0.1.2
[0.1.1]: https://github.com/kittyruntime/home-server-interface/compare/v0.1.0...v0.1.1
[0.1.0]: https://github.com/kittyruntime/home-server-interface/compare/v0.0.2...v0.1.0
[0.0.2]: https://github.com/kittyruntime/home-server-interface/compare/v0.0.1...v0.0.2
[0.0.1]: https://github.com/kittyruntime/home-server-interface/releases/tag/v0.0.1