Skip to content

feat!: custom widgets v2 - #6356

Open
ajnart wants to merge 39 commits into
devfrom
v2
Open

feat!: custom widgets v2#6356
ajnart wants to merge 39 commits into
devfrom
v2

Conversation

@ajnart

@ajnart ajnart commented Jul 15, 2026

Copy link
Copy Markdown
Member

Homarr

Thank you for your contribution. Please ensure that your pull request meets the following pull request:

  • Builds without warnings or errors (pnpm build, autofix with pnpm format:fix)
  • Pull request targets dev branch
  • Commits follow the conventional commits guideline
  • No shorthand variable names are used (eg. x, y, i or any abbrevation)
  • Documentation is up to date. Create a pull request here.
  • When using AI; No temp files are checked in, the code style follows the rest of the project

When contributing a new integration or widget:

  • I confirmed manually that the integration or widget is working with a real system and performed basic smoke
    tests (e.g. what happens if it is offline)
  • Optional but recommended: I confirm that I am willing to be added to the CODEOWNERS of this feature and will
    provide support and maintain the integration (e.g. in case of breaking or failure)

ajnart and others added 8 commits July 13, 2026 18:14
Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com>
This reverts commit 377f2f6, reversing
changes made to 7e4cb02.
Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
…4.0.7 (#6343)

Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com>
@coderabbitai

coderabbitai Bot commented Jul 15, 2026

Copy link
Copy Markdown

Important

Review skipped

Too many files!

This PR contains 678 files, which is 378 over the limit of 300.

To get a review, narrow the scope:
• coderabbit review --committed # exclude uncommitted changes
• coderabbit review --dir # limit to a subdirectory
• coderabbit review --base # compare against a closer base

Usage-priced reviews support at most 300 files.

⚙️ Run configuration

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro Plus

Run ID: a4160e4e-61ff-4d83-acee-76c9c6229feb

📥 Commits

Reviewing files that changed from the base of the PR and between 77dc317 and 557ebe0.

⛔ Files ignored due to path filters (2)
  • packages/custom-widgets/src/core/component-catalog.generated.json is excluded by !**/*.generated.*
  • pnpm-lock.yaml is excluded by !**/pnpm-lock.yaml
📒 Files selected for processing (678)
  • .agents/skills/homarr-custom-widget/SKILL.md
  • .agents/skills/homarr-custom-widget/references/runtime.md
  • .agents/skills/homarr-custom-widget/references/schema.md
  • .agents/skills/homarr-custom-widget/references/security.md
  • .env.example
  • .github/pull_request_template.md
  • .github/workflows/autofix.yml
  • .github/workflows/ci.yml
  • .github/workflows/workshop.yml
  • .gitignore
  • .impeccable/critique/2026-07-21T11-32-50Z__apps-docs-src-components-workshop.md
  • .impeccable/critique/2026-07-21T12-29-41Z__apps-docs-src-components-workshop.md
  • .impeccable/critique/2026-07-22T15-58-15Z__apps-docs-src-components-workshop.md
  • .oxfmtrc.json
  • .oxlintrc.json
  • PRODUCT.md
  • apps/docs/.vscode/settings.json
  • apps/docs/README.md
  • apps/docs/components.json
  • apps/docs/docs/advanced/command-line/_category_.json
  • apps/docs/docs/advanced/command-line/fix-usernames/index.mdx
  • apps/docs/docs/advanced/command-line/index.mdx
  • apps/docs/docs/advanced/command-line/integrations/index.mdx
  • apps/docs/docs/advanced/command-line/password-recovery/index.mdx
  • apps/docs/docs/advanced/command-line/users/index.mdx
  • apps/docs/docs/advanced/development/_category_.json
  • apps/docs/docs/advanced/development/getting-started.mdx
  • apps/docs/docs/advanced/development/kubernetes.mdx
  • apps/docs/docs/advanced/environment-variables/index.mdx
  • apps/docs/docs/advanced/icons/index.mdx
  • apps/docs/docs/advanced/keyboard-shortcuts/index.mdx
  • apps/docs/docs/advanced/proxy/index.mdx
  • apps/docs/docs/advanced/running-as-different-user/index.mdx
  • apps/docs/docs/advanced/single-sign-on/index.mdx
  • apps/docs/docs/advanced/styling/index.mdx
  • apps/docs/docs/community/donate.mdx
  • apps/docs/docs/community/faq.mdx
  • apps/docs/docs/community/get-in-touch.mdx
  • apps/docs/docs/community/license.mdx
  • apps/docs/docs/community/translations.mdx
  • apps/docs/docs/getting-started/after-the-installation.mdx
  • apps/docs/docs/getting-started/glossary.mdx
  • apps/docs/docs/getting-started/index.mdx
  • apps/docs/docs/getting-started/installation/docker.mdx
  • apps/docs/docs/getting-started/installation/helm.md
  • apps/docs/docs/getting-started/installation/home-assistant.mdx
  • apps/docs/docs/getting-started/installation/portainer.mdx
  • apps/docs/docs/getting-started/installation/proxmox.mdx
  • apps/docs/docs/getting-started/installation/qnap.mdx
  • apps/docs/docs/getting-started/installation/runtipi.mdx
  • apps/docs/docs/getting-started/installation/saltbox.mdx
  • apps/docs/docs/getting-started/installation/source.mdx
  • apps/docs/docs/getting-started/installation/unraid.mdx
  • apps/docs/docs/integrations/adguard-home/index.mdx
  • apps/docs/docs/integrations/anchor/index.mdx
  • apps/docs/docs/integrations/aria2/index.mdx
  • apps/docs/docs/integrations/audiobookshelf/index.mdx
  • apps/docs/docs/integrations/bazarr/index.mdx
  • apps/docs/docs/integrations/beszel/index.mdx
  • apps/docs/docs/integrations/coolify/index.mdx
  • apps/docs/docs/integrations/dash-dot/index.mdx
  • apps/docs/docs/integrations/deluge/index.mdx
  • apps/docs/docs/integrations/docker/index.mdx
  • apps/docs/docs/integrations/emby/index.mdx
  • apps/docs/docs/integrations/glances/index.mdx
  • apps/docs/docs/integrations/gluetun/index.mdx
  • apps/docs/docs/integrations/gotify/index.mdx
  • apps/docs/docs/integrations/home-assistant/index.mdx
  • apps/docs/docs/integrations/ical/index.mdx
  • apps/docs/docs/integrations/immich/index.mdx
  • apps/docs/docs/integrations/jellyfin/index.mdx
  • apps/docs/docs/integrations/jellyseerr/index.mdx
  • apps/docs/docs/integrations/kubernetes/index.mdx
  • apps/docs/docs/integrations/lidarr/index.mdx
  • apps/docs/docs/integrations/navidrome/index.mdx
  • apps/docs/docs/integrations/nextcloud/index.mdx
  • apps/docs/docs/integrations/ntfy/index.mdx
  • apps/docs/docs/integrations/nzbget/index.mdx
  • apps/docs/docs/integrations/open-media-vault/index.mdx
  • apps/docs/docs/integrations/opnsense/index.mdx
  • apps/docs/docs/integrations/overseerr/index.mdx
  • apps/docs/docs/integrations/paperless-ngx/index.mdx
  • apps/docs/docs/integrations/patchmon/index.mdx
  • apps/docs/docs/integrations/peanut/index.mdx
  • apps/docs/docs/integrations/pi-hole/index.mdx
  • apps/docs/docs/integrations/plex/index.mdx
  • apps/docs/docs/integrations/prowlarr/index.mdx
  • apps/docs/docs/integrations/proxmox/index.mdx
  • apps/docs/docs/integrations/q-bittorent/index.mdx
  • apps/docs/docs/integrations/radarr/index.mdx
  • apps/docs/docs/integrations/readarr/index.mdx
  • apps/docs/docs/integrations/sabnzbd/index.mdx
  • apps/docs/docs/integrations/seerr/index.mdx
  • apps/docs/docs/integrations/slskd/index.mdx
  • apps/docs/docs/integrations/sonarr/index.mdx
  • apps/docs/docs/integrations/speedtest-tracker/index.mdx
  • apps/docs/docs/integrations/synology/index.mdx
  • apps/docs/docs/integrations/tdarr/index.mdx
  • apps/docs/docs/integrations/technitium-dns/index.mdx
  • apps/docs/docs/integrations/tracearr/index.mdx
  • apps/docs/docs/integrations/transmission/index.mdx
  • apps/docs/docs/integrations/truenas/index.mdx
  • apps/docs/docs/integrations/umami/index.mdx
  • apps/docs/docs/integrations/unifi-controller/index.mdx
  • apps/docs/docs/integrations/unraid/index.mdx
  • apps/docs/docs/integrations/uptime-kuma/index.mdx
  • apps/docs/docs/management/api/index.mdx
  • apps/docs/docs/management/apps/index.mdx
  • apps/docs/docs/management/backup.mdx
  • apps/docs/docs/management/boards/index.mdx
  • apps/docs/docs/management/certificates/index.mdx
  • apps/docs/docs/management/custom-widgets/_category_.json
  • apps/docs/docs/management/custom-widgets/agent-authoring.mdx
  • apps/docs/docs/management/custom-widgets/authoring.mdx
  • apps/docs/docs/management/custom-widgets/component-reference.mdx
  • apps/docs/docs/management/custom-widgets/custom-jsx.mdx
  • apps/docs/docs/management/custom-widgets/index.mdx
  • apps/docs/docs/management/custom-widgets/requests-and-security.mdx
  • apps/docs/docs/management/custom-widgets/troubleshooting.mdx
  • apps/docs/docs/management/integrations/index.mdx
  • apps/docs/docs/management/mcp.mdx
  • apps/docs/docs/management/media/index.mdx
  • apps/docs/docs/management/search-engines/index.mdx
  • apps/docs/docs/management/settings/index.mdx
  • apps/docs/docs/management/tasks/index.mdx
  • apps/docs/docs/management/users/index.mdx
  • apps/docs/docs/management/workshop/index.mdx
  • apps/docs/docs/widgets/anchor-note/index.mdx
  • apps/docs/docs/widgets/app/index.mdx
  • apps/docs/docs/widgets/audio-stats/index.mdx
  • apps/docs/docs/widgets/bazarr/index.mdx
  • apps/docs/docs/widgets/beszel-alerts/index.mdx
  • apps/docs/docs/widgets/beszel-system-grid/index.mdx
  • apps/docs/docs/widgets/beszel-system-table/index.mdx
  • apps/docs/docs/widgets/bookmarks/index.mdx
  • apps/docs/docs/widgets/calendar/index.mdx
  • apps/docs/docs/widgets/clock/index.mdx
  • apps/docs/docs/widgets/coolify/index.mdx
  • apps/docs/docs/widgets/custom-api/index.mdx
  • apps/docs/docs/widgets/custom-api/index.ts
  • apps/docs/docs/widgets/dns-hole-controls/index.mdx
  • apps/docs/docs/widgets/dns-hole-summary/index.mdx
  • apps/docs/docs/widgets/docker-containers/index.mdx
  • apps/docs/docs/widgets/downloads/index.mdx
  • apps/docs/docs/widgets/firewall/index.mdx
  • apps/docs/docs/widgets/iframe/index.mdx
  • apps/docs/docs/widgets/immich-album-carousel/index.mdx
  • apps/docs/docs/widgets/immich-server-stats/index.mdx
  • apps/docs/docs/widgets/indexer-manager/index.mdx
  • apps/docs/docs/widgets/media-missing/index.mdx
  • apps/docs/docs/widgets/media-releases/index.mdx
  • apps/docs/docs/widgets/media-request-stats/index.mdx
  • apps/docs/docs/widgets/media-server/index.mdx
  • apps/docs/docs/widgets/media-transcoding/index.mdx
  • apps/docs/docs/widgets/minecraft-server-status/index.mdx
  • apps/docs/docs/widgets/network-controller-status/index.mdx
  • apps/docs/docs/widgets/network-controller-summary/index.mdx
  • apps/docs/docs/widgets/notifications/index.mdx
  • apps/docs/docs/widgets/paperless-ngx/index.mdx
  • apps/docs/docs/widgets/patchmon/index.mdx
  • apps/docs/docs/widgets/rss-feed/index.mdx
  • apps/docs/docs/widgets/smart-home-entity-state/index.mdx
  • apps/docs/docs/widgets/smart-home-execute-automation/index.mdx
  • apps/docs/docs/widgets/speedtest-tracker/index.mdx
  • apps/docs/docs/widgets/stock-price/index.mdx
  • apps/docs/docs/widgets/system-disks/index.ts
  • apps/docs/docs/widgets/timetable/index.mdx
  • apps/docs/docs/widgets/tracearr/index.mdx
  • apps/docs/docs/widgets/umami/index.mdx
  • apps/docs/docs/widgets/ups/index.mdx
  • apps/docs/docs/widgets/uptime-kuma/index.mdx
  • apps/docs/docs/widgets/video/index.mdx
  • apps/docs/docs/widgets/vpn/index.mdx
  • apps/docs/docs/widgets/weather/index.mdx
  • apps/docs/docusaurus.config.ts
  • apps/docs/package.json
  • apps/docs/scripts/dump-contributors.mjs
  • apps/docs/scripts/verify-algolia-search.mjs
  • apps/docs/src/components/custom-jsx-component-reference.module.css
  • apps/docs/src/components/custom-jsx-component-reference.tsx
  • apps/docs/src/components/custom-widget-code-client.tsx
  • apps/docs/src/components/custom-widget-code.tsx
  • apps/docs/src/components/pages/home/integrations/available-integrations.module.css
  • apps/docs/src/components/pages/home/review-list/styles.module.css
  • apps/docs/src/components/ui/accordion.tsx
  • apps/docs/src/components/ui/alert-dialog.tsx
  • apps/docs/src/components/ui/alert.tsx
  • apps/docs/src/components/ui/aspect-ratio.tsx
  • apps/docs/src/components/ui/attachment.tsx
  • apps/docs/src/components/ui/avatar.tsx
  • apps/docs/src/components/ui/badge.tsx
  • apps/docs/src/components/ui/breadcrumb.tsx
  • apps/docs/src/components/ui/bubble.tsx
  • apps/docs/src/components/ui/button-group.tsx
  • apps/docs/src/components/ui/button.tsx
  • apps/docs/src/components/ui/calendar.tsx
  • apps/docs/src/components/ui/card.tsx
  • apps/docs/src/components/ui/carousel.tsx
  • apps/docs/src/components/ui/chart.tsx
  • apps/docs/src/components/ui/checkbox.tsx
  • apps/docs/src/components/ui/collapsible.tsx
  • apps/docs/src/components/ui/combobox.tsx
  • apps/docs/src/components/ui/command.tsx
  • apps/docs/src/components/ui/context-menu.tsx
  • apps/docs/src/components/ui/dialog.tsx
  • apps/docs/src/components/ui/direction.tsx
  • apps/docs/src/components/ui/drawer.tsx
  • apps/docs/src/components/ui/dropdown-menu.tsx
  • apps/docs/src/components/ui/empty.tsx
  • apps/docs/src/components/ui/field.tsx
  • apps/docs/src/components/ui/header.tsx
  • apps/docs/src/components/ui/hover-card.tsx
  • apps/docs/src/components/ui/input-group.tsx
  • apps/docs/src/components/ui/input-otp.tsx
  • apps/docs/src/components/ui/input.tsx
  • apps/docs/src/components/ui/item.tsx
  • apps/docs/src/components/ui/kbd.tsx
  • apps/docs/src/components/ui/label.tsx
  • apps/docs/src/components/ui/marker.tsx
  • apps/docs/src/components/ui/menubar.tsx
  • apps/docs/src/components/ui/message-scroller.tsx
  • apps/docs/src/components/ui/message.tsx
  • apps/docs/src/components/ui/native-select.tsx
  • apps/docs/src/components/ui/navigation-menu.tsx
  • apps/docs/src/components/ui/pagination.tsx
  • apps/docs/src/components/ui/popover.tsx
  • apps/docs/src/components/ui/progress.tsx
  • apps/docs/src/components/ui/radio-group.tsx
  • apps/docs/src/components/ui/resizable.tsx
  • apps/docs/src/components/ui/scroll-area.tsx
  • apps/docs/src/components/ui/select.tsx
  • apps/docs/src/components/ui/separator.tsx
  • apps/docs/src/components/ui/sheet.tsx
  • apps/docs/src/components/ui/sidebar.tsx
  • apps/docs/src/components/ui/skeleton.tsx
  • apps/docs/src/components/ui/slider.tsx
  • apps/docs/src/components/ui/sonner.tsx
  • apps/docs/src/components/ui/spinner.tsx
  • apps/docs/src/components/ui/switch.tsx
  • apps/docs/src/components/ui/table.tsx
  • apps/docs/src/components/ui/tabs.tsx
  • apps/docs/src/components/ui/textarea.tsx
  • apps/docs/src/components/ui/toggle-group.tsx
  • apps/docs/src/components/ui/toggle.tsx
  • apps/docs/src/components/ui/tooltip.tsx
  • apps/docs/src/components/workshop/DetailComments.tsx
  • apps/docs/src/components/workshop/DetailPage.tsx
  • apps/docs/src/components/workshop/DetailSections.spec.tsx
  • apps/docs/src/components/workshop/DetailSections.tsx
  • apps/docs/src/components/workshop/ScreenshotEditor.tsx
  • apps/docs/src/components/workshop/SubmitForm.tsx
  • apps/docs/src/components/workshop/WorkshopAccountMenu.tsx
  • apps/docs/src/components/workshop/WorkshopAdmin.tsx
  • apps/docs/src/components/workshop/WorkshopApp.tsx
  • apps/docs/src/components/workshop/WorkshopDetailRoutePage.tsx
  • apps/docs/src/components/workshop/WorkshopErrorBoundary.tsx
  • apps/docs/src/components/workshop/format.ts
  • apps/docs/src/components/workshop/useWorkshop.ts
  • apps/docs/src/components/workshop/workshop-utils.spec.ts
  • apps/docs/src/components/workshop/workshop-utils.ts
  • apps/docs/src/css/custom.css
  • apps/docs/src/hooks/use-mobile.ts
  • apps/docs/src/lib/pocketbase.ts
  • apps/docs/src/lib/utils.ts
  • apps/docs/src/lib/workshop-schema.spec.ts
  • apps/docs/src/lib/workshop-schema.ts
  • apps/docs/src/pages/index.module.css
  • apps/docs/src/pages/workshop/admin/index.tsx
  • apps/docs/src/pages/workshop/index.tsx
  • apps/docs/static/api/open-api-schema.json
  • apps/docs/static/custom-widgets/component-catalog-v1.json
  • apps/docs/static/data/contributions.json
  • apps/docs/static/data/translation-contributions.json
  • apps/docs/tsconfig.json
  • apps/nextjs/README.md
  • apps/nextjs/package.json
  • apps/nextjs/src/app/[locale]/boards/(content)/_header-actions.tsx
  • apps/nextjs/src/app/[locale]/boards/[name]/settings/_customCss.tsx
  • apps/nextjs/src/app/[locale]/boards/_layout-creator.tsx
  • apps/nextjs/src/app/[locale]/custom-widget-configuration/[token]/configuration-entry.tsx
  • apps/nextjs/src/app/[locale]/custom-widget-configuration/[token]/page.tsx
  • apps/nextjs/src/app/[locale]/layout.tsx
  • apps/nextjs/src/app/[locale]/manage/custom-widgets/_beta-banner.tsx
  • apps/nextjs/src/app/[locale]/manage/custom-widgets/_code-editor.tsx
  • apps/nextjs/src/app/[locale]/manage/custom-widgets/_copy-ai-prompt-button.spec.tsx
  • apps/nextjs/src/app/[locale]/manage/custom-widgets/_copy-ai-prompt-button.tsx
  • apps/nextjs/src/app/[locale]/manage/custom-widgets/_custom-widget-actions.tsx
  • apps/nextjs/src/app/[locale]/manage/custom-widgets/_custom-widget-advanced-manifest.tsx
  • apps/nextjs/src/app/[locale]/manage/custom-widgets/_custom-widget-ai-card.tsx
  • apps/nextjs/src/app/[locale]/manage/custom-widgets/_custom-widget-form-analysis.ts
  • apps/nextjs/src/app/[locale]/manage/custom-widgets/_custom-widget-form-layout.tsx
  • apps/nextjs/src/app/[locale]/manage/custom-widgets/_custom-widget-form-references.ts
  • apps/nextjs/src/app/[locale]/manage/custom-widgets/_custom-widget-form-utils.spec.ts
  • apps/nextjs/src/app/[locale]/manage/custom-widgets/_custom-widget-form-utils.ts
  • apps/nextjs/src/app/[locale]/manage/custom-widgets/_custom-widget-form.module.css
  • apps/nextjs/src/app/[locale]/manage/custom-widgets/_custom-widget-form.tsx
  • apps/nextjs/src/app/[locale]/manage/custom-widgets/_custom-widget-identifier-input.tsx
  • apps/nextjs/src/app/[locale]/manage/custom-widgets/_custom-widget-legacy-migration.spec.ts
  • apps/nextjs/src/app/[locale]/manage/custom-widgets/_custom-widget-list.tsx
  • apps/nextjs/src/app/[locale]/manage/custom-widgets/_custom-widget-option-fields.tsx
  • apps/nextjs/src/app/[locale]/manage/custom-widgets/_custom-widget-options-editor.tsx
  • apps/nextjs/src/app/[locale]/manage/custom-widgets/_custom-widget-preview-action.tsx
  • apps/nextjs/src/app/[locale]/manage/custom-widgets/_custom-widget-preview-data.ts
  • apps/nextjs/src/app/[locale]/manage/custom-widgets/_custom-widget-preview-panel.spec.tsx
  • apps/nextjs/src/app/[locale]/manage/custom-widgets/_custom-widget-preview-panel.tsx
  • apps/nextjs/src/app/[locale]/manage/custom-widgets/_custom-widget-preview-status.tsx
  • apps/nextjs/src/app/[locale]/manage/custom-widgets/_custom-widget-preview.tsx
  • apps/nextjs/src/app/[locale]/manage/custom-widgets/_custom-widget-rename-handlers.ts
  • apps/nextjs/src/app/[locale]/manage/custom-widgets/_custom-widget-request-value-editors.tsx
  • apps/nextjs/src/app/[locale]/manage/custom-widgets/_custom-widget-requests-editor.tsx
  • apps/nextjs/src/app/[locale]/manage/custom-widgets/_custom-widget-save-errors.spec.ts
  • apps/nextjs/src/app/[locale]/manage/custom-widgets/_custom-widget-save-errors.ts
  • apps/nextjs/src/app/[locale]/manage/custom-widgets/_custom-widget-save-issues-alert.tsx
  • apps/nextjs/src/app/[locale]/manage/custom-widgets/_custom-widget-source-dependencies.spec.ts
  • apps/nextjs/src/app/[locale]/manage/custom-widgets/_custom-widget-source-dependencies.ts
  • apps/nextjs/src/app/[locale]/manage/custom-widgets/_custom-widget-source-field.tsx
  • apps/nextjs/src/app/[locale]/manage/custom-widgets/_custom-widget-sources-editor.tsx
  • apps/nextjs/src/app/[locale]/manage/custom-widgets/_form-error-boundary.tsx
  • apps/nextjs/src/app/[locale]/manage/custom-widgets/_import-custom-widget-button.tsx
  • apps/nextjs/src/app/[locale]/manage/custom-widgets/_json-preview-editor.tsx
  • apps/nextjs/src/app/[locale]/manage/custom-widgets/_unsaved-changes-guard.spec.ts
  • apps/nextjs/src/app/[locale]/manage/custom-widgets/_unsaved-changes-guard.ts
  • apps/nextjs/src/app/[locale]/manage/custom-widgets/_use-custom-widget-form-actions.ts
  • apps/nextjs/src/app/[locale]/manage/custom-widgets/_use-unsaved-changes-guard.ts
  • apps/nextjs/src/app/[locale]/manage/custom-widgets/edit/[id]/page.tsx
  • apps/nextjs/src/app/[locale]/manage/custom-widgets/new/page.tsx
  • apps/nextjs/src/app/[locale]/manage/custom-widgets/page.tsx
  • apps/nextjs/src/app/[locale]/manage/custom-widgets/preview/[id]/page.tsx
  • apps/nextjs/src/app/[locale]/manage/layout.tsx
  • apps/nextjs/src/app/[locale]/manage/workshop/page.tsx
  • apps/nextjs/src/app/api/custom-widgets/[resource]/route.ts
  • apps/nextjs/src/app/api/custom-widgets/admin.spec.ts
  • apps/nextjs/src/app/api/custom-widgets/admin.ts
  • apps/nextjs/src/app/api/custom-widgets/configuration-request/[token]/route.ts
  • apps/nextjs/src/app/api/custom-widgets/configuration-request/body.spec.ts
  • apps/nextjs/src/app/api/custom-widgets/configuration-request/body.ts
  • apps/nextjs/src/app/api/mcp/[transport]/route.spec.ts
  • apps/nextjs/src/app/api/mcp/[transport]/route.ts
  • apps/nextjs/src/components/board/items/item-content.tsx
  • apps/nextjs/src/components/board/items/item-menu.tsx
  • apps/nextjs/src/components/board/items/item-select-modal.tsx
  • apps/nextjs/src/components/board/items/widget-context-menu.tsx
  • apps/nextjs/src/components/board/items/widget-hover-overlay.module.css
  • apps/nextjs/src/components/custom-widgets/custom-widget-import-dialog.tsx
  • apps/nextjs/src/components/workshop/workshop-browser.tsx
  • apps/nextjs/src/components/workshop/workshop-client.ts
  • apps/nextjs/src/components/workshop/workshop-css-import-button.tsx
  • apps/nextjs/src/components/workshop/workshop-install-button.tsx
  • apps/nextjs/src/components/workshop/workshop-installer.tsx
  • apps/nextjs/src/components/workshop/workshop-publish-definition.spec.ts
  • apps/nextjs/src/components/workshop/workshop-publish-definition.ts
  • apps/nextjs/src/components/workshop/workshop-publish-modal.tsx
  • apps/nextjs/src/env.ts
  • apps/workshop/.env.example
  • apps/workshop/.gitignore
  • apps/workshop/Dockerfile
  • apps/workshop/Dockerfile.dockerignore
  • apps/workshop/README.md
  • apps/workshop/docker-compose.yml
  • apps/workshop/entrypoint.sh
  • apps/workshop/pb_hooks/comment-email.html
  • apps/workshop/pb_hooks/report-email.html
  • apps/workshop/pb_hooks/submission-deleted-email.html
  • apps/workshop/pb_hooks/workshop-utils.js
  • apps/workshop/pb_hooks/workshop.pb.js
  • apps/workshop/pb_migrations/1784240000_workshop_widgets.js
  • apps/workshop/test.sh
  • apps/workshop/tests/oauth-sync.integration.mjs
  • apps/workshop/tests/workshop-contracts.mjs
  • apps/workshop/tests/workshop-identity.mjs
  • apps/workshop/tests/workshop-migration.mjs
  • apps/workshop/tests/workshop.integration.mjs
  • e2e/custom-widgets-custom-jsx-v2.spec.ts
  • e2e/custom-widgets-custom-jsx.spec.ts
  • e2e/shared/mock-api-server.ts
  • package.json
  • packages/api/package.json
  • packages/api/src/custom-widget-configuration.ts
  • packages/api/src/env.ts
  • packages/api/src/mcp.ts
  • packages/api/src/router/board.ts
  • packages/api/src/router/board/custom-widget-placement-access.ts
  • packages/api/src/router/board/test/custom-widget-placement-access.spec.ts
  • packages/api/src/router/custom-widget/auth.ts
  • packages/api/src/router/custom-widget/cache-version.ts
  • packages/api/src/router/custom-widget/configuration-requests.ts
  • packages/api/src/router/custom-widget/custom-widget-router.ts
  • packages/api/src/router/custom-widget/definition-insert.ts
  • packages/api/src/router/custom-widget/display-data.ts
  • packages/api/src/router/custom-widget/domain-error.ts
  • packages/api/src/router/custom-widget/legacy-migration.ts
  • packages/api/src/router/custom-widget/management-queries.ts
  • packages/api/src/router/custom-widget/management-query-mappers.ts
  • packages/api/src/router/custom-widget/metadata-procedures.ts
  • packages/api/src/router/custom-widget/parse-display-config.ts
  • packages/api/src/router/custom-widget/preview-action-procedures.ts
  • packages/api/src/router/custom-widget/preview-base-procedures.ts
  • packages/api/src/router/custom-widget/preview-procedure-helpers.ts
  • packages/api/src/router/custom-widget/preview-query-procedures.ts
  • packages/api/src/router/custom-widget/preview-sessions.ts
  • packages/api/src/router/custom-widget/request-executor.ts
  • packages/api/src/router/custom-widget/request-limits.ts
  • packages/api/src/router/custom-widget/request-manifest.ts
  • packages/api/src/router/custom-widget/secret-persistence.ts
  • packages/api/src/router/custom-widget/secret-policy.ts
  • packages/api/src/router/custom-widget/secret-procedures.ts
  • packages/api/src/router/custom-widget/stored-definition.ts
  • packages/api/src/router/custom-widget/template-procedures.ts
  • packages/api/src/router/custom-widget/transfer-procedures.ts
  • packages/api/src/router/custom-widget/workshop-procedures.ts
  • packages/api/src/router/test/board.spec.ts
  • packages/api/src/router/test/custom-widget/configuration-requests.spec.ts
  • packages/api/src/router/test/custom-widget/definition-persistence.spec.ts
  • packages/api/src/router/test/custom-widget/legacy-migration.spec.ts
  • packages/api/src/router/test/custom-widget/preview-options.spec.ts
  • packages/api/src/router/test/custom-widget/request-executor.spec.ts
  • packages/api/src/router/test/custom-widget/request-limits.spec.ts
  • packages/api/src/router/test/custom-widget/stored-definition.spec.ts
  • packages/api/src/router/test/custom-widget/workshop-error-privacy.spec.ts
  • packages/api/src/router/test/widgets/custom-api-v2.spec.ts
  • packages/api/src/router/test/widgets/options.spec.ts
  • packages/api/src/router/test/widgets/patchmon.spec.ts
  • packages/api/src/router/widgets/__tests__/custom-api-extractors.spec.ts
  • packages/api/src/router/widgets/__tests__/custom-api-fixtures.ts
  • packages/api/src/router/widgets/custom-api.ts
  • packages/api/src/router/widgets/options.ts
  • packages/api/src/test/mcp.spec.ts
  • packages/api/src/trpc.ts
  • packages/custom-widgets/package.json
  • packages/custom-widgets/scripts/ai-evaluation-cases.ts
  • packages/custom-widgets/scripts/ai-evaluation.ts
  • packages/custom-widgets/scripts/check-architecture.mjs
  • packages/custom-widgets/scripts/evaluate-ai-authoring.ts
  • packages/custom-widgets/scripts/generate-component-metadata.ts
  • packages/custom-widgets/scripts/verify-reference-apis.ts
  • packages/custom-widgets/src/core/ai-prompt.ts
  • packages/custom-widgets/src/core/authoring-resources.ts
  • packages/custom-widgets/src/core/bundled-widgets.ts
  • packages/custom-widgets/src/core/catalog.ts
  • packages/custom-widgets/src/core/component-catalog-policy.ts
  • packages/custom-widgets/src/core/component-catalog-types.ts
  • packages/custom-widgets/src/core/component-catalog.ts
  • packages/custom-widgets/src/core/component-descriptor.ts
  • packages/custom-widgets/src/core/component-discovery.ts
  • packages/custom-widgets/src/core/component-example.ts
  • packages/custom-widgets/src/core/component-props.ts
  • packages/custom-widgets/src/core/component-registry.ts
  • packages/custom-widgets/src/core/component-types.ts
  • packages/custom-widgets/src/core/custom-jsx-schema.ts
  • packages/custom-widgets/src/core/definition-schemas.ts
  • packages/custom-widgets/src/core/definition-security.ts
  • packages/custom-widgets/src/core/examples.ts
  • packages/custom-widgets/src/core/import.ts
  • packages/custom-widgets/src/core/index.ts
  • packages/custom-widgets/src/core/option-value-types.ts
  • packages/custom-widgets/src/core/options-schema.ts
  • packages/custom-widgets/src/core/options.ts
  • packages/custom-widgets/src/core/request-schema.ts
  • packages/custom-widgets/src/core/schema-references.ts
  • packages/custom-widgets/src/core/schema-types.ts
  • packages/custom-widgets/src/core/schema.ts
  • packages/custom-widgets/src/core/secret-requirements.ts
  • packages/custom-widgets/src/core/source-setup.ts
  • packages/custom-widgets/src/core/tabler-icons.ts
  • packages/custom-widgets/src/core/url-policy.ts
  • packages/custom-widgets/src/jsx/analyzer-ast.ts
  • packages/custom-widgets/src/jsx/analyzer-diagnostics.ts
  • packages/custom-widgets/src/jsx/analyzer-jsx.ts
  • packages/custom-widgets/src/jsx/analyzer-language.ts
  • packages/custom-widgets/src/jsx/analyzer.ts
  • packages/custom-widgets/src/jsx/bindings.ts
  • packages/custom-widgets/src/jsx/collection-methods.ts
  • packages/custom-widgets/src/jsx/emitter-context.ts
  • packages/custom-widgets/src/jsx/index.ts
  • packages/custom-widgets/src/jsx/interactive-components.tsx
  • packages/custom-widgets/src/jsx/interpreter-callbacks.ts
  • packages/custom-widgets/src/jsx/interpreter-foundation.ts
  • packages/custom-widgets/src/jsx/interpreter-method-context.ts
  • packages/custom-widgets/src/jsx/interpreter-parser.ts
  • packages/custom-widgets/src/jsx/interpreter.tsx
  • packages/custom-widgets/src/jsx/jsx-emitter.tsx
  • packages/custom-widgets/src/jsx/policy.ts
  • packages/custom-widgets/src/jsx/regex-policy.ts
  • packages/custom-widgets/src/jsx/runtime-component-policy.ts
  • packages/custom-widgets/src/jsx/runtime-components.tsx
  • packages/custom-widgets/src/jsx/safe-bindings.ts
  • packages/custom-widgets/src/jsx/safe-language-policy.ts
  • packages/custom-widgets/src/jsx/safe-properties.ts
  • packages/custom-widgets/src/jsx/string-methods.ts
  • packages/custom-widgets/src/runtime/actions.tsx
  • packages/custom-widgets/src/runtime/context.tsx
  • packages/custom-widgets/src/runtime/custom-jsx-renderer.tsx
  • packages/custom-widgets/src/runtime/data.tsx
  • packages/custom-widgets/src/runtime/index.ts
  • packages/custom-widgets/src/runtime/refresh-button.tsx
  • packages/custom-widgets/src/runtime/status.tsx
  • packages/custom-widgets/src/runtime/sub-fetch.tsx
  • packages/custom-widgets/src/runtime/types.ts
  • packages/custom-widgets/src/server/auth.ts
  • packages/custom-widgets/src/server/errors.ts
  • packages/custom-widgets/src/server/index.ts
  • packages/custom-widgets/src/server/network-policy.ts
  • packages/custom-widgets/src/server/preview-sessions.ts
  • packages/custom-widgets/src/server/request-dispatcher-lifecycle.ts
  • packages/custom-widgets/src/server/request-executor.ts
  • packages/custom-widgets/src/server/request-limits.ts
  • packages/custom-widgets/src/server/request-manifest.ts
  • packages/custom-widgets/src/server/response.ts
  • packages/custom-widgets/src/styles.d.ts
  • packages/custom-widgets/src/test/ai-evaluation.spec.ts
  • packages/custom-widgets/src/test/ai-prompt.spec.ts
  • packages/custom-widgets/src/test/authoring-resources.spec.ts
  • packages/custom-widgets/src/test/component-catalog.spec.ts
  • packages/custom-widgets/src/test/component-registry.spec.ts
  • packages/custom-widgets/src/test/fixtures/reference-widgets.ts
  • packages/custom-widgets/src/test/import.spec.ts
  • packages/custom-widgets/src/test/jsx-policy.spec.ts
  • packages/custom-widgets/src/test/options.spec.ts
  • packages/custom-widgets/src/test/preview-sessions.spec.ts
  • packages/custom-widgets/src/test/reference-widgets.spec.ts
  • packages/custom-widgets/src/test/request-deadline.spec.ts
  • packages/custom-widgets/src/test/request-limits.spec.ts
  • packages/custom-widgets/src/test/request-manifest.spec.ts
  • packages/custom-widgets/src/test/runtime.spec.tsx
  • packages/custom-widgets/src/test/schema.spec.ts
  • packages/custom-widgets/src/test/server-policy.spec.ts
  • packages/custom-widgets/src/test/workbench-ui.spec.tsx
  • packages/custom-widgets/src/test/workbench.spec.ts
  • packages/custom-widgets/src/test/workshop-translations.spec.ts
  • packages/custom-widgets/src/workbench/analyzer.ts
  • packages/custom-widgets/src/workbench/code-editor-diagnostics.tsx
  • packages/custom-widgets/src/workbench/code-editor-toolbar.tsx
  • packages/custom-widgets/src/workbench/code-editor-types.ts
  • packages/custom-widgets/src/workbench/code-editor.module.css
  • packages/custom-widgets/src/workbench/code-editor.tsx
  • packages/custom-widgets/src/workbench/code-language.ts
  • packages/custom-widgets/src/workbench/component-reference.tsx
  • packages/custom-widgets/src/workbench/direct-code-mirror.tsx
  • packages/custom-widgets/src/workbench/form-schema.ts
  • packages/custom-widgets/src/workbench/import-review.tsx
  • packages/custom-widgets/src/workbench/index.ts
  • packages/custom-widgets/src/workbench/ports.ts
  • packages/custom-widgets/src/workbench/preview-diagnostics-panel.tsx
  • packages/custom-widgets/src/workbench/preview-error-boundary.tsx
  • packages/custom-widgets/src/workbench/preview-header.tsx
  • packages/custom-widgets/src/workbench/preview-request-panel.tsx
  • packages/custom-widgets/src/workbench/preview-response-panel.tsx
  • packages/custom-widgets/src/workbench/preview-utils.ts
  • packages/custom-widgets/src/workbench/request-references.ts
  • packages/custom-widgets/src/workbench/response-tree.tsx
  • packages/custom-widgets/src/workbench/source-setup.tsx
  • packages/custom-widgets/tsconfig.json
  • packages/custom-widgets/vitest.config.ts
  • packages/db/collection.ts
  • packages/db/migrations/mysql/0044_custom_widget_v2_tables.sql
  • packages/db/migrations/mysql/meta/0038_snapshot.json
  • packages/db/migrations/mysql/meta/0040_snapshot.json
  • packages/db/migrations/mysql/meta/0041_snapshot.json
  • packages/db/migrations/mysql/meta/0042_snapshot.json
  • packages/db/migrations/mysql/meta/0044_snapshot.json
  • packages/db/migrations/mysql/meta/_journal.json
  • packages/db/migrations/postgresql/0010_custom_widget_v2_tables.sql
  • packages/db/migrations/postgresql/meta/0006_snapshot.json
  • packages/db/migrations/postgresql/meta/0007_snapshot.json
  • packages/db/migrations/postgresql/meta/0008_snapshot.json
  • packages/db/migrations/postgresql/meta/0010_snapshot.json
  • packages/db/migrations/postgresql/meta/_journal.json
  • packages/db/migrations/seed.ts
  • packages/db/migrations/sqlite/0042_custom_widget_v2_tables.sql
  • packages/db/migrations/sqlite/meta/0038_snapshot.json
  • packages/db/migrations/sqlite/meta/0039_snapshot.json
  • packages/db/migrations/sqlite/meta/0040_snapshot.json
  • packages/db/migrations/sqlite/meta/0042_snapshot.json
  • packages/db/migrations/sqlite/meta/_journal.json
  • packages/db/package.json
  • packages/db/schema/index.ts
  • packages/db/schema/mysql.ts
  • packages/db/schema/postgresql.ts
  • packages/db/schema/sqlite.ts
  • packages/db/seed/custom-widgets/currency-exchange.json
  • packages/db/seed/custom-widgets/dog-facts.json
  • packages/db/seed/custom-widgets/jellyfin.json
  • packages/db/seed/custom-widgets/pokedex.json
  • packages/db/test/custom-widget-seed-assertions.ts
  • packages/db/test/mysql-migration.spec.ts
  • packages/db/test/postgresql-migration.spec.ts
  • packages/db/test/schema.spec.ts
  • packages/db/test/sqlite-migration.spec.ts
  • packages/definitions/src/docs/index.ts
  • packages/definitions/src/test/docs.spec.ts
  • packages/integrations/src/patchmon/patchmon-types.ts
  • packages/integrations/src/plex/test/plex-integration.spec.ts
  • packages/integrations/test/home-assistant.spec.ts
  • packages/integrations/test/nextcloud.spec.ts
  • packages/modals/src/confirm-modal.tsx
  • packages/translation/src/lang/ca.json
  • packages/translation/src/lang/cn.json
  • packages/translation/src/lang/cr.json
  • packages/translation/src/lang/cs.json
  • packages/translation/src/lang/da.json
  • packages/translation/src/lang/de-CH.json
  • packages/translation/src/lang/de.json
  • packages/translation/src/lang/el.json
  • packages/translation/src/lang/en-gb.json
  • packages/translation/src/lang/en.json
  • packages/translation/src/lang/es.json
  • packages/translation/src/lang/et.json
  • packages/translation/src/lang/fi.json
  • packages/translation/src/lang/fr.json
  • packages/translation/src/lang/he.json
  • packages/translation/src/lang/hr.json
  • packages/translation/src/lang/hu.json
  • packages/translation/src/lang/it.json
  • packages/translation/src/lang/ja.json
  • packages/translation/src/lang/ko.json
  • packages/translation/src/lang/lt.json
  • packages/translation/src/lang/lv.json
  • packages/translation/src/lang/nl.json
  • packages/translation/src/lang/no.json
  • packages/translation/src/lang/pl.json
  • packages/translation/src/lang/pt-br.json
  • packages/translation/src/lang/pt.json
  • packages/translation/src/lang/ro.json
  • packages/translation/src/lang/ru.json
  • packages/translation/src/lang/sk.json
  • packages/translation/src/lang/sl.json
  • packages/translation/src/lang/sv.json
  • packages/translation/src/lang/tr.json
  • packages/translation/src/lang/uk.json
  • packages/translation/src/lang/vi.json
  • packages/translation/src/lang/zh.json
  • packages/validation/package.json
  • packages/validation/src/custom-widget.ts
  • packages/widgets/package.json
  • packages/widgets/src/_inputs/index.ts
  • packages/widgets/src/_inputs/widget-custom-widget-configuration-input.spec.tsx
  • packages/widgets/src/_inputs/widget-custom-widget-configuration-input.tsx
  • packages/widgets/src/_inputs/widget-custom-widget-select-input.spec.tsx
  • packages/widgets/src/_inputs/widget-custom-widget-select-input.tsx
  • packages/widgets/src/_inputs/widget-internal-input.tsx
  • packages/widgets/src/custom-api/component.tsx
  • packages/widgets/src/custom-api/custom-jsx-display.spec.ts
  • packages/widgets/src/custom-api/custom-jsx-display.tsx
  • packages/widgets/src/custom-api/extract-display-data.ts
  • packages/widgets/src/custom-api/index.ts
  • packages/widgets/src/custom-api/jsx-components.ts
  • packages/widgets/src/custom-api/jsx-icon-adapter.tsx
  • packages/widgets/src/custom-api/jsx-whitelist.ts
  • packages/widgets/src/custom-api/migration-state.spec.ts
  • packages/widgets/src/custom-api/migration-state.ts
  • packages/widgets/src/custom-api/widget-definition-context.tsx
  • packages/widgets/src/definition.ts
  • packages/widgets/src/filter-storage-volumes.spec.ts
  • packages/widgets/src/filter-storage-volumes.ts
  • packages/widgets/src/media-missing/component.tsx
  • packages/widgets/src/media-server/component.tsx
  • packages/widgets/src/modals/widget-edit-modal.tsx
  • packages/widgets/src/options.ts
  • packages/widgets/src/patchmon/index.ts
  • packages/widgets/src/patchmon/os-distribution-section.tsx
  • packages/widgets/src/patchmon/stat-colors.ts
  • packages/widgets/src/patchmon/test/stat-colors.spec.ts
  • packages/widgets/src/patchmon/test/threshold-validation.spec.ts
  • packages/widgets/src/test/translation.spec.ts
  • packages/workshop/package.json
  • packages/workshop/src/backend.ts
  • packages/workshop/src/client.spec.ts
  • packages/workshop/src/client.ts
  • packages/workshop/src/index.ts
  • packages/workshop/src/schema.spec.ts
  • packages/workshop/src/schema.ts
  • packages/workshop/tsconfig.json
  • pnpm-workspace.yaml
  • scripts/check-custom-widget-bundle.mjs
  • scripts/check-custom-widget-bundle.spec.ts
  • scripts/check-openapi-schema.mts
  • vitest.config.mts
  • vitest.setup.node.ts

You can disable this status message by setting the reviews.review_status to false in the CodeRabbit configuration file.

✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch v2

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

@ajnart ajnart changed the title v2 feat!: custom widgets v2 Jul 15, 2026
@ajnart
ajnart marked this pull request as ready for review July 15, 2026 13:13
@ajnart
ajnart requested review from a team and manuel-rw as code owners July 15, 2026 13:13
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant