A container's own visible card is inset from its allocated board cell by the board's standard per-item gap, but items inside it are positioned in a coordinate space sized to the un-inset column/row count - so without correcting for that, items (not just the grid's own box) spilled past the container's right/bottom edge by that inset amount, worse the busier/more zoomed-out the board is. Scales the container's inner grid content down to fit the actual card size, using the same zoom mechanism the board's own top-level canvas uses for its whole-board zoom, just one level deeper. Corrects --board-canvas-ui-scale to compensate so icon/text/custom-CSS sizing inside the container isn't affected - computed as a plain JS number rather than a CSS calc() referencing the property's own inherited value, since custom properties don't have a sequential/temporal order within the same element and doing so is a circular reference that silently invalidates the whole property for every descendant. Also fixes the collapsible container's label bar poking above the card's rounded top border via a negative offset - it now sits flush inside it.
Homarr web application
This workspace contains Homarr's Next.js application. It consumes the shared API, authentication, database, board, widget, translation, and UI packages from this monorepo.
Run commands from the repository root:
pnpm install --frozen-lockfile
cp .env.example .env
Keep infrastructure running in the first terminal:
pnpm docker:dev
Apply migrations and start the application in a second terminal:
pnpm db:migration:sqlite:run
pnpm dev
The app listens on http://127.0.0.1:3000. Configure an absolute writable DB_URL, AUTH_SECRET, and
SECRET_ENCRYPTION_KEY in .env before first startup.
To test Custom Widgets against a local Community Workshop, start PocketBase and the docs in separate terminals:
pnpm docker:workshop
WORKSHOP_API_URL=http://127.0.0.1:8090 pnpm dev:docs
Then set:
HOMARR_WEBSITE_URL=http://127.0.0.1:3003
WORKSHOP_API_URL=http://127.0.0.1:8090
WORKSHOP_WEB_URL=http://127.0.0.1:3003/workshop
Server-rendered runtime configuration exposes those URLs to the browser, so changing a production container's environment does not require rebuilding the Next.js bundle.
See apps/docs/docs/advanced/development/getting-started.mdx
for the full contributor setup.