feat(onboarding): enhance integration setup with Docker discovery and URL templating#5607
Open
ajnart wants to merge 59 commits into
Open
feat(onboarding): enhance integration setup with Docker discovery and URL templating#5607ajnart wants to merge 59 commits into
ajnart wants to merge 59 commits into
Conversation
Add static mapping of widget kinds to integration kinds for server-side use without importing @homarr/widgets. Includes default widget configs (size, options, skip), featured integrations list for grid sorting, and default bookmark apps for onboarding dashboard population.
Create a default "dashboard" board during seeding with a section and layout. Set it as the home board for the everyone group. Seed default bookmark apps (Homarr Docs, GitHub, Help Translate) for the bookmarks widget.
Add "integrations" step to onboarding flow between settings and finish. Add setupIntegrations mutation that reads existing integrations from DB, populates the dashboard with matching widgets (respecting config-driven sizes/options/skip), places app widgets for each app, and creates a bookmarks widget with seeded default apps.
Create IntegrationSelectGrid (single-select) and IntegrationMultiSelectGrid (multi-select) components with search, category badges, widget count tooltips, and featured integration sorting. Use SimpleGrid to prevent horizontal overflow. Add stepper modal for creating integrations from the dashboard.
Add 3-phase integration setup to onboarding: multi-select grid, per-integration configuration with NewIntegrationForm stepper, and finishing phase that populates the dashboard and shows final actions. Merge finish step actions into the integrations step. Add translation keys for configure phase.
…tion Refactor integration creation page to show a grid picker before the form. Add "Add integration" action to dashboard header menu. Convert app select modal to a two-step stepper. Standardize modal widths to 1200 for item, integration, and app select modals.
- Fix TypeScript error: InitIntegrations returning null by transitioning to done phase instead - Fix TypeScript error: Object.fromEntries cast in integration grids by typing the array elements - Update E2E onboarding tests to process the new integrations step (skip for now) and increase finish assertion timeout for async mutation
fix(lint): remove empty fragment and redundant undefined argument chore: format
3197f9e to
62d5716
Compare
Contributor
|
|
Overall Grade |
Security Reliability Complexity Hygiene |
Code Review Summary
| Analyzer | Status | Updated (UTC) | Details |
|---|---|---|---|
| JavaScript | May 4, 2026 10:41a.m. | Review ↗ |
Important
AI Review is run only on demand for your team. We're only showing results of static analysis review right now. To trigger AI Review, comment @deepsourcebot review on this thread.
Dokploy Preview Deployment
|
Dokploy Preview Deployment
|
Dokploy Preview Deployment
|
Dokploy Preview Deployment
|
Dokploy Preview Deployment
|
- Show error notification on setup failure instead of silent reset - Fix toggleKind stale closure by using prop array directly - Remove duplicate translations from en-gb.json (falls back to en.json) - Align seed board columnCount to 12 (codebase default) - Extract shared placeAllWidgetsAsync helper to @homarr/db/queries - Remove redundant onboardingFormSchema; reuse formSchema for both paths - Fix lint errors (optional chain, unused imports, unnecessary conditions)
- Filter out integrations with no widgets from onboarding selection - Replace single checkbox app toggle with a compact selectable grid - Each Docker-discovered app is individually toggleable (all on by default) - Track selected apps by container ID instead of a boolean flag
CodeQL flagged `/\/+$/` as polynomial-time on repeated slashes.
Use `while (endsWith("/"))` loop instead.
Containers that don't match a known integration were only added as apps if they had a matching icon in the DB. Remove the iconUrl requirement so all non-integration containers appear as selectable apps.
During fresh onboarding the icons DB table hasn't been populated by the cron job yet. Fall back to a dashboard-icons CDN URL guess based on the container image name so apps still get icons for popular services.
…th matched icons - Change listContainers to all:false so only running containers are discovered - Replace loose bestMatch with strictIconMatch (exact or startsWith) to avoid false positives from short image names matching unrelated icons - Gate discovered apps behind DB icon match; unmatched containers are hidden - Add CDN icon URL fallback for matched integrations display
…tion - Show animated "Scanning Docker..." indicator with dots loader while the discovery query is pending - Add isLoading prop to DockerDiscoveryIndicator - Fix button hydration mismatch with suppressHydrationWarning - Add scanning/scanningDescription translation keys
Apply miw="min(1400px, 90vw)" to app select and integration select modals so they never shrink when filtering reduces visible items.
Integrate dev's centralized Mantine theme in @homarr/ui and reconcile modal grid work.
Replace per-step hardcoded Card widths (384px, 776px, 1024px) with a consistent 1024px shell defined in _constants.ts. All steps now use an InitStepCard wrapper set to w=100%, inheriting width from the page shell. Also updates old-import cards to w=100% for proper width propagation.
- Replace plain Base URL input with a prominent Alert callout so users don't overlook it - Add disableScroll prop to SelectGridLayout and use it in onboarding so integrations expand the page instead of scrolling - Fix Collapse `in` → `expanded` prop for Mantine v9 migration in both the URL helpers panel and the Docker discovery panel
Points to /#/settings/webui so the integration form can link directly to the qBittorrent API key settings page.
Subdomain-based URLs (e.g. sonarr.example.com) are typically served behind a reverse proxy with TLS. Update the template to generate https:// URLs. Host:port mode remains http:// for local access.
Discovered Docker apps now use the same buildAppUrl logic as integrations when a base host is set, instead of using the raw Docker socket URL (e.g. http://container:5432). Extracts shared buildUrl helper and adds buildAppUrl that derives a slug from the container name. Also passes publishedPort through the DiscoveredApp type so host:port mode works correctly.
Replace polynomial trailing-slash regex with removeTrailingSlash helper and remove unused ModalFormFooter import in quick-add-app modal.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Homarr
Thank you for your contribution. Please ensure that your pull request meets the following pull request:
pnpm build, autofix withpnpm format:fix)devbranchx,y,ior any abbrevation)Summary
{app}.website.comor192.168.1.1:{port})Test plan