chore: bump version to 3.3.0

The Device Inventory row becomes the source of a device's facts, and the
device columns are dropped from `nodes` in a one-way migration on first start,
so the release notes lead with a Breaking section: what moved, what the
migration does, when it refuses to drop, and that `homelab.db.back-3.3.0` —
written before any migration runs — is the way back.

ha-relevant: no
This commit is contained in:
Pouzor
2026-08-14 10:59:51 +02:00
parent 9fe130851e
commit 779e09ecb8
4 changed files with 52 additions and 4 deletions
+48
View File
@@ -5,6 +5,54 @@ All notable changes to **Homelable** are documented here.
The format is loosely based on [Keep a Changelog](https://keepachangelog.com/),
and this project adheres to [Semantic Versioning](https://semver.org/).
## [3.3.0] - 2026-08-14
### Breaking
- **The Device Inventory row is now the source of a device's facts.** A canvas node
owns how a device is drawn (position, size, colours, icon, handles, nesting);
what the device *is* — addresses, services, properties, notes, hardware, check
method, live status — lives on its `device_inventory` row, named by
`nodes.device_id`. One device therefore reads the same on every canvas it
appears on, and editing it anywhere updates it everywhere. (#339)
- **Migration on first start of 3.3.0, one way.** The device columns are copied
from `nodes` into `device_inventory`, then dropped from `nodes` in a table
rebuild. Nodes drawing the same device are linked to one row (by IEEE, then IP,
then MAC). The API still reports the node and its facts together, so REST and
MCP clients see the same shape as before. A downgrade to 3.2.x on a migrated
database will not work. The startup backup (`homelab.db.back-3.3.0`, written
before any migration runs) is the way back. (#339)
- The drop is skipped, and logged, if any non-furniture node is still unlinked
after the backfill — the old columns are that node's only remaining copy of its
facts. (#339)
- `/ws/status` messages now carry `device_id` and the `node_ids` drawing it,
in place of a single `node_id`. (#339)
### Features
- Show and edit a device from the Device Inventory: the detail sheet is grouped
by what a reader is after, and every field of the row is editable in place. (#339)
- Per-service host override: a service can be checked against a host of its own
rather than the device's. (#338)
- Nodes accept 0 connection points on their top and bottom edges. (#336)
- New device type: KVM switch. (#335)
### Fixes
- A partial `PATCH /api/v1/nodes/{id}` no longer blanks the list it did not send —
properties and services are replaced one by one. (#339)
- An inventory card reads the device's curated type rather than the suggestion
discovery left on it. (#339)
- YAML import files hardware specs as device properties. (#339)
- Alignment guides show for nodes inside groups and containers. (#337)
- A group child is seeded near its group, and groups refuse to nest. (#338)
- A node stays inside its group when edited. (#338)
- A comma-listed host override is split, and the wire host is typed. (#338)
- The status check interval applies to the running scheduler. (#319)
- `get_canvas` on the MCP server reported only an id and a node type: it slimmed
a React Flow shape the API has never sent. It now reads the facts where the API
puts them. (#339)
## [3.2.0] - 2026-08-10
### Features
+1 -1
View File
@@ -1 +1 @@
3.2.0
3.3.0
+2 -2
View File
@@ -1,12 +1,12 @@
{
"name": "frontend",
"version": "3.2.0",
"version": "3.3.0",
"lockfileVersion": 3,
"requires": true,
"packages": {
"": {
"name": "frontend",
"version": "3.2.0",
"version": "3.3.0",
"dependencies": {
"@base-ui/react": "^1.2.0",
"@dagrejs/dagre": "^2.0.4",
+1 -1
View File
@@ -1,7 +1,7 @@
{
"name": "frontend",
"private": true,
"version": "3.2.0",
"version": "3.3.0",
"type": "module",
"scripts": {
"dev": "vite",