Files
homarr/apps/nextjs
Thomas Camlong 206905ea2d feat(workshop): rebuild install and publish as pages
Replace the stacked install modals (browse -> details -> import review)
with page-based flows so the primary action is always reachable:

- /manage/custom-widgets/workshop browses submissions as a card grid
  with large previews, sitting in a tab next to the installed widgets
- /manage/custom-widgets/workshop/[id] merges the listing, security
  review and source setup onto one page with a sticky install footer
- /manage/custom-widgets/publish/[id] replaces the publish modal
- /manage/workshop redirects; its navbar entry is gone
- the Custom CSS picker collapses from three modals to one

Extract useCustomWidgetImport and ImportReviewContent so the Workshop
page and the file/clipboard dialog share one import pipeline.

Votes now show the viewer's own choice filled Reddit-style, backed by a
new user-votes query, and screenshots get a zoomable lightbox.

Rework the installed list onto ManageCollectionItem: show the widget
description, replace the cryptic "JSX - 2" badge with plain request and
origin facts, and swap the toggle and bare pencil for a status badge,
a labelled Edit button and a menu entry for enable/disable.

Fixes found while reviewing:

- importing could run twice and duplicate a widget; guard on pending and
  succeeded, and return to the installed list instead of the heavy edit
  form
- a background refetch of the submission (window focus, or the
  invalidation a vote triggers) reset the source setup and silently wiped
  part-typed credentials; key the reset on the sources, not the object
- breadcrumbs raised MISSING_MESSAGE for unmapped dynamic segments; fall
  back to the raw segment via t.has
- publishing had no in-flight guard and could post duplicate listings
- tooltips on disabled vote and report controls never fired, making the
  sign-in hint unreachable
2026-08-17 01:14:38 +02:00
..
2026-08-14 11:32:12 +02:00
2026-08-14 11:32:12 +02:00

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.