Ctrl K
ComunidadGuías…

CHANGELOG.md

Rama main · réplica de lectura del repositorio original.

Archivo original ↗Preguntar a KiBot
# 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