├── .deepsource.toml ├── .dockerignore ├── .env.example ├── .gitattributes ├── .github ├── FUNDING.yml ├── ISSUE_TEMPLATE │ ├── bug_report.yml │ ├── feature_request.yml │ ├── integration.yml │ └── widget.yml ├── pull_request_template.md ├── renovate.json5 └── workflows │ ├── automatic-approval.yml │ ├── code-quality.yml │ ├── conventions-semantic-commits.yml │ ├── conventions-semantic-pull-requests.yml │ ├── crowdin-schedule-download.yml │ ├── crowdin-upload.yml │ ├── deployment-docker-image.yml │ ├── deployment-weekly-release.yml │ └── update-contributors.yml ├── .gitignore ├── .npmrc ├── .nvmrc ├── .releaserc.json ├── .run ├── All Tests.run.xml ├── db_migration_mysql_generate.run.xml ├── db_migration_sqlite_generate.run.xml ├── db_push.run.xml ├── db_studio.run.xml ├── dev.run.xml ├── docker_dev.run.xml ├── format.run.xml ├── format_fix.run.xml ├── test.run.xml ├── test_ui.run.xml └── typecheck.run.xml ├── .vscode ├── extensions.json ├── i18n-ally-custom-framework.yml ├── launch.json └── settings.json ├── CHANGELOG.md ├── CODEOWNERS ├── Dockerfile ├── LICENSE ├── SECURITY.md ├── apps ├── nextjs │ ├── README.md │ ├── eslint.config.js │ ├── next.config.ts │ ├── package.json │ ├── postcss.config.cjs │ ├── public │ │ ├── favicon.ico │ │ ├── images │ │ │ ├── apps │ │ │ │ ├── imdb.svg │ │ │ │ ├── lastfm.svg │ │ │ │ ├── lidarr.svg │ │ │ │ ├── nextcloud.svg │ │ │ │ ├── radarr.svg │ │ │ │ ├── readarr.svg │ │ │ │ ├── sonarr.svg │ │ │ │ ├── the-tvdb.svg │ │ │ │ ├── tmdb.svg │ │ │ │ ├── truenas.svg │ │ │ │ ├── unraid-alt.svg │ │ │ │ └── vgmdb.svg │ │ │ ├── kubernetes │ │ │ │ ├── configmaps.svg │ │ │ │ ├── ingresses.svg │ │ │ │ ├── namespaces.svg │ │ │ │ ├── nodes.svg │ │ │ │ ├── pods.svg │ │ │ │ ├── secrets.svg │ │ │ │ ├── services.svg │ │ │ │ └── volumes.svg │ │ │ └── pwa │ │ │ │ ├── 192.maskable.png │ │ │ │ └── 512.maskable.png │ │ └── logo │ │ │ └── logo.png │ ├── src │ │ ├── app │ │ │ ├── [locale] │ │ │ │ ├── (home) │ │ │ │ │ ├── (board) │ │ │ │ │ │ ├── layout.tsx │ │ │ │ │ │ └── page.tsx │ │ │ │ │ └── not-found.tsx │ │ │ │ ├── _client-providers │ │ │ │ │ ├── dayjs-loader.tsx │ │ │ │ │ ├── jotai.tsx │ │ │ │ │ ├── mantine.tsx │ │ │ │ │ ├── session.tsx │ │ │ │ │ └── trpc.tsx │ │ │ │ ├── auth │ │ │ │ │ ├── invite │ │ │ │ │ │ └── [id] │ │ │ │ │ │ │ ├── _registration-form.tsx │ │ │ │ │ │ │ └── page.tsx │ │ │ │ │ └── login │ │ │ │ │ │ ├── _login-form.tsx │ │ │ │ │ │ └── page.tsx │ │ │ │ ├── boards │ │ │ │ │ ├── (content) │ │ │ │ │ │ ├── (home) │ │ │ │ │ │ │ ├── _definition.ts │ │ │ │ │ │ │ ├── layout.tsx │ │ │ │ │ │ │ └── page.tsx │ │ │ │ │ │ ├── [name] │ │ │ │ │ │ │ ├── (board) │ │ │ │ │ │ │ │ ├── _definition.tsx │ │ │ │ │ │ │ │ ├── layout.tsx │ │ │ │ │ │ │ │ └── page.tsx │ │ │ │ │ │ │ └── not-found.tsx │ │ │ │ │ │ ├── _client.tsx │ │ │ │ │ │ ├── _creator.tsx │ │ │ │ │ │ ├── _custom-css.tsx │ │ │ │ │ │ ├── _dynamic-client.tsx │ │ │ │ │ │ ├── _header-actions.tsx │ │ │ │ │ │ ├── _ready-context.tsx │ │ │ │ │ │ ├── _theme.tsx │ │ │ │ │ │ └── not-found.tsx │ │ │ │ │ ├── [name] │ │ │ │ │ │ ├── layout.tsx │ │ │ │ │ │ └── settings │ │ │ │ │ │ │ ├── _appereance.tsx │ │ │ │ │ │ │ ├── _background.tsx │ │ │ │ │ │ │ ├── _behavior.tsx │ │ │ │ │ │ │ ├── _board-access.tsx │ │ │ │ │ │ │ ├── _customCss.tsx │ │ │ │ │ │ │ ├── _danger.tsx │ │ │ │ │ │ │ ├── _general.tsx │ │ │ │ │ │ │ ├── _layout.tsx │ │ │ │ │ │ │ ├── _shared.tsx │ │ │ │ │ │ │ ├── customcss.module.css │ │ │ │ │ │ │ ├── danger.module.css │ │ │ │ │ │ │ └── page.tsx │ │ │ │ │ ├── _header-actions.tsx │ │ │ │ │ ├── _layout-creator.tsx │ │ │ │ │ └── _types.ts │ │ │ │ ├── compose.tsx │ │ │ │ ├── init │ │ │ │ │ ├── _steps │ │ │ │ │ │ ├── back.tsx │ │ │ │ │ │ ├── finish │ │ │ │ │ │ │ └── init-finish.tsx │ │ │ │ │ │ ├── group │ │ │ │ │ │ │ └── init-group.tsx │ │ │ │ │ │ ├── import │ │ │ │ │ │ │ ├── file-info-card.tsx │ │ │ │ │ │ │ ├── import-dropzone.tsx │ │ │ │ │ │ │ └── init-import.tsx │ │ │ │ │ │ ├── settings │ │ │ │ │ │ │ └── init-settings.tsx │ │ │ │ │ │ ├── start │ │ │ │ │ │ │ ├── init-start.tsx │ │ │ │ │ │ │ └── next-button.tsx │ │ │ │ │ │ └── user │ │ │ │ │ │ │ ├── init-user-form.tsx │ │ │ │ │ │ │ └── init-user.tsx │ │ │ │ │ └── page.tsx │ │ │ │ ├── layout.tsx │ │ │ │ ├── loading.tsx │ │ │ │ ├── manage │ │ │ │ │ ├── [...not-found] │ │ │ │ │ │ └── page.tsx │ │ │ │ │ ├── _components │ │ │ │ │ │ ├── hero-banner.module.css │ │ │ │ │ │ └── hero-banner.tsx │ │ │ │ │ ├── about │ │ │ │ │ │ ├── about.module.css │ │ │ │ │ │ └── page.tsx │ │ │ │ │ ├── apps │ │ │ │ │ │ ├── _app-delete-button.tsx │ │ │ │ │ │ ├── edit │ │ │ │ │ │ │ └── [id] │ │ │ │ │ │ │ │ ├── _app-edit-form.tsx │ │ │ │ │ │ │ │ └── page.tsx │ │ │ │ │ │ ├── new │ │ │ │ │ │ │ └── page.tsx │ │ │ │ │ │ └── page.tsx │ │ │ │ │ ├── boards │ │ │ │ │ │ ├── _components │ │ │ │ │ │ │ ├── board-card-menu-dropdown.tsx │ │ │ │ │ │ │ └── create-board-button.tsx │ │ │ │ │ │ └── page.tsx │ │ │ │ │ ├── integrations │ │ │ │ │ │ ├── _components │ │ │ │ │ │ │ ├── integration-access-settings.tsx │ │ │ │ │ │ │ ├── secrets │ │ │ │ │ │ │ │ ├── integration-secret-card.tsx │ │ │ │ │ │ │ │ ├── integration-secret-icons.ts │ │ │ │ │ │ │ │ └── integration-secret-inputs.tsx │ │ │ │ │ │ │ └── test-connection │ │ │ │ │ │ │ │ ├── integration-test-connection-error.tsx │ │ │ │ │ │ │ │ ├── test-connection-certificate.tsx │ │ │ │ │ │ │ │ └── types.ts │ │ │ │ │ │ ├── _integration-buttons.tsx │ │ │ │ │ │ ├── edit │ │ │ │ │ │ │ └── [id] │ │ │ │ │ │ │ │ ├── _integration-edit-form.tsx │ │ │ │ │ │ │ │ └── page.tsx │ │ │ │ │ │ ├── new │ │ │ │ │ │ │ ├── _integration-new-dropdown.tsx │ │ │ │ │ │ │ ├── _integration-new-form.tsx │ │ │ │ │ │ │ └── page.tsx │ │ │ │ │ │ ├── page.module.css │ │ │ │ │ │ └── page.tsx │ │ │ │ │ ├── layout.tsx │ │ │ │ │ ├── medias │ │ │ │ │ │ ├── _actions │ │ │ │ │ │ │ ├── copy-media.tsx │ │ │ │ │ │ │ ├── delete-media.tsx │ │ │ │ │ │ │ ├── show-all.tsx │ │ │ │ │ │ │ └── upload-media.tsx │ │ │ │ │ │ └── page.tsx │ │ │ │ │ ├── not-found.tsx │ │ │ │ │ ├── page.tsx │ │ │ │ │ ├── search-engines │ │ │ │ │ │ ├── _form.tsx │ │ │ │ │ │ ├── _search-engine-delete-button.tsx │ │ │ │ │ │ ├── edit │ │ │ │ │ │ │ └── [id] │ │ │ │ │ │ │ │ ├── _search-engine-edit-form.tsx │ │ │ │ │ │ │ │ └── page.tsx │ │ │ │ │ │ ├── new │ │ │ │ │ │ │ ├── _search-engine-new-form.tsx │ │ │ │ │ │ │ └── page.tsx │ │ │ │ │ │ └── page.tsx │ │ │ │ │ ├── settings │ │ │ │ │ │ ├── _components │ │ │ │ │ │ │ ├── analytics.settings.tsx │ │ │ │ │ │ │ ├── appearance-settings-form.tsx │ │ │ │ │ │ │ ├── board-settings-form.tsx │ │ │ │ │ │ │ ├── common-form.tsx │ │ │ │ │ │ │ ├── crawling-and-indexing.settings.tsx │ │ │ │ │ │ │ ├── culture-settings-form.tsx │ │ │ │ │ │ │ ├── search-settings-form.tsx │ │ │ │ │ │ │ └── setting-switch.tsx │ │ │ │ │ │ └── page.tsx │ │ │ │ │ ├── tools │ │ │ │ │ │ ├── api │ │ │ │ │ │ │ ├── components │ │ │ │ │ │ │ │ ├── api-keys.tsx │ │ │ │ │ │ │ │ ├── copy-api-key-modal.tsx │ │ │ │ │ │ │ │ └── swagger-ui.tsx │ │ │ │ │ │ │ ├── page.tsx │ │ │ │ │ │ │ ├── swagger-ui-dark.css │ │ │ │ │ │ │ ├── swagger-ui-overrides.css │ │ │ │ │ │ │ └── swagger-ui.css │ │ │ │ │ │ ├── certificates │ │ │ │ │ │ │ ├── _components │ │ │ │ │ │ │ │ ├── add-certificate.tsx │ │ │ │ │ │ │ │ └── remove-certificate.tsx │ │ │ │ │ │ │ ├── hostnames │ │ │ │ │ │ │ │ ├── _components │ │ │ │ │ │ │ │ │ └── remove-hostname.tsx │ │ │ │ │ │ │ │ └── page.tsx │ │ │ │ │ │ │ └── page.tsx │ │ │ │ │ │ ├── docker │ │ │ │ │ │ │ ├── docker-table.tsx │ │ │ │ │ │ │ ├── error.tsx │ │ │ │ │ │ │ └── page.tsx │ │ │ │ │ │ ├── kubernetes │ │ │ │ │ │ │ ├── cluster-dashboard │ │ │ │ │ │ │ │ ├── cluster-dashboard.tsx │ │ │ │ │ │ │ │ ├── error.tsx │ │ │ │ │ │ │ │ ├── header-card │ │ │ │ │ │ │ │ │ ├── header-card.module.css │ │ │ │ │ │ │ │ │ ├── header-card.tsx │ │ │ │ │ │ │ │ │ └── header-icon.tsx │ │ │ │ │ │ │ │ ├── resource-gauge │ │ │ │ │ │ │ │ │ ├── resource-gauge.module.css │ │ │ │ │ │ │ │ │ ├── resource-gauge.tsx │ │ │ │ │ │ │ │ │ └── resource-icon.tsx │ │ │ │ │ │ │ │ └── resource-tile │ │ │ │ │ │ │ │ │ ├── resource-tile.module.css │ │ │ │ │ │ │ │ │ └── resource-tile.tsx │ │ │ │ │ │ │ ├── configmaps │ │ │ │ │ │ │ │ ├── configmaps-table.tsx │ │ │ │ │ │ │ │ └── page.tsx │ │ │ │ │ │ │ ├── ingresses │ │ │ │ │ │ │ │ ├── ingresses-table.tsx │ │ │ │ │ │ │ │ └── page.tsx │ │ │ │ │ │ │ ├── namespaces │ │ │ │ │ │ │ │ ├── namespaces-table.tsx │ │ │ │ │ │ │ │ └── page.tsx │ │ │ │ │ │ │ ├── nodes │ │ │ │ │ │ │ │ ├── nodes-table.tsx │ │ │ │ │ │ │ │ └── page.tsx │ │ │ │ │ │ │ ├── page.tsx │ │ │ │ │ │ │ ├── pods │ │ │ │ │ │ │ │ ├── page.tsx │ │ │ │ │ │ │ │ └── pods-table.tsx │ │ │ │ │ │ │ ├── secrets │ │ │ │ │ │ │ │ ├── page.tsx │ │ │ │ │ │ │ │ └── secrets-table.tsx │ │ │ │ │ │ │ ├── services │ │ │ │ │ │ │ │ ├── page.tsx │ │ │ │ │ │ │ │ └── services-table.tsx │ │ │ │ │ │ │ └── volumes │ │ │ │ │ │ │ │ ├── page.tsx │ │ │ │ │ │ │ │ └── volumes-table.tsx │ │ │ │ │ │ ├── logs │ │ │ │ │ │ │ ├── client.tsx │ │ │ │ │ │ │ ├── page.tsx │ │ │ │ │ │ │ ├── terminal.module.css │ │ │ │ │ │ │ └── terminal.tsx │ │ │ │ │ │ └── tasks │ │ │ │ │ │ │ ├── _components │ │ │ │ │ │ │ └── jobs-list.tsx │ │ │ │ │ │ │ └── page.tsx │ │ │ │ │ └── users │ │ │ │ │ │ ├── [userId] │ │ │ │ │ │ ├── access.ts │ │ │ │ │ │ ├── general │ │ │ │ │ │ │ ├── _components │ │ │ │ │ │ │ │ ├── _change-home-board.tsx │ │ │ │ │ │ │ │ ├── _change-search-preferences.tsx │ │ │ │ │ │ │ │ ├── _delete-user-button.tsx │ │ │ │ │ │ │ │ ├── _first-day-of-week.tsx │ │ │ │ │ │ │ │ ├── _ping-icons-enabled.tsx │ │ │ │ │ │ │ │ ├── _profile-avatar-form.tsx │ │ │ │ │ │ │ │ └── _profile-form.tsx │ │ │ │ │ │ │ └── page.tsx │ │ │ │ │ │ ├── layout.tsx │ │ │ │ │ │ └── security │ │ │ │ │ │ │ ├── _components │ │ │ │ │ │ │ └── _change-password-form.tsx │ │ │ │ │ │ │ └── page.tsx │ │ │ │ │ │ ├── _components │ │ │ │ │ │ └── user-list.tsx │ │ │ │ │ │ ├── create │ │ │ │ │ │ ├── _components │ │ │ │ │ │ │ ├── create-user-stepper.tsx │ │ │ │ │ │ │ └── stepper-navigation.tsx │ │ │ │ │ │ └── page.tsx │ │ │ │ │ │ ├── groups │ │ │ │ │ │ ├── [id] │ │ │ │ │ │ │ ├── _delete-group.tsx │ │ │ │ │ │ │ ├── _navigation.tsx │ │ │ │ │ │ │ ├── _rename-group-form.tsx │ │ │ │ │ │ │ ├── _reserved-group-alert.tsx │ │ │ │ │ │ │ ├── _transfer-group-ownership.tsx │ │ │ │ │ │ │ ├── layout.tsx │ │ │ │ │ │ │ ├── members │ │ │ │ │ │ │ │ ├── _add-group-member.tsx │ │ │ │ │ │ │ │ ├── _remove-group-member.tsx │ │ │ │ │ │ │ │ └── page.tsx │ │ │ │ │ │ │ ├── page.tsx │ │ │ │ │ │ │ ├── permissions │ │ │ │ │ │ │ │ ├── _group-permission-form.tsx │ │ │ │ │ │ │ │ └── page.tsx │ │ │ │ │ │ │ └── settings │ │ │ │ │ │ │ │ ├── _group-home-boards.tsx │ │ │ │ │ │ │ │ └── page.tsx │ │ │ │ │ │ ├── _client.tsx │ │ │ │ │ │ ├── _groups-table.tsx │ │ │ │ │ │ ├── groups.module.css │ │ │ │ │ │ └── page.tsx │ │ │ │ │ │ ├── invites │ │ │ │ │ │ ├── _components │ │ │ │ │ │ │ └── invite-list.tsx │ │ │ │ │ │ └── page.tsx │ │ │ │ │ │ └── page.tsx │ │ │ │ ├── not-found.tsx │ │ │ │ └── widgets │ │ │ │ │ └── [kind] │ │ │ │ │ ├── _content.tsx │ │ │ │ │ ├── _dimension-modal.tsx │ │ │ │ │ ├── layout.tsx │ │ │ │ │ └── page.tsx │ │ │ ├── api │ │ │ │ ├── [...trpc] │ │ │ │ │ └── route.ts │ │ │ │ ├── about │ │ │ │ │ └── contributors │ │ │ │ │ │ ├── crowdin │ │ │ │ │ │ └── route.ts │ │ │ │ │ │ └── github │ │ │ │ │ │ └── route.ts │ │ │ │ ├── auth │ │ │ │ │ └── [...nextauth] │ │ │ │ │ │ └── route.ts │ │ │ │ ├── health │ │ │ │ │ ├── live │ │ │ │ │ │ └── route.ts │ │ │ │ │ └── ready │ │ │ │ │ │ └── route.ts │ │ │ │ ├── openapi │ │ │ │ │ └── route.ts │ │ │ │ ├── trpc │ │ │ │ │ └── [trpc] │ │ │ │ │ │ └── route.ts │ │ │ │ └── user-medias │ │ │ │ │ └── [id] │ │ │ │ │ └── route.ts │ │ │ └── manifest.ts │ │ ├── components │ │ │ ├── access │ │ │ │ ├── access-settings.tsx │ │ │ │ ├── access-table-rows.tsx │ │ │ │ ├── context.tsx │ │ │ │ ├── form.ts │ │ │ │ ├── group-access-form.tsx │ │ │ │ ├── group-select-modal.tsx │ │ │ │ ├── inherit-access-table.tsx │ │ │ │ ├── user-access-form.tsx │ │ │ │ └── user-select-modal.tsx │ │ │ ├── active-tab-accordion.tsx │ │ │ ├── board │ │ │ │ ├── board-select.tsx │ │ │ │ ├── items │ │ │ │ │ ├── actions │ │ │ │ │ │ ├── create-item.ts │ │ │ │ │ │ ├── duplicate-item.ts │ │ │ │ │ │ ├── empty-position.ts │ │ │ │ │ │ ├── move-and-resize-item.ts │ │ │ │ │ │ ├── move-item-to-section.ts │ │ │ │ │ │ ├── remove-item.ts │ │ │ │ │ │ ├── section-elements.ts │ │ │ │ │ │ └── test │ │ │ │ │ │ │ ├── create-item.spec.ts │ │ │ │ │ │ │ ├── duplicate-item.spec.ts │ │ │ │ │ │ │ ├── empty-position.spec.ts │ │ │ │ │ │ │ ├── mocks │ │ │ │ │ │ │ ├── board-mock.ts │ │ │ │ │ │ │ ├── category-section-mock.ts │ │ │ │ │ │ │ ├── dynamic-section-mock.ts │ │ │ │ │ │ │ ├── empty-section-mock.ts │ │ │ │ │ │ │ ├── item-mock.ts │ │ │ │ │ │ │ └── layout-mock.ts │ │ │ │ │ │ │ ├── move-and-resize-item.spec.ts │ │ │ │ │ │ │ ├── move-item-to-section.spec.ts │ │ │ │ │ │ │ └── remove-item.spec.ts │ │ │ │ │ ├── item-actions.tsx │ │ │ │ │ ├── item-content.module.css │ │ │ │ │ ├── item-content.tsx │ │ │ │ │ ├── item-menu.tsx │ │ │ │ │ ├── item-move-modal.tsx │ │ │ │ │ └── item-select-modal.tsx │ │ │ │ ├── modals │ │ │ │ │ └── board-rename-modal.tsx │ │ │ │ ├── not-found.tsx │ │ │ │ ├── permissions │ │ │ │ │ ├── client.ts │ │ │ │ │ └── server.ts │ │ │ │ └── sections │ │ │ │ │ ├── category-section.tsx │ │ │ │ │ ├── category │ │ │ │ │ ├── actions │ │ │ │ │ │ ├── move-category.ts │ │ │ │ │ │ ├── remove-category.ts │ │ │ │ │ │ └── test │ │ │ │ │ │ │ ├── move-category.spec.ts │ │ │ │ │ │ │ └── remove-category.spec.ts │ │ │ │ │ ├── category-actions.ts │ │ │ │ │ ├── category-edit-modal.tsx │ │ │ │ │ ├── category-menu-actions.tsx │ │ │ │ │ ├── category-menu.tsx │ │ │ │ │ └── filter.ts │ │ │ │ │ ├── content.tsx │ │ │ │ │ ├── dynamic-section.tsx │ │ │ │ │ ├── dynamic │ │ │ │ │ ├── actions │ │ │ │ │ │ ├── add-dynamic-section.ts │ │ │ │ │ │ └── remove-dynamic-section.ts │ │ │ │ │ ├── dynamic-actions.ts │ │ │ │ │ ├── dynamic-edit-modal.tsx │ │ │ │ │ └── dynamic-menu.tsx │ │ │ │ │ ├── empty-section.tsx │ │ │ │ │ ├── gridstack │ │ │ │ │ ├── gridstack-item.tsx │ │ │ │ │ ├── gridstack.tsx │ │ │ │ │ ├── init-gridstack.ts │ │ │ │ │ └── use-gridstack.ts │ │ │ │ │ ├── item.module.css │ │ │ │ │ ├── section-actions.tsx │ │ │ │ │ ├── section-context.ts │ │ │ │ │ └── use-section-items.ts │ │ │ ├── color-scheme │ │ │ │ └── current-color-scheme-combobox.tsx │ │ │ ├── language │ │ │ │ ├── current-language-combobox.tsx │ │ │ │ ├── language-combobox.module.css │ │ │ │ └── language-combobox.tsx │ │ │ ├── layout │ │ │ │ ├── analytics.tsx │ │ │ │ ├── background.tsx │ │ │ │ ├── header.tsx │ │ │ │ ├── header │ │ │ │ │ ├── burger.tsx │ │ │ │ │ ├── button.tsx │ │ │ │ │ ├── search.module.css │ │ │ │ │ ├── search.tsx │ │ │ │ │ ├── update.tsx │ │ │ │ │ └── user.tsx │ │ │ │ ├── logo │ │ │ │ │ ├── board-logo.tsx │ │ │ │ │ ├── homarr-logo.tsx │ │ │ │ │ └── logo.tsx │ │ │ │ ├── navigation-link.tsx │ │ │ │ ├── navigation.tsx │ │ │ │ ├── search-engine-optimization.tsx │ │ │ │ └── shell.tsx │ │ │ ├── manage │ │ │ │ ├── danger-zone.tsx │ │ │ │ ├── manage-container.tsx │ │ │ │ └── mobile-affix-button.tsx │ │ │ ├── navigation │ │ │ │ └── dynamic-breadcrumb.tsx │ │ │ ├── no-results.tsx │ │ │ ├── user-avatar-menu.tsx │ │ │ └── user-avatar.tsx │ │ ├── constants.ts │ │ ├── errors │ │ │ └── trpc-catch-error.ts │ │ ├── metadata.ts │ │ ├── middleware.ts │ │ ├── react-app-env.d.ts │ │ ├── styles │ │ │ ├── gridstack.scss │ │ │ ├── prismjs.scss │ │ │ └── scroll-area.scss │ │ ├── theme │ │ │ └── color-scheme.ts │ │ └── versions │ │ │ └── package-reader.ts │ └── tsconfig.json ├── tasks │ ├── eslint.config.js │ ├── package.json │ ├── src │ │ ├── main.ts │ │ └── undici-log-agent-override.ts │ └── tsconfig.json └── websocket │ ├── eslint.config.js │ ├── package.json │ ├── src │ └── main.ts │ └── tsconfig.json ├── crowdin.yml ├── development ├── build.cmd ├── development.docker-compose.yml └── docker-run.cmd ├── docs ├── README.md ├── banner.png ├── installation-button.png ├── section-contribute.png ├── section-features.png ├── section-installation.png ├── section-preview.png └── section-widgets-and-integrations.png ├── e2e ├── health-checks.spec.ts ├── home.spec.ts ├── lldap.spec.ts ├── onboarding.spec.ts └── shared │ ├── actions │ └── onboarding-actions.ts │ ├── assertions │ └── onboarding-assertions.ts │ ├── create-homarr-container.ts │ └── e2e-db.ts ├── nginx.conf ├── package.json ├── packages ├── analytics │ ├── eslint.config.js │ ├── index.ts │ ├── package.json │ ├── src │ │ ├── constants.ts │ │ ├── index.ts │ │ └── send-server-analytics.ts │ └── tsconfig.json ├── api │ ├── eslint.config.js │ ├── package.json │ ├── src │ │ ├── client.ts │ │ ├── env.ts │ │ ├── index.ts │ │ ├── middlewares │ │ │ ├── docker.ts │ │ │ ├── integration.ts │ │ │ ├── item.ts │ │ │ └── kubernetes.ts │ │ ├── open-api.ts │ │ ├── root.ts │ │ ├── router │ │ │ ├── apiKeys.ts │ │ │ ├── app.ts │ │ │ ├── app │ │ │ │ └── app-access-control.ts │ │ │ ├── board.ts │ │ │ ├── board │ │ │ │ ├── board-access.ts │ │ │ │ ├── grid-algorithm.ts │ │ │ │ └── test │ │ │ │ │ └── grid-algorithm.spec.ts │ │ │ ├── certificates │ │ │ │ └── certificate-router.ts │ │ │ ├── cron-jobs.ts │ │ │ ├── docker │ │ │ │ └── docker-router.ts │ │ │ ├── group.ts │ │ │ ├── home.ts │ │ │ ├── icons.ts │ │ │ ├── import │ │ │ │ └── import-router.ts │ │ │ ├── integration │ │ │ │ ├── integration-access.ts │ │ │ │ ├── integration-router.ts │ │ │ │ ├── integration-test-connection.ts │ │ │ │ └── map-test-connection-error.ts │ │ │ ├── invite.ts │ │ │ ├── invite │ │ │ │ └── checks.ts │ │ │ ├── kubernetes │ │ │ │ ├── kubernetes-client.ts │ │ │ │ ├── resource-parser │ │ │ │ │ ├── cpu-resource-parser.ts │ │ │ │ │ ├── memory-resource-parser.ts │ │ │ │ │ └── resource-parser.ts │ │ │ │ └── router │ │ │ │ │ ├── cluster.ts │ │ │ │ │ ├── configMaps.ts │ │ │ │ │ ├── ingresses.ts │ │ │ │ │ ├── kubernetes-router.ts │ │ │ │ │ ├── namespaces.ts │ │ │ │ │ ├── nodes.ts │ │ │ │ │ ├── pods.ts │ │ │ │ │ ├── secrets.ts │ │ │ │ │ ├── services.ts │ │ │ │ │ └── volumes.ts │ │ │ ├── location.ts │ │ │ ├── log.ts │ │ │ ├── medias │ │ │ │ └── media-router.ts │ │ │ ├── onboard │ │ │ │ ├── onboard-queries.ts │ │ │ │ └── onboard-router.ts │ │ │ ├── search-engine │ │ │ │ └── search-engine-router.ts │ │ │ ├── section │ │ │ │ └── section-router.ts │ │ │ ├── serverSettings.ts │ │ │ ├── test │ │ │ │ ├── app.spec.ts │ │ │ │ ├── board.spec.ts │ │ │ │ ├── board │ │ │ │ │ └── board-access.spec.ts │ │ │ │ ├── docker │ │ │ │ │ └── docker-router.spec.ts │ │ │ │ ├── group.spec.ts │ │ │ │ ├── helper.ts │ │ │ │ ├── integration │ │ │ │ │ ├── integration-access.spec.ts │ │ │ │ │ ├── integration-router.spec.ts │ │ │ │ │ └── integration-test-connection.spec.ts │ │ │ │ ├── invite.spec.ts │ │ │ │ ├── kubernetes │ │ │ │ │ └── resource-parser │ │ │ │ │ │ ├── cpu-resource-parser.spec.ts │ │ │ │ │ │ └── memory-resource-parser.spec.ts │ │ │ │ ├── serverSettings.spec.ts │ │ │ │ ├── user.spec.ts │ │ │ │ └── widgets │ │ │ │ │ └── app.spec.ts │ │ │ ├── update-checker.ts │ │ │ ├── user.ts │ │ │ ├── user │ │ │ │ └── change-search-preferences.ts │ │ │ └── widgets │ │ │ │ ├── app.ts │ │ │ │ ├── calendar.ts │ │ │ │ ├── dns-hole.ts │ │ │ │ ├── downloads.ts │ │ │ │ ├── health-monitoring.ts │ │ │ │ ├── index.ts │ │ │ │ ├── indexer-manager.ts │ │ │ │ ├── media-requests.ts │ │ │ │ ├── media-server.ts │ │ │ │ ├── media-transcoding.ts │ │ │ │ ├── minecraft.ts │ │ │ │ ├── network-controller.ts │ │ │ │ ├── notebook.ts │ │ │ │ ├── options.ts │ │ │ │ ├── releases.ts │ │ │ │ ├── rssFeed.ts │ │ │ │ ├── smart-home.ts │ │ │ │ ├── stocks.ts │ │ │ │ └── weather.ts │ │ ├── schema-merger.ts │ │ ├── server.ts │ │ ├── shared.ts │ │ ├── test │ │ │ └── open-api.spec.ts │ │ ├── trpc.ts │ │ └── websocket.ts │ └── tsconfig.json ├── auth │ ├── adapter.ts │ ├── callbacks.ts │ ├── client.ts │ ├── configuration.ts │ ├── env.ts │ ├── eslint.config.js │ ├── events.ts │ ├── index.ts │ ├── next.ts │ ├── package.json │ ├── permissions │ │ ├── board-permissions.ts │ │ ├── index.ts │ │ ├── integration-permissions.ts │ │ ├── integration-provider.tsx │ │ ├── integration-query-permissions.ts │ │ ├── integrations-with-permissions.ts │ │ └── test │ │ │ ├── board-permissions.spec.ts │ │ │ ├── integration-permissions.spec.ts │ │ │ └── integration-query-permissions.spec.ts │ ├── providers │ │ ├── check-provider.ts │ │ ├── credentials │ │ │ ├── authorization │ │ │ │ ├── basic-authorization.ts │ │ │ │ └── ldap-authorization.ts │ │ │ ├── credentials-provider.ts │ │ │ └── ldap-client.ts │ │ ├── empty │ │ │ └── empty-provider.ts │ │ ├── filter-providers.ts │ │ ├── oidc │ │ │ └── oidc-provider.ts │ │ └── test │ │ │ ├── basic-authorization.spec.ts │ │ │ └── ldap-authorization.spec.ts │ ├── redirect.ts │ ├── security.ts │ ├── server.ts │ ├── session.ts │ ├── shared.ts │ ├── test │ │ ├── adapter.spec.ts │ │ ├── callbacks.spec.ts │ │ ├── events.spec.ts │ │ ├── redirect.spec.ts │ │ ├── security.spec.ts │ │ └── session.spec.ts │ └── tsconfig.json ├── boards │ ├── eslint.config.js │ ├── package.json │ ├── src │ │ ├── context.tsx │ │ ├── edit-mode.tsx │ │ └── updater.ts │ └── tsconfig.json ├── certificates │ ├── eslint.config.js │ ├── package.json │ ├── src │ │ └── server.ts │ └── tsconfig.json ├── cli │ ├── eslint.config.js │ ├── index.ts │ ├── package.json │ ├── src │ │ ├── commands │ │ │ ├── fix-usernames.ts │ │ │ ├── recreate-admin.ts │ │ │ └── reset-password.ts │ │ └── index.ts │ └── tsconfig.json ├── common │ ├── env.ts │ ├── eslint.config.js │ ├── index.ts │ ├── package.json │ ├── src │ │ ├── array.ts │ │ ├── client.ts │ │ ├── cookie.ts │ │ ├── date.ts │ │ ├── encryption.ts │ │ ├── env-validation.ts │ │ ├── error.ts │ │ ├── errors │ │ │ ├── http │ │ │ │ ├── handlers │ │ │ │ │ ├── axios-http-error-handler.ts │ │ │ │ │ ├── fetch-http-error-handler.ts │ │ │ │ │ ├── http-error-handler.ts │ │ │ │ │ ├── index.ts │ │ │ │ │ ├── ofetch-http-error-handler.ts │ │ │ │ │ └── tsdav-http-error-handler.ts │ │ │ │ ├── index.ts │ │ │ │ ├── request-error.ts │ │ │ │ └── response-error.ts │ │ │ ├── index.ts │ │ │ └── parse │ │ │ │ ├── handlers │ │ │ │ ├── index.ts │ │ │ │ ├── json-parse-error-handler.ts │ │ │ │ ├── parse-error-handler.ts │ │ │ │ └── zod-parse-error-handler.ts │ │ │ │ ├── index.ts │ │ │ │ └── parse-error.ts │ │ ├── fetch-agent.ts │ │ ├── fetch-with-timeout.ts │ │ ├── function.ts │ │ ├── hooks.ts │ │ ├── index.ts │ │ ├── number.ts │ │ ├── object.ts │ │ ├── revalidate-path-action.ts │ │ ├── security.ts │ │ ├── server.ts │ │ ├── stopwatch.ts │ │ ├── string.ts │ │ ├── test │ │ │ ├── array.spec.ts │ │ │ ├── date.spec.ts │ │ │ ├── error.spec.ts │ │ │ ├── fetch-agent.spec.ts │ │ │ ├── object.spec.ts │ │ │ ├── string.spec.ts │ │ │ └── url.spec.ts │ │ ├── theme.ts │ │ ├── types.ts │ │ ├── url.ts │ │ └── user-agent.ts │ └── tsconfig.json ├── cron-job-runner │ ├── eslint.config.js │ ├── index.ts │ ├── package.json │ ├── src │ │ ├── index.ts │ │ └── register.ts │ └── tsconfig.json ├── cron-job-status │ ├── eslint.config.js │ ├── index.ts │ ├── package.json │ ├── src │ │ ├── index.ts │ │ └── publisher.ts │ └── tsconfig.json ├── cron-jobs-core │ ├── eslint.config.js │ ├── index.ts │ ├── package.json │ ├── src │ │ ├── creator.ts │ │ ├── expressions.ts │ │ ├── group.ts │ │ ├── index.ts │ │ ├── logger.ts │ │ ├── registry.ts │ │ └── validation.ts │ └── tsconfig.json ├── cron-jobs │ ├── eslint.config.js │ ├── index.ts │ ├── package.json │ ├── src │ │ ├── index.ts │ │ ├── jobs │ │ │ ├── analytics.ts │ │ │ ├── docker.ts │ │ │ ├── icons-updater.ts │ │ │ ├── integrations │ │ │ │ ├── dns-hole.ts │ │ │ │ ├── downloads.ts │ │ │ │ ├── health-monitoring.ts │ │ │ │ ├── home-assistant.ts │ │ │ │ ├── indexer-manager.ts │ │ │ │ ├── media-organizer.ts │ │ │ │ ├── media-requests.ts │ │ │ │ ├── media-server.ts │ │ │ │ ├── media-transcoding.ts │ │ │ │ └── network-controller.ts │ │ │ ├── minecraft-server-status.ts │ │ │ ├── ping.ts │ │ │ ├── rss-feeds.ts │ │ │ ├── session-cleanup.ts │ │ │ └── update-checker.ts │ │ └── lib │ │ │ └── index.ts │ └── tsconfig.json ├── db │ ├── client.ts │ ├── collection.ts │ ├── configs │ │ ├── mysql.config.ts │ │ └── sqlite.config.ts │ ├── driver.ts │ ├── env.ts │ ├── eslint.config.js │ ├── index.ts │ ├── migrations │ │ ├── mysql │ │ │ ├── 0000_harsh_photon.sql │ │ │ ├── 0001_wild_alex_wilder.sql │ │ │ ├── 0002_flimsy_deathbird.sql │ │ │ ├── 0003_freezing_black_panther.sql │ │ │ ├── 0004_noisy_giant_girl.sql │ │ │ ├── 0005_soft_microbe.sql │ │ │ ├── 0006_young_micromax.sql │ │ │ ├── 0007_boring_nocturne.sql │ │ │ ├── 0008_far_lifeguard.sql │ │ │ ├── 0009_wakeful_tenebrous.sql │ │ │ ├── 0010_melted_pestilence.sql │ │ │ ├── 0011_freezing_banshee.sql │ │ │ ├── 0012_abnormal_wendell_vaughn.sql │ │ │ ├── 0013_youthful_vulture.sql │ │ │ ├── 0014_bizarre_red_shift.sql │ │ │ ├── 0015_unknown_firedrake.sql │ │ │ ├── 0016_change_all_to_snake_case.sql │ │ │ ├── 0017_tired_penance.sql │ │ │ ├── 0018_mighty_shaman.sql │ │ │ ├── 0019_crazy_marvel_zombies.sql │ │ │ ├── 0020_salty_doorman.sql │ │ │ ├── 0021_fluffy_jocasta.sql │ │ │ ├── 0022_famous_otto_octavius.sql │ │ │ ├── 0023_fix_on_delete_actions.sql │ │ │ ├── 0024_mean_vin_gonzales.sql │ │ │ ├── 0025_add-group-home-board-settings.sql │ │ │ ├── 0026_add-border-radius.sql │ │ │ ├── 0027_acoustic_karma.sql │ │ │ ├── 0028_add_app_ping_url.sql │ │ │ ├── 0029_add_layouts.sql │ │ │ ├── 0030_migrate_item_and_section_for_layouts.sql │ │ │ ├── 0031_add_dynamic_section_options.sql │ │ │ ├── 0032_add_trusted_certificate_hostnames.sql │ │ │ ├── meta │ │ │ │ ├── 0000_snapshot.json │ │ │ │ ├── 0001_snapshot.json │ │ │ │ ├── 0002_snapshot.json │ │ │ │ ├── 0003_snapshot.json │ │ │ │ ├── 0004_snapshot.json │ │ │ │ ├── 0005_snapshot.json │ │ │ │ ├── 0006_snapshot.json │ │ │ │ ├── 0007_snapshot.json │ │ │ │ ├── 0008_snapshot.json │ │ │ │ ├── 0009_snapshot.json │ │ │ │ ├── 0010_snapshot.json │ │ │ │ ├── 0011_snapshot.json │ │ │ │ ├── 0012_snapshot.json │ │ │ │ ├── 0013_snapshot.json │ │ │ │ ├── 0014_snapshot.json │ │ │ │ ├── 0015_snapshot.json │ │ │ │ ├── 0016_snapshot.json │ │ │ │ ├── 0017_snapshot.json │ │ │ │ ├── 0018_snapshot.json │ │ │ │ ├── 0019_snapshot.json │ │ │ │ ├── 0020_snapshot.json │ │ │ │ ├── 0021_snapshot.json │ │ │ │ ├── 0022_snapshot.json │ │ │ │ ├── 0023_snapshot.json │ │ │ │ ├── 0024_snapshot.json │ │ │ │ ├── 0025_snapshot.json │ │ │ │ ├── 0026_snapshot.json │ │ │ │ ├── 0027_snapshot.json │ │ │ │ ├── 0028_snapshot.json │ │ │ │ ├── 0029_snapshot.json │ │ │ │ ├── 0030_snapshot.json │ │ │ │ ├── 0031_snapshot.json │ │ │ │ ├── 0032_snapshot.json │ │ │ │ └── _journal.json │ │ │ └── migrate.ts │ │ ├── run-seed.ts │ │ ├── seed.ts │ │ └── sqlite │ │ │ ├── 0000_talented_ben_parker.sql │ │ │ ├── 0001_mixed_titanium_man.sql │ │ │ ├── 0002_cooing_sumo.sql │ │ │ ├── 0003_adorable_raider.sql │ │ │ ├── 0004_peaceful_red_ghost.sql │ │ │ ├── 0005_lean_random.sql │ │ │ ├── 0006_windy_doctor_faustus.sql │ │ │ ├── 0007_known_ultragirl.sql │ │ │ ├── 0008_third_thor.sql │ │ │ ├── 0009_stale_roulette.sql │ │ │ ├── 0010_gorgeous_stingray.sql │ │ │ ├── 0011_classy_angel.sql │ │ │ ├── 0012_ambiguous_black_panther.sql │ │ │ ├── 0013_faithful_hex.sql │ │ │ ├── 0014_colorful_cargill.sql │ │ │ ├── 0015_superb_psylocke.sql │ │ │ ├── 0016_change_all_to_snake_case.sql │ │ │ ├── 0017_small_rumiko_fujikawa.sql │ │ │ ├── 0018_cheerful_tattoo.sql │ │ │ ├── 0019_steady_darkhawk.sql │ │ │ ├── 0020_empty_hellfire_club.sql │ │ │ ├── 0021_famous_bruce_banner.sql │ │ │ ├── 0022_modern_sunfire.sql │ │ │ ├── 0023_fix_on_delete_actions.sql │ │ │ ├── 0024_bitter_scrambler.sql │ │ │ ├── 0025_add-group-home-board-settings.sql │ │ │ ├── 0026_add-border-radius.sql │ │ │ ├── 0027_wooden_blizzard.sql │ │ │ ├── 0028_add_app_ping_url.sql │ │ │ ├── 0029_add_layouts.sql │ │ │ ├── 0030_migrate_item_and_section_for_layouts.sql │ │ │ ├── 0031_add_dynamic_section_options.sql │ │ │ ├── 0032_add_trusted_certificate_hostnames.sql │ │ │ ├── meta │ │ │ ├── 0000_snapshot.json │ │ │ ├── 0001_snapshot.json │ │ │ ├── 0002_snapshot.json │ │ │ ├── 0003_snapshot.json │ │ │ ├── 0004_snapshot.json │ │ │ ├── 0005_snapshot.json │ │ │ ├── 0006_snapshot.json │ │ │ ├── 0007_snapshot.json │ │ │ ├── 0008_snapshot.json │ │ │ ├── 0009_snapshot.json │ │ │ ├── 0010_snapshot.json │ │ │ ├── 0011_snapshot.json │ │ │ ├── 0012_snapshot.json │ │ │ ├── 0013_snapshot.json │ │ │ ├── 0014_snapshot.json │ │ │ ├── 0015_snapshot.json │ │ │ ├── 0016_snapshot.json │ │ │ ├── 0017_snapshot.json │ │ │ ├── 0018_snapshot.json │ │ │ ├── 0019_snapshot.json │ │ │ ├── 0020_snapshot.json │ │ │ ├── 0021_snapshot.json │ │ │ ├── 0022_snapshot.json │ │ │ ├── 0023_snapshot.json │ │ │ ├── 0024_snapshot.json │ │ │ ├── 0025_snapshot.json │ │ │ ├── 0026_snapshot.json │ │ │ ├── 0027_snapshot.json │ │ │ ├── 0028_snapshot.json │ │ │ ├── 0029_snapshot.json │ │ │ ├── 0030_snapshot.json │ │ │ ├── 0031_snapshot.json │ │ │ ├── 0032_snapshot.json │ │ │ └── _journal.json │ │ │ └── migrate.ts │ ├── package.json │ ├── queries │ │ ├── group.ts │ │ ├── index.ts │ │ ├── item.ts │ │ └── server-setting.ts │ ├── schema │ │ ├── index.ts │ │ ├── mysql.ts │ │ └── sqlite.ts │ ├── test │ │ ├── db-mock.ts │ │ ├── index.ts │ │ ├── mysql-migration.spec.ts │ │ └── schema.spec.ts │ ├── transactions.ts │ ├── tsconfig.json │ └── validationSchemas.ts ├── definitions │ ├── eslint.config.js │ ├── index.ts │ ├── package.json │ ├── src │ │ ├── _definition.ts │ │ ├── auth.ts │ │ ├── board.ts │ │ ├── cookie.ts │ │ ├── docker.ts │ │ ├── docs │ │ │ ├── codegen.ts │ │ │ ├── homarr-docs-sitemap.ts │ │ │ └── index.ts │ │ ├── emptysuperjson.ts │ │ ├── group.ts │ │ ├── index.ts │ │ ├── integration.ts │ │ ├── kubernetes.ts │ │ ├── onboarding.ts │ │ ├── permissions.ts │ │ ├── search-engine.ts │ │ ├── section.ts │ │ ├── test │ │ │ ├── docs.spec.ts │ │ │ ├── integration.spec.ts │ │ │ └── permissions.spec.ts │ │ ├── user.ts │ │ └── widget.ts │ └── tsconfig.json ├── docker │ ├── eslint.config.js │ ├── index.ts │ ├── package.json │ ├── src │ │ ├── env.ts │ │ ├── index.ts │ │ ├── shared.ts │ │ └── singleton.ts │ └── tsconfig.json ├── env │ ├── eslint.config.js │ ├── index.ts │ ├── package.json │ ├── src │ │ ├── index.ts │ │ └── schemas.ts │ └── tsconfig.json ├── form │ ├── eslint.config.js │ ├── index.ts │ ├── package.json │ ├── src │ │ ├── index.ts │ │ ├── messages.ts │ │ └── types.ts │ └── tsconfig.json ├── forms-collection │ ├── eslint.config.js │ ├── index.ts │ ├── package.json │ ├── src │ │ ├── icon-picker │ │ │ ├── icon-picker.module.css │ │ │ └── icon-picker.tsx │ │ ├── index.tsx │ │ ├── new-app │ │ │ ├── _app-new-form.tsx │ │ │ ├── _form.tsx │ │ │ └── icon-matcher.ts │ │ └── upload-media │ │ │ └── upload-media.tsx │ └── tsconfig.json ├── icons │ ├── eslint.config.js │ ├── index.ts │ ├── package.json │ ├── src │ │ ├── auto-icon-searcher.ts │ │ ├── icons-fetcher.ts │ │ ├── local.ts │ │ ├── repositories │ │ │ ├── github.icon-repository.ts │ │ │ ├── icon-repository.ts │ │ │ ├── jsdelivr.icon-repository.ts │ │ │ └── local.icon-repository.ts │ │ └── types │ │ │ ├── icon-repository-license.ts │ │ │ ├── index.ts │ │ │ ├── repository-icon-group.ts │ │ │ └── repository-icon.ts │ └── tsconfig.json ├── integrations │ ├── eslint.config.js │ ├── index.ts │ ├── package.json │ ├── src │ │ ├── adguard-home │ │ │ ├── adguard-home-integration.ts │ │ │ └── adguard-home-types.ts │ │ ├── base │ │ │ ├── creator.ts │ │ │ ├── errors │ │ │ │ ├── decorator.ts │ │ │ │ ├── handler.ts │ │ │ │ ├── http │ │ │ │ │ ├── index.ts │ │ │ │ │ ├── integration-http-error-handler.ts │ │ │ │ │ ├── integration-request-error.ts │ │ │ │ │ └── integration-response-error.ts │ │ │ │ ├── integration-error.ts │ │ │ │ ├── integration-unknown-error.ts │ │ │ │ └── parse │ │ │ │ │ ├── index.ts │ │ │ │ │ ├── integration-parse-error-handler.ts │ │ │ │ │ └── integration-parse-error.ts │ │ │ ├── integration.ts │ │ │ ├── searchable-integration.ts │ │ │ ├── session-store.ts │ │ │ ├── test-connection │ │ │ │ ├── index.ts │ │ │ │ ├── test-connection-error.ts │ │ │ │ └── test-connection-service.ts │ │ │ └── types.ts │ │ ├── calendar-types.ts │ │ ├── dashdot │ │ │ └── dashdot-integration.ts │ │ ├── download-client │ │ │ ├── aria2 │ │ │ │ ├── aria2-integration.ts │ │ │ │ └── aria2-types.ts │ │ │ ├── deluge │ │ │ │ └── deluge-integration.ts │ │ │ ├── nzbget │ │ │ │ ├── nzbget-integration.ts │ │ │ │ └── nzbget-types.ts │ │ │ ├── qbittorrent │ │ │ │ └── qbittorrent-integration.ts │ │ │ ├── sabnzbd │ │ │ │ ├── sabnzbd-integration.ts │ │ │ │ └── sabnzbd-schema.ts │ │ │ └── transmission │ │ │ │ └── transmission-integration.ts │ │ ├── emby │ │ │ └── emby-integration.ts │ │ ├── homeassistant │ │ │ ├── homeassistant-integration.ts │ │ │ └── homeassistant-types.ts │ │ ├── index.ts │ │ ├── interfaces │ │ │ ├── dns-hole-summary │ │ │ │ ├── dns-hole-summary-integration.ts │ │ │ │ └── dns-hole-summary-types.ts │ │ │ ├── downloads │ │ │ │ ├── download-client-data.ts │ │ │ │ ├── download-client-integration.ts │ │ │ │ ├── download-client-items.ts │ │ │ │ └── download-client-status.ts │ │ │ ├── health-monitoring │ │ │ │ └── healt-monitoring.ts │ │ │ ├── indexer-manager │ │ │ │ └── indexer.ts │ │ │ ├── media-requests │ │ │ │ └── media-request.ts │ │ │ ├── media-server │ │ │ │ └── session.ts │ │ │ ├── media-transcoding │ │ │ │ ├── queue.ts │ │ │ │ ├── statistics.ts │ │ │ │ └── workers.ts │ │ │ └── network-controller-summary │ │ │ │ ├── network-controller-summary-integration.ts │ │ │ │ └── network-controller-summary-types.ts │ │ ├── jellyfin │ │ │ └── jellyfin-integration.ts │ │ ├── jellyseerr │ │ │ └── jellyseerr-integration.ts │ │ ├── media-organizer │ │ │ ├── lidarr │ │ │ │ └── lidarr-integration.ts │ │ │ ├── media-organizer-integration.ts │ │ │ ├── radarr │ │ │ │ └── radarr-integration.ts │ │ │ ├── readarr │ │ │ │ └── readarr-integration.ts │ │ │ └── sonarr │ │ │ │ └── sonarr-integration.ts │ │ ├── media-transcoding │ │ │ ├── tdarr-integration.ts │ │ │ └── tdarr-validation-schemas.ts │ │ ├── nextcloud │ │ │ └── nextcloud.integration.ts │ │ ├── openmediavault │ │ │ ├── openmediavault-integration.ts │ │ │ └── openmediavault-types.ts │ │ ├── overseerr │ │ │ └── overseerr-integration.ts │ │ ├── pi-hole │ │ │ ├── pi-hole-integration-factory.ts │ │ │ ├── v5 │ │ │ │ ├── pi-hole-integration-v5.ts │ │ │ │ └── pi-hole-schemas-v5.ts │ │ │ └── v6 │ │ │ │ ├── pi-hole-integration-v6.ts │ │ │ │ └── pi-hole-schemas-v6.ts │ │ ├── plex │ │ │ ├── interface.ts │ │ │ └── plex-integration.ts │ │ ├── prowlarr │ │ │ ├── prowlarr-integration.ts │ │ │ └── prowlarr-types.ts │ │ ├── proxmox │ │ │ ├── proxmox-error-handler.ts │ │ │ ├── proxmox-integration.ts │ │ │ ├── proxmox-types.ts │ │ │ └── test │ │ │ │ └── proxmox-error-handler.spec.ts │ │ ├── types.ts │ │ └── unifi-controller │ │ │ ├── unifi-controller-integration.ts │ │ │ └── unifi-controller-types.ts │ ├── test │ │ ├── aria2.spec.ts │ │ ├── base.spec.ts │ │ ├── home-assistant.spec.ts │ │ ├── nzbget.spec.ts │ │ ├── pi-hole.spec.ts │ │ ├── sabnzbd.spec.ts │ │ └── volumes │ │ │ ├── home-assistant-config.zip │ │ │ └── usenet │ │ │ ├── sabnzbd.ini │ │ │ └── test_download_100MB.nzb │ └── tsconfig.json ├── log │ ├── eslint.config.js │ ├── package.json │ ├── src │ │ ├── env.ts │ │ ├── error.ts │ │ ├── index.ts │ │ ├── metadata.ts │ │ └── redis-transport.ts │ └── tsconfig.json ├── modals-collection │ ├── eslint.config.js │ ├── index.ts │ ├── package.json │ ├── src │ │ ├── apps │ │ │ ├── app-select-modal.tsx │ │ │ ├── index.ts │ │ │ └── quick-add-app │ │ │ │ └── quick-add-app-modal.tsx │ │ ├── boards │ │ │ ├── add-board-modal.tsx │ │ │ ├── duplicate-board-modal.tsx │ │ │ ├── import-board-modal.tsx │ │ │ └── index.ts │ │ ├── certificates │ │ │ ├── add-certificate-modal.tsx │ │ │ └── index.ts │ │ ├── docker │ │ │ ├── add-docker-app-to-homarr.tsx │ │ │ └── index.ts │ │ ├── groups │ │ │ ├── add-group-modal.tsx │ │ │ └── index.ts │ │ ├── index.ts │ │ ├── invites │ │ │ ├── index.ts │ │ │ ├── invite-copy-modal.tsx │ │ │ └── invite-create-modal.tsx │ │ └── search-engines │ │ │ ├── index.ts │ │ │ └── request-media-modal.tsx │ └── tsconfig.json ├── modals │ ├── eslint.config.js │ ├── index.ts │ ├── package.json │ ├── src │ │ ├── confirm-modal.tsx │ │ ├── creator.ts │ │ ├── index.tsx │ │ ├── reducer.tsx │ │ └── type.ts │ └── tsconfig.json ├── notifications │ ├── eslint.config.js │ ├── index.ts │ ├── package.json │ ├── src │ │ ├── index.tsx │ │ └── styles.css │ └── tsconfig.json ├── old-import │ ├── eslint.config.js │ ├── index.ts │ ├── package.json │ ├── src │ │ ├── analyse │ │ │ ├── analyse-oldmarr-import.ts │ │ │ ├── index.ts │ │ │ ├── input.ts │ │ │ └── types.ts │ │ ├── components │ │ │ ├── index.ts │ │ │ ├── initial-oldmarr-import.tsx │ │ │ ├── initial │ │ │ │ ├── board-selection-card.tsx │ │ │ │ ├── import-settings-card.tsx │ │ │ │ ├── import-summary-card.tsx │ │ │ │ └── token-modal.tsx │ │ │ └── shared │ │ │ │ ├── apps-section.tsx │ │ │ │ └── sidebar-behaviour-select.tsx │ │ ├── fix-section-issues.ts │ │ ├── import-error.ts │ │ ├── import-sections.ts │ │ ├── import │ │ │ ├── collections │ │ │ │ ├── board-collection.ts │ │ │ │ ├── integration-collection.ts │ │ │ │ └── user-collection.ts │ │ │ ├── import-initial-oldmarr.ts │ │ │ ├── import-single-oldmarr.ts │ │ │ ├── index.ts │ │ │ ├── input.ts │ │ │ ├── test │ │ │ │ └── board-collection.spec.ts │ │ │ └── validate-token.ts │ │ ├── index.ts │ │ ├── mappers │ │ │ ├── map-app.ts │ │ │ ├── map-board.ts │ │ │ ├── map-breakpoint.ts │ │ │ ├── map-colors.ts │ │ │ ├── map-column-count.ts │ │ │ ├── map-integration.ts │ │ │ ├── map-item.ts │ │ │ ├── map-section.ts │ │ │ ├── map-user.ts │ │ │ └── test │ │ │ │ └── map-integration.spec.ts │ │ ├── move-widgets-and-apps-merge.ts │ │ ├── prepare │ │ │ ├── prepare-apps.ts │ │ │ ├── prepare-boards.ts │ │ │ ├── prepare-integrations.ts │ │ │ ├── prepare-items.ts │ │ │ ├── prepare-multiple.ts │ │ │ ├── prepare-sections.ts │ │ │ └── prepare-single.ts │ │ ├── settings.ts │ │ ├── shared.ts │ │ ├── user-schema.ts │ │ └── widgets │ │ │ ├── definitions │ │ │ ├── bookmark.ts │ │ │ ├── calendar.ts │ │ │ ├── common.ts │ │ │ ├── dashdot.ts │ │ │ ├── date.ts │ │ │ ├── dlspeed.ts │ │ │ ├── dns-hole-controls.ts │ │ │ ├── dns-hole-summary.ts │ │ │ ├── health-monitoring.ts │ │ │ ├── iframe.ts │ │ │ ├── index.ts │ │ │ ├── indexer-manager.ts │ │ │ ├── media-requests-list.ts │ │ │ ├── media-requests-stats.ts │ │ │ ├── media-server.ts │ │ │ ├── media-transcoding.ts │ │ │ ├── notebook.ts │ │ │ ├── rss.ts │ │ │ ├── smart-home-entity-state.ts │ │ │ ├── smart-home-trigger-automation.ts │ │ │ ├── torrent-status.ts │ │ │ ├── usenet.ts │ │ │ ├── video-stream.ts │ │ │ └── weather.ts │ │ │ └── options.ts │ └── tsconfig.json ├── old-schema │ ├── eslint.config.js │ ├── index.ts │ ├── package.json │ ├── src │ │ ├── app.ts │ │ ├── config.ts │ │ ├── index.ts │ │ ├── setting.ts │ │ ├── tile.ts │ │ └── widget.ts │ └── tsconfig.json ├── ping │ ├── eslint.config.js │ ├── index.ts │ ├── package.json │ ├── src │ │ └── index.ts │ └── tsconfig.json ├── redis │ ├── eslint.config.js │ ├── index.ts │ ├── package.json │ ├── redis.conf │ ├── src │ │ ├── index.ts │ │ └── lib │ │ │ ├── channel-subscription-tracker.ts │ │ │ ├── channel.ts │ │ │ └── connection.ts │ └── tsconfig.json ├── request-handler │ ├── eslint.config.js │ ├── package.json │ ├── src │ │ ├── calendar.ts │ │ ├── dns-hole.ts │ │ ├── docker.ts │ │ ├── downloads.ts │ │ ├── health-monitoring.ts │ │ ├── indexer-manager.ts │ │ ├── lib │ │ │ ├── cached-integration-request-handler.ts │ │ │ ├── cached-request-handler.ts │ │ │ ├── cached-request-integration-job-handler.ts │ │ │ └── cached-widget-request-handler.ts │ │ ├── media-request-list.ts │ │ ├── media-request-stats.ts │ │ ├── media-server.ts │ │ ├── media-transcoding.ts │ │ ├── minecraft-server-status.ts │ │ ├── network-controller.ts │ │ ├── releases-providers.ts │ │ ├── releases.ts │ │ ├── rss-feeds.ts │ │ ├── smart-home-entity-state.ts │ │ ├── stock-price.ts │ │ └── update-checker.ts │ └── tsconfig.json ├── server-settings │ ├── eslint.config.js │ ├── index.ts │ ├── package.json │ ├── src │ │ └── index.ts │ └── tsconfig.json ├── settings │ ├── eslint.config.js │ ├── index.ts │ ├── package.json │ ├── src │ │ ├── context.tsx │ │ └── creator.ts │ └── tsconfig.json ├── spotlight │ ├── eslint.config.js │ ├── index.ts │ ├── package.json │ ├── src │ │ ├── components │ │ │ ├── actions │ │ │ │ ├── children-actions.tsx │ │ │ │ ├── group-actions.tsx │ │ │ │ ├── groups │ │ │ │ │ └── action-group.tsx │ │ │ │ └── items │ │ │ │ │ ├── action-item.module.css │ │ │ │ │ ├── children-action-item.tsx │ │ │ │ │ └── group-action-item.tsx │ │ │ ├── no-results.tsx │ │ │ └── spotlight.tsx │ │ ├── index.ts │ │ ├── lib │ │ │ ├── children.ts │ │ │ ├── group.ts │ │ │ ├── interaction.ts │ │ │ └── mode.ts │ │ ├── modes │ │ │ ├── app-integration-board │ │ │ │ ├── apps-search-group.tsx │ │ │ │ ├── boards-search-group.tsx │ │ │ │ ├── index.tsx │ │ │ │ └── integrations-search-group.tsx │ │ │ ├── command │ │ │ │ ├── children │ │ │ │ │ ├── language.tsx │ │ │ │ │ └── new-integration.tsx │ │ │ │ ├── context-specific-group.tsx │ │ │ │ ├── global-group.tsx │ │ │ │ └── index.tsx │ │ │ ├── external │ │ │ │ ├── index.tsx │ │ │ │ └── search-engines-search-group.tsx │ │ │ ├── home │ │ │ │ ├── context-specific-group.tsx │ │ │ │ ├── context.tsx │ │ │ │ ├── home-search-engine-group.tsx │ │ │ │ └── index.tsx │ │ │ ├── index.tsx │ │ │ ├── page │ │ │ │ ├── index.tsx │ │ │ │ └── pages-search-group.tsx │ │ │ └── user-group │ │ │ │ ├── groups-search-group.tsx │ │ │ │ ├── index.tsx │ │ │ │ └── users-search-group.tsx │ │ ├── spotlight-store.ts │ │ └── styles.css │ └── tsconfig.json ├── translation │ ├── eslint.config.js │ ├── index.ts │ ├── package.json │ ├── src │ │ ├── client │ │ │ ├── index.ts │ │ │ ├── use-change-locale.ts │ │ │ └── use-current-locale.ts │ │ ├── config.ts │ │ ├── dayjs.ts │ │ ├── index.ts │ │ ├── lang │ │ │ ├── ca.json │ │ │ ├── cn.json │ │ │ ├── cr.json │ │ │ ├── cs.json │ │ │ ├── da.json │ │ │ ├── de-CH.json │ │ │ ├── de.json │ │ │ ├── el.json │ │ │ ├── en-gb.json │ │ │ ├── en.json │ │ │ ├── es.json │ │ │ ├── et.json │ │ │ ├── fr.json │ │ │ ├── he.json │ │ │ ├── hr.json │ │ │ ├── hu.json │ │ │ ├── it.json │ │ │ ├── ja.json │ │ │ ├── ko.json │ │ │ ├── lt.json │ │ │ ├── lv.json │ │ │ ├── nl.json │ │ │ ├── no.json │ │ │ ├── pl.json │ │ │ ├── pt.json │ │ │ ├── ro.json │ │ │ ├── ru.json │ │ │ ├── sk.json │ │ │ ├── sl.json │ │ │ ├── sv.json │ │ │ ├── tr.json │ │ │ ├── uk.json │ │ │ ├── vi.json │ │ │ └── zh.json │ │ ├── mantine-react-table │ │ │ ├── ca.json │ │ │ ├── en.json │ │ │ ├── lt.json │ │ │ ├── lv.json │ │ │ └── sl.json │ │ ├── mapping.ts │ │ ├── middleware.ts │ │ ├── request.ts │ │ ├── routing.ts │ │ ├── server.ts │ │ └── type.ts │ └── tsconfig.json ├── ui │ ├── eslint.config.js │ ├── index.ts │ ├── package.json │ ├── src │ │ ├── components │ │ │ ├── beta-badge.tsx │ │ │ ├── count-badge.module.css │ │ │ ├── count-badge.tsx │ │ │ ├── index.tsx │ │ │ ├── integration-avatar.tsx │ │ │ ├── masked-image.module.css │ │ │ ├── masked-image.tsx │ │ │ ├── masked-or-normal-image.tsx │ │ │ ├── overflow-badge.tsx │ │ │ ├── password-input │ │ │ │ ├── password-input.tsx │ │ │ │ ├── password-requirement.tsx │ │ │ │ └── password-requirements-popover.tsx │ │ │ ├── search-input.tsx │ │ │ ├── select-with-custom-items.tsx │ │ │ ├── select-with-description-and-badge.tsx │ │ │ ├── select-with-description.tsx │ │ │ ├── table-pagination.tsx │ │ │ ├── text-multi-select.tsx │ │ │ ├── user-avatar-group.tsx │ │ │ └── user-avatar.tsx │ │ ├── hooks │ │ │ ├── index.ts │ │ │ └── use-translated-mantine-react-table.ts │ │ ├── index.ts │ │ ├── styles.css │ │ ├── theme.ts │ │ └── theme │ │ │ └── colors │ │ │ ├── primary.ts │ │ │ └── secondary.ts │ └── tsconfig.json ├── validation │ ├── eslint.config.js │ ├── package.json │ ├── src │ │ ├── app.ts │ │ ├── board.ts │ │ ├── certificates.ts │ │ ├── common.ts │ │ ├── enums.ts │ │ ├── form │ │ │ └── i18n.ts │ │ ├── group.ts │ │ ├── icons.ts │ │ ├── integration.ts │ │ ├── media.ts │ │ ├── permissions.ts │ │ ├── search-engine.ts │ │ ├── settings.ts │ │ ├── shared.ts │ │ ├── user.ts │ │ └── widgets │ │ │ └── media-request.ts │ └── tsconfig.json └── widgets │ ├── eslint.config.js │ ├── index.ts │ ├── package.json │ ├── src │ ├── _inputs │ │ ├── common.tsx │ │ ├── form.ts │ │ ├── index.ts │ │ ├── widget-app-input.tsx │ │ ├── widget-location-input.tsx │ │ ├── widget-multi-text-input.tsx │ │ ├── widget-multiReleasesRepositories-input.tsx │ │ ├── widget-multiselect-input.tsx │ │ ├── widget-number-input.tsx │ │ ├── widget-select-input.tsx │ │ ├── widget-slider-input.tsx │ │ ├── widget-sortable-item-list-input.tsx │ │ ├── widget-switch-input.tsx │ │ └── widget-text-input.tsx │ ├── app │ │ ├── app.module.css │ │ ├── component.tsx │ │ ├── index.ts │ │ ├── ping │ │ │ ├── ping-dot.tsx │ │ │ └── ping-indicator.tsx │ │ └── prefetch.ts │ ├── bookmarks │ │ ├── add-button.tsx │ │ ├── app-select-modal.tsx │ │ ├── bookmark.module.css │ │ ├── component.tsx │ │ ├── index.tsx │ │ └── prefetch.ts │ ├── calendar │ │ ├── calendar-event-list.module.css │ │ ├── calendar-event-list.tsx │ │ ├── calender-day.tsx │ │ ├── component.module.css │ │ ├── component.tsx │ │ └── index.ts │ ├── clock │ │ ├── component.tsx │ │ └── index.ts │ ├── definition.ts │ ├── dns-hole │ │ ├── controls │ │ │ ├── TimerModal.tsx │ │ │ ├── component.module.css │ │ │ ├── component.tsx │ │ │ └── index.ts │ │ └── summary │ │ │ ├── component.tsx │ │ │ └── index.ts │ ├── docker │ │ ├── component.tsx │ │ └── index.ts │ ├── downloads │ │ ├── component.tsx │ │ └── index.ts │ ├── errors │ │ ├── base-component.tsx │ │ ├── base.ts │ │ ├── component.tsx │ │ ├── index.ts │ │ ├── no-data-integration.tsx │ │ └── no-integration-selected.tsx │ ├── health-monitoring │ │ ├── cluster │ │ │ ├── cluster-health.tsx │ │ │ ├── resource-accordion-item.tsx │ │ │ ├── resource-popover.tsx │ │ │ └── resource-table.tsx │ │ ├── component.tsx │ │ ├── index.ts │ │ ├── rings │ │ │ ├── cpu-ring.tsx │ │ │ ├── cpu-temp-ring.tsx │ │ │ └── memory-ring.tsx │ │ ├── system-health.module.css │ │ └── system-health.tsx │ ├── iframe │ │ ├── component.module.css │ │ ├── component.tsx │ │ └── index.ts │ ├── import.ts │ ├── index.tsx │ ├── indexer-manager │ │ ├── component.module.css │ │ ├── component.tsx │ │ └── index.ts │ ├── media-requests │ │ ├── list │ │ │ ├── component.tsx │ │ │ └── index.ts │ │ └── stats │ │ │ ├── component.module.css │ │ │ ├── component.tsx │ │ │ └── index.ts │ ├── media-server │ │ ├── component.tsx │ │ └── index.ts │ ├── media-transcoding │ │ ├── component.tsx │ │ ├── health-check-status.tsx │ │ ├── index.ts │ │ └── panels │ │ │ ├── queue.panel.tsx │ │ │ ├── statistics.panel.tsx │ │ │ └── workers.panel.tsx │ ├── minecraft │ │ └── server-status │ │ │ ├── component.tsx │ │ │ └── index.ts │ ├── modals │ │ ├── index.ts │ │ ├── widget-advanced-options-modal.tsx │ │ └── widget-edit-modal.tsx │ ├── network-controller │ │ ├── network-status │ │ │ ├── component.tsx │ │ │ ├── index.ts │ │ │ └── variants │ │ │ │ ├── stat-row.tsx │ │ │ │ ├── wifi-variant.tsx │ │ │ │ └── wired-variant.tsx │ │ └── summary │ │ │ ├── component.tsx │ │ │ └── index.ts │ ├── notebook │ │ ├── component.tsx │ │ ├── default-content.ts │ │ ├── index.ts │ │ ├── notebook.css │ │ └── notebook.tsx │ ├── options.ts │ ├── prefetch.ts │ ├── releases │ │ ├── component.module.scss │ │ ├── component.tsx │ │ ├── index.ts │ │ ├── releases-providers.ts │ │ └── releases-repository.ts │ ├── rssFeed │ │ ├── component.module.scss │ │ ├── component.tsx │ │ └── index.ts │ ├── smart-home │ │ ├── entity-state │ │ │ ├── component.tsx │ │ │ └── index.ts │ │ └── execute-automation │ │ │ ├── component.tsx │ │ │ └── index.ts │ ├── stocks │ │ ├── component.tsx │ │ └── index.ts │ ├── test │ │ └── translation.spec.ts │ ├── video │ │ ├── component.module.css │ │ ├── component.tsx │ │ └── index.ts │ ├── weather │ │ ├── component.tsx │ │ ├── icon.tsx │ │ └── index.ts │ ├── widget-integration-select.module.css │ ├── widget-integration-select.tsx │ └── widgets-common.css │ └── tsconfig.json ├── patches └── @types__node-unifi.patch ├── pnpm-lock.yaml ├── pnpm-workspace.yaml ├── scripts ├── entrypoint.sh ├── run.sh └── update-contributors.mjs ├── static-data ├── contributors.json └── translators.json ├── tooling ├── eslint │ ├── base.js │ ├── eslint.config.js │ ├── nextjs.js │ ├── package.json │ ├── react.js │ ├── tsconfig.json │ └── types.d.ts ├── github │ ├── package.json │ └── setup │ │ └── action.yml ├── prettier │ ├── index.mjs │ ├── package.json │ └── tsconfig.json └── typescript │ ├── base.json │ └── package.json ├── tsconfig.e2e.json ├── turbo.json ├── turbo └── generators │ ├── config.ts │ └── templates │ ├── eslint.config.js.hbs │ ├── package.json.hbs │ └── tsconfig.json.hbs ├── vitest.config.mts └── vitest.setup.ts /.deepsource.toml: -------------------------------------------------------------------------------- 1 | version = 1 2 | 3 | [[analyzers]] 4 | name = "javascript" 5 | 6 | [analyzers.meta] 7 | plugins = ["react"] 8 | environment = ["nodejs"] 9 | 10 | [[transformers]] 11 | name = "prettier" -------------------------------------------------------------------------------- /.dockerignore: -------------------------------------------------------------------------------- 1 | Dockerfile 2 | .dockerignore 3 | node_modules 4 | **/node_modules 5 | npm-debug.log 6 | README.md 7 | .next 8 | .git 9 | dev 10 | .build 11 | e2e -------------------------------------------------------------------------------- /.gitattributes: -------------------------------------------------------------------------------- 1 | * text=auto eol=lf -------------------------------------------------------------------------------- /.github/FUNDING.yml: -------------------------------------------------------------------------------- 1 | # These are supported funding model platforms 2 | 3 | open_collective: homarr 4 | -------------------------------------------------------------------------------- /.github/renovate.json5: -------------------------------------------------------------------------------- 1 | { 2 | $schema: "https://docs.renovatebot.com/renovate-schema.json", 3 | extends: ["config:recommended"], 4 | packageRules: [ 5 | { 6 | matchPackagePatterns: ["^@homarr/"], 7 | enabled: false, 8 | }, 9 | { 10 | matchUpdateTypes: ["minor", "patch", "pin", "digest"], 11 | automerge: true, 12 | }, 13 | ], 14 | updateInternalDeps: true, 15 | rangeStrategy: "bump", 16 | automerge: false, 17 | baseBranches: ["dev"], 18 | dependencyDashboard: false, 19 | } 20 | -------------------------------------------------------------------------------- /.github/workflows/conventions-semantic-commits.yml: -------------------------------------------------------------------------------- 1 | # https://github.com/webiny/action-conventional-commits?tab=readme-ov-file 2 | name: "[Conventions] Semantic Commits" 3 | 4 | on: 5 | pull_request: 6 | branches: [ dev ] 7 | 8 | jobs: 9 | build: 10 | name: Conventional Commits 11 | runs-on: ubuntu-latest 12 | steps: 13 | - uses: actions/checkout@v4 14 | - uses: webiny/action-conventional-commits@v1.3.0 -------------------------------------------------------------------------------- /.github/workflows/conventions-semantic-pull-requests.yml: -------------------------------------------------------------------------------- 1 | name: "[Conventions] Semantic PRs" 2 | 3 | on: 4 | pull_request_target: 5 | types: 6 | - opened 7 | - edited 8 | - synchronize 9 | 10 | permissions: 11 | pull-requests: read 12 | 13 | jobs: 14 | validate-pull-request-title: 15 | runs-on: ubuntu-latest 16 | steps: 17 | - uses: amannn/action-semantic-pull-request@v5 18 | env: 19 | GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} -------------------------------------------------------------------------------- /.npmrc: -------------------------------------------------------------------------------- 1 | # Expo doesn't play nice with pnpm by default. 2 | # The symbolic links of pnpm break the rules of Expo monorepos. 3 | # @link https://docs.expo.dev/guides/monorepos/#common-issues 4 | node-linker=hoisted 5 | strict-peer-dependencies=false 6 | -------------------------------------------------------------------------------- /.nvmrc: -------------------------------------------------------------------------------- 1 | 22.16.0 2 | -------------------------------------------------------------------------------- /.run/All Tests.run.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | -------------------------------------------------------------------------------- /.run/db_migration_mysql_generate.run.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 |