* feat: migrate tooling and runtimes to bun
* fix: serialize act installs and adapt backup checks
* fix: finish bun scripts and rootless act setup
* fix: support bun images in runtime benchmarks
* fix: keep a single bun toolchain configuration
* fix: include docs mascot sources in workshop build
* docs: use bun in remaining tool commands
* fix: complete bun sqlite development tooling
* docs: explain sqlite development adapter
* fix: align remaining commands and local ci validation
* fix: use renovate regex fallback with bun
* fix: finalize bun sqlite connections during cleanup
* fix: preserve sqlite foreign key enforcement
* fix: align docker build frontends
* fix: prepare release versions with bun
* Add Bun benchmarks and preserve SQLite connection defaults
* Benchmark Bun installs, conflicts and production workloads
* Force Bun workspace tools and HTTP/1.1 upstream streaming
* Exclude benchmark evidence from Docker contexts
* Expose branch benchmarks through CI
* Verify hydrated widget data in production benchmarks
* Measure image archives and document benchmark protocol
* Audit dependency sharing across every workspace
* Pin pnpm for nested baseline benchmark scripts
* Preserve nested manager pinning on benchmark resume
* Include application and runtime image footprints
* Fail benchmark gates on candidate command errors
* Report complete build overhead and sampled memory bounds
* Validate migration comparisons across pinned revisions
* Record configurable runtime memory budgets
* Retain out-of-memory kills in runtime budget probes
* Reject OOM events consistently across runtime metrics
* Record complete Bun migration benchmarks
* Record memory diagnosis and correct Turbo caching
* Use Bun package management while preserving Node runtimes
* Keep native build fallbacks and exclude development artifacts
* Fix Node ESM metadata and isolate local CI configuration
* Measure development performance and isolate act environment
* Support isolated environment files in rootless act
* Validate the full migration range with act
* Preserve native SQLite binding for bundled migrations
* Use documented dev defaults and report benchmark scope
* Validate dev defaults and isolate restart measurements
* Record package-manager and development benchmarks
* Keep benchmark measurements and link full command artifacts
* Clean up temporary act environment files
* Validate Node runtimes in package-manager comparisons
* Validate every workspace in manual CI runs
* Retain patched nested brace expansion versions
* Complete package-manager and Node performance report
* Normalize archived benchmark logs
* Record final hosted validation
* Cache both Next builds with platform isolation
* Prime cache with write-only mode
* Split Next artifacts below Cloudflare upload limit
* Assemble coherent standalone cache outputs
* Preserve traced middleware entrypoints
* Assemble traced directory links before files
* Separate cached dependencies from assembled output
* Record signed Turbo cache benchmarks
* Remove archived benchmark captures
Full benchmark evidence is preserved at 8f7d3bcd14109bfb13fa664d31710b88d820ad66.
* Remove migration benchmark harness
* fix: correct migration launch and local Act prerequisites
* Consolidate Turbo caches and production artifacts
* Exclude generated files from Docker cache inputs
* fix: address Bun migration review findings
* fix: check restored compiler bundle manifests
* feat(api): expand REST coverage for full dashboard automation
Closes#6435.
Boards could only be created empty through the API. The single endpoint for
adding a widget took no geometry, so the size came from the widget default and
the position was always the next free cell. Everything else a setup needs was
reachable from the interface only.
Board composition
- POST /api/boards/items accepts an optional placement: width, height, xOffset,
yOffset and sectionId, or a layouts array for per breakpoint control. Without
it the previous automatic placement is unchanged.
- Adds read, update and delete for items, CRUD for sections, read and replace
for layouts, and GET /api/boards/{id} for the whole board.
- GET /api/boards/{id}/export and POST /api/boards/import make a board
reproducible from version control. onConflict decides what happens when the
name is taken, so a pipeline can be re-run.
- Board access is manageable through GET/PUT /api/boards/{id}/permissions.
Remaining services
- Search engines, integrations, groups, api keys and server settings are
exposed over OpenAPI and registered as MCP tools.
- GET /api/config/export and POST /api/config/import cover the configuration of
a whole instance. Ids are kept so references inside opaque widget options stay
intact, and entities are matched by natural key when the id is unknown, which
is what makes a document from another instance applicable.
- The backup endpoints accept an ApiKey header, so a recovery job no longer
needs a browser session.
Headless bootstrap
- homarr api-keys create prints a key without opening the web interface, which
together with the existing recreate-admin removes the last manual step.
Notes
- No database migration, the schema already stores position and size.
- Grid coordinates and sizes in a document are bounded, and the placement scan
no longer walks every column, so a large grid cannot occupy the server.
- Imports collect their statements first and apply them in one transaction, so a
rejected document never leaves a board half written.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
* fix: harden dashboard automation APIs
* fix: validate global home board settings
* fix: validate merged import settings
* docs(api): describe the bounded placement scan accurately
The comment still described the earlier version that walked every row up to the
last occupied one. Both axes now iterate the edges of the occupied areas, so the
cost follows the amount of content rather than the dimensions of the grid.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
* fix(api): keep the search engine type narrow and record the new MCP tools
The `.output()` added to `searchEngine.getPaginated` widened `type` back to a
string through the plain select schema, which broke the management page that
switches on it. It now reuses the narrowed union the detail endpoint already has.
`mcp.spec` pins the reviewed tool inventory; the 33 tools this branch exposes are
added to it. The configuration round trip asserted the first layout of an item,
which is the mobile one half of the time and holds the same item clamped, so it
addresses the base layout by id instead.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
* feat(api): complete Homarr automation endpoints
* refactor(api): consolidate preferences and task docs
* refactor(api): narrow REST to dashboard automation
* refactor(api): expose existing dashboard controls only
* fix(docs): drop removed API key CLI path
---------
Co-authored-by: rfdrew <20803599+rfdrew@users.noreply.github.com>
Co-authored-by: Claude Opus 5 <noreply@anthropic.com>
Co-authored-by: Thomas Camlong <thomas@ajnart.fr>
Co-authored-by: ajnart <thomas@ajnart.dev>
* fix: use native DNS resolution by default for Docker services
* test: verify Docker service DNS through production Compose
* test: isolate Docker DNS smoke resources per invocation [skip ci]
Fix Unraid logical CPU averaging, preserve native context menus for app and bookmark widgets in view mode, and prevent scrollbar-width GridStack resize oscillation.
* fix: keep nginx IPv6 listen only when IPv6 is available (#4596)
Commit 2c48b1896 (1.45.2) made the internal nginx proxy listen on the IPv6
wildcard ('listen [::]:7575;'), which aborts nginx startup on hosts/VMs with
IPv6 disabled:
nginx: [emerg] socket() [::]:7575 failed (97: Address family not supported by protocol)
A plain revert would reintroduce #2697 and break IPv6-only/dual-stack
environments where this listener is required. Instead, only emit the IPv6
listen directive when the host actually has IPv6 configured.
Reuse the envsubst step run.sh already performs: compute NGINX_LISTEN_IPV6
from /proc/net/if_inet6 and substitute it into the template. proc files always
report size 0, so presence is detected by grepping the file (not 'test -s').
* fix: honor HOMARR_DISABLE_IPV6 override in nginx config generation
Review feedback on #6539: give users an explicit opt-out from the IPv6
listener even when the host reports IPv6. The issue reporter (#4596)
requested such an env var, and the pattern matches the existing
ENABLE_DNS_CACHING IPv6 toggle. Auto-detection behavior is unchanged when
the var is unset. Validated in containers: override wins, dual-stack
preserved by default, IPv4-only fallback on IPv6-less hosts.