CHANGELOG.md
Rama main · réplica de lectura del repositorio original.
# Changelog
All notable changes to RootGuard are documented here, generated from the
commit history at release time. See [ROADMAP.md](ROADMAP.md) for what's
still ahead.
## [1.0.12] - 2026-11-10
### Fixed
- Clear the nightly findings from 2026-11-09 ([#806](https://github.com/foxly-it/rootguard/pull/806))
- Stop failing after a successful install ([#807](https://github.com/foxly-it/rootguard/pull/807))
- Close the expiry tracking issue once nothing is due ([#808](https://github.com/foxly-it/rootguard/pull/808))
### Maintenance
- Bump the npm group ([#802](https://github.com/foxly-it/rootguard/pull/802))
- Bump debian ([#804](https://github.com/foxly-it/rootguard/pull/804))
- Bump jsdom in /rootguard-webapp/frontend ([#803](https://github.com/foxly-it/rootguard/pull/803))
- Bump the actions group across 1 directory with 2 updates ([#805](https://github.com/foxly-it/rootguard/pull/805))
## [1.0.11] - 2026-11-06
### Fixed
- Review the new sqlite and zlib findings ([#793](https://github.com/foxly-it/rootguard/pull/793))
- Update AdGuard Home to v0.107.80 ([#796](https://github.com/foxly-it/rootguard/pull/796))
- Override minimatch to close GHSA-g3hv-75wg-m249 ([#797](https://github.com/foxly-it/rootguard/pull/797))
- Follow AdGuard Home v1.0's filter route, test UI and updates ([#798](https://github.com/foxly-it/rootguard/pull/798))
- Narrow the Go exceptions to cosign, recheck the Debian ones ([#799](https://github.com/foxly-it/rootguard/pull/799))
- Offer new AdGuard Home pins on existing installations ([#800](https://github.com/foxly-it/rootguard/pull/800))
## [1.0.10] - 2026-11-05
### Fixed
- Clear the image's HIGH findings, recheck GO-2026-5932 ([#792](https://github.com/foxly-it/rootguard/pull/792))
### Maintenance
- Bump the npm group ([#787](https://github.com/foxly-it/rootguard/pull/787))
- Bump the base-images group across 6 directories with 3 updates ([#788](https://github.com/foxly-it/rootguard/pull/788))
- Bump docker/login-action ([#789](https://github.com/foxly-it/rootguard/pull/789))
- Refresh drifted package pins ([#791](https://github.com/foxly-it/rootguard/pull/791))
## [1.0.9] - 2026-10-31
### Fixed
- Unbreak Unbound CI on Ubuntu 26 runners, pin libcurl 8.23.0-r0 ([#786](https://github.com/foxly-it/rootguard/pull/786))
### Maintenance
- Refresh drifted package pins ([#780](https://github.com/foxly-it/rootguard/pull/780))
- Bump the npm group ([#781](https://github.com/foxly-it/rootguard/pull/781))
- Bump the base-images group across 6 directories with 4 updates ([#782](https://github.com/foxly-it/rootguard/pull/782))
- Bump actions/setup-python ([#783](https://github.com/foxly-it/rootguard/pull/783))
## [1.0.8] - 2026-10-24
### Fixed
- Pin brotli-libs 1.2.1-r0, update undici and zod (#778) ([#779](https://github.com/foxly-it/rootguard/pull/779))
## [1.0.7] - 2026-10-23
### CI
- Propose a security release when the published one has fixed findings (#772) ([#773](https://github.com/foxly-it/rootguard/pull/773))
- Run the pin bot every 6 hours (#775) ([#776](https://github.com/foxly-it/rootguard/pull/776))
### Documentation
- Release history for v1.0.6 ([#771](https://github.com/foxly-it/rootguard/pull/771))
### Maintenance
- Refresh drifted package pins ([#774](https://github.com/foxly-it/rootguard/pull/774))
- Refresh drifted package pins ([#777](https://github.com/foxly-it/rootguard/pull/777))
## [1.0.6] - 2026-10-21
### Added
- Move runtime stage to distroless/static-debian12 (#695) ([#696](https://github.com/foxly-it/rootguard/pull/696))
- Bump docker:29-cli base, narrow bundled-binary suppressions (#703) ([#706](https://github.com/foxly-it/rootguard/pull/706))
### CI
- Push and open the fix PR with PIN_REFRESH_TOKEN ([#698](https://github.com/foxly-it/rootguard/pull/698))
- Warn ahead of expiring .trivyignore.yaml suppressions (#710) ([#711](https://github.com/foxly-it/rootguard/pull/711))
- Also cover the Alpine apk pins (#712) ([#713](https://github.com/foxly-it/rootguard/pull/713))
- Add scan-images.sh, a local image scan that matches CI exactly (#714) ([#715](https://github.com/foxly-it/rootguard/pull/715))
- Gate upstream vulnerability findings only on PRs that touch them (#719) ([#720](https://github.com/foxly-it/rootguard/pull/720))
- Let Dependabot cover every shipped ecosystem (#721) ([#722](https://github.com/foxly-it/rootguard/pull/722))
- Restore trivy's vulnerability DB from a nightly-seeded cache (#723) ([#724](https://github.com/foxly-it/rootguard/pull/724))
- Auto-merge bot PRs once CI is green (#727) ([#734](https://github.com/foxly-it/rootguard/pull/734))
- Stop compiling arm64 images under QEMU ([#737](https://github.com/foxly-it/rootguard/pull/737))
- Test the documented upgrade path instead of bypassing upgrade-test (#725) ([#726](https://github.com/foxly-it/rootguard/pull/726))
- Hold TypeScript at <7 until typescript-eslint supports it (#749) ([#750](https://github.com/foxly-it/rootguard/pull/750))
- Keep @types/node majors with the Node runtime (#757) ([#758](https://github.com/foxly-it/rootguard/pull/758))
### Fixed
- Suppress unfixed libexpat CVE-2026-93990 (#687) ([#688](https://github.com/foxly-it/rootguard/pull/688))
- Unblock CI after upstream Debian/Alpine/npm security updates ([#691](https://github.com/foxly-it/rootguard/pull/691))
- Unblock CI after Go 1.26.9 and upstream package security updates ([#704](https://github.com/foxly-it/rootguard/pull/704))
- Curl pin refresh for Unbound + suppress CVE-2026-78669 in bundled cosign/compose ([#708](https://github.com/foxly-it/rootguard/pull/708))
- Libexpat 2.9.0 (DSA-6566-1) + bridge trivy's DB lag ([#716](https://github.com/foxly-it/rootguard/pull/716))
- Suppress unreachable CVE-2026-9538 in perl-base (#743) ([#744](https://github.com/foxly-it/rootguard/pull/744))
- Pin libexpat 2.9.0-r0, suppress unreachable x/text CVE in cosign (#745) ([#746](https://github.com/foxly-it/rootguard/pull/746))
- Drop 22 trivy suppressions that no longer match anything (#718) ([#748](https://github.com/foxly-it/rootguard/pull/748))
- Match whole name=version tokens in the pin bots (#767) ([#768](https://github.com/foxly-it/rootguard/pull/768))
- Go 1.26.10 for all binaries, cosign v3.1.4, docker:29-cli 29.9.1 (#766) ([#769](https://github.com/foxly-it/rootguard/pull/769))
### Maintenance
- Bump the actions group with 3 updates ([#707](https://github.com/foxly-it/rootguard/pull/707))
- Bump the base-images group across 6 directories with 3 updates ([#735](https://github.com/foxly-it/rootguard/pull/735))
- Refresh drifted package pins ([#747](https://github.com/foxly-it/rootguard/pull/747))
- Bump the go group across 2 directories with 2 updates ([#728](https://github.com/foxly-it/rootguard/pull/728))
- Bump the npm group across 1 directory with 10 updates ([#729](https://github.com/foxly-it/rootguard/pull/729))
- Bump jsdom in /rootguard-webapp/frontend ([#730](https://github.com/foxly-it/rootguard/pull/730))
- Bump vitest in /rootguard-webapp/frontend ([#731](https://github.com/foxly-it/rootguard/pull/731))
- Bump globals in /rootguard-webapp/frontend ([#732](https://github.com/foxly-it/rootguard/pull/732))
- Bump vitest ([#751](https://github.com/foxly-it/rootguard/pull/751))
- Bump vite to 8 together with @vitejs/plugin-react 6 (#759) ([#760](https://github.com/foxly-it/rootguard/pull/760))
- Bump typescript in /rootguard-webapp/frontend ([#752](https://github.com/foxly-it/rootguard/pull/752))
- Bump @types/node ([#763](https://github.com/foxly-it/rootguard/pull/763))
- Bump lucide-react in /rootguard-webapp/frontend ([#765](https://github.com/foxly-it/rootguard/pull/765))
- Refresh drifted package pins ([#770](https://github.com/foxly-it/rootguard/pull/770))
### Other
- Revert the temporary 1.0.5 upgrade-test bypass ([#686](https://github.com/foxly-it/rootguard/pull/686))
### Testing
- Wait for the enabled download button in the Logs test (#738) ([#739](https://github.com/foxly-it/rootguard/pull/739))
- Free the scenario container name before reusing it (#740) ([#741](https://github.com/foxly-it/rootguard/pull/741))
- Add scrollMargin to the IntersectionObserver mock (#755) ([#756](https://github.com/foxly-it/rootguard/pull/756))
- Disable git auto-maintenance in the pin resolver's scratch repo (#761) ([#762](https://github.com/foxly-it/rootguard/pull/762))
## [1.0.5] - 2026-09-22
### Other
- Revert the temporary 1.0.4 upgrade-test bypass ([#679](https://github.com/foxly-it/rootguard/pull/679))
- Add rootguard-docker-proxy to the real release pipeline ([#680](https://github.com/foxly-it/rootguard/pull/680))
- Tolerate WebApp's own 502 during the core/webapp swap ([#682](https://github.com/foxly-it/rootguard/pull/682))
- Allow POST /containers/{id}/rename ([#684](https://github.com/foxly-it/rootguard/pull/684))
- TEMPORARY bypass of upgrade-test gate for 1.0.5 only ([#685](https://github.com/foxly-it/rootguard/pull/685))
## [1.0.5] - 2026-09-22
### Other
- Revert the temporary 1.0.4 upgrade-test bypass ([#679](https://github.com/foxly-it/rootguard/pull/679))
- Add rootguard-docker-proxy to the real release pipeline ([#680](https://github.com/foxly-it/rootguard/pull/680))
- Tolerate WebApp's own 502 during the core/webapp swap ([#682](https://github.com/foxly-it/rootguard/pull/682))
- Allow POST /containers/{id}/rename ([#684](https://github.com/foxly-it/rootguard/pull/684))
## [1.0.5] - 2026-09-22
### Other
- Revert the temporary 1.0.4 upgrade-test bypass ([#679](https://github.com/foxly-it/rootguard/pull/679))
- Add rootguard-docker-proxy to the real release pipeline ([#680](https://github.com/foxly-it/rootguard/pull/680))
- Tolerate WebApp's own 502 during the core/webapp swap ([#682](https://github.com/foxly-it/rootguard/pull/682))
## [1.0.5] - 2026-09-22
### Other
- Revert the temporary 1.0.4 upgrade-test bypass ([#679](https://github.com/foxly-it/rootguard/pull/679))
- Add rootguard-docker-proxy to the real release pipeline ([#680](https://github.com/foxly-it/rootguard/pull/680))
## [1.0.4] - 2026-09-22
### Documentation
- Post-1.0.3 cleanup - dedupe CHANGELOG.md, refresh ROADMAP/project-state ([#673](https://github.com/foxly-it/rootguard/pull/673))
### Other
- Revert the temporary 1.0.3 upgrade-test bypass ([#672](https://github.com/foxly-it/rootguard/pull/672))
- Allow GET /containers/{id}/logs, fixes Logs & Diagnose ([#675](https://github.com/foxly-it/rootguard/pull/675))
- Re-bump docker-proxy pin, PR #669's fix was never deployed ([#677](https://github.com/foxly-it/rootguard/pull/677))
- TEMPORARY bypass of upgrade-test gate for 1.0.4 only ([#678](https://github.com/foxly-it/rootguard/pull/678))
## [1.0.4] - 2026-09-22
### Documentation
- Post-1.0.3 cleanup - dedupe CHANGELOG.md, refresh ROADMAP/project-state ([#673](https://github.com/foxly-it/rootguard/pull/673))
### Other
- Revert the temporary 1.0.3 upgrade-test bypass ([#672](https://github.com/foxly-it/rootguard/pull/672))
- Allow GET /containers/{id}/logs, fixes Logs & Diagnose ([#675](https://github.com/foxly-it/rootguard/pull/675))
- Re-bump docker-proxy pin, PR #669's fix was never deployed ([#677](https://github.com/foxly-it/rootguard/pull/677))
## [1.0.4] - 2026-09-22
### Documentation
- Post-1.0.3 cleanup - dedupe CHANGELOG.md, refresh ROADMAP/project-state ([#673](https://github.com/foxly-it/rootguard/pull/673))
### Other
- Revert the temporary 1.0.3 upgrade-test bypass ([#672](https://github.com/foxly-it/rootguard/pull/672))
- Allow GET /containers/{id}/logs, fixes Logs & Diagnose ([#675](https://github.com/foxly-it/rootguard/pull/675))
## [1.0.3] - 2026-09-21
### Other
- Bump stale docker-proxy pin, fixes shipped but never deployed ([#667](https://github.com/foxly-it/rootguard/pull/667))
- Allow Core/Updater's self-referential compose-file bind ([#669](https://github.com/foxly-it/rootguard/pull/669))
- TEMPORARY bypass of upgrade-test gate for 1.0.3 only ([#671](https://github.com/foxly-it/rootguard/pull/671))
## [1.0.2] - 2026-09-21
### Added
- Serve German and English marketing pages on separate URLs ([#639](https://github.com/foxly-it/rootguard/pull/639))
### Documentation
- Catch up project-state.md/release-history.md to v1.0.1 ([#635](https://github.com/foxly-it/rootguard/pull/635))
- Add two new guides targeting broader search intent ([#638](https://github.com/foxly-it/rootguard/pull/638))
- Verify and document rootless Docker daemon compatibility ([#642](https://github.com/foxly-it/rootguard/pull/642))
- Rootless Docker fully verified end to end, close out the roadmap item ([#645](https://github.com/foxly-it/rootguard/pull/645))
- Log the two 1.0.2 review rounds in security-audit-log.md ([#660](https://github.com/foxly-it/rootguard/pull/660))
- Add extension API design draft for #186 ([#665](https://github.com/foxly-it/rootguard/pull/665))
### Fixed
- Add a curl/sudo preflight check, skip sudo when already root ([#636](https://github.com/foxly-it/rootguard/pull/636))
- Repair icons corrupted by the 1.0.1 version bump, plus an SEO pass ([#637](https://github.com/foxly-it/rootguard/pull/637))
- Unbreak the build - bind9-dnsutils' own pin went stale ([#641](https://github.com/foxly-it/rootguard/pull/641))
### Maintenance
- Bump the actions group across 1 directory with 3 updates ([#652](https://github.com/foxly-it/rootguard/pull/652))
### Other
- Wire rootguard-docker-proxy into the stack ([#640](https://github.com/foxly-it/rootguard/pull/640))
- Detect rootless Docker and adapt without forcing either mode ([#643](https://github.com/foxly-it/rootguard/pull/643))
- Allow Core's real rootguard-unbound exec calls ([#644](https://github.com/foxly-it/rootguard/pull/644))
- Fix unauthenticated session-fsync DoS and audit gaps ([#647](https://github.com/foxly-it/rootguard/pull/647))
- Validate Cmd/Entrypoint/User/NetworkingConfig and more ([#646](https://github.com/foxly-it/rootguard/pull/646))
- Tolerate corrupted history entries, fix rollback scope, dedup runner ([#649](https://github.com/foxly-it/rootguard/pull/649))
- Fix sudo PWD loss, cleanup traps, and two races ([#648](https://github.com/foxly-it/rootguard/pull/648))
- Fix status accuracy on no-op checks and ctx plumbing in verify ([#650](https://github.com/foxly-it/rootguard/pull/650))
- Webapp frontend: fix number-field NaN handling and dedupe helpers ([#651](https://github.com/foxly-it/rootguard/pull/651))
- Move Post-1.0/Future to the top, newest items first ([#653](https://github.com/foxly-it/rootguard/pull/653))
- Close volume bind-mount escape, validate Healthcheck/Env/SecurityOpt ([#655](https://github.com/foxly-it/rootguard/pull/655))
- Audit/rate-limit update-check routes, fix service-logs error mapping ([#657](https://github.com/foxly-it/rootguard/pull/657))
- Reject public IPv6 ranges in reverse-DNS discovery ([#659](https://github.com/foxly-it/rootguard/pull/659))
- Fix flaky installer tests racing a fixed 2-second deploy deadline ([#662](https://github.com/foxly-it/rootguard/pull/662))
- Close TOCTOU gap between control-plane update and self-update ([#663](https://github.com/foxly-it/rootguard/pull/663))
## [1.0.1] - 2026-09-17
### Added
- Add rootguard-docker-proxy, a filtering Docker socket proxy ([#632](https://github.com/foxly-it/rootguard/pull/632))
### Documentation
- Record rootguard-docker-proxy's landing in the roadmap and threat model ([#633](https://github.com/foxly-it/rootguard/pull/633))
### Fixed
- Suppress 5 new libxml2 CVEs unfixed in trixie ([#631](https://github.com/foxly-it/rootguard/pull/631))
- Include blockpage and attestation-proxy in the live service status ([#634](https://github.com/foxly-it/rootguard/pull/634))
### Other
- Update site and README for shipped 1.0, add release confetti ([#621](https://github.com/foxly-it/rootguard/pull/621))
- Make the 1.0 release celebration an actual surprise ([#622](https://github.com/foxly-it/rootguard/pull/622))
- Migrate public documentation to MkDocs Material at /docs/ ([#623](https://github.com/foxly-it/rootguard/pull/623))
- Fix unreadable MkDocs header/search text contrast ([#624](https://github.com/foxly-it/rootguard/pull/624))
- Add worked-example guides, inline HTTPS/threat-model docs, fix header ([#625](https://github.com/foxly-it/rootguard/pull/625))
- Consolidate thin subpages, fix header still not matching the main site ([#626](https://github.com/foxly-it/rootguard/pull/626))
- Re-add a light color scheme to the docs for accessibility ([#627](https://github.com/foxly-it/rootguard/pull/627))
- Add real WebApp screenshots to the docs ([#628](https://github.com/foxly-it/rootguard/pull/628))
- Homepage redesign: trust facts, real-screenshot showcase, cohesive polish ([#629](https://github.com/foxly-it/rootguard/pull/629))
- Full-width animated status card, showcase countdown bars, fix stale docs links ([#630](https://github.com/foxly-it/rootguard/pull/630))
## [1.0.0] - 2026-09-14
### CI
- Docker-Layer-Cache für alle Multi-Arch-Builds + Go-Modul-Cache-Fix ([#551](https://github.com/foxly-it/rootguard/pull/551))
- Timeout-minutes und concurrency-Gruppen ergänzen ([#558](https://github.com/foxly-it/rootguard/pull/558))
- Wait-Loops in wiederverwendbare Composite Actions extrahieren ([#559](https://github.com/foxly-it/rootguard/pull/559))
- Trivy-Install-Logik in install-trivy.sh vereinheitlichen ([#560](https://github.com/foxly-it/rootguard/pull/560))
- Unabhängige Checks in ci.yml parallelisieren ([#561](https://github.com/foxly-it/rootguard/pull/561))
- CVE-2026-74860 (libxml2) unterdruecken ([#568](https://github.com/foxly-it/rootguard/pull/568))
- Kleinere Hygiene-Funde aus dem zweiten Review-Durchlauf beheben ([#574](https://github.com/foxly-it/rootguard/pull/574))
- Docker-Layer-Cache für alle bisher ungecachten Image-Scans ergänzen ([#575](https://github.com/foxly-it/rootguard/pull/575))
### Changed
- Router.go auf Go-1.22-Method-Pattern vereinheitlichen ([#553](https://github.com/foxly-it/rootguard/pull/553))
- Gemeinsamen useInterval-Hook fürs Frontend-Polling ([#554](https://github.com/foxly-it/rootguard/pull/554))
- Validate() in unbound/settings.go aufteilen ([#556](https://github.com/foxly-it/rootguard/pull/556))
- DNS-/Blockpage-Port-Check in Preflight() zusammenfassen ([#557](https://github.com/foxly-it/rootguard/pull/557))
- Overview.tsx auf useOverviewData()-Hook umstellen ([#562](https://github.com/foxly-it/rootguard/pull/562))
- Stack.tsx auf useStackData()-Hook umstellen ([#563](https://github.com/foxly-it/rootguard/pull/563))
- Unbound.tsx auf useUnboundData()-Hook umstellen ([#564](https://github.com/foxly-it/rootguard/pull/564))
- Connect/blockpage-reload zwischen deploy und restoreDeploy dedupen ([#572](https://github.com/foxly-it/rootguard/pull/572))
- Docker-CLI-Runner in rootguard-core dedupen ([#571](https://github.com/foxly-it/rootguard/pull/571))
- AdGuard.tsx auf useAdGuardData()-Hook umstellen, withBusy-Lücken in Unbound/Stack-Hooks schließen ([#573](https://github.com/foxly-it/rootguard/pull/573))
- JSON-Helfer zwischen api- und httpapi-Package dedupen ([#570](https://github.com/foxly-it/rootguard/pull/570))
### Documentation
- Zweite Review-Runde (Sicherheit, Duplizierung, Simplification, CI) protokollieren ([#576](https://github.com/foxly-it/rootguard/pull/576))
- Record the 30-day soak test's final result in ROADMAP.md ([#602](https://github.com/foxly-it/rootguard/pull/602))
- Record the third full-repo review (correctness, for 1.0.0) ([#605](https://github.com/foxly-it/rootguard/pull/605))
- Record round 3's follow-up pass in the security audit log ([#618](https://github.com/foxly-it/rootguard/pull/618))
### Fixed
- Rate-limit DELETE /api/auth/sessions/{id} ([#550](https://github.com/foxly-it/rootguard/pull/550))
- Correct the inline theme script's CSP hash ([#579](https://github.com/foxly-it/rootguard/pull/579))
- Reload blockpage after the standalone AdGuard bootstrap endpoint rotates its token ([#580](https://github.com/foxly-it/rootguard/pull/580))
- Run restoreDeploy's cleanup on a context detached from the request ([#581](https://github.com/foxly-it/rootguard/pull/581))
- Implement Unwrap() on statusRecorder so ResponseController works through it ([#582](https://github.com/foxly-it/rootguard/pull/582))
- Pass ROOTGUARD_ADMIN_USER/WEB_BIND/WEB_PORT into Core's own environment for compose re-invocation ([#585](https://github.com/foxly-it/rootguard/pull/585))
- Detach rollback from update's own context in rootguard-core's updater ([#586](https://github.com/foxly-it/rootguard/pull/586))
- Enable blockpage in the soak backup-restore drill's deploy config ([#588](https://github.com/foxly-it/rootguard/pull/588))
- Don't delete staged AdGuard credentials on an ambiguous configure failure ([#590](https://github.com/foxly-it/rootguard/pull/590))
- Bring attestation-proxy reachability check back in sync with Core ([#593](https://github.com/foxly-it/rootguard/pull/593))
- Stop updater's load() from leaving m.selected nil ([#595](https://github.com/foxly-it/rootguard/pull/595))
- Propagate Core's own status code from HandleServiceAction ([#598](https://github.com/foxly-it/rootguard/pull/598))
- Stop ContentModal from stealing focus on unrelated re-renders ([#600](https://github.com/foxly-it/rootguard/pull/600))
- Unblock the blockpage's reload button and harden its JS against CSP/storage/API edge cases ([#583](https://github.com/foxly-it/rootguard/pull/583))
- Add the missing webapp healthcheck to compose.release.yaml/compose.integration.yaml ([#587](https://github.com/foxly-it/rootguard/pull/587))
- Re-normalize Unbound volume ownership after a restore rollback ([#589](https://github.com/foxly-it/rootguard/pull/589))
- Stop the Expert Editor from deleting indentation on multi-line suggestions ([#601](https://github.com/foxly-it/rootguard/pull/601))
- Stop reporting a permanent error for a disabled Blockpage ([#603](https://github.com/foxly-it/rootguard/pull/603))
- Return 405 instead of 404 for a registered path hit with the wrong method ([#604](https://github.com/foxly-it/rootguard/pull/604))
- Stop a slower, superseded load() from overwriting a newer one ([#599](https://github.com/foxly-it/rootguard/pull/599))
- Make the Unbound healthcheck actually check the DNS response, not just dig's exit code ([#584](https://github.com/foxly-it/rootguard/pull/584))
- Dedup private-domain entries during unbound.conf import ([#591](https://github.com/foxly-it/rootguard/pull/591))
- Stop ImportUnboundConf from mutating the caller's ReverseZones ([#594](https://github.com/foxly-it/rootguard/pull/594))
- Stop restore from rolling back untouched local directories on ErrNotClean ([#596](https://github.com/foxly-it/rootguard/pull/596))
- Make Unbound Apply's post-activation snapshot best-effort ([#597](https://github.com/foxly-it/rootguard/pull/597))
- Surface a visible error when Overview's service restart fails ([#606](https://github.com/foxly-it/rootguard/pull/606))
- Stop the Expert Editor from discarding drafts on a language switch ([#607](https://github.com/foxly-it/rootguard/pull/607))
- Stop the restore preview's port field from storing NaN ([#608](https://github.com/foxly-it/rootguard/pull/608))
- Tolerate a transient curl failure in wait_for_installed ([#611](https://github.com/foxly-it/rootguard/pull/611))
- Defer revoking the diagnostic report's object URL ([#609](https://github.com/foxly-it/rootguard/pull/609))
- Harden docker-entrypoint.sh's setup and trust-anchor init ([#610](https://github.com/foxly-it/rootguard/pull/610))
- Stop pages.yml from deploying a zero-byte project-data.json ([#612](https://github.com/foxly-it/rootguard/pull/612))
- Make inject.sh's error messages actually reachable ([#613](https://github.com/foxly-it/rootguard/pull/613))
- Stop release-version-bump.yml's tag filter using its own SemVer regex ([#614](https://github.com/foxly-it/rootguard/pull/614))
- Cover 2 missing env vars in the digest-pin assertion ([#616](https://github.com/foxly-it/rootguard/pull/616))
- Anchor resolve-release-pin-commit.sh's path-scope regex ([#615](https://github.com/foxly-it/rootguard/pull/615))
- Translate the 72 destructive-action audit log events ([#617](https://github.com/foxly-it/rootguard/pull/617))
- Resync current_id on every updater status read ([#619](https://github.com/foxly-it/rootguard/pull/619))
- Resync current_id on every control-plane status read ([#620](https://github.com/foxly-it/rootguard/pull/620))
### Maintenance
- Refresh drifted Debian package pins ([#577](https://github.com/foxly-it/rootguard/pull/577))
- Refresh drifted Debian package pins ([#578](https://github.com/foxly-it/rootguard/pull/578))
- Bump golang.org/x/mod in /rootguard-updater ([#592](https://github.com/foxly-it/rootguard/pull/592))
### Other
- Toten BackupRestorePreview-Struct entfernen ([#555](https://github.com/foxly-it/rootguard/pull/555))
- Rate-Limit auf Unbound-Custom-/Import-Preview ergänzen ([#567](https://github.com/foxly-it/rootguard/pull/567))
- Toten Code entfernen (Backend + Frontend) ([#569](https://github.com/foxly-it/rootguard/pull/569))
- Updater-Control-Plane-Endpunkte absichern und dedupen ([#566](https://github.com/foxly-it/rootguard/pull/566))
### Testing
- Doppelte Test-Fixture-Bootstraps zusammenfassen ([#565](https://github.com/foxly-it/rootguard/pull/565))
## [1.0.0-rc.5] - 2026-09-09
### Documentation
- Document the 1.0.0-rc.3 broken-release incident and 1.0.0-rc.4 recovery ([#521](https://github.com/foxly-it/rootguard/pull/521))
- Sync German translations and fix stale claims from today's fixes ([#544](https://github.com/foxly-it/rootguard/pull/544))
- Add versioned 1.0.0 migration/rollback instructions ([#545](https://github.com/foxly-it/rootguard/pull/545))
### Fixed
- Stop permanently GPU-promoting the hero dashboard mockup ([#523](https://github.com/foxly-it/rootguard/pull/523))
- Make the hero dashboard mockup's resting state fully untransformed ([#524](https://github.com/foxly-it/rootguard/pull/524))
- Suppress CVE-2026-86140 (libxml2) in Unbound's image scan ([#533](https://github.com/foxly-it/rootguard/pull/533))
- Route GitHub Releases self-update discovery through the attestation proxy ([#532](https://github.com/foxly-it/rootguard/pull/532))
- Give Blockpage a real self-update path ([#534](https://github.com/foxly-it/rootguard/pull/534))
- Refuse a control-plane update while the updater self-update is busy ([#535](https://github.com/foxly-it/rootguard/pull/535))
- Check the attestation proxy's real /healthz endpoint, not just TCP ([#536](https://github.com/foxly-it/rootguard/pull/536))
- Bound backup-restore uploads to 2 concurrent, not the shared 30 ([#537](https://github.com/foxly-it/rootguard/pull/537))
- Suppress CVE-2026-84445 (grpc-go xDS DoS) in bundled cosign/compose ([#541](https://github.com/foxly-it/rootguard/pull/541))
- Run upgrade-test on both amd64 and arm64, not just amd64 ([#540](https://github.com/foxly-it/rootguard/pull/540))
- Harden attestation-proxy URL handling before RC5 ([#548](https://github.com/foxly-it/rootguard/pull/548))
### Maintenance
- Bump the actions group across 1 directory with 2 updates ([#520](https://github.com/foxly-it/rootguard/pull/520))
- Minor cleanups from the 2026-09-08 external review ([#538](https://github.com/foxly-it/rootguard/pull/538))
- Bump @vitest/mocker and vitest ([#542](https://github.com/foxly-it/rootguard/pull/542))
- Bump vitest in /rootguard-webapp/frontend ([#543](https://github.com/foxly-it/rootguard/pull/543))
## [1.0.0-rc.4] - 2026-09-05
### Fixed
- Include README.md in the pin-commit's path scope ([#517](https://github.com/foxly-it/rootguard/pull/517))
- CRITICAL - anchor accepts both tag-less and tag+digest image references ([#519](https://github.com/foxly-it/rootguard/pull/519))
## [1.0.0-rc.3] - 2026-09-05
### Added
- Bring rootguard-attestation-proxy into self-update management ([#484](https://github.com/foxly-it/rootguard/pull/484))
### Documentation
- Refresh stale README product-preview screenshots ([#409](https://github.com/foxly-it/rootguard/pull/409))
- Note the 1.0.0-rc.2 cut in ROADMAP.md's 0.9 exit note ([#482](https://github.com/foxly-it/rootguard/pull/482))
- Add rootguard-attestation-proxy to README's component table ([#486](https://github.com/foxly-it/rootguard/pull/486))
- Catch up threat-model/architecture/site to the proxy's self-update status ([#487](https://github.com/foxly-it/rootguard/pull/487))
- Summarize 2026-09-05 internal security review round (WIP, will finalize before push) ([#511](https://github.com/foxly-it/rootguard/pull/511))
- Bring roadmap.html and index.html up to date ([#514](https://github.com/foxly-it/rootguard/pull/514))
### Fixed
- Give bump-site-versions.sh/check-site-facts.sh the version they're actively cutting ([#480](https://github.com/foxly-it/rootguard/pull/480))
- Suppress newly-surfaced CVE-2026-16742 in rootguard-unbound's base image ([#485](https://github.com/foxly-it/rootguard/pull/485))
- Share one self-update manager for updater and attestation-proxy ([#488](https://github.com/foxly-it/rootguard/pull/488))
- Bump curl/libcurl apk pin to 8.22.0-r0 ([#506](https://github.com/foxly-it/rootguard/pull/506))
- Log a warning when ROOTGUARD_SKIP_ATTESTATION disables attestation gates ([#500](https://github.com/foxly-it/rootguard/pull/500))
- Anchor image-prefix policy check to the digest delimiter ([#501](https://github.com/foxly-it/rootguard/pull/501))
- Rate-limit /api/router-import/fritzbox/discover ([#502](https://github.com/foxly-it/rootguard/pull/502))
- Rate-limit /api/backups/restore/preview ([#503](https://github.com/foxly-it/rootguard/pull/503))
- Rate-limit unbound forward-check and reverse-dns discover routes ([#504](https://github.com/foxly-it/rootguard/pull/504))
- Fix self-referential relative bind-mount in compose.integration.yaml ([#508](https://github.com/foxly-it/rootguard/pull/508))
- Validate target_images overrides against the pinned repository ([#509](https://github.com/foxly-it/rootguard/pull/509))
- Verify the container image actually swapped after compose up ([#510](https://github.com/foxly-it/rootguard/pull/510))
- Hard-block access-control rules that reach beyond private space ([#507](https://github.com/foxly-it/rootguard/pull/507))
- Install-demo-section never collapsed to one column on mobile ([#513](https://github.com/foxly-it/rootguard/pull/513))
- Bump libuuid apk pin to 2.41.6-r1 ([#515](https://github.com/foxly-it/rootguard/pull/515))
### Maintenance
- Bump the actions group across 1 directory with 2 updates ([#429](https://github.com/foxly-it/rootguard/pull/429))
### Other
- Bring current, disclose AI-assisted code review ([#489](https://github.com/foxly-it/rootguard/pull/489))
## [1.0.0-rc.2] - 2026-09-01
### Added
- Local DNSSEC test zone for CI/release gates instead of real internet ([#442](https://github.com/foxly-it/rootguard/pull/442))
### CI
- Pin compose.release.yaml, .env.release.example, and site/*.html to 1.0.0-rc.1 [skip ci]
- Always bypass Core's live resolution in upgrade-test, not per-version
### Changed
- Consolidate atomic-file-write duplication into a shared package ([#385](https://github.com/foxly-it/rootguard/pull/385))
- Split rootguard-updater/main.go (851 lines) into files by concern ([#386](https://github.com/foxly-it/rootguard/pull/386))
- Share SemVer validation between the two release workflows ([#387](https://github.com/foxly-it/rootguard/pull/387))
- Close the atomic-write duplication gap, revisiting round 1's shared-module call ([#404](https://github.com/foxly-it/rootguard/pull/404))
### Documentation
- Record the v1.0.0-rc.1 cut and the upgrade-test bootstrap fix
- Warn beta.14-or-earlier installations they need a manual RC update
- Cross-reference the digest-resolution duplication between the two updaters ([#388](https://github.com/foxly-it/rootguard/pull/388))
- Add docs/release-process.md, an architecture-level map of release-alpha.yml ([#406](https://github.com/foxly-it/rootguard/pull/406))
- Trim rootguard-webapp/Dockerfile from 123 to 60 lines ([#405](https://github.com/foxly-it/rootguard/pull/405))
- Split docs/project-state.md into current-state, release-history, and security-audit-log ([#407](https://github.com/foxly-it/rootguard/pull/407))
- README/SECURITY/release-history/site still described an old alpha/beta series ([#416](https://github.com/foxly-it/rootguard/pull/416))
- Stale component lifecycle wording + delete dead per-component SECURITY.md files ([#423](https://github.com/foxly-it/rootguard/pull/423))
- Fix eight broken SECURITY.md links left by round 4's deletion; add repo-wide markdown link check ([#427](https://github.com/foxly-it/rootguard/pull/427))
- Record round 6's two repo-settings findings (one fixed, one open) ([#435](https://github.com/foxly-it/rootguard/pull/435))
- Document the correct shellcheck invocation for semver-compare.test.sh ([#437](https://github.com/foxly-it/rootguard/pull/437))
- Audit log was missing the ci.yml AdGuard-check real-domain fix ([#444](https://github.com/foxly-it/rootguard/pull/444))
- Document docker_engine_cp_cve_unknown preflight advisory (round 15 small item) ([#472](https://github.com/foxly-it/rootguard/pull/472))
### Fixed
- Enforce release attestation before activation, not just display
- Unblock ci-updater.yml's real E2E integration test after the attestation gate
- Gate the release pipeline on smoke-test/upgrade-test, not the other way around
- Pin and verify the dockerinstall.sh download in install.sh
- Pin and digest-verify the blockpage image like every other component
- Block domain-insecure and harden-dnssec-stripped: no in expert config
- Logout clears the session cookie even when persistence fails ([#370](https://github.com/foxly-it/rootguard/pull/370))
- Reject corrupt credentials.json instead of silently reverting to the env password ([#373](https://github.com/foxly-it/rootguard/pull/373))
- Destructive rate limit is per-session and closes the TOCTOU race ([#374](https://github.com/foxly-it/rootguard/pull/374))
- Preflight now checks the blockpage's port 80, not just DNS ([#375](https://github.com/foxly-it/rootguard/pull/375))
- WebApp now sends browser security headers (CSP, nosniff, frame-options, referrer-policy, permissions-policy) ([#376](https://github.com/foxly-it/rootguard/pull/376))
- Router-import client refuses redirects and restricts targets to private ranges ([#377](https://github.com/foxly-it/rootguard/pull/377))
- Pin GitHub Actions to commit SHAs, scope elevated permissions, checksum tool installs ([#378](https://github.com/foxly-it/rootguard/pull/378))
- Backup-restore's entry-limit message no longer overclaims what was found ([#379](https://github.com/foxly-it/rootguard/pull/379))
- AdGuard UI proxy's Set-Cookie rewrite parses cookies instead of string-matching ([#380](https://github.com/foxly-it/rootguard/pull/380))
- Blockpage builds the block-reason lead via DOM APIs instead of innerHTML ([#381](https://github.com/foxly-it/rootguard/pull/381))
- Install.sh quotes .env values and rejects newlines in the admin username/password ([#382](https://github.com/foxly-it/rootguard/pull/382))
- Persistence errors are no longer silently swallowed ([#383](https://github.com/foxly-it/rootguard/pull/383))
- Release notes record which commit published images were actually built from ([#384](https://github.com/foxly-it/rootguard/pull/384))
- Guided setup's first DNS stack deploy is now attestation-gated ([#389](https://github.com/foxly-it/rootguard/pull/389))
- Digest-pin builder-stage base images (golang, docker:29-cli, node) ([#390](https://github.com/foxly-it/rootguard/pull/390))
- Release pipeline no longer builds/tags/attributes provenance from a racy ref ([#391](https://github.com/foxly-it/rootguard/pull/391))
- Install.sh single-quotes .env values, closing a Compose $-expansion gap ([#393](https://github.com/foxly-it/rootguard/pull/393))
- SSRF check in FritzBox client now runs before connect(), not after ([#394](https://github.com/foxly-it/rootguard/pull/394))
- Publish to a candidate tag first, promote to the final release tag only after E2E tests pass ([#395](https://github.com/foxly-it/rootguard/pull/395))
- Blockpage no longer holds any AdGuard credential ([#396](https://github.com/foxly-it/rootguard/pull/396))
- Atomicfile.WriteFile uses os.CreateTemp instead of a fixed temp name ([#397](https://github.com/foxly-it/rootguard/pull/397))
- DNSSEC-bypass check parses the directive value, not a raw-line suffix ([#392](https://github.com/foxly-it/rootguard/pull/392))
- Backup archive now accepts exactly MaxFiles entries, not just fewer ([#399](https://github.com/foxly-it/rootguard/pull/399))
- AdGuard UI cookie rewrite no longer drops unknown Set-Cookie attributes ([#400](https://github.com/foxly-it/rootguard/pull/400))
- Blockpage theme.js no longer uses innerHTML ([#402](https://github.com/foxly-it/rootguard/pull/402))
- WebApp audit log and session inventory no longer trust X-Forwarded-For ([#401](https://github.com/foxly-it/rootguard/pull/401))
- Persist errors now surface in Status(), not just logs ([#398](https://github.com/foxly-it/rootguard/pull/398))
- Local dev compose files never forwarded ROOTGUARD_SKIP_ATTESTATION ([#408](https://github.com/foxly-it/rootguard/pull/408))
- Harden-dnssec-stripped bypass via quoted "no"/'no' ([#410](https://github.com/foxly-it/rootguard/pull/410))
- Installer never resolved unbound/blockpage image to a digest before attestation ([#411](https://github.com/foxly-it/rootguard/pull/411))
- Release tag could move onto untested commits; promotion trusted candidates blindly ([#412](https://github.com/foxly-it/rootguard/pull/412))
- Release-alpha.yml smoke test never deployed or verified the blockpage image ([#413](https://github.com/foxly-it/rootguard/pull/413))
- Updater.Manager's status.json/images.json/updates.yaml were only atomic per file ([#415](https://github.com/foxly-it/rootguard/pull/415))
- Blockpage /api/reason comment claimed $host isn't client-supplied ([#417](https://github.com/foxly-it/rootguard/pull/417))
- Surface PersistError/PersistErrorAt in the web UI ([#414](https://github.com/foxly-it/rootguard/pull/414))
- Invalid stored theme value permanently broke the blockpage toggle ([#418](https://github.com/foxly-it/rootguard/pull/418))
- FritzBox dial guard rejected zone-qualified IPv6 link-local addresses ([#419](https://github.com/foxly-it/rootguard/pull/419))
- Remove redundant unpinned apk installs from Core/Updater Dockerfiles ([#420](https://github.com/foxly-it/rootguard/pull/420))
- Release pipeline could fold untested commits into a tag; installer could pin a stale digest ([#421](https://github.com/foxly-it/rootguard/pull/421))
- Updater.Manager's status.json/images.json still had a residual multi-file window ([#422](https://github.com/foxly-it/rootguard/pull/422))
- Small round-4 cleanup items (gofmt gate, shellcheck, Dockerfile comment, blockpage smoke test, theme.js drift check) ([#424](https://github.com/foxly-it/rootguard/pull/424))
- Tag-push trigger incompatible with new model; images promoted before main-race check; no version-ordering guard ([#425](https://github.com/foxly-it/rootguard/pull/425))
- SelectImage left the new image selected even when its own persist failed ([#426](https://github.com/foxly-it/rootguard/pull/426))
- Ci-unbound.yml still used setup-go v5 without a go.sum cache path ([#428](https://github.com/foxly-it/rootguard/pull/428))
- Semver-compare.sh overflowed bash's 64-bit integer range on large versions ([#431](https://github.com/foxly-it/rootguard/pull/431))
- Image promotion still happened before the last main-race check ([#434](https://github.com/foxly-it/rootguard/pull/434))
- SelectImage's persist-failure revert left a stray empty-string map entry ([#432](https://github.com/foxly-it/rootguard/pull/432))
- Release pin-commit retry detection was unreachable, and could resolve to the wrong commit ([#436](https://github.com/foxly-it/rootguard/pull/436))
- Applying Unbound settings could return success before Unbound was ready ([#439](https://github.com/foxly-it/rootguard/pull/439))
- A reverted pin commit still resolved as a safe retry ([#438](https://github.com/foxly-it/rootguard/pull/438))
- Release-alpha.yml's SemVer tag filter had drifted, and the resolver compared SOURCE_REF as a raw string ([#441](https://github.com/foxly-it/rootguard/pull/441))
- Unbound settings rollback could fail silently under a canceled context ([#440](https://github.com/foxly-it/rootguard/pull/440))
- Real-internet DNS still leaked into blocking CI in two spots round 9 missed ([#445](https://github.com/foxly-it/rootguard/pull/445))
- Release-alpha.yml's own source_ref was the raw, possibly-abbreviated dispatch input ([#446](https://github.com/foxly-it/rootguard/pull/446))
- Six job-name collisions across unrelated workflows ([#449](https://github.com/foxly-it/rootguard/pull/449))
- Inject.sh has no Docker Desktop escape hatch; waitReady slept once too many times ([#448](https://github.com/foxly-it/rootguard/pull/448))
- Required status checks contradicted their own pull_request.paths filter ([#450](https://github.com/foxly-it/rootguard/pull/450))
- Setup.sh's split-DNS authority readiness check unreachable from Docker Desktop; container reproducibility gaps ([#452](https://github.com/foxly-it/rootguard/pull/452))
- Scenario_integration_test.go ignored DNSSEC_TEST_ZONE_DIR; drop stale TestMain ([#451](https://github.com/foxly-it/rootguard/pull/451))
- Frontend had no declared minimum Node version ([#453](https://github.com/foxly-it/rootguard/pull/453))
- Close round 10 finding 9 (Backup/Restore, Unbound, rollback checks not required) ([#454](https://github.com/foxly-it/rootguard/pull/454))
- Repin CI/test fixture base images off their EOL/unpinned tags (round 12 finding 1) ([#455](https://github.com/foxly-it/rootguard/pull/455))
- Sync package-lock.json engines field, tighten .nvmrc to 22.22.0 (round 12 finding 2) ([#456](https://github.com/foxly-it/rootguard/pull/456))
- Preserve dig error details in real-DNS-upstream diagnostics (round 12 finding 3) ([#457](https://github.com/foxly-it/rootguard/pull/457))
- Warn on unpatched Docker Engine docker-cp CVEs in preflight (round 13 finding 3) ([#458](https://github.com/foxly-it/rootguard/pull/458))
- Patch runtime image OpenSSL CVE, remove unused buildx plugin (round 13 finding 2) ([#459](https://github.com/foxly-it/rootguard/pull/459))
- Bump pinned cosign to v3.1.3, found via new image scan (round 13 finding 1 follow-up) ([#461](https://github.com/foxly-it/rootguard/pull/461))
- Add real container image vulnerability scanning to CI ([#460](https://github.com/foxly-it/rootguard/pull/460))
- Patch Blockpage's nginx base image CVEs ([#462](https://github.com/foxly-it/rootguard/pull/462))
- Patch Unbound's util-linux CVEs, scope+justify the rest ([#463](https://github.com/foxly-it/rootguard/pull/463))
- Scope trivy ignores with purls, correct 3 wrong CVE attributions ([#464](https://github.com/foxly-it/rootguard/pull/464))
- Add missing third docker-cp CVE (CVE-2026-41568) to preflight advisory ([#465](https://github.com/foxly-it/rootguard/pull/465))
- Four small round-14 improvements (push.paths, unknown-version advisory, ternary, frontend test) ([#466](https://github.com/foxly-it/rootguard/pull/466))
- Patch openssh CVEs, ignore new x/crypto and libevent CVEs (unblocks round 15 CI) ([#469](https://github.com/foxly-it/rootguard/pull/469))
- Patch newly-surfaced libexpat CVE in docker:29-cli base ([#470](https://github.com/foxly-it/rootguard/pull/470))
- Scan release-candidate images before promotion (round 15 finding 1) ([#467](https://github.com/foxly-it/rootguard/pull/467))
- Make Blockpage's image scan a required check (round 15 finding 2) ([#468](https://github.com/foxly-it/rootguard/pull/468))
- Bump Blockpage's libexpat pin to match what Alpine's mirror carries (unblocks CI) ([#473](https://github.com/foxly-it/rootguard/pull/473))
- Pin exact versions and paths in trivy ignore purls (round 15 finding 3) ([#471](https://github.com/foxly-it/rootguard/pull/471))
- Harden image scans and pin refresh automation ([#474](https://github.com/foxly-it/rootguard/pull/474))
### Maintenance
- Refresh drifted Debian package pins ([#430](https://github.com/foxly-it/rootguard/pull/430))
- Replace the hand-rolled markdown-link regex checker with lychee ([#433](https://github.com/foxly-it/rootguard/pull/433))
- Hardcoded dev-proxy LAN IP and unused vite/react scaffold assets ([#447](https://github.com/foxly-it/rootguard/pull/447))
### Other
- Homepage layout, RC messaging, and Unbound docs gaps
- Fold wiki.html into docs.html, remove the Wiki page
- Redirect stub, 404 page, sitemap/robots, canonical+favicon, stale-data guard
### Performance
- Lazy-load frontend authenticated pages, closing Vite's >500kB chunk warning ([#403](https://github.com/foxly-it/rootguard/pull/403))
## [1.0.0-rc.1] - 2026-08-26
### Added
- Generalize the release-cutting pipeline to real SemVer
### Changed
- Generalize the downgrade guard to real SemVer
### Documentation
- Record the downgrade-refusal safety net and confirm beta.14 is clean
### Fixed
- Correct SemVer handling in release/install/site scripts
- Recognize hyphenated SemVer identifiers and stop losing stable-version tracking
- Validate release-cut override before side effects, real SemVer sort in install.sh
- Hyphen-tolerant tag lookup in cut workflow, overflow-safe SemVer compare
## [0.1.0-beta.14] - 2026-08-26
### Added
- Updater refuses to install an older release than what's running
### Documentation
- Record the real update-mechanism bug chain (beta.10 through beta.13)
## [0.1.0-beta.13] - 2026-08-25
### Fixed
- GitHub Releases API order isn't reliably newest-first; digestQualify bug in Core too
## [0.1.0-beta.12] - 2026-08-25
### Fixed
- Upgrade-test's final verification assumed a local tag already existed
- Update() had its own separate, still-buggy digestQualify call
## [0.1.0-beta.11] - 2026-08-25
### Documentation
- Record the real updater digest bug found while cutting beta.10
### Fixed
- Updater's digest lookup could return a stale, already-superseded digest
## [0.1.0-beta.10] - 2026-08-25
### Added
- Copy-to-clipboard button and animated install demo on the website
### Changed
- Shared generic decodeJSON helper across Core and WebApp
- Remove duplicate frontend API client, move getVersion into client.ts
### Documentation
- Record the third review round (PR #347-#350)
### Fixed
- Enforce startup secret strength, FritzBox IPv6 URLs, backup off-by-one
- Two more CI fixtures still used a short ROOTGUARD_API_TOKEN
## [0.1.0-beta.9] - 2026-08-25
### Documentation
- Record the AdGuard polish and follow-up review round in project-state
### Fixed
- Login/recovery/account rate limits could be bypassed with concurrent requests
- AdGuard filtering endpoint accepted {} as "disable filtering"
- Install.sh respects ROOTGUARD_ADMIN_USER, validates web port
- Strict JSON decode helper, recovery rate-limit race, install.sh dir check order
### Other
- Add breathing room between install.sh's output phases
- AdGuard filtering toggle as switch, restyle protection select
## [0.1.0-beta.8] - 2026-08-25
### Added
- Authenticated account settings (change username/password from the WebGUI)
- One-command installer for non-technical users
- Install.sh checks for busy ports before installing
### Documentation
- Record authenticated account settings ([#329](https://github.com/foxly-it/rootguard/pull/329))
- Remove stale DNS-flow block from the website's dashboard mockup
- Record beta.7 dashboard/AdGuard polish round and the real update-process verification
- Record the one-command installer addition
- Record account-settings ship, select styling fix, mockup fidelity, and install.sh port preflight
### Fixed
- Account update could leave a renamed-but-uncommitted session on credential-persist failure
- Three account-settings issues found in review (wrong-password logout, partial-failure state, unparsed error codes)
- AdGuard protection select didn't match the app's other dropdowns
- Misleading "Nicht konfiguriert" label for AdGuard's health badge
### Other
- Make the hero mockup structurally match the real dashboard
## [0.1.0-beta.7] - 2026-08-24
### Documentation
- Record v0.1.0-beta.6 and the release-pipeline mechanics it surfaced ([#327](https://github.com/foxly-it/rootguard/pull/327))
### Fixed
- Radial gauge overflowed its 40px metric row and got clipped by the card edge
- Dashboard cards/gauge track nearly invisible in dark mode
- Three review findings on the dashboard metrics (stale-response race, wrong sparkline ages, keyboard/AT-inaccessible tooltip)
- Metrics polling starved itself at 1s - never showing data at all
- Metrics collector ran docker stats continuously even with nobody watching
- Metrics cache could serve arbitrarily stale data after being idle
- Webapp's dashboard proxy struct dropped collected_at
- AdGuard protection-pause toggle had three real bugs
### Other
- Horizontal progress stepper for the Setup deployment steps
- Dashboard service list - fix untranslated English text, modernize layout
- Dashboard hero/metrics/system-panel redesign
- Service grid, sparkline axis, flow-arrow animation and contrast
- Gauge min/max parity, service cards, interactive chart tooltip
- CPU/filter-rate as sparklines, fix panel gap, animate arrowhead, faster initial metrics
- Pull the flow-arrow icon flush against its line
### Performance
- Avoid redundant chart recompute on hover, throttle pointer tracking, pause polling when tab hidden
- Parallelize metric fetches, refresh metrics every 1s instead of 10s
- Background-cache Core's docker stats collection, drop metrics refresh to 500ms
- Cache container status server-side and singleflight refreshes; remove DATENFLUSS card; add AdGuard protection-pause toggle
## [0.1.0-beta.6] - 2026-08-22
### Fixed
- Updater self-update compose-mount resolution, digest-less attestation, and a broken beta.5 pin ([#324](https://github.com/foxly-it/rootguard/pull/324))
## [0.1.0-beta.5] - 2026-08-22
### Added
- Discover new RootGuard releases live instead of a manual .env pin ([#320](https://github.com/foxly-it/rootguard/pull/320))
- Let the RootGuard Updater update its own image ([#322](https://github.com/foxly-it/rootguard/pull/322))
### Documentation
- Record v0.1.0-beta.4 and the release-pipeline bugs it surfaced ([#316](https://github.com/foxly-it/rootguard/pull/316))
### Fixed
- Quick-start still referenced compose.alpha.yaml under v0.1.0-beta.4 ([#313](https://github.com/foxly-it/rootguard/pull/313))
- Dispatch pages.yml explicitly after the release pin-refresh push (#314) ([#315](https://github.com/foxly-it/rootguard/pull/315))
- Actually check updater/unbound attestation instead of hardcoding not_applicable (#317) ([#318](https://github.com/foxly-it/rootguard/pull/318))
## [0.1.0-beta.4] - 2026-08-22
### Added
- Automate site-version refresh and Debian pin-drift detection ([#298](https://github.com/foxly-it/rootguard/pull/298))
### Documentation
- Explain the real host-level port-53 verification on the site ([#299](https://github.com/foxly-it/rootguard/pull/299))
- Record the real 08-22 update-exercise result ([#310](https://github.com/foxly-it/rootguard/pull/310))
### Fixed
- Bump drifted libexpat pin; refresh site to beta.3 ([#297](https://github.com/foxly-it/rootguard/pull/297))
- Retry post-restore DNS check in the soak backup-restore drill (#301) ([#302](https://github.com/foxly-it/rootguard/pull/302))
- Parameterize updater image in compose.yaml, matching core/webapp (#303) ([#304](https://github.com/foxly-it/rootguard/pull/304))
- Match the actual graphify-out/ directory name ([#305](https://github.com/foxly-it/rootguard/pull/305))
- Bump stale AdGuard Home pin from v0.107.78 to v0.107.79 (#306) ([#307](https://github.com/foxly-it/rootguard/pull/307))
### Other
- "Control Plane" -> "Control Panel" in WebGUI-visible text ([#300](https://github.com/foxly-it/rootguard/pull/300))
- Compose.alpha.yaml/.env.alpha.example -> compose.release.yaml/.env.release.example (#308) ([#309](https://github.com/foxly-it/rootguard/pull/309))
## [0.1.0-beta.3] - 2026-08-16
### Fixed
- Multiple beta.2 deploy/labeling/site-freshness bugs found live on .7 ([#295](https://github.com/foxly-it/rootguard/pull/295))
## [0.1.0-beta.2] - 2026-08-16
### Added
- Add unattended 30-day endurance test harness ([#272](https://github.com/foxly-it/rootguard/pull/272))
- Probe for non-Docker port occupants during preflight ([#289](https://github.com/foxly-it/rootguard/pull/289))
- Default the setup DNS bind address to the detected LAN IP ([#291](https://github.com/foxly-it/rootguard/pull/291))
### CI
- Add a real end-to-end backup/restore CI job ([#276](https://github.com/foxly-it/rootguard/pull/276))
### Changed
- Compaction follow-ups from code review ([#275](https://github.com/foxly-it/rootguard/pull/275))
### Documentation
- Performance and memory baseline for small/medium networks ([#277](https://github.com/foxly-it/rootguard/pull/277))
- Final accessibility and security review ([#279](https://github.com/foxly-it/rootguard/pull/279))
- Freeze supported platforms, requirements, and support policy ([#280](https://github.com/foxly-it/rootguard/pull/280))
- Fix friction points found in a no-context Quick Start walkthrough ([#281](https://github.com/foxly-it/rootguard/pull/281))
- Catch up ROADMAP.md/project-state.md/roadmap.html bookkeeping ([#282](https://github.com/foxly-it/rootguard/pull/282))
### Fixed
- Use the full canonical AGPL-3.0 text ([#273](https://github.com/foxly-it/rootguard/pull/273))
- Auth security hardening from code review ([#274](https://github.com/foxly-it/rootguard/pull/274))
- Three real bugs in the soak harness found by review ([#278](https://github.com/foxly-it/rootguard/pull/278))
- Drop the SPDX-License-Identifier line, it broke detection ([#283](https://github.com/foxly-it/rootguard/pull/283))
- Destructive-guard bug, untested PR builds, and endurance race ([#284](https://github.com/foxly-it/rootguard/pull/284))
- Retry transient port-53 bind race on deploy; reword HTTPS export warning ([#287](https://github.com/foxly-it/rootguard/pull/287))
- Ownership-timing bug, temp-file leak on guard abort, add tests ([#285](https://github.com/foxly-it/rootguard/pull/285))
- Return combined output+error as probeHostPortBusy's detail ([#292](https://github.com/foxly-it/rootguard/pull/292))
- Precise setup address help text; add frontend unit tests ([#293](https://github.com/foxly-it/rootguard/pull/293))
## [0.1.0-beta.1] - 2026-08-14
### Added
- Let the release pipeline cut a beta, not just alpha.N+1 ([#259](https://github.com/foxly-it/rootguard/pull/259))
### Documentation
- Mark 0.6 beta release engineering complete ([#257](https://github.com/foxly-it/rootguard/pull/257))
- Update public site to 0.1.0-alpha.16 ([#258](https://github.com/foxly-it/rootguard/pull/258))
### Other
- Make German-only markdown docs bilingual ([#246](https://github.com/foxly-it/rootguard/pull/246))
## [0.1.0-alpha.16] - 2026-08-14
### Fixed
- Stop dropping control-plane update history in the API response ([#256](https://github.com/foxly-it/rootguard/pull/256))
## [0.1.0-alpha.15] - 2026-08-14
### Fixed
- Tolerate the WebApp being briefly unreachable mid-install ([#255](https://github.com/foxly-it/rootguard/pull/255))
## [0.1.0-alpha.14] - 2026-08-14
### Fixed
- Wait for the check to finish before starting the install ([#254](https://github.com/foxly-it/rootguard/pull/254))
## [0.1.0-alpha.13] - 2026-08-14
### Fixed
- Stop swallowing the upgrade test's own error diagnostics ([#253](https://github.com/foxly-it/rootguard/pull/253))
## [0.1.0-alpha.12] - 2026-08-14
### Fixed
- Catch curl connection failures in the upgrade test, not just bad HTTP status ([#251](https://github.com/foxly-it/rootguard/pull/251))
## [0.1.0-alpha.11] - 2026-08-14
### Documentation
- Update public site to 0.1.0-alpha.10 ([#248](https://github.com/foxly-it/rootguard/pull/248))
### Fixed
- Surface real HTTP errors from the control-plane upgrade test ([#247](https://github.com/foxly-it/rootguard/pull/247))
- Clean up mobile header nav and animate the status dot ([#249](https://github.com/foxly-it/rootguard/pull/249))
## [0.1.0-alpha.9] - 2026-08-13
### CI
- Pin compose.alpha.yaml to 0.1.0-alpha.8 image digests [skip ci]
### Other
- Verify SBOM/provenance/attestation live against v0.1.0-alpha.8 (#229, #230) ([#232](https://github.com/foxly-it/rootguard/pull/232))
- Automate release versioning and changelog generation ([#235](https://github.com/foxly-it/rootguard/pull/235))
## [0.1.0-alpha.8] - 2026-08-13
### Added
- Add safe backup retention controls ([#189](https://github.com/foxly-it/rootguard/pull/189))
- Add safe manual cleanup preview ([#191](https://github.com/foxly-it/rootguard/pull/191))
- Centralize service logs ([#201](https://github.com/foxly-it/rootguard/pull/201))
- Surface import workflows ([#203](https://github.com/foxly-it/rootguard/pull/203))
### CI
- Pin compose.alpha.yaml to 0.1.0-alpha.7 image digests [skip ci]
### Changed
- Move Unbound's in-page section nav into the main sidebar ([#180](https://github.com/foxly-it/rootguard/pull/180))
- Clarify stack operations ([#206](https://github.com/foxly-it/rootguard/pull/206))
### Documentation
- Close the digest-pin automation item, sync site to alpha.7
- Defer extension architecture until post-1.0 ([#187](https://github.com/foxly-it/rootguard/pull/187))
- Synchronize backups navigation ([#197](https://github.com/foxly-it/rootguard/pull/197))
- Align operations UI documentation ([#208](https://github.com/foxly-it/rootguard/pull/208))
- Record log allowlist separation ([#211](https://github.com/foxly-it/rootguard/pull/211))
### Fixed
- Clamp section-nav rail to never overlap expanded sidebar ([#179](https://github.com/foxly-it/rootguard/pull/179))
- Stop truncating sidebar sub-item labels, show them collapsed ([#181](https://github.com/foxly-it/rootguard/pull/181))
- Pin AdGuard and controller addresses on the DNS network ([#182](https://github.com/foxly-it/rootguard/pull/182))
- Allow managed control-plane logs ([#210](https://github.com/foxly-it/rootguard/pull/210))
- Style backup archive picker ([#213](https://github.com/foxly-it/rootguard/pull/213))
- Compact AdGuard contextual actions ([#215](https://github.com/foxly-it/rootguard/pull/215))
- Compact Unbound form controls ([#217](https://github.com/foxly-it/rootguard/pull/217))
### Other
- Sync the compose.alpha.yaml header comment version, automate it going forward
- Add bounded reverse-DNS host discovery ([#185](https://github.com/foxly-it/rootguard/pull/185))
- Add passphrase-encrypted full backup export ([#193](https://github.com/foxly-it/rootguard/pull/193))
- Add dedicated backups page ([#195](https://github.com/foxly-it/rootguard/pull/195))
- Add guided clean-install full restore ([#199](https://github.com/foxly-it/rootguard/pull/199))
- Polish Unbound cache card spacing ([#218](https://github.com/foxly-it/rootguard/pull/218))
- Rate limits and audit events for destructive actions ([#220](https://github.com/foxly-it/rootguard/pull/220))
- Formal keyboard/screen-reader re-verification of every WebGUI workflow ([#222](https://github.com/foxly-it/rootguard/pull/222))
- Verify pre-update snapshot integrity before an automatic rollback ([#224](https://github.com/foxly-it/rootguard/pull/224))
- Prove recovery from a real process kill mid-install and mid-update (#225) ([#226](https://github.com/foxly-it/rootguard/pull/226))
- Add a disaster-recovery runbook, drilled on a real separate host (#227) ([#228](https://github.com/foxly-it/rootguard/pull/228))
- Attach SBOM/provenance to every release image, verify all 5 signers (#229, #230) ([#231](https://github.com/foxly-it/rootguard/pull/231))
### Testing
- Add end-to-end scenario tests for guided Unbound settings ([#183](https://github.com/foxly-it/rootguard/pull/183))
## [0.1.0-alpha.7] - 2026-08-10
### Added
- Sticky in-page section nav, reveal-and-focus for search ([#108](https://github.com/foxly-it/rootguard/pull/108))
### CI
- Run functional checks on native arm64, not just amd64 ([#121](https://github.com/foxly-it/rootguard/pull/121))
- Add dependency, container, secret, and static-analysis scans ([#143](https://github.com/foxly-it/rootguard/pull/143))
- Add AdGuard compatibility tests against both supported channels ([#158](https://github.com/foxly-it/rootguard/pull/158))
- Complete OCI image metadata labels across all 5 components ([#162](https://github.com/foxly-it/rootguard/pull/162))
- Automate compose.alpha.yaml digest pins after each alpha release ([#165](https://github.com/foxly-it/rootguard/pull/165))
### Documentation
- Document blockpage, fix stale monorepo component links ([#104](https://github.com/foxly-it/rootguard/pull/104))
- Point blockpage redesign roadmap link at the merged PR ([#119](https://github.com/foxly-it/rootguard/pull/119))
- Refresh zone-centred host inventory + FRITZ!Box import plan ([#113](https://github.com/foxly-it/rootguard/pull/113))
- Add threat model covering the six 0.5 trust boundaries ([#144](https://github.com/foxly-it/rootguard/pull/144))
- Verify WCAG reduced-motion coverage, split it out of the contrast/focus item ([#145](https://github.com/foxly-it/rootguard/pull/145))
- Add HTTPS/reverse-proxy deployment guide, verify secure-cookie enforcement ([#146](https://github.com/foxly-it/rootguard/pull/146))
- Document AdGuard backup/restore ownership ([#151](https://github.com/foxly-it/rootguard/pull/151))
- Sync ROADMAP.md status against the public website ([#154](https://github.com/foxly-it/rootguard/pull/154))
- Fix a stale roadmap checkbox and persist a sequenced next-steps plan ([#157](https://github.com/foxly-it/rootguard/pull/157))
- Correct roadmap items against a code audit, not assumptions ([#163](https://github.com/foxly-it/rootguard/pull/163))
- Note the unbound.conf importer hardening and host-table UI polish
### Fixed
- Show Unbound expert base config always, not behind a click ([#102](https://github.com/foxly-it/rootguard/pull/102))
### Maintenance
- Stop tracking AI assistant tooling files
- Gitignore the local-only AI memory file
- Rename the local AI context file to something inconspicuous
### Other
- Bump the actions group across 1 directory with 6 updates ([#94](https://github.com/foxly-it/rootguard/pull/94))
- Refresh README/website for alpha.6, fix stale monorepo/UI references ([#96](https://github.com/foxly-it/rootguard/pull/96))
- Ship RootGuard Blockpage: fresh design + automatic AdGuard wiring ([#98](https://github.com/foxly-it/rootguard/pull/98))
- Redesign blockpage around AdGuard's own color language, not RootGuard's ([#100](https://github.com/foxly-it/rootguard/pull/100))
- Make Unbound tabs URL-addressable, wire precise search-to-tab navigation ([#106](https://github.com/foxly-it/rootguard/pull/106))
- Add a blockpage preview link in Setup, fix a real contrast bug found while building it ([#112](https://github.com/foxly-it/rootguard/pull/112))
- Reason-lookup backend proxying AdGuard's check_host ([#117](https://github.com/foxly-it/rootguard/pull/117))
- Show the real per-request block reason, not a static list ([#118](https://github.com/foxly-it/rootguard/pull/118))
- Visual redesign - cards and motion, not a dashboard ([#119](https://github.com/foxly-it/rootguard/pull/119))
- Fix reason card never highlighting on a real match ([#120](https://github.com/foxly-it/rootguard/pull/120))
- Accessibility verification pass: contrast, focus trap, keyboard access, zoom/reflow ([#110](https://github.com/foxly-it/rootguard/pull/110))
- Document and test fixed-base hardening directives ([#122](https://github.com/foxly-it/rootguard/pull/122))
- Refresh dashboard preview, drop off-topic nav, fix real gaps ([#123](https://github.com/foxly-it/rootguard/pull/123))
- Hover feedback for ContentModal's close button + a real contrast fix found along the way ([#124](https://github.com/foxly-it/rootguard/pull/124))
- Narrative redesign with a RootGuard fox mascot ([#125](https://github.com/foxly-it/rootguard/pull/125))
- Add jump-to-top button ([#126](https://github.com/foxly-it/rootguard/pull/126))
- Fix header GitHub link pointing at the archived component repo ([#128](https://github.com/foxly-it/rootguard/pull/128))
- Typed host-inventory backend (zone-centred local hosts) ([#129](https://github.com/foxly-it/rootguard/pull/129))
- Fix sticky section-nav unsticking early + style blockpage preview as a button ([#130](https://github.com/foxly-it/rootguard/pull/130))
- Bump nanoid to clear a high-severity advisory ([#134](https://github.com/foxly-it/rootguard/pull/134))
- FRITZ!Box TR-064 host discovery adapter ([#133](https://github.com/foxly-it/rootguard/pull/133))
- Float Unbound's section nav as an icon rail on wide viewports ([#135](https://github.com/foxly-it/rootguard/pull/135))
- Anchor the floating rail to content instead of the viewport edge ([#136](https://github.com/foxly-it/rootguard/pull/136))
- FRITZ!Box import UI - discover, rename, select, activate ([#137](https://github.com/foxly-it/rootguard/pull/137))
- Fix the section-nav rail rendering way too wide ([#138](https://github.com/foxly-it/rootguard/pull/138))
- Sync roadmap.html's 0.2 status with what actually shipped ([#139](https://github.com/foxly-it/rootguard/pull/139))
- Keep local_zones when switching resolver presets ([#140](https://github.com/foxly-it/rootguard/pull/140))
- Fix misaligned columns in the Cache & performance card ([#141](https://github.com/foxly-it/rootguard/pull/141))
- Restyle the Unbound in-page rail as a left-gutter "on this page" widget ([#142](https://github.com/foxly-it/rootguard/pull/142))
- Add session inventory and revocation ([#147](https://github.com/foxly-it/rootguard/pull/147))
- Add login/recovery rate limiting and an auth audit log ([#148](https://github.com/foxly-it/rootguard/pull/148))
- Surface AdGuard's own reported version ([#149](https://github.com/foxly-it/rootguard/pull/149))
- Add contextual deep-links from AdGuard status to native AdGuard pages ([#150](https://github.com/foxly-it/rootguard/pull/150))
- Fix a broken healthcheck on the distroless runtime image ([#152](https://github.com/foxly-it/rootguard/pull/152))
- Fix toggle-row hover background overhanging the advanced-settings card ([#153](https://github.com/foxly-it/rootguard/pull/153))
- Redesign AdGuard status panel and add filtering toggle ([#155](https://github.com/foxly-it/rootguard/pull/155))
- Close layout gaps on Setup network step and Dashboard data-flow card ([#156](https://github.com/foxly-it/rootguard/pull/156))
- Fix Unbound section-nav rail links overflowing the widget ([#159](https://github.com/foxly-it/rootguard/pull/159))
- Add cross-service Client -> AdGuard -> Unbound -> DNSSEC diagnostics ([#160](https://github.com/foxly-it/rootguard/pull/160))
- Align the section-nav rail with the tab strip and ease truncation ([#161](https://github.com/foxly-it/rootguard/pull/161))
- Fix webapp's attestation policy pointing at the archived per-repo ([#166](https://github.com/foxly-it/rootguard/pull/166))
- Migrate guided zones onto the typed host-inventory model ([#167](https://github.com/foxly-it/rootguard/pull/167))
- Extract the shared guided draft/preview/activate workflow ([#168](https://github.com/foxly-it/rootguard/pull/168))
- Enforce hostname uniqueness across zones ([#169](https://github.com/foxly-it/rootguard/pull/169))
- Import/export of the complete logical resolver configuration ([#170](https://github.com/foxly-it/rootguard/pull/170))
- Classify and adopt a hand-written unbound.conf (partial) ([#171](https://github.com/foxly-it/rootguard/pull/171))
- Fix missing spacing between Advanced-tab cards ([#172](https://github.com/foxly-it/rootguard/pull/172))
- Reverse-map forward-zone blocks in the unbound.conf importer ([#173](https://github.com/foxly-it/rootguard/pull/173))
- Reverse-map local-zone host inventory in the unbound.conf importer ([#174](https://github.com/foxly-it/rootguard/pull/174))
- Reverse-map RFC1918 reverse-zone policy, network mode, and resource ([#175](https://github.com/foxly-it/rootguard/pull/175))
- Validate zone names/addresses before classifying as guided; fix filter-chip contrast ([#176](https://github.com/foxly-it/rootguard/pull/176))
- Fix PTR trailing-dot rejection and custom-config accumulation on re-import ([#177](https://github.com/foxly-it/rootguard/pull/177))
- Show local zone hosts as a table instead of an inline chip list ([#178](https://github.com/foxly-it/rootguard/pull/178))
- Update the public roadmap page for the 0.2 Unbound work
## [0.1.0-alpha.6] - 2026-08-06
### Added
- Full-stack container integration with stable SPA routing
- Professional dashboard layout with status indicator
- Stabilize router + SPA fallback, add dashboard API + service endpoint, UI glass layout baseline
- Implement service detection engine
- Implement docker container lifecycle control
- Introduce rootguard service model
- Introduce service registry
- Select AdGuard release channel ([#46](https://github.com/foxly-it/rootguard/pull/46))
- Show cryptographic release provenance ([#47](https://github.com/foxly-it/rootguard/pull/47))
- Introduce semantic design tokens with System/Light/Dark support ([#54](https://github.com/foxly-it/rootguard/pull/54))
- Migrate Dashboard to design tokens ([#56](https://github.com/foxly-it/rootguard/pull/56))
- Migrate remaining pages to design tokens ([#58](https://github.com/foxly-it/rootguard/pull/58))
- Rework as a coherent utility bar ([#60](https://github.com/foxly-it/rootguard/pull/60))
- Consolidate language, appearance, and sign-out into a user menu ([#62](https://github.com/foxly-it/rootguard/pull/62))
- Add global, local-only search with S / Ctrl+Cmd+K ([#64](https://github.com/foxly-it/rootguard/pull/64))
- Move collapse control to bottom edge, default desktop to collapsed ([#68](https://github.com/foxly-it/rootguard/pull/68))
- Add AdGuard release channels ([#32](https://github.com/foxly-it/rootguard/pull/32))
- Verify release attestations ([#33](https://github.com/foxly-it/rootguard/pull/33))
- Stable rootguard unbound base image with dnssec, internal bind and production defaults
### CI
- Add GHCR multi-arch pipeline + improved Dockerfile
- Restore id-token/attestations permissions dropped during port
### Changed
- Remove duplicate service model file
### Documentation
- Add rootguard-blockpage roadmap item ([#84](https://github.com/foxly-it/rootguard/pull/84))
- Add expert editor fullscreen + inline base config roadmap item ([#85](https://github.com/foxly-it/rootguard/pull/85))
- Catch up ROADMAP.md/project-state.md for items 7 and 8 (missed earlier) ([#86](https://github.com/foxly-it/rootguard/pull/86))
- Mark 4 already-shipped roadmap items as done (audit finding) ([#87](https://github.com/foxly-it/rootguard/pull/87))
### Fixed
- Regenerate package-lock for CI build
- Extend service model to support detection layer fields
- Preserve service provenance fields ([#48](https://github.com/foxly-it/rootguard/pull/48))
- Bump brace-expansion and postcss to clear high-severity audit gate ([#52](https://github.com/foxly-it/rootguard/pull/52))
- Derive service KPI total from allowlist instead of hardcoded 2 ([#50](https://github.com/foxly-it/rootguard/pull/50))
- Remove distracting hero circles, fix search placement ([#66](https://github.com/foxly-it/rootguard/pull/66))
- Verify exact SLSA v1 predicate ([#34](https://github.com/foxly-it/rootguard/pull/34))
- Install unbound-anchor for automatic dnssec trust anchor generation
- Bind unbound to 0.0.0.0 for docker port mapping compatibility
- Use writable trust anchor in /var/lib/unbound (Debian 13 compliant)
- Explicit IPv4 + IPv6 binding for Docker compatibility
### Maintenance
- Gitignore local AI-assistant tooling (.claude/, CLAUDE.md) ([#76](https://github.com/foxly-it/rootguard/pull/76))
- Bump rootguard-webapp submodule for design-token theme system ([#77](https://github.com/foxly-it/rootguard/pull/77))
- Bump rootguard-webapp submodule for Dashboard design-token migration ([#78](https://github.com/foxly-it/rootguard/pull/78))
- Bump rootguard-webapp submodule, theme-tokens roadmap item complete ([#79](https://github.com/foxly-it/rootguard/pull/79))
- Bump rootguard-webapp submodule for header utility-bar rework ([#80](https://github.com/foxly-it/rootguard/pull/80))
- Bump rootguard-webapp submodule for the accessible user menu ([#81](https://github.com/foxly-it/rootguard/pull/81))
- Bump rootguard-webapp submodule for global search ([#82](https://github.com/foxly-it/rootguard/pull/82))
- Bump rootguard-webapp submodule for hero-circle/search-header fix ([#83](https://github.com/foxly-it/rootguard/pull/83))
### Other
- Add verified RootGuard product screenshots
- Sync Core API docs and WebGUI roadmap
- Integrate tested rootless Podman documentation
- Bump rootguard-webapp submodule: Dashboard KPI fix + audit-gate bump ([#75](https://github.com/foxly-it/rootguard/pull/75))
- Bump rootguard-webapp: theme-aware shadow fix for washed-out light mode ([#89](https://github.com/foxly-it/rootguard/pull/89))
- Bump rootguard-webapp: expert editor fullscreen + inline base config ([#91](https://github.com/foxly-it/rootguard/pull/91))
- Remove git submodules ahead of monorepo migration
- Initial commit
- Add initial backend implementation (health + version endpoints)
- Add professional project README
- Add docker stats engine, system API and dashboard metrics
- Connect WebApp to Core and add Unbound settings ([#12](https://github.com/foxly-it/rootguard/pull/12))
- Add AdGuard bootstrap interface ([#13](https://github.com/foxly-it/rootguard/pull/13))
- Add Unbound preview rollback and diagnostics UI ([#14](https://github.com/foxly-it/rootguard/pull/14))
- Add Unbound advisor and preset interface ([#15](https://github.com/foxly-it/rootguard/pull/15))
- Add Unbound expert configuration editor ([#16](https://github.com/foxly-it/rootguard/pull/16))
- Add secure AIO management interface ([#17](https://github.com/foxly-it/rootguard/pull/17))
- Enforce frontend dependency security audit ([#18](https://github.com/foxly-it/rootguard/pull/18))
- Add guided conditional forwarding interface ([#19](https://github.com/foxly-it/rootguard/pull/19))
- Guide unsigned private forward zones ([#20](https://github.com/foxly-it/rootguard/pull/20))
- Guide private answers for forward zones ([#21](https://github.com/foxly-it/rootguard/pull/21))
- Clarify forwarding authority checks ([#22](https://github.com/foxly-it/rootguard/pull/22))
- Fix alpha dependency security audit ([#23](https://github.com/foxly-it/rootguard/pull/23))
- Add secure local password recovery ([#24](https://github.com/foxly-it/rootguard/pull/24))
- Improve GitHub project discoverability ([#25](https://github.com/foxly-it/rootguard/pull/25))
- Explain service runtime state in Stack Center ([#27](https://github.com/foxly-it/rootguard/pull/27))
- Add on-demand service diagnostics ([#28](https://github.com/foxly-it/rootguard/pull/28))
- Show update and cleanup history ([#29](https://github.com/foxly-it/rootguard/pull/29))
- Show actionable installation diagnostics ([#30](https://github.com/foxly-it/rootguard/pull/30))
- Add guided private DNS controls ([#31](https://github.com/foxly-it/rootguard/pull/31))
- Add guided resolver protocol modes ([#32](https://github.com/foxly-it/rootguard/pull/32))
- Explain containers without healthchecks ([#33](https://github.com/foxly-it/rootguard/pull/33))
- Polish Unbound fields and runtime badge ([#34](https://github.com/foxly-it/rootguard/pull/34))
- Polish management UI ([#35](https://github.com/foxly-it/rootguard/pull/35))
- Add Unbound resource profile controls ([#36](https://github.com/foxly-it/rootguard/pull/36))
- Preserve Unbound resource profiles in proxy ([#37](https://github.com/foxly-it/rootguard/pull/37))
- Add serve-expired controls to Webapp ([#38](https://github.com/foxly-it/rootguard/pull/38))
- Add DNSSEC cache controls ([#39](https://github.com/foxly-it/rootguard/pull/39))
- Expose EDNS buffer size control ([#40](https://github.com/foxly-it/rootguard/pull/40))
- Expose temporary diagnostic logging ([#41](https://github.com/foxly-it/rootguard/pull/41))
- Add collapsible navigation sidebar ([#42](https://github.com/foxly-it/rootguard/pull/42))
- Show AdGuard filter diagnostics ([#43](https://github.com/foxly-it/rootguard/pull/43))
- Unify actions and focus AdGuard diagnostics
- Show trusted stack release metadata ([#45](https://github.com/foxly-it/rootguard/pull/45))
- Keep sidebar navigation and collapse control visible while long pages scroll ([#70](https://github.com/foxly-it/rootguard/pull/70))
- Make box-shadow color/intensity theme-aware to fix washed-out light mode ([#72](https://github.com/foxly-it/rootguard/pull/72))
- Add fullscreen mode and inline base-config reference to expert editor ([#74](https://github.com/foxly-it/rootguard/pull/74))
- Initial project structure
- Add Apache 2.0 license
- Add NOTICE
- Build secure RootGuard control plane ([#1](https://github.com/foxly-it/rootguard/pull/1))
- Add secure AdGuard bootstrap control ([#2](https://github.com/foxly-it/rootguard/pull/2))
- Add versioned Unbound configuration lifecycle ([#4](https://github.com/foxly-it/rootguard/pull/4))
- Add Unbound presets and advisor ([#5](https://github.com/foxly-it/rootguard/pull/5))
- Add safe Unbound custom configuration ([#6](https://github.com/foxly-it/rootguard/pull/6))
- Build AIO control plane and safe updates ([#7](https://github.com/foxly-it/rootguard/pull/7))
- Add guided conditional forwarding ([#8](https://github.com/foxly-it/rootguard/pull/8))
- Support unsigned private forward zones ([#9](https://github.com/foxly-it/rootguard/pull/9))
- Allow private answers per forward zone ([#10](https://github.com/foxly-it/rootguard/pull/10))
- Require authoritative forwarding probes ([#11](https://github.com/foxly-it/rootguard/pull/11))
- Stabilize forwarding probe errors ([#12](https://github.com/foxly-it/rootguard/pull/12))
- Improve GitHub project discoverability ([#13](https://github.com/foxly-it/rootguard/pull/13))
- Expose trustworthy service runtime metadata ([#15](https://github.com/foxly-it/rootguard/pull/15))
- Add bounded redacted service diagnostics ([#16](https://github.com/foxly-it/rootguard/pull/16))
- Add safe update cleanup history ([#17](https://github.com/foxly-it/rootguard/pull/17))
- Add typed installation diagnostics ([#18](https://github.com/foxly-it/rootguard/pull/18))
- Add guided private DNS settings ([#19](https://github.com/foxly-it/rootguard/pull/19))
- Add capability-checked resolver modes ([#20](https://github.com/foxly-it/rootguard/pull/20))
- Distinguish missing container healthchecks ([#21](https://github.com/foxly-it/rootguard/pull/21))
- Add live dashboard metrics ([#22](https://github.com/foxly-it/rootguard/pull/22))
- Add bounded Unbound resource profiles ([#23](https://github.com/foxly-it/rootguard/pull/23))
- Add guided serve-expired controls ([#24](https://github.com/foxly-it/rootguard/pull/24))
- Add DNSSEC cache controls ([#25](https://github.com/foxly-it/rootguard/pull/25))
- Add EDNS buffer size control ([#26](https://github.com/foxly-it/rootguard/pull/26))
- Add privacy-safe diagnostic logging ([#27](https://github.com/foxly-it/rootguard/pull/27))
- Migrate service volume ownership during updates ([#28](https://github.com/foxly-it/rootguard/pull/28))
- Add AdGuard filter diagnostics and DNS defaults ([#29](https://github.com/foxly-it/rootguard/pull/29))
- Fix AdGuard DNS baseline status ([#30](https://github.com/foxly-it/rootguard/pull/30))
- Expose stack release metadata ([#31](https://github.com/foxly-it/rootguard/pull/31))
- Initial rootguard-unbound engine (Debian based) + GH Actions
- Fix Dockerfile: remove entrypoint and stabilize build
- Use system user instead of fixed UID
- Use packaged unbound system user
- Add MIT license and README
- Enterprise versioning: automatic Debian Unbound tagging
- Fix Docker tag: sanitize Debian version (+ → -)
- Update README.md
- Finalize recursive DNSSEC configuration with persistent trust anchor
- Finalize Debian-based recursive DNSSEC configuration (enterprise commented)
- Run container as root (Debian compliant), let unbound drop privileges internally
- Install dns-root-data package to provide Debian root.key
- Container-optimized recursive DNSSEC configuration with documentation
- Finalize enterprise container-optimized Unbound configuration
- Finalize container-optimized Unbound configuration (no pidfile, no syslog)
- Move DNSSEC trust anchor to /var/lib/unbound (writable runtime path)
- Add runtime entrypoint to fix volume ownership and drop privileges correctly
- Finalize runtime bootstrap: proper trust anchor handling without su
- Enterprise runtime model: root PID1 + internal privilege drop
- Enterprise entrypoint: state init + ownership fix + DNSSEC bootstrap
- Replace unbound-anchor bootstrap with Debian trust anchor copy
- Remove unbound-anchor, use Debian dns-root-data trust anchor
- Finalize immutable runtime model with documented unbound.conf
- Finalize immutable runtime model with documented unbound.conf
- Remove legacy entrypoint.sh, keep docker-entrypoint.sh
- Production-ready rootguard unbound base image
- Production-ready rootguard unbound image without anchor hard-fail
- Debian 13 compliant rootguard unbound image using dns-root-data trust anchor
- Debian 13 compliant writable trust anchor under /var/lib/unbound
- Docker-compatible access-control with bridge network support
- Rootguard-ready modular unbound base (unbound.d includes)
- Update README.md
- Harden Unbound for RootGuard runtime ([#1](https://github.com/foxly-it/rootguard/pull/1))
- Adopt AGPL-3.0-or-later ([#2](https://github.com/foxly-it/rootguard/pull/2))
- Allow versioned RootGuard image tags ([#3](https://github.com/foxly-it/rootguard/pull/3))
- Improve GitHub project discoverability ([#4](https://github.com/foxly-it/rootguard/pull/4))
- Upgrade Unbound security baseline to 1.25.2 ([#6](https://github.com/foxly-it/rootguard/pull/6))
- Enable loopback-only runtime control ([#7](https://github.com/foxly-it/rootguard/pull/7))
- Keep Unbound volume identity stable ([#8](https://github.com/foxly-it/rootguard/pull/8))
- Build Unbound reproducibly from verified source ([#9](https://github.com/foxly-it/rootguard/pull/9))
- Prepare RootGuard alpha foundation and documentation ([#5](https://github.com/foxly-it/rootguard/pull/5))
- Add safe update lifecycle history ([#34](https://github.com/foxly-it/rootguard/pull/34))
- Prepare standalone updater component ([#1](https://github.com/foxly-it/rootguard/pull/1))
- Test real paired update and rollback ([#3](https://github.com/foxly-it/rootguard/pull/3))
- Bump the actions group across 1 directory with 6 updates ([#2](https://github.com/foxly-it/rootguard/pull/2))
- Rebuild CI, docs, and workflow tooling for the monorepo
## [0.1.0-alpha.5] - 2026-08-01
### Added
- Add AdGuard release channel setup ([#66](https://github.com/foxly-it/rootguard/pull/66))
- Integrate signed release provenance ([#67](https://github.com/foxly-it/rootguard/pull/67))
### Fixed
- Use exact SLSA v1 attestation predicate ([#68](https://github.com/foxly-it/rootguard/pull/68))
- Preserve Stack Center provenance status ([#69](https://github.com/foxly-it/rootguard/pull/69))
### Other
- Integrate WebApp action audit
- Integrate reproducible Unbound source build ([#63](https://github.com/foxly-it/rootguard/pull/63))
- Complete Unbound amd64 update verification ([#64](https://github.com/foxly-it/rootguard/pull/64))
- Integrate stack release metadata ([#65](https://github.com/foxly-it/rootguard/pull/65))
- Prepare v0.1.0-alpha.5 ([#70](https://github.com/foxly-it/rootguard/pull/70))
## [0.1.0-alpha.4] - 2026-08-01
### Other
- Integrate Unbound resource profiles ([#50](https://github.com/foxly-it/rootguard/pull/50))
- Pin patched Unbound 1.25.2 image ([#51](https://github.com/foxly-it/rootguard/pull/51))
- Integrate serve-expired controls ([#52](https://github.com/foxly-it/rootguard/pull/52))
- Integrate DNSSEC cache controls ([#53](https://github.com/foxly-it/rootguard/pull/53))
- Integrate EDNS buffer size control ([#54](https://github.com/foxly-it/rootguard/pull/54))
- Integrate privacy-safe diagnostic logging ([#55](https://github.com/foxly-it/rootguard/pull/55))
- Integrate sidebar and matching preview icons ([#56](https://github.com/foxly-it/rootguard/pull/56))
- Match preview KPI icons to dashboard ([#57](https://github.com/foxly-it/rootguard/pull/57))
- Integrate safe Unbound volume migration ([#58](https://github.com/foxly-it/rootguard/pull/58))
- Prioritize reproducible Unbound build ([#59](https://github.com/foxly-it/rootguard/pull/59))
- Integrate AdGuard filter diagnostics ([#60](https://github.com/foxly-it/rootguard/pull/60))
- Prepare RootGuard v0.1.0-alpha.4
## [0.1.0-alpha.3] - 2026-07-29
### Other
- Record alpha.2 release status ([#17](https://github.com/foxly-it/rootguard/pull/17))
- Add live project overview to website ([#18](https://github.com/foxly-it/rootguard/pull/18))
- Simplify project website experience ([#19](https://github.com/foxly-it/rootguard/pull/19))
- Improve GitHub project discoverability ([#20](https://github.com/foxly-it/rootguard/pull/20))
- Stabilize manual section navigation ([#22](https://github.com/foxly-it/rootguard/pull/22))
- Update component repository presentation ([#23](https://github.com/foxly-it/rootguard/pull/23))
- Animate hero dashboard preview ([#24](https://github.com/foxly-it/rootguard/pull/24))
- Use production environment terminology ([#25](https://github.com/foxly-it/rootguard/pull/25))
- Add project legal pages and tool navigation ([#26](https://github.com/foxly-it/rootguard/pull/26))
- Group and polish public site navigation ([#27](https://github.com/foxly-it/rootguard/pull/27))
- Correct AdGuard Home Updater naming ([#28](https://github.com/foxly-it/rootguard/pull/28))
- Integrate language switch into navigation ([#29](https://github.com/foxly-it/rootguard/pull/29))
- Unify site header and documentation naming ([#30](https://github.com/foxly-it/rootguard/pull/30))
- Sync roadmap and Stack Center visibility ([#31](https://github.com/foxly-it/rootguard/pull/31))
- Publish bounded Stack Center diagnostics ([#32](https://github.com/foxly-it/rootguard/pull/32))
- Refine AdGuard integration and cleanup roadmap ([#33](https://github.com/foxly-it/rootguard/pull/33))
- Add safe update lifecycle history ([#34](https://github.com/foxly-it/rootguard/pull/34))
- Pin alpha images by digest ([#35](https://github.com/foxly-it/rootguard/pull/35))
- Pin standalone updater component ([#36](https://github.com/foxly-it/rootguard/pull/36))
- Pin real update rollback test ([#37](https://github.com/foxly-it/rootguard/pull/37))
- Publish installation diagnostics milestone ([#38](https://github.com/foxly-it/rootguard/pull/38))
- Add clean install platform matrix ([#40](https://github.com/foxly-it/rootguard/pull/40))
- Add guided private DNS lifecycle ([#42](https://github.com/foxly-it/rootguard/pull/42))
- Add checked resolver protocol modes ([#44](https://github.com/foxly-it/rootguard/pull/44))
- Unify Docs link colors ([#45](https://github.com/foxly-it/rootguard/pull/45))
- Integrate explicit healthcheck states ([#46](https://github.com/foxly-it/rootguard/pull/46))
- Integrate RootGuard UI polish ([#47](https://github.com/foxly-it/rootguard/pull/47))
- Integrate dashboard metrics and UI polish ([#48](https://github.com/foxly-it/rootguard/pull/48))
- Prepare RootGuard v0.1.0-alpha.3 ([#49](https://github.com/foxly-it/rootguard/pull/49))
## [0.1.0-alpha.2] - 2026-07-26
### Other
- Announce public alpha on website ([#14](https://github.com/foxly-it/rootguard/pull/14))
- Integrate local password recovery ([#15](https://github.com/foxly-it/rootguard/pull/15))
- Prepare RootGuard v0.1.0-alpha.2 ([#16](https://github.com/foxly-it/rootguard/pull/16))
## [0.1.0-alpha.1] - 2026-07-26
### Other
- Initialize RootGuard project repository
- Integrate RootGuard stack and project website ([#1](https://github.com/foxly-it/rootguard/pull/1))
- Update GitHub Pages actions ([#2](https://github.com/foxly-it/rootguard/pull/2))
- Integrate Unbound configuration v2 ([#3](https://github.com/foxly-it/rootguard/pull/3))
- Integrate Unbound advisor and project state ([#4](https://github.com/foxly-it/rootguard/pull/4))
- Prepare RootGuard alpha foundation and documentation ([#5](https://github.com/foxly-it/rootguard/pull/5))
- Integrate guided conditional forwarding ([#6](https://github.com/foxly-it/rootguard/pull/6))
- Allow private answers for forward zones ([#7](https://github.com/foxly-it/rootguard/pull/7))
- Require authoritative forwarding checks ([#8](https://github.com/foxly-it/rootguard/pull/8))
- Refresh dashboard website preview ([#9](https://github.com/foxly-it/rootguard/pull/9))
- Prepare public RootGuard alpha Compose release ([#10](https://github.com/foxly-it/rootguard/pull/10))
- Respect component package ownership ([#11](https://github.com/foxly-it/rootguard/pull/11))
- Publish WebApp from its component repository ([#12](https://github.com/foxly-it/rootguard/pull/12))
- Pin published alpha component revisions ([#13](https://github.com/foxly-it/rootguard/pull/13))