The matrix could not represent board-create, app-create, integration-create, search-engine-create or media-upload, and savePermissions force-bundled every create key with its modify/full parent. Together that meant a group with board-create was silently upgraded to board-full-all on the next save, and the common "members may create their own boards" setup became unreachable. - permissionMatrix models create/upload as an orthogonal capability next to the ordered access levels, so all 20 permission keys round-trip losslessly - savePermissions stores exactly what was selected - the matrix UI gets a per-category create checkbox, auto-checked and disabled when the chosen level already implies it - a management section is reachable when the user can do at least one thing in it; nav, pages and stat cards now share one access helper
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.