Changelog
🔧 Chore
- Migrate to TypeScript 7.0 RC (Go-based
tsgocompiler):- Updated peer dependency to
typescript: ^7.0.1-rc - Updated
@typescript/native-previewto7.0.0-dev.20260701.1 - Updated
tsconfig.json, migration docs, and instruction files - Patches
esModuleInteropdefault and other TS 7.0 defaults
- Updated peer dependency to
✨ Features
- HDIdle per-disk model (Lab Mode feature): Replaced the global HDIdle
enable/disable toggle with a fully per-disk configuration model gated behind
Lab Mode (experimental_lab_mode=true). Key changes:- Per-disk enable/disable: each physical disk has its own HDIdle record
(enabled: yes|custom|no); the service runs automatically when ≥1 disk is
enabled. The five globalSettings.hdidle_*fields have been removed. - Dashboard suggestion badge: HDDs that have not yet been configured show
an inline "Enable HDIdle?" badge in the disk I/O table (visible only in Lab
Mode). The badge provides Ignore (persistssuggestion_ignored=true)
and Enable (navigates to the per-disk card in the Volumes page). - Non-rotational guard: enabling HDIdle on an SSD/NVMe or a device with
unknown rotational type opens a confirm dialog; accepting persists
force_enabled=trueso the warning does not repeat. The backend returns
HTTP 409 if the flag is missing, preventing accidental spindowns of SSDs. - Rotational detection:
Disk.is_rotationaltri-state (HDD/SSD/unknown)
is now derived from/sys/block/<dev>/queue/rotational(sysfs primary) with
SMARTrotation_rateas fallback. Unknown (e.g. USB enclosures) returns
nil— treated as non-rotational for safety. - Ignore-suggestion endpoint:
POST /api/disk/{id}/hdidle/ignore-suggestion
persists the badge dismissal per disk. - Adaptive polling: the monitor goroutine polls every 60s when ≥1 disk is
spun-up and slows to 5min when all monitored disks are already spun-down.
The goroutine is never started when zero disks are enabled. - readOnly threading: the per-disk settings card now correctly propagates
thereadOnlyflag fromVolumeDetailsPanel.
- Per-disk enable/disable: each physical disk has its own HDIdle record
- mDNS Registration: Added optional mDNS registration of the SRAT service for local network discovery. When enabled, the backend registers a
_srat._tcpservice with the system mDNS responder, advertising the service name, port, and metadata. This allows compatible clients to discover the SRAT service on the local network without manual configuration. The feature is controlled by a newMDNSRegistrationboolean setting in the advanced settings section.
🐛 Bug Fixes
- HDIdle service permanently broken after first Stop():
Stop()no longer
leavesstopChannon-nil after close. SubsequentStart()calls now succeed
(idempotent). Fixes a latent bug where the service refused to restart after
any config PUT. - Nested mutex deadlock in
GetDeviceStatus,GetProcessStatus, and
observeDiskActivity: calls toIsRunning()under an existing lock now read
stopChandirectly to avoid the deadlock inherent in re-acquiring an
RWMutexthat is not guaranteed reentrant. GetDeviceConfigreturned HTTP 500 when service disabled: the guard
!s.config.Enabled → ErrorHDIdleNotSupportedhas been removed. The config
endpoint is now always available for inspection/configuration regardless of
whether the monitor goroutine is running.disk_idinjected unsanitised into file path:hdidle_handler.gowas
naïvely prefixing everydisk_idwith/dev/disk/by-id/without validation.
Replaced byHDIdleServiceInterface.ResolveDevicePath()which probes three
candidate paths (absolute/dev/…, by-id, kernel name) and rejects inputs
containing path-traversal characters.
🔄 Breaking Changes
Settings.hdidle_enabled,hdidle_default_idle_time,hdidle_default_command_type,
hdidle_default_power_condition, andhdidle_ignore_spin_down_detectionhave
been removed from the API and the DB (migration 00017 drops the
corresponding rows from thepropertiestable).POST /api/hdidle/startandPOST /api/hdidle/stophave been removed.
The service lifecycle is now fully automatic (driven by the per-disk records).PATCH /api/disk/{id}/hdidle/confighas been removed (it was a dead spec
entry with no handler).
🏗 Chore
- DB migration
00017(drop_global_hdidle_properties): deletes the five
obsolete global HDIdle property rows. Down migration re-seeds them with their
original defaults for dev/test rollback. events.PowerEventnow carries aKind PowerEventKinddiscriminant field
(configorstatus) so subscribers can branch without comparing zero-values.- Two new
dto.HDIdleDevicefields (SuggestionIgnored,ForceEnabled) and
matching GORM/generated-layer/converter updates. Schema columns are added by
GORMAutoMigrateon the next startup — no manual migration needed. openapi.jsonis not regenerated in this branch — it requires a working
Go toolchain andgo run ./cmd/srat-openapi. CI must run
go run ./cmd/srat-openapi -dir=backend/docsand
cd frontend && bun run gen:apibefore merging to keep generated artifacts in
sync. Three hand-edited generated files (config_to_dto_conv_gen.go,
dto_to_dbom_conv_gen.go,g/hdidle_device_config.go) are aligned with their
source directives — ago generate ./...run will produce the same output.
🔧 Maintenance
- Multi-variant server release: Release archives now ship three
srat-servervariants —srat-server-static(fully static, zero shared-library dependencies),srat-server-musl(dynamic linked against musl libc, built via Zig), andsrat-server-glib(dynamic linked against glibc, built via CGO). Thesrat-serverentry in the archive is a symlink that defaults tosrat-server-static; the upgrade process automatically updates it to the best available variant for the running system (musl → glibc → static).srat-openapiis no longer included in release archives.srat-cliis always statically linked.
What's Changed
- 📚 docs: auto-fix documentation formatting and TOC by @github-actions[bot] in #670
- ⬆️ Update @biomejs/biome to v2.4.16 by @renovate[bot] in #673
- ⬆️ Update dependency npm:@typescript/native-preview to v7.0.0-dev.20260527.2 by @renovate[bot] in #675
- ⬆️ Update dependency hk to v1.46.0 by @renovate[bot] in #678
- ⬆️ Update dependency ruff to v0.15.15 by @renovate[bot] in #676
- ⬆️ Update dependency act to v0.2.89 by @renovate[bot] in #674
- ⬆️ Update dependency npm:@typescript/native-preview to v7.0.0-dev.20260607.1 by @renovate[bot] in #685
- ⬆️ Update BackEnd by @renovate[bot] in #683
- ⬆️ Update dependency go to v1.26.4 by @renovate[bot] in #684
- ⬆️ Update dependency ruff to v0.15.16 by @renovate[bot] in #686
- ⬆️ Update FrontEnd by @renovate[bot] in #687
- ⬆️ Update CI/CD to v7 by @renovate[bot] in #688
- feat(release): multi-variant server builds (static, musl, glibc) by @dianlight in #672
- ⬆️ Update ghcr.io/devcontainers/features/copilot-cli Docker tag to v1.1.3 by @renovate[bot] in #677
- ⬆️ Update CI/CD by @renovate[bot] in #663
- ⬆️ Update dependency npm:@typescript/native-preview to v7.0.0-dev.20260609.1 by @renovate[bot] in #692
- fix(hdidle): per-disk rework + review bug fixes by @dianlight in #690
- ⬆️ Update BackEnd by @renovate[bot] in #693
- 📚 docs: auto-fix documentation formatting and TOC by @github-actions[bot] in #691
- ⬆️ Update dependency prettier to v3.8.4 by @renovate[bot] in #697
- ⬆️ Update BackEnd by @renovate[bot] in #695
- ⬆️ Update dependency ruff to v0.15.17 by @renovate[bot] in #699
- ⬆️ Update mcr.microsoft.com/devcontainers/go:2-1.26-bookworm Docker digest to 85fff53 by @renovate[bot] in #694
- ⬆️ Update dependency npm:@typescript/native-preview to v7.0.0-dev.20260615.1 by @renovate[bot] in #696
- ⬆️ Update dependency python to v3.14.6 by @renovate[bot] in #698
- ⬆️ Update dependency hk to v1.48.0 by @renovate[bot] in #700
- ⬆️ Update dependency npm:doctoc to v2.5.0 by @renovate[bot] in #701
- ⬆️ Update FrontEnd by @renovate[bot] in #703
- ⬆️ Update dependency vale to v3.15.1 by @renovate[bot] in #702
- ⬆️ Update FrontEnd to v20.10.5 by @renovate[bot] in #706
- ⬆️ Update BackEnd by @renovate[bot] in #707
- feat: implement server mDNS registration over WebSocket with HA reconnect hardening by @dianlight in #679
- 📚 docs: auto-fix documentation formatting and TOC by @github-actions[bot] in #708
- ⬆️ Update CI/CD (major) by @renovate[bot] in #704
- ⬆️ Update dependency jq to v1.8.2 by @renovate[bot] in #710
- ⬆️ Update BackEnd by @renovate[bot] in #709
- ⬆️ Update dependency ruff to v0.15.18 by @renovate[bot] in #712
- ⬆️ Update dependency npm:@typescript/native-preview to v7.0.0-dev.20260620.1 by @renovate[bot] in #711
- ⬆️ Lock file maintenance FrontEnd by @renovate[bot] in #667
- ⬆️ Update actions/checkout to v7 by @renovate[bot] in #713
- ⬆️ Update js-yaml to v5 by @renovate[bot] in #715
- ⬆️ Update fastify-plugin to v6 by @renovate[bot] in #705
- ⬆️ Update @happy-dom/global-registrator to v20.10.6 by @renovate[bot] in #717
- ⬆️ Update dependency npm:@typescript/native-preview to v7.0.0-dev.20260622.1 by @renovate[bot] in #718
- ⬆️ Update gorm.io/gorm to v1.31.2 by @renovate[bot] in #719
- ⬆️ Update CI/CD by @renovate[bot] in #716
- 🐛 fix(be): Add macOS development compatibility support by @dianlight in #720
- ⬆️ Update FrontEnd by @renovate[bot] in #726
- ⬆️ Update dependency npm:@typescript/native-preview to v7.0.0-dev.20260626.1 by @renovate[bot] in #723
- ⬆️ Update dependency prettier to v3.8.5 by @renovate[bot] in #724
- ⬆️ Update npm:@redocly/cli to v2.35.1 by @renovate[bot] in #727
- ⬆️ Update dependency ruff to v0.15.20 by @renovate[bot] in #725
- 📚 docs: auto-fix documentation formatting and TOC by @github-actions[bot] in #722
- ⬆️ Update dependency npm:@typescript/native-preview to v7.0.0-dev.20260627.2 by @renovate[bot] in #729
- ⬆️ Update github.com/prometheus/procfs to v0.21.0 by @renovate[bot] in #731
- ⬆️ Update dependency prettier to v3.9.0 by @renovate[bot] in #730
- Added
maxLength:128toSharedResource.Nameby @opencode-agent[bot] in #734 - ⬆️ Update BackEnd by @renovate[bot] in #739
- ⬆️ Update dependency prettier to v3.9.1 by @renovate[bot] in #742
- ⬆️ Update mcr.microsoft.com/devcontainers/go:2-1.26-bookworm Docker digest to 090a56c by @renovate[bot] in #740
- ⬆️ Update dependency npm:@typescript/native-preview to v7.0.0-dev.20260628.1 by @renovate[bot] in #741
- Disk symlink mismatch → realpath fallback by @opencode-agent[bot] in #738
- 📝 CodeRabbit Chat: Reduce lock scope in HDIdleService.Start config loading by @coderabbitai[bot] in #747
- 🏗️ build: Migrate frontend to TypeScript 7.0 RC by @dianlight in #743
- 📝 CodeRabbit Chat: Update TypeScript migration instructions for ES2022 by @coderabbitai[bot] in #748
- Empty password fix + tests by @opencode-agent[bot] in #744
- ⬆️ Update dependency npm:@typescript/native-preview to v7.0.0-dev.20260629.1 by @renovate[bot] in #749
- ⬆️ Update dependency prettier to v3.9.3 by @renovate[bot] in #750
- 📝 CodeRabbit Chat: Keep HDIdleDiskSettings controls reachable after toggle by @coderabbitai[bot] in #751
- 🔄 synced file(s) with dianlight/opencode-actions by @dianlight in #752
- ⬆️ Lock file maintenance by @renovate[bot] in #721
- ⬆️ Update dorny/paths-filter to 7b450ff by @renovate[bot] in #753
- ⬆️ Update dependency prettier to v3.9.4 by @renovate[bot] in #754
- Auto-save HDIdle YES/NO toggle at line 202 by @opencode-agent[bot] in #737
- 🔄 synced file(s) with dianlight/opencode-actions by @dianlight in #755
- ⬆️ Update @biomejs/biome to v2.5.2 by @renovate[bot] in #758
- ⬆️ Update dependency npm:@typescript/native-preview to v7.0.0-dev.20260703.1 by @renovate[bot] in #760
- ⬆️ Update BackEnd by @renovate[bot] in #759
- 🔄 synced file(s) with dianlight/opencode-actions by @dianlight in #757
- ⬆️ Update dependency markdownlint-cli2 to v0.23.0 by @renovate[bot] in #762
- ⬆️ Update dependency hk to v1.49.0 by @renovate[bot] in #761
- ⬆️ Update dependency npm:@typescript/native-preview to v7.0.0-dev.20260704.1 by @renovate[bot] in #764
- ⬆️ Update dependency npm:@typescript/native-preview to v7.0.0-dev.20260705.1 by @renovate[bot] in #765
- ⬆️ Update BackEnd by @renovate[bot] in #766
- ⬆️ Update github.com/oapi-codegen/oapi-codegen/v2 to v2.7.2 by @renovate[bot] in #767
- ⬆️ Update FrontEnd to v4.1.10 by @renovate[bot] in #769
- ⬆️ Update dependency npm:@typescript/native-preview to v7.0.0-dev.20260706.1 by @renovate[bot] in #768
- ⬆️ Update oapi-codegen to v2.7.2 by @renovate[bot] in #770
- ⬆️ Update dependency hk to v1.50.0 by @renovate[bot] in #771
- ⬆️ Update dependency npm:@typescript/native-preview to v7.0.0-dev.20260707.2 by @renovate[bot] in #772
- ⬆️ Update msw to v2.14.7 by @renovate[bot] in #774
- ⬆️ Update dependency go to v1.26.5 by @renovate[bot] in #773
- ⬆️ Update msw to v2.15.0 by @renovate[bot] in #775
- Feat/hdidle per disk rework by @dianlight in #689
- ⬆️ Pin dependencies by @renovate[bot] in #777
- ⬆️ Update FrontEnd by @renovate[bot] in #779
- ⬆️ Update CI/CD by @renovate[bot] in #780
- ⬆️ Update npm:@redocly/cli to v2.38.0 by @renovate[bot] in #781
- ⬆️ Update dependency pkl to v0.32.0 by @renovate[bot] in #782
- ⬆️ Update dependency ruff to v0.15.20 by @renovate[bot] in #778
- ⬆️ Lock file maintenance by @renovate[bot] in #756
- 📚 docs: auto-fix documentation formatting and TOC by @github-actions[bot] in #776
- chore(release): 2026.7.0-rc11 by @github-actions[bot] in #783
New Contributors
- @opencode-agent[bot] made their first contribution in #734
- @coderabbitai[bot] made their first contribution in #747
Full Changelog: 2026.5.0-rc9...2026.7.0-rc11