gitextract_9b_v3mll/ ├── .gitattributes ├── .github/ │ └── workflows/ │ ├── ci.yml │ └── update-translations-in-pr.yml ├── .gitignore ├── .prettierrc.js ├── .umbrel ├── CONTRIBUTING.md ├── LICENSE.md ├── README.md ├── containers/ │ ├── app-auth/ │ │ ├── .dockerignore │ │ ├── .gitignore │ │ ├── Dockerfile │ │ ├── README.md │ │ ├── bin/ │ │ │ └── www │ │ ├── middleware/ │ │ │ ├── handle_error.js │ │ │ └── validate_token.js │ │ ├── package.json │ │ ├── routes/ │ │ │ └── auth.js │ │ ├── test/ │ │ │ ├── docker-compose.yml │ │ │ ├── fixtures/ │ │ │ │ └── app-data/ │ │ │ │ └── mempool/ │ │ │ │ └── umbrel-app.yml │ │ │ ├── global.js │ │ │ ├── test.sh │ │ │ └── utils/ │ │ │ └── hmac.js │ │ ├── utils/ │ │ │ ├── app.js │ │ │ ├── const.js │ │ │ ├── dashboard.js │ │ │ ├── express.js │ │ │ ├── hmac.js │ │ │ ├── host_resolution.js │ │ │ ├── manager.js │ │ │ ├── safe_handler.js │ │ │ └── token.js │ │ └── views/ │ │ └── pages/ │ │ └── redirect.ejs │ ├── app-proxy/ │ │ ├── .dockerignore │ │ ├── .gitignore │ │ ├── Dockerfile │ │ ├── Dockerfile.dev │ │ ├── README.md │ │ ├── bin/ │ │ │ └── www │ │ ├── middleware/ │ │ │ └── handle_error.js │ │ ├── package.json │ │ ├── routes/ │ │ │ └── umbrel.js │ │ ├── test/ │ │ │ ├── .gitignore │ │ │ ├── docker-compose.app1.yml │ │ │ ├── docker-compose.app2.yml │ │ │ ├── docker-compose.bleskomat.yml │ │ │ ├── docker-compose.error.yml │ │ │ ├── docker-compose.mempool.yml │ │ │ ├── docker-compose.nextcloud.yml │ │ │ ├── docker-compose.proxy.yml │ │ │ ├── docker-compose.proxyhttps.yaml │ │ │ ├── docker-compose.sse.yml │ │ │ ├── docker-compose.suredbits.yml │ │ │ ├── docker-compose.ws.yml │ │ │ ├── docker-compose.yml │ │ │ ├── fixtures/ │ │ │ │ └── mempool-umbrel-app.yml │ │ │ ├── global.js │ │ │ ├── sse-test-server/ │ │ │ │ ├── .dockerignore │ │ │ │ ├── Dockerfile │ │ │ │ ├── bin/ │ │ │ │ │ └── www │ │ │ │ └── package.json │ │ │ ├── test/ │ │ │ │ └── Caddyfile-https │ │ │ ├── test.sh │ │ │ └── utils/ │ │ │ ├── express.js │ │ │ └── tor.js │ │ ├── utils/ │ │ │ ├── const.js │ │ │ ├── express.js │ │ │ ├── hmac.js │ │ │ ├── manager.js │ │ │ ├── proxy.js │ │ │ ├── safe_handler.js │ │ │ ├── token.js │ │ │ └── tor.js │ │ └── views/ │ │ └── pages/ │ │ └── error.ejs │ └── tor/ │ ├── Dockerfile │ ├── README.md │ └── test/ │ ├── .gitignore │ ├── docker-compose.entrypoint.yml │ ├── docker-compose.yml │ ├── entrypoint.sh │ ├── test-entrypoint.sh │ ├── test.sh │ └── torrc ├── info.json ├── package.json ├── packages/ │ ├── os/ │ │ ├── .gitignore │ │ ├── README.md │ │ ├── build-steps/ │ │ │ ├── initialize.sh │ │ │ ├── setup-raspberrypi/ │ │ │ │ ├── cmdline.txt │ │ │ │ ├── config.txt │ │ │ │ ├── raspberrypi.gpg.key │ │ │ │ └── raspberrypi.list │ │ │ └── setup-raspberrypi.sh │ │ ├── build.sh │ │ ├── builder.Dockerfile │ │ ├── mender.cfg │ │ ├── overlay-amd64/ │ │ │ └── umbrelOS │ │ ├── overlay-arm64/ │ │ │ ├── etc/ │ │ │ │ └── systemd/ │ │ │ │ └── system/ │ │ │ │ └── umbrel-external-storage.service │ │ │ └── opt/ │ │ │ └── umbrel-external-storage/ │ │ │ └── umbrel-external-storage │ │ ├── overlay-common/ │ │ │ ├── etc/ │ │ │ │ ├── NetworkManager/ │ │ │ │ │ ├── NetworkManager.conf │ │ │ │ │ └── conf.d/ │ │ │ │ │ └── 10-cloudflaredns.conf │ │ │ │ ├── acpi/ │ │ │ │ │ ├── events/ │ │ │ │ │ │ └── power-button │ │ │ │ │ └── power-button.sh │ │ │ │ ├── fstab │ │ │ │ ├── hostname │ │ │ │ ├── hosts │ │ │ │ ├── issue │ │ │ │ ├── locale.conf │ │ │ │ ├── motd │ │ │ │ ├── sudoers.d/ │ │ │ │ │ └── umbrel │ │ │ │ ├── sudoers.lecture │ │ │ │ ├── sysctl.d/ │ │ │ │ │ └── 99-vm-zram-parameters.conf │ │ │ │ └── systemd/ │ │ │ │ ├── logind.conf.d/ │ │ │ │ │ ├── lid-switch.conf │ │ │ │ │ └── power-button.conf │ │ │ │ ├── system/ │ │ │ │ │ ├── umbrel-dns-sync.service │ │ │ │ │ ├── umbrel-ssh-host-key-hydration.service │ │ │ │ │ ├── umbrel-tty-message.service │ │ │ │ │ └── umbrel.service │ │ │ │ ├── timesyncd.conf.d/ │ │ │ │ │ └── cloudflare.conf │ │ │ │ └── zram-generator.conf │ │ │ ├── opt/ │ │ │ │ ├── umbrel-data/ │ │ │ │ │ └── umbrel-data-mount │ │ │ │ ├── umbrel-dns-sync/ │ │ │ │ │ └── umbrel-dns-sync │ │ │ │ ├── umbrel-ssh-host-key-hydration/ │ │ │ │ │ └── umbrel-ssh-host-key-hydration │ │ │ │ └── umbrel-tty-message/ │ │ │ │ └── umbrel-tty-message │ │ │ └── umbrelOS │ │ ├── package.json │ │ ├── rugix/ │ │ │ ├── .gitignore │ │ │ ├── fix-umbrelos-pi-mbr.sh │ │ │ ├── layers/ │ │ │ │ ├── umbrelos-amd64.toml │ │ │ │ ├── umbrelos-mender-amd64.toml │ │ │ │ ├── umbrelos-pi.toml │ │ │ │ ├── umbrelos-pi4.toml │ │ │ │ ├── umbrelos-root-amd64.toml │ │ │ │ └── umbrelos-root-arm64.toml │ │ │ ├── recipes/ │ │ │ │ ├── fix-overlay/ │ │ │ │ │ ├── files/ │ │ │ │ │ │ ├── .gitignore │ │ │ │ │ │ └── .gitkeep │ │ │ │ │ ├── recipe.toml │ │ │ │ │ └── steps/ │ │ │ │ │ └── 00-install.sh │ │ │ │ ├── setup-rugix/ │ │ │ │ │ ├── files/ │ │ │ │ │ │ ├── bootstrapping-amd64.toml │ │ │ │ │ │ ├── bootstrapping-arm64.toml │ │ │ │ │ │ ├── hooks/ │ │ │ │ │ │ │ └── state-reset/ │ │ │ │ │ │ │ └── prepare.sh │ │ │ │ │ │ ├── state-data.toml │ │ │ │ │ │ └── system.toml │ │ │ │ │ ├── recipe.toml │ │ │ │ │ └── steps/ │ │ │ │ │ └── 00-install.sh │ │ │ │ ├── setup-rugix-mender/ │ │ │ │ │ ├── files/ │ │ │ │ │ │ ├── init │ │ │ │ │ │ ├── migrate-state.sh │ │ │ │ │ │ └── system.toml │ │ │ │ │ ├── recipe.toml │ │ │ │ │ └── steps/ │ │ │ │ │ └── 00-install.sh │ │ │ │ ├── umbrelos-boot/ │ │ │ │ │ ├── files/ │ │ │ │ │ │ └── grub.cfg │ │ │ │ │ ├── recipe.toml │ │ │ │ │ └── steps/ │ │ │ │ │ └── 00-install.sh │ │ │ │ ├── umbrelos-cleanup/ │ │ │ │ │ ├── recipe.toml │ │ │ │ │ └── steps/ │ │ │ │ │ └── 00-install.sh │ │ │ │ └── umbrelos-prepare/ │ │ │ │ ├── recipe.toml │ │ │ │ └── steps/ │ │ │ │ └── 00-install.sh │ │ │ ├── rugix-bakery.toml │ │ │ └── run-bakery │ │ ├── rugpi-image │ │ ├── trigger-change │ │ ├── umbrelos.Dockerfile │ │ ├── usb-installer/ │ │ │ ├── .gitignore │ │ │ ├── build.sh │ │ │ ├── builder.Dockerfile │ │ │ ├── overlay/ │ │ │ │ ├── etc/ │ │ │ │ │ └── systemd/ │ │ │ │ │ └── system/ │ │ │ │ │ └── custom-tty.service │ │ │ │ └── opt/ │ │ │ │ └── custom-tty │ │ │ ├── run.sh │ │ │ └── usb-installer.Dockerfile │ │ └── vm.sh │ ├── ui/ │ │ ├── .dockerignore │ │ ├── .gitignore │ │ ├── .prettierignore │ │ ├── .prettierrc.js │ │ ├── Dockerfile │ │ ├── app-auth/ │ │ │ ├── README.md │ │ │ ├── index.html │ │ │ ├── src/ │ │ │ │ ├── login-with-umbrel.tsx │ │ │ │ └── main.tsx │ │ │ └── vite.config.ts │ │ ├── components.json │ │ ├── eslint.config.js │ │ ├── index.html │ │ ├── package.json │ │ ├── public/ │ │ │ ├── assets/ │ │ │ │ ├── onboarding/ │ │ │ │ │ └── onboarding-bg.webm │ │ │ │ └── whats-new/ │ │ │ │ ├── backups.webm │ │ │ │ ├── external-storage.webm │ │ │ │ ├── network-devices.webm │ │ │ │ ├── restore.webm │ │ │ │ └── rewind.webm │ │ │ ├── locales/ │ │ │ │ ├── de.json │ │ │ │ ├── en.json │ │ │ │ ├── es.json │ │ │ │ ├── fr.json │ │ │ │ ├── hu.json │ │ │ │ ├── it.json │ │ │ │ ├── ja.json │ │ │ │ ├── ko.json │ │ │ │ ├── nl.json │ │ │ │ ├── pt.json │ │ │ │ ├── tr.json │ │ │ │ └── uk.json │ │ │ └── site.webmanifest │ │ ├── src/ │ │ │ ├── components/ │ │ │ │ ├── app-icon.tsx │ │ │ │ ├── caret-right.tsx │ │ │ │ ├── chevron-down.tsx │ │ │ │ ├── cmdk-providers.tsx │ │ │ │ ├── cmdk.tsx │ │ │ │ ├── darken-layer.tsx │ │ │ │ ├── fade-scroller.tsx │ │ │ │ ├── iframe-checker.tsx │ │ │ │ ├── install-button-connected.tsx │ │ │ │ ├── install-button.tsx │ │ │ │ ├── markdown.tsx │ │ │ │ ├── onboarding-background.tsx │ │ │ │ ├── progress-button.tsx │ │ │ │ ├── ui/ │ │ │ │ │ ├── alert-dialog.tsx │ │ │ │ │ ├── alert.tsx │ │ │ │ │ ├── animated-number.tsx │ │ │ │ │ ├── arc.tsx │ │ │ │ │ ├── badge.tsx │ │ │ │ │ ├── button-link.tsx │ │ │ │ │ ├── button.tsx │ │ │ │ │ ├── card.tsx │ │ │ │ │ ├── carousel.tsx │ │ │ │ │ ├── checkbox.tsx │ │ │ │ │ ├── command.tsx │ │ │ │ │ ├── context-menu.tsx │ │ │ │ │ ├── copy-button.tsx │ │ │ │ │ ├── copyable-field.tsx │ │ │ │ │ ├── cover-message.tsx │ │ │ │ │ ├── debug-only.tsx │ │ │ │ │ ├── dialog-close-button.tsx │ │ │ │ │ ├── dialog.tsx │ │ │ │ │ ├── drawer.tsx │ │ │ │ │ ├── dropdown-menu.tsx │ │ │ │ │ ├── error-boundary-card-fallback.tsx │ │ │ │ │ ├── error-boundary-page-fallback.tsx │ │ │ │ │ ├── fade-in-img.tsx │ │ │ │ │ ├── form.tsx │ │ │ │ │ ├── generic-error-text.tsx │ │ │ │ │ ├── icon-button-link.tsx │ │ │ │ │ ├── icon-button.tsx │ │ │ │ │ ├── icon.tsx │ │ │ │ │ ├── immersive-dialog.tsx │ │ │ │ │ ├── input.tsx │ │ │ │ │ ├── label.tsx │ │ │ │ │ ├── list.tsx │ │ │ │ │ ├── loading.tsx │ │ │ │ │ ├── notification-badge.tsx │ │ │ │ │ ├── numbered-list.tsx │ │ │ │ │ ├── pagination.tsx │ │ │ │ │ ├── pin-input.tsx │ │ │ │ │ ├── popover.tsx │ │ │ │ │ ├── progress.tsx │ │ │ │ │ ├── radio-group.tsx │ │ │ │ │ ├── root-error-fallback.tsx │ │ │ │ │ ├── scroll-area.tsx │ │ │ │ │ ├── segmented-control.tsx │ │ │ │ │ ├── separator.tsx │ │ │ │ │ ├── shared/ │ │ │ │ │ │ ├── dialog.ts │ │ │ │ │ │ └── menu.ts │ │ │ │ │ ├── sheet-scroll-area.tsx │ │ │ │ │ ├── sheet.tsx │ │ │ │ │ ├── switch.tsx │ │ │ │ │ ├── table.tsx │ │ │ │ │ ├── tabs.tsx │ │ │ │ │ ├── toast.tsx │ │ │ │ │ └── tooltip.tsx │ │ │ │ ├── umbrel-logo.tsx │ │ │ │ └── widget-check-icon.tsx │ │ │ ├── constants/ │ │ │ │ ├── index.ts │ │ │ │ └── links.ts │ │ │ ├── features/ │ │ │ │ ├── backups/ │ │ │ │ │ ├── cmdk-search-provider.tsx │ │ │ │ │ ├── components/ │ │ │ │ │ │ ├── backup-device-icon.tsx │ │ │ │ │ │ ├── backup-location-dropdown.tsx │ │ │ │ │ │ ├── backups-exclusions.tsx │ │ │ │ │ │ ├── configure-wizard.tsx │ │ │ │ │ │ ├── floating-island/ │ │ │ │ │ │ │ ├── expanded.tsx │ │ │ │ │ │ │ ├── index.tsx │ │ │ │ │ │ │ └── minimized.tsx │ │ │ │ │ │ ├── modals/ │ │ │ │ │ │ │ ├── already-configured-modal.tsx │ │ │ │ │ │ │ └── connect-existing-modal.tsx │ │ │ │ │ │ ├── restore-location-dropdown.tsx │ │ │ │ │ │ ├── restore-wizard.tsx │ │ │ │ │ │ ├── review-card.tsx │ │ │ │ │ │ ├── setup-wizard.tsx │ │ │ │ │ │ ├── tab-switcher.tsx │ │ │ │ │ │ └── tiles.tsx │ │ │ │ │ ├── hooks/ │ │ │ │ │ │ ├── use-apps-auto-excluded-paths.ts │ │ │ │ │ │ ├── use-apps-backup-ignore.ts │ │ │ │ │ │ ├── use-backup-ignored-paths.ts │ │ │ │ │ │ ├── use-backups.ts │ │ │ │ │ │ └── use-existing-backup-detection.ts │ │ │ │ │ ├── index.tsx │ │ │ │ │ └── utils/ │ │ │ │ │ ├── backup-location-helpers.ts │ │ │ │ │ ├── error-messages.ts │ │ │ │ │ ├── filepath-helpers.ts │ │ │ │ │ └── sort.ts │ │ │ │ ├── files/ │ │ │ │ │ ├── assets/ │ │ │ │ │ │ ├── add-folder-icon.tsx │ │ │ │ │ │ ├── apps-icon.tsx │ │ │ │ │ │ ├── caret-right.tsx │ │ │ │ │ │ ├── chevron-left.tsx │ │ │ │ │ │ ├── chevron-right.tsx │ │ │ │ │ │ ├── copy-icon.tsx │ │ │ │ │ │ ├── cursor-text-icon.tsx │ │ │ │ │ │ ├── empty-folder-icon.tsx │ │ │ │ │ │ ├── file-items-thumbnails/ │ │ │ │ │ │ │ └── index.tsx │ │ │ │ │ │ ├── flame-icon.tsx │ │ │ │ │ │ ├── grid-layout-icon.tsx │ │ │ │ │ │ ├── home-icon.tsx │ │ │ │ │ │ ├── list-layout-icon.tsx │ │ │ │ │ │ ├── recents-icon.tsx │ │ │ │ │ │ ├── rewind-icon.tsx │ │ │ │ │ │ ├── search-icon.tsx │ │ │ │ │ │ ├── shared-folder-badge.tsx │ │ │ │ │ │ └── trash-icon.tsx │ │ │ │ │ ├── cmdk-search-provider.tsx │ │ │ │ │ ├── components/ │ │ │ │ │ │ ├── cards/ │ │ │ │ │ │ │ └── server-cards.tsx │ │ │ │ │ │ ├── dialogs/ │ │ │ │ │ │ │ ├── add-network-share-dialog/ │ │ │ │ │ │ │ │ └── index.tsx │ │ │ │ │ │ │ ├── external-storage-unsupported-dialog/ │ │ │ │ │ │ │ │ └── index.tsx │ │ │ │ │ │ │ ├── format-drive-dialog/ │ │ │ │ │ │ │ │ └── index.tsx │ │ │ │ │ │ │ ├── permanently-delete-confirmation-dialog/ │ │ │ │ │ │ │ │ └── index.tsx │ │ │ │ │ │ │ └── share-info-dialog/ │ │ │ │ │ │ │ ├── index.tsx │ │ │ │ │ │ │ ├── platform-instructions/ │ │ │ │ │ │ │ │ ├── index.tsx │ │ │ │ │ │ │ │ ├── inline-copyable-field.tsx │ │ │ │ │ │ │ │ ├── instruction.tsx │ │ │ │ │ │ │ │ ├── ios-instructions.tsx │ │ │ │ │ │ │ │ ├── macos-instructions.tsx │ │ │ │ │ │ │ │ ├── umbrelos-instructions.tsx │ │ │ │ │ │ │ │ └── windows-instructions.tsx │ │ │ │ │ │ │ ├── platform-selector.tsx │ │ │ │ │ │ │ └── share-toggle.tsx │ │ │ │ │ │ ├── embedded/ │ │ │ │ │ │ │ └── index.tsx │ │ │ │ │ │ ├── file-viewer/ │ │ │ │ │ │ │ ├── audio-viewer/ │ │ │ │ │ │ │ │ └── index.tsx │ │ │ │ │ │ │ ├── downloader/ │ │ │ │ │ │ │ │ └── index.tsx │ │ │ │ │ │ │ ├── image-viewer/ │ │ │ │ │ │ │ │ └── index.tsx │ │ │ │ │ │ │ ├── index.tsx │ │ │ │ │ │ │ ├── pdf-viewer/ │ │ │ │ │ │ │ │ └── index.tsx │ │ │ │ │ │ │ ├── video-viewer/ │ │ │ │ │ │ │ │ └── index.tsx │ │ │ │ │ │ │ └── viewer-wrapper.tsx │ │ │ │ │ │ ├── files-dnd-wrapper/ │ │ │ │ │ │ │ ├── files-dnd-overlay.tsx │ │ │ │ │ │ │ └── index.tsx │ │ │ │ │ │ ├── floating-islands/ │ │ │ │ │ │ │ ├── audio-island/ │ │ │ │ │ │ │ │ ├── equalizer.tsx │ │ │ │ │ │ │ │ ├── expanded.tsx │ │ │ │ │ │ │ │ ├── index.tsx │ │ │ │ │ │ │ │ └── minimized.tsx │ │ │ │ │ │ │ ├── formatting-island/ │ │ │ │ │ │ │ │ ├── expanded.tsx │ │ │ │ │ │ │ │ ├── index.tsx │ │ │ │ │ │ │ │ └── minimized.tsx │ │ │ │ │ │ │ ├── operations-island/ │ │ │ │ │ │ │ │ ├── expanded.tsx │ │ │ │ │ │ │ │ ├── index.tsx │ │ │ │ │ │ │ │ └── minimized.tsx │ │ │ │ │ │ │ └── uploading-island/ │ │ │ │ │ │ │ ├── expanded.tsx │ │ │ │ │ │ │ ├── index.tsx │ │ │ │ │ │ │ └── minimized.tsx │ │ │ │ │ │ ├── listing/ │ │ │ │ │ │ │ ├── actions-bar/ │ │ │ │ │ │ │ │ ├── actions-bar-context.tsx │ │ │ │ │ │ │ │ ├── index.tsx │ │ │ │ │ │ │ │ ├── mobile-actions.tsx │ │ │ │ │ │ │ │ ├── navigation-controls.tsx │ │ │ │ │ │ │ │ ├── path-bar/ │ │ │ │ │ │ │ │ │ ├── index.tsx │ │ │ │ │ │ │ │ │ ├── path-bar-desktop.tsx │ │ │ │ │ │ │ │ │ ├── path-bar-mobile.tsx │ │ │ │ │ │ │ │ │ └── path-input.tsx │ │ │ │ │ │ │ │ ├── search-input.tsx │ │ │ │ │ │ │ │ ├── sort-dropdown.tsx │ │ │ │ │ │ │ │ └── view-toggle.tsx │ │ │ │ │ │ │ ├── apps-listing/ │ │ │ │ │ │ │ │ └── index.tsx │ │ │ │ │ │ │ ├── directory-listing/ │ │ │ │ │ │ │ │ ├── empty-state.tsx │ │ │ │ │ │ │ │ └── index.tsx │ │ │ │ │ │ │ ├── file-item/ │ │ │ │ │ │ │ │ ├── circular-progress.tsx │ │ │ │ │ │ │ │ ├── editable-name.tsx │ │ │ │ │ │ │ │ ├── icons-view-file-item.tsx │ │ │ │ │ │ │ │ ├── index.tsx │ │ │ │ │ │ │ │ ├── list-view-file-item.css │ │ │ │ │ │ │ │ ├── list-view-file-item.tsx │ │ │ │ │ │ │ │ └── truncated-filename.tsx │ │ │ │ │ │ │ ├── index.tsx │ │ │ │ │ │ │ ├── listing-and-file-item-context-menu.tsx │ │ │ │ │ │ │ ├── listing-body.tsx │ │ │ │ │ │ │ ├── marquee-selection.tsx │ │ │ │ │ │ │ ├── recents-listing/ │ │ │ │ │ │ │ │ └── index.tsx │ │ │ │ │ │ │ ├── search-listing/ │ │ │ │ │ │ │ │ └── index.tsx │ │ │ │ │ │ │ ├── trash-listing/ │ │ │ │ │ │ │ │ └── index.tsx │ │ │ │ │ │ │ └── virtualized-list.tsx │ │ │ │ │ │ ├── mini-browser/ │ │ │ │ │ │ │ └── index.tsx │ │ │ │ │ │ ├── rewind/ │ │ │ │ │ │ │ ├── index.tsx │ │ │ │ │ │ │ ├── overlay-context.tsx │ │ │ │ │ │ │ ├── prerewind-dialog.tsx │ │ │ │ │ │ │ ├── restore-grouping.ts │ │ │ │ │ │ │ ├── restore-progress-dialog.tsx │ │ │ │ │ │ │ ├── snapshot-carousel.tsx │ │ │ │ │ │ │ ├── snapshot-date-label.ts │ │ │ │ │ │ │ ├── timeline-bar.tsx │ │ │ │ │ │ │ └── tooltip.tsx │ │ │ │ │ │ ├── shared/ │ │ │ │ │ │ │ ├── circular-progress.tsx │ │ │ │ │ │ │ ├── drag-and-drop.tsx │ │ │ │ │ │ │ ├── file-item-icon/ │ │ │ │ │ │ │ │ ├── animated-folder-icon.tsx │ │ │ │ │ │ │ │ ├── embedded-overlay-icons.tsx │ │ │ │ │ │ │ │ ├── folder-icon.tsx │ │ │ │ │ │ │ │ ├── index.tsx │ │ │ │ │ │ │ │ └── unknown-file-thumbnail.tsx │ │ │ │ │ │ │ ├── file-upload-drop-zone.tsx │ │ │ │ │ │ │ └── upload-input.tsx │ │ │ │ │ │ └── sidebar/ │ │ │ │ │ │ ├── index.tsx │ │ │ │ │ │ ├── mobile-sidebar-wrapper.tsx │ │ │ │ │ │ ├── sidebar-apps.tsx │ │ │ │ │ │ ├── sidebar-external-storage-item.tsx │ │ │ │ │ │ ├── sidebar-external-storage.tsx │ │ │ │ │ │ ├── sidebar-favorites.tsx │ │ │ │ │ │ ├── sidebar-home.tsx │ │ │ │ │ │ ├── sidebar-item.tsx │ │ │ │ │ │ ├── sidebar-network-share-item.tsx │ │ │ │ │ │ ├── sidebar-network-storage.tsx │ │ │ │ │ │ ├── sidebar-recents.tsx │ │ │ │ │ │ ├── sidebar-shares.tsx │ │ │ │ │ │ └── sidebar-trash.tsx │ │ │ │ │ ├── constants.ts │ │ │ │ │ ├── hooks/ │ │ │ │ │ │ ├── use-drag-and-drop.ts │ │ │ │ │ │ ├── use-external-storage.ts │ │ │ │ │ │ ├── use-favorites.ts │ │ │ │ │ │ ├── use-files-keyboard-shortcuts.ts │ │ │ │ │ │ ├── use-files-operations.ts │ │ │ │ │ │ ├── use-home-directory-name.ts │ │ │ │ │ │ ├── use-is-touch-device.ts │ │ │ │ │ │ ├── use-item-click.ts │ │ │ │ │ │ ├── use-list-directory.ts │ │ │ │ │ │ ├── use-list-recents.ts │ │ │ │ │ │ ├── use-navigate.ts │ │ │ │ │ │ ├── use-network-device-type.ts │ │ │ │ │ │ ├── use-network-storage.ts │ │ │ │ │ │ ├── use-new-folder.ts │ │ │ │ │ │ ├── use-preferences.ts │ │ │ │ │ │ ├── use-rewind-action.ts │ │ │ │ │ │ ├── use-rewind.ts │ │ │ │ │ │ ├── use-search-files.ts │ │ │ │ │ │ └── use-shares.ts │ │ │ │ │ ├── index.tsx │ │ │ │ │ ├── providers/ │ │ │ │ │ │ └── files-capabilities-context.tsx │ │ │ │ │ ├── routes.tsx │ │ │ │ │ ├── store/ │ │ │ │ │ │ ├── slices/ │ │ │ │ │ │ │ ├── clipboard-slice.ts │ │ │ │ │ │ │ ├── drag-and-drop-slice.ts │ │ │ │ │ │ │ ├── file-viewer-slice.ts │ │ │ │ │ │ │ ├── interaction-slice.ts │ │ │ │ │ │ │ ├── new-folder-slice.ts │ │ │ │ │ │ │ ├── rename-slice.ts │ │ │ │ │ │ │ └── selection-slice.ts │ │ │ │ │ │ └── use-files-store.ts │ │ │ │ │ ├── types.ts │ │ │ │ │ ├── utils/ │ │ │ │ │ │ ├── error-messages.ts │ │ │ │ │ │ ├── format-filesystem-date.ts │ │ │ │ │ │ ├── format-filesystem-name.ts │ │ │ │ │ │ ├── format-filesystem-size.ts │ │ │ │ │ │ ├── get-grid-column-count.ts │ │ │ │ │ │ ├── get-item-key.ts │ │ │ │ │ │ ├── is-directory-a-network-device-or-share.ts │ │ │ │ │ │ ├── is-directory-an-external-drive-partition.ts │ │ │ │ │ │ ├── is-directory-an-umbrel-backup.ts │ │ │ │ │ │ ├── path-alias.ts │ │ │ │ │ │ └── sort-filesystem-items.ts │ │ │ │ │ └── widgets.tsx │ │ │ │ └── storage/ │ │ │ │ ├── components/ │ │ │ │ │ ├── dialogs/ │ │ │ │ │ │ ├── add-to-raid-dialog.tsx │ │ │ │ │ │ ├── install-ssd-dialog.tsx │ │ │ │ │ │ ├── install-tips-collapsible.tsx │ │ │ │ │ │ ├── operation-in-progress-banner.tsx │ │ │ │ │ │ ├── replace-failed-drive-dialog.tsx │ │ │ │ │ │ ├── shutdown-confirmation-dialog.tsx │ │ │ │ │ │ ├── ssd-health-dialog.tsx │ │ │ │ │ │ └── swap-dialog.tsx │ │ │ │ │ ├── floating-island/ │ │ │ │ │ │ ├── data-stream-icon.tsx │ │ │ │ │ │ ├── expanded.tsx │ │ │ │ │ │ ├── index.tsx │ │ │ │ │ │ └── minimized.tsx │ │ │ │ │ ├── ssd-shape.tsx │ │ │ │ │ ├── storage-donut-chart.tsx │ │ │ │ │ └── storage-mode-display.tsx │ │ │ │ ├── hooks/ │ │ │ │ │ ├── use-active-raid-operation.ts │ │ │ │ │ ├── use-raid-progress.ts │ │ │ │ │ └── use-storage.ts │ │ │ │ ├── index.tsx │ │ │ │ ├── providers/ │ │ │ │ │ └── pending-operation-context.tsx │ │ │ │ └── utils.ts │ │ │ ├── hooks/ │ │ │ │ ├── use-2fa.ts │ │ │ │ ├── use-app-install.ts │ │ │ │ ├── use-apps-with-updates.ts │ │ │ │ ├── use-auto-height-animation.tsx │ │ │ │ ├── use-color-thief.ts │ │ │ │ ├── use-cpu-temperature.ts │ │ │ │ ├── use-cpu.ts │ │ │ │ ├── use-debug-install-random-apps.ts │ │ │ │ ├── use-device-info.ts │ │ │ │ ├── use-disk.ts │ │ │ │ ├── use-is-externaldns.ts │ │ │ │ ├── use-is-home-or-pro.ts │ │ │ │ ├── use-is-mobile.ts │ │ │ │ ├── use-is-umbrel-home.tsx │ │ │ │ ├── use-is-umbrel-pro.ts │ │ │ │ ├── use-language.ts │ │ │ │ ├── use-launch-app.ts │ │ │ │ ├── use-memory.ts │ │ │ │ ├── use-notifications.ts │ │ │ │ ├── use-password.ts │ │ │ │ ├── use-prefixed-local-storage.ts │ │ │ │ ├── use-query-params.ts │ │ │ │ ├── use-scroll-restoration.ts │ │ │ │ ├── use-settings-notification-count.ts │ │ │ │ ├── use-software-update.ts │ │ │ │ ├── use-temperature-unit.ts │ │ │ │ ├── use-tor-enabled.ts │ │ │ │ ├── use-update-all-apps.ts │ │ │ │ ├── use-user-name.ts │ │ │ │ ├── use-version.ts │ │ │ │ └── use-widgets.ts │ │ │ ├── index.css │ │ │ ├── init.tsx │ │ │ ├── layouts/ │ │ │ │ ├── README.md │ │ │ │ ├── app-store.tsx │ │ │ │ ├── bare/ │ │ │ │ │ ├── bare-page.tsx │ │ │ │ │ ├── bare.tsx │ │ │ │ │ ├── onboarding-page.tsx │ │ │ │ │ ├── onboarding.tsx │ │ │ │ │ └── shared.tsx │ │ │ │ ├── desktop.tsx │ │ │ │ └── sheet.tsx │ │ │ ├── lib/ │ │ │ │ └── utils.ts │ │ │ ├── main.tsx │ │ │ ├── modules/ │ │ │ │ ├── app-store/ │ │ │ │ │ ├── app-page/ │ │ │ │ │ │ ├── about-section.tsx │ │ │ │ │ │ ├── app-content.tsx │ │ │ │ │ │ ├── app-settings-dialog.tsx │ │ │ │ │ │ ├── default-credentials-dialog.tsx │ │ │ │ │ │ ├── dependencies.tsx │ │ │ │ │ │ ├── get-recommendations.ts │ │ │ │ │ │ ├── info-section.tsx │ │ │ │ │ │ ├── recommendations-section.tsx │ │ │ │ │ │ ├── release-notes-section.tsx │ │ │ │ │ │ ├── settings-section.tsx │ │ │ │ │ │ ├── shared.tsx │ │ │ │ │ │ └── top-header.tsx │ │ │ │ │ ├── app-store-nav.tsx │ │ │ │ │ ├── community-app-store-dialog.tsx │ │ │ │ │ ├── constants.ts │ │ │ │ │ ├── discover/ │ │ │ │ │ │ ├── apps-grid-section.tsx │ │ │ │ │ │ ├── apps-row-section.tsx │ │ │ │ │ │ └── apps-three-column-section.tsx │ │ │ │ │ ├── gallery-section.tsx │ │ │ │ │ ├── os-update-required.tsx │ │ │ │ │ ├── select-dependencies-dialog.tsx │ │ │ │ │ ├── shared.tsx │ │ │ │ │ ├── updates-button.tsx │ │ │ │ │ ├── updates-dialog.tsx │ │ │ │ │ └── utils.ts │ │ │ │ ├── auth/ │ │ │ │ │ ├── ensure-backend-available.tsx │ │ │ │ │ ├── ensure-logged-in.tsx │ │ │ │ │ ├── ensure-no-raid-mount-failure.tsx │ │ │ │ │ ├── ensure-pro-device.tsx │ │ │ │ │ ├── ensure-user-exists.tsx │ │ │ │ │ ├── redirects.tsx │ │ │ │ │ ├── shared.ts │ │ │ │ │ └── use-auth.tsx │ │ │ │ ├── bare/ │ │ │ │ │ ├── alert.tsx │ │ │ │ │ ├── failed-layout.tsx │ │ │ │ │ ├── progress-layout.tsx │ │ │ │ │ ├── progress.tsx │ │ │ │ │ ├── shared.tsx │ │ │ │ │ └── success-layout.tsx │ │ │ │ ├── community-app-store/ │ │ │ │ │ └── community-badge.tsx │ │ │ │ ├── desktop/ │ │ │ │ │ ├── app-grid/ │ │ │ │ │ │ ├── app-grid.tsx │ │ │ │ │ │ ├── app-pagination-utils.tsx │ │ │ │ │ │ └── paginator.tsx │ │ │ │ │ ├── app-icon.tsx │ │ │ │ │ ├── blur-below-dock.tsx │ │ │ │ │ ├── desktop-content.tsx │ │ │ │ │ ├── desktop-context-menu.tsx │ │ │ │ │ ├── desktop-misc.tsx │ │ │ │ │ ├── desktop-preview.tsx │ │ │ │ │ ├── dock-item.tsx │ │ │ │ │ ├── dock.tsx │ │ │ │ │ ├── greeting-message.ts │ │ │ │ │ ├── header.tsx │ │ │ │ │ ├── install-first-app.tsx │ │ │ │ │ ├── logout-dialog.tsx │ │ │ │ │ ├── uninstall-confirmation-dialog.tsx │ │ │ │ │ └── uninstall-these-first-dialog.tsx │ │ │ │ ├── floating-island/ │ │ │ │ │ ├── bare-island.tsx │ │ │ │ │ └── container.tsx │ │ │ │ ├── immersive-picker/ │ │ │ │ │ └── index.tsx │ │ │ │ ├── migrate/ │ │ │ │ │ ├── migrate-image.tsx │ │ │ │ │ └── migrate-inner.tsx │ │ │ │ ├── sheet-top-fixed.tsx │ │ │ │ ├── widgets/ │ │ │ │ │ ├── four-stats-widget.tsx │ │ │ │ │ ├── index.tsx │ │ │ │ │ ├── list-emoji-widget.tsx │ │ │ │ │ ├── list-widget.tsx │ │ │ │ │ ├── shared/ │ │ │ │ │ │ ├── backdrop-blur-context.tsx │ │ │ │ │ │ ├── constants.ts │ │ │ │ │ │ ├── shared.tsx │ │ │ │ │ │ ├── stat-text.tsx │ │ │ │ │ │ ├── tabler-icon.tsx │ │ │ │ │ │ └── widget-wrapper.tsx │ │ │ │ │ ├── text-with-buttons-widget.tsx │ │ │ │ │ ├── text-with-progress-widget.tsx │ │ │ │ │ ├── three-stats-widget.tsx │ │ │ │ │ └── two-stats-with-guage-widget.tsx │ │ │ │ └── wifi/ │ │ │ │ ├── desktop-wifi-button-connected.tsx │ │ │ │ ├── icon.tsx │ │ │ │ ├── wifi-drawer-or-dialog.tsx │ │ │ │ ├── wifi-item-content.tsx │ │ │ │ └── wifi-list-row-connected-description.tsx │ │ │ ├── providers/ │ │ │ │ ├── apps.tsx │ │ │ │ ├── auth-bootstrap.tsx │ │ │ │ ├── available-apps.tsx │ │ │ │ ├── confirmation/ │ │ │ │ │ ├── confirmation-context.tsx │ │ │ │ │ ├── confirmation-provider.tsx │ │ │ │ │ ├── generic-confirmation-dialog.tsx │ │ │ │ │ ├── index.ts │ │ │ │ │ ├── types.ts │ │ │ │ │ └── use-confirmation.ts │ │ │ │ ├── global-files.tsx │ │ │ │ ├── global-system-state/ │ │ │ │ │ ├── index.tsx │ │ │ │ │ ├── migrate.tsx │ │ │ │ │ ├── reset.tsx │ │ │ │ │ ├── restart.tsx │ │ │ │ │ ├── restore.tsx │ │ │ │ │ ├── shutdown.tsx │ │ │ │ │ └── update.tsx │ │ │ │ ├── immersive-dialog.tsx │ │ │ │ ├── language.tsx │ │ │ │ ├── prefetch.tsx │ │ │ │ ├── sheet-sticky-header.tsx │ │ │ │ └── wallpaper.tsx │ │ │ ├── router.tsx │ │ │ ├── routes/ │ │ │ │ ├── README.md │ │ │ │ ├── app-store/ │ │ │ │ │ ├── app-page/ │ │ │ │ │ │ └── index.tsx │ │ │ │ │ ├── category-page.tsx │ │ │ │ │ ├── discover.tsx │ │ │ │ │ └── use-discover-query.tsx │ │ │ │ ├── community-app-store/ │ │ │ │ │ ├── app-page/ │ │ │ │ │ │ └── index.tsx │ │ │ │ │ └── index.tsx │ │ │ │ ├── edit-widgets/ │ │ │ │ │ ├── index.tsx │ │ │ │ │ └── widget-selector.tsx │ │ │ │ ├── factory-reset/ │ │ │ │ │ ├── _components/ │ │ │ │ │ │ ├── confirm-with-password.tsx │ │ │ │ │ │ ├── misc.tsx │ │ │ │ │ │ └── review-data.tsx │ │ │ │ │ └── index.tsx │ │ │ │ ├── live-usage.tsx │ │ │ │ ├── login.tsx │ │ │ │ ├── not-found.tsx │ │ │ │ ├── notifications.tsx │ │ │ │ ├── onboarding/ │ │ │ │ │ ├── account-created.tsx │ │ │ │ │ ├── create-account.tsx │ │ │ │ │ ├── index.tsx │ │ │ │ │ ├── onboarding-footer.tsx │ │ │ │ │ ├── raid/ │ │ │ │ │ │ ├── index.tsx │ │ │ │ │ │ ├── raid-error.tsx │ │ │ │ │ │ ├── setup.tsx │ │ │ │ │ │ ├── ssd-health-dialog.tsx │ │ │ │ │ │ ├── ssd-tray.tsx │ │ │ │ │ │ └── use-raid-setup.ts │ │ │ │ │ ├── restore.tsx │ │ │ │ │ └── use-onboarding-device.ts │ │ │ │ ├── raid-error/ │ │ │ │ │ └── index.tsx │ │ │ │ ├── settings/ │ │ │ │ │ ├── 2fa-disable.tsx │ │ │ │ │ ├── 2fa-enable.tsx │ │ │ │ │ ├── 2fa.tsx │ │ │ │ │ ├── _components/ │ │ │ │ │ │ ├── app-store-preferences-content.tsx │ │ │ │ │ │ ├── cpu-card-content.tsx │ │ │ │ │ │ ├── cpu-temperature-card-content.tsx │ │ │ │ │ │ ├── device-info-content.tsx │ │ │ │ │ │ ├── device-info-umbrel-home.tsx │ │ │ │ │ │ ├── device-info-umbrel-pro.tsx │ │ │ │ │ │ ├── language-dropdown.tsx │ │ │ │ │ │ ├── laser-engraving.tsx │ │ │ │ │ │ ├── list-row.tsx │ │ │ │ │ │ ├── memory-card-content.tsx │ │ │ │ │ │ ├── no-forgot-password-message.tsx │ │ │ │ │ │ ├── progress-card-content.tsx │ │ │ │ │ │ ├── settings-content-mobile.tsx │ │ │ │ │ │ ├── settings-content.tsx │ │ │ │ │ │ ├── settings-summary.tsx │ │ │ │ │ │ ├── shared.tsx │ │ │ │ │ │ ├── software-update-list-row.tsx │ │ │ │ │ │ ├── storage-card-content.tsx │ │ │ │ │ │ └── wallpaper-picker.tsx │ │ │ │ │ ├── advanced.tsx │ │ │ │ │ ├── app-store-preferences.tsx │ │ │ │ │ ├── change-name.tsx │ │ │ │ │ ├── change-password.tsx │ │ │ │ │ ├── device-info.tsx │ │ │ │ │ ├── file-sharing.tsx │ │ │ │ │ ├── index.tsx │ │ │ │ │ ├── migration-assistant.tsx │ │ │ │ │ ├── mobile/ │ │ │ │ │ │ ├── account.tsx │ │ │ │ │ │ ├── app-store-preferences.tsx │ │ │ │ │ │ ├── backups-mobile-drawer.tsx │ │ │ │ │ │ ├── device-info.tsx │ │ │ │ │ │ ├── language.tsx │ │ │ │ │ │ ├── software-update.tsx │ │ │ │ │ │ ├── start-migration-drawer-or-dialog.tsx │ │ │ │ │ │ ├── tor.tsx │ │ │ │ │ │ └── wallpaper.tsx │ │ │ │ │ ├── restart.tsx │ │ │ │ │ ├── shutdown.tsx │ │ │ │ │ ├── software-update-confirm.tsx │ │ │ │ │ ├── terminal/ │ │ │ │ │ │ ├── _shared.tsx │ │ │ │ │ │ ├── app.tsx │ │ │ │ │ │ ├── index.tsx │ │ │ │ │ │ └── umbrelos.tsx │ │ │ │ │ ├── troubleshoot/ │ │ │ │ │ │ ├── _shared.tsx │ │ │ │ │ │ ├── app.tsx │ │ │ │ │ │ ├── index.tsx │ │ │ │ │ │ └── umbrelos.tsx │ │ │ │ │ ├── wifi-unsupported.tsx │ │ │ │ │ └── wifi.tsx │ │ │ │ └── whats-new-modal.tsx │ │ │ ├── trpc/ │ │ │ │ ├── loading-indicator.tsx │ │ │ │ ├── trpc-provider.tsx │ │ │ │ └── trpc.ts │ │ │ ├── types.d.ts │ │ │ └── utils/ │ │ │ ├── call-every-interval.ts │ │ │ ├── date-time.ts │ │ │ ├── dialog.ts │ │ │ ├── element-classes.ts │ │ │ ├── i18n.ts │ │ │ ├── language.ts │ │ │ ├── logs.ts │ │ │ ├── misc.ts │ │ │ ├── number.ts │ │ │ ├── pretty-bytes.ts │ │ │ ├── search.ts │ │ │ ├── seconds-to-eta.ts │ │ │ ├── system.ts │ │ │ ├── temperature.ts │ │ │ ├── tw.ts │ │ │ └── wifi.ts │ │ ├── tailwind.config.ts │ │ ├── tsconfig.json │ │ ├── tsconfig.node.json │ │ ├── update-translations.js │ │ └── vite.config.ts │ └── umbreld/ │ ├── .gitignore │ ├── .prettierignore │ ├── package.json │ ├── scripts/ │ │ └── validate-manifests.ts │ ├── source/ │ │ ├── cli.ts │ │ ├── constants.ts │ │ ├── index.ts │ │ └── modules/ │ │ ├── apps/ │ │ │ ├── app-repository.integration.test.ts │ │ │ ├── app-repository.ts │ │ │ ├── app-store.integration.test.ts │ │ │ ├── app-store.ts │ │ │ ├── app.ts │ │ │ ├── apps.integration.test.ts │ │ │ ├── apps.ts │ │ │ ├── legacy-compat/ │ │ │ │ ├── app-environment.ts │ │ │ │ ├── app-script │ │ │ │ ├── app-script.ts │ │ │ │ ├── bin/ │ │ │ │ │ ├── bitcoin-cli │ │ │ │ │ └── lncli │ │ │ │ ├── docker-compose.app_proxy.yml │ │ │ │ ├── docker-compose.common.yml │ │ │ │ ├── docker-compose.tor.yml │ │ │ │ ├── docker-compose.yml │ │ │ │ ├── tor-entrypoint.sh │ │ │ │ ├── tor-proxy-torrc │ │ │ │ └── tor-server-torrc │ │ │ ├── routes.ts │ │ │ └── schema.ts │ │ ├── backups/ │ │ │ ├── backups.backupProgress.test.ts │ │ │ ├── backups.integration.test.ts │ │ │ ├── backups.ts │ │ │ └── routes.ts │ │ ├── blacklist-uas/ │ │ │ └── blacklist-uas.ts │ │ ├── cli-client.ts │ │ ├── dbus/ │ │ │ └── dbus.ts │ │ ├── development.ts │ │ ├── event-bus/ │ │ │ ├── event-bus.ts │ │ │ └── routes.ts │ │ ├── files/ │ │ │ ├── api.download.integration.test.ts │ │ │ ├── api.thumbnail.integration.test.ts │ │ │ ├── api.ts │ │ │ ├── api.upload.integration.test.ts │ │ │ ├── api.view.integration.test.ts │ │ │ ├── archive.integration.test.ts │ │ │ ├── archive.ts │ │ │ ├── external-storage.integration.test.ts │ │ │ ├── external-storage.ts │ │ │ ├── favorites.integration.test.ts │ │ │ ├── favorites.ts │ │ │ ├── files-reflink-copy.vm.test.ts │ │ │ ├── files.copy.integration.test.ts │ │ │ ├── files.createDirectory.integration.test.ts │ │ │ ├── files.delete.test.ts │ │ │ ├── files.emptyTrash.test.ts │ │ │ ├── files.list.integration.test.ts │ │ │ ├── files.move.integration.test.ts │ │ │ ├── files.operationProgress.test.ts │ │ │ ├── files.preferences.integration.test.ts │ │ │ ├── files.rename.integration.test.ts │ │ │ ├── files.restore.test.ts │ │ │ ├── files.trash.test.ts │ │ │ ├── files.ts │ │ │ ├── fixtures/ │ │ │ │ └── thumbnails/ │ │ │ │ └── master-lossless-video.mkv │ │ │ ├── network-storage.integration.test.ts │ │ │ ├── network-storage.ts │ │ │ ├── recents.test.ts │ │ │ ├── recents.ts │ │ │ ├── routes.ts │ │ │ ├── samba.integration.test.ts │ │ │ ├── samba.ts │ │ │ ├── search.integration.test.ts │ │ │ ├── search.ts │ │ │ ├── thumbnails.integration.test.ts │ │ │ ├── thumbnails.ts │ │ │ ├── watcher.ts │ │ │ └── widgets.ts │ │ ├── hardware/ │ │ │ ├── hardware.ts │ │ │ ├── internal-storage-rounding.vm.test.ts │ │ │ ├── internal-storage-slot-detection.vm.test.ts │ │ │ ├── internal-storage.ts │ │ │ ├── raid-failsafe-space-reporting.vm.test.ts │ │ │ ├── raid-failsafe.vm.test.ts │ │ │ ├── raid-foreign-pool.vm.test.ts │ │ │ ├── raid-operations-different-sizes.vm.test.ts │ │ │ ├── raid-preused-drives.vm.test.ts │ │ │ ├── raid-recovery-mode.vm.test.ts │ │ │ ├── raid-replace-larger-capacity.vm.test.ts │ │ │ ├── raid-replace.vm.test.ts │ │ │ ├── raid-size-rounding.vm.test.ts │ │ │ ├── raid-slot-swap.vm.test.ts │ │ │ ├── raid-storage.vm.test.ts │ │ │ ├── raid-transition-different-size.vm.test.ts │ │ │ ├── raid-transition-full-storage.vm.test.ts │ │ │ ├── raid-transition.vm.test.ts │ │ │ ├── raid.getRoundedDeviceSize.unit.test.ts │ │ │ ├── raid.ts │ │ │ ├── routes.ts │ │ │ └── umbrel-pro.ts │ │ ├── is-umbrel-home.ts │ │ ├── jwt.ts │ │ ├── migration/ │ │ │ ├── migration.ts │ │ │ └── routes.ts │ │ ├── notifications/ │ │ │ ├── notifications.integration.test.ts │ │ │ ├── notifications.ts │ │ │ └── routes.ts │ │ ├── server/ │ │ │ ├── index.ts │ │ │ ├── terminal-socket.ts │ │ │ └── trpc/ │ │ │ ├── common.ts │ │ │ ├── context.ts │ │ │ ├── index.ts │ │ │ ├── is-authenticated.ts │ │ │ ├── trpc.ts │ │ │ └── websocket-logger.ts │ │ ├── startup-migrations/ │ │ │ ├── index.ts │ │ │ └── startup-migrations.integration.test.ts │ │ ├── system/ │ │ │ ├── factory-reset.ts │ │ │ ├── routes.ts │ │ │ ├── system-widgets.ts │ │ │ ├── system.integration.test.ts │ │ │ ├── system.ts │ │ │ ├── system.unit.test.ts │ │ │ ├── update.ts │ │ │ └── wifi-routes.ts │ │ ├── test-utilities/ │ │ │ ├── create-test-umbreld.ts │ │ │ ├── fixtures/ │ │ │ │ ├── another-community-repo/ │ │ │ │ │ ├── another-sparkles-hello-world/ │ │ │ │ │ │ ├── docker-compose.yml │ │ │ │ │ │ └── umbrel-app.yml │ │ │ │ │ └── umbrel-app-store.yml │ │ │ │ └── community-repo/ │ │ │ │ ├── app-with-invalid-id/ │ │ │ │ │ ├── docker-compose.yml │ │ │ │ │ └── umbrel-app.yml │ │ │ │ ├── app-with-invalid-manifest/ │ │ │ │ │ ├── docker-compose.yml │ │ │ │ │ └── umbrel-app.yml │ │ │ │ ├── sparkles-hello-world/ │ │ │ │ │ ├── docker-compose.yml │ │ │ │ │ └── umbrel-app.yml │ │ │ │ └── umbrel-app-store.yml │ │ │ └── run-git-server.ts │ │ ├── user/ │ │ │ ├── routes.ts │ │ │ ├── user.integration.test.ts │ │ │ └── user.ts │ │ ├── utilities/ │ │ │ ├── copy-with-progress.ts │ │ │ ├── dependencies.ts │ │ │ ├── docker-pull.ts │ │ │ ├── file-store.integration.test.ts │ │ │ ├── file-store.ts │ │ │ ├── get-directory-size.ts │ │ │ ├── get-or-create-file.ts │ │ │ ├── logger.ts │ │ │ ├── package-directory.ts │ │ │ ├── random-token.ts │ │ │ ├── regexp.ts │ │ │ ├── run-every.ts │ │ │ ├── temporary-directory.ts │ │ │ └── totp.ts │ │ └── widgets/ │ │ ├── routes.ts │ │ └── widget.integration.test.ts │ ├── trigger-change │ ├── tsconfig.json │ └── umbreld └── scripts/ ├── data-export ├── install ├── remote-builder ├── umbrel-dev └── update-script