diff --git a/.github/workflows/build-windows.yml b/.github/workflows/build-windows.yml index bfaf758..6122c3a 100644 --- a/.github/workflows/build-windows.yml +++ b/.github/workflows/build-windows.yml @@ -13,7 +13,7 @@ jobs: runs-on: windows-latest defaults: run: - working-directory: js + working-directory: js/desktop env: APP_ENV: prod AZURE_TENANT_ID: ${{ vars.AZURE_TENANT_ID }} @@ -31,7 +31,7 @@ jobs: with: node-version: 20 cache: yarn - cache-dependency-path: js/yarn.lock + cache-dependency-path: js/desktop/yarn.lock - name: Install dependencies run: yarn install --frozen-lockfile --network-timeout 600000 @@ -51,7 +51,7 @@ jobs: $dlib = Join-Path $env:RUNNER_TEMP "trusted-signing\Microsoft.Trusted.Signing.Client\bin\x64\Azure.CodeSigning.Dlib.dll" if (-not (Test-Path $dlib)) { throw "Dlib not found at $dlib" } "AZURE_DLIB_PATH=$dlib" | Out-File -FilePath $env:GITHUB_ENV -Append -Encoding utf8 - "AZURE_METADATA_JSON_PATH=$env:GITHUB_WORKSPACE\js\signing-metadata.json" | Out-File -FilePath $env:GITHUB_ENV -Append -Encoding utf8 + "AZURE_METADATA_JSON_PATH=$env:GITHUB_WORKSPACE\js\desktop\signing-metadata.json" | Out-File -FilePath $env:GITHUB_ENV -Append -Encoding utf8 - name: Locate signtool.exe shell: pwsh @@ -84,7 +84,7 @@ jobs: uses: actions/upload-artifact@v4 with: name: flowy-llink-windows-signed - path: js/out/make/**/* + path: js/desktop/out/make/**/* if-no-files-found: warn # When Squirrel reports a generic "Failed to sign", the real error from @@ -94,5 +94,5 @@ jobs: uses: actions/upload-artifact@v4 with: name: electron-windows-sign-log - path: js/node_modules/electron-winstaller/vendor/electron-windows-sign.log + path: js/desktop/node_modules/electron-winstaller/vendor/electron-windows-sign.log if-no-files-found: ignore diff --git a/js/.eslintrc.json b/js/desktop/.eslintrc.json similarity index 100% rename from js/.eslintrc.json rename to js/desktop/.eslintrc.json diff --git a/js/.gitignore b/js/desktop/.gitignore similarity index 100% rename from js/.gitignore rename to js/desktop/.gitignore diff --git a/js/assets/flowy.icns b/js/desktop/assets/flowy.icns similarity index 100% rename from js/assets/flowy.icns rename to js/desktop/assets/flowy.icns diff --git a/js/assets/flowy.ico b/js/desktop/assets/flowy.ico similarity index 100% rename from js/assets/flowy.ico rename to js/desktop/assets/flowy.ico diff --git a/js/assets/flowy.iconset/icon_128x128.png b/js/desktop/assets/flowy.iconset/icon_128x128.png similarity index 100% rename from js/assets/flowy.iconset/icon_128x128.png rename to js/desktop/assets/flowy.iconset/icon_128x128.png diff --git a/js/assets/flowy.iconset/icon_128x128@2x.png b/js/desktop/assets/flowy.iconset/icon_128x128@2x.png similarity index 100% rename from js/assets/flowy.iconset/icon_128x128@2x.png rename to js/desktop/assets/flowy.iconset/icon_128x128@2x.png diff --git a/js/assets/flowy.iconset/icon_16x16.png b/js/desktop/assets/flowy.iconset/icon_16x16.png similarity index 100% rename from js/assets/flowy.iconset/icon_16x16.png rename to js/desktop/assets/flowy.iconset/icon_16x16.png diff --git a/js/assets/flowy.iconset/icon_16x16@2x.png b/js/desktop/assets/flowy.iconset/icon_16x16@2x.png similarity index 100% rename from js/assets/flowy.iconset/icon_16x16@2x.png rename to js/desktop/assets/flowy.iconset/icon_16x16@2x.png diff --git a/js/assets/flowy.iconset/icon_256x256.png b/js/desktop/assets/flowy.iconset/icon_256x256.png similarity index 100% rename from js/assets/flowy.iconset/icon_256x256.png rename to js/desktop/assets/flowy.iconset/icon_256x256.png diff --git a/js/assets/flowy.iconset/icon_256x256@2x.png b/js/desktop/assets/flowy.iconset/icon_256x256@2x.png similarity index 100% rename from js/assets/flowy.iconset/icon_256x256@2x.png rename to js/desktop/assets/flowy.iconset/icon_256x256@2x.png diff --git a/js/assets/flowy.iconset/icon_32x32.png b/js/desktop/assets/flowy.iconset/icon_32x32.png similarity index 100% rename from js/assets/flowy.iconset/icon_32x32.png rename to js/desktop/assets/flowy.iconset/icon_32x32.png diff --git a/js/assets/flowy.iconset/icon_32x32@2x.png b/js/desktop/assets/flowy.iconset/icon_32x32@2x.png similarity index 100% rename from js/assets/flowy.iconset/icon_32x32@2x.png rename to js/desktop/assets/flowy.iconset/icon_32x32@2x.png diff --git a/js/assets/flowy.iconset/icon_512x512.png b/js/desktop/assets/flowy.iconset/icon_512x512.png similarity index 100% rename from js/assets/flowy.iconset/icon_512x512.png rename to js/desktop/assets/flowy.iconset/icon_512x512.png diff --git a/js/assets/icon.png b/js/desktop/assets/icon.png similarity index 100% rename from js/assets/icon.png rename to js/desktop/assets/icon.png diff --git a/js/assets/icon_green.png b/js/desktop/assets/icon_green.png similarity index 100% rename from js/assets/icon_green.png rename to js/desktop/assets/icon_green.png diff --git a/js/assets/icon_red.png b/js/desktop/assets/icon_red.png similarity index 100% rename from js/assets/icon_red.png rename to js/desktop/assets/icon_red.png diff --git a/js/assets/images/FLOWY-4.svg b/js/desktop/assets/images/FLOWY-4.svg similarity index 100% rename from js/assets/images/FLOWY-4.svg rename to js/desktop/assets/images/FLOWY-4.svg diff --git a/js/assets/sound.wav b/js/desktop/assets/sound.wav similarity index 100% rename from js/assets/sound.wav rename to js/desktop/assets/sound.wav diff --git a/js/assets/sounds/click.mp3 b/js/desktop/assets/sounds/click.mp3 similarity index 100% rename from js/assets/sounds/click.mp3 rename to js/desktop/assets/sounds/click.mp3 diff --git a/js/components.json b/js/desktop/components.json similarity index 100% rename from js/components.json rename to js/desktop/components.json diff --git a/js/forge.config.ts b/js/desktop/forge.config.ts similarity index 97% rename from js/forge.config.ts rename to js/desktop/forge.config.ts index c369c7a..e2381bd 100644 --- a/js/forge.config.ts +++ b/js/desktop/forge.config.ts @@ -1,124 +1,124 @@ -import type { ForgeConfig } from '@electron-forge/shared-types'; -import { MakerSquirrel } from '@electron-forge/maker-squirrel'; -import { MakerZIP } from '@electron-forge/maker-zip'; -import { MakerDeb } from '@electron-forge/maker-deb'; -import { MakerRpm } from '@electron-forge/maker-rpm'; -import { VitePlugin } from '@electron-forge/plugin-vite'; -import { FusesPlugin } from '@electron-forge/plugin-fuses'; -import { FuseV1Options, FuseVersion } from '@electron/fuses'; - -// Windows code signing via Azure Trusted Signing. Dormant unless the workflow -// provisions the dlib + metadata file and exports these env vars, so local -// `yarn make` and unsigned CI builds both work unchanged. -// @electron/windows-sign prepends `sign /tr /td sha256 /fd sha256` -// to the sha256 pass, so `signWithParams` only carries the Azure Trusted Signing -// bits. Skip the sha1 pass (deprecated; not supported by Trusted Signing). -const windowsSign = process.env.AZURE_METADATA_JSON_PATH ? { - debug: true, - signToolPath: process.env.SIGNTOOL_PATH, - hashes: ['sha256' as any], - timestampServer: 'http://timestamp.acs.microsoft.com', - signWithParams: [ - '/v', - '/dlib', process.env.AZURE_DLIB_PATH, - '/dmdf', process.env.AZURE_METADATA_JSON_PATH, - ].join(' '), -} : undefined; - -const config: ForgeConfig = { - packagerConfig: { - asar: true, - icon: './assets/flowy', - appBundleId: 'live.flowy.llink', - protocols: [ - { name: 'llink', schemes: ['llink'] }, - ], - extendInfo: { - NSMicrophoneUsageDescription: 'llink needs microphone access to record audio messages.', - NSCameraUsageDescription: 'llink needs camera access to record video messages.', - }, - osxSign: {}, - osxNotarize: { - keychainProfile: 'default', - }, - windowsSign - }, - publishers: [ - { - name: '@electron-forge/publisher-gcs', - config: { - storageOptions: { - projectId: 'flowy-prod-440017' - }, - bucket: 'flowy-releases', - folder: 'llink', - // NOTE: commented out because we do not want to apply per object ACL which conflicts with uniform bucket-level access that's already public - // public: true - } - } - ], - rebuildConfig: {}, - makers: [ - new MakerSquirrel((arch) => ({ - remoteReleases: `https://storage.googleapis.com/flowy-releases/llink/win32/${arch}`, - setupIcon: './assets/flowy.ico', - iconUrl: 'https://storage.googleapis.com/flowy-releases/llink/win32/x64/flowy.ico', - windowsSign - })), - new MakerZIP((arch) => ({ - macUpdateManifestBaseUrl: `https://storage.googleapis.com/flowy-releases/llink/darwin/${arch}` - }), ['darwin']), - new MakerRpm({}), - new MakerDeb({}), - ], - plugins: [ - new VitePlugin({ - // `build` can specify multiple entry builds, which can be Main process, Preload scripts, Worker process, etc. - // If you are familiar with Vite configuration, it will look really familiar. - build: [ - { - // `entry` is just an alias for `build.lib.entry` in the corresponding file of `config`. - entry: 'src/main.ts', - config: 'vite.main.config.ts', - target: 'main', - }, - { - entry: 'src/preload.ts', - config: 'vite.preload.config.ts', - target: 'preload', - }, - ], - renderer: [ - { - name: 'main_window', - config: 'vite.renderer.config.mts', - }, - { - name: 'autoplay_window', - config: 'vite.autoplay.config.mts', - }, - { - name: 'huddle_window', - config: 'vite.huddle.config.mts', - }, - { - name: 'screen_record_window', - config: 'vite.screen-record.config.mts', - }, - ], - }), - // Fuses are used to enable/disable various Electron functionality - // at package time, before code signing the application - new FusesPlugin({ - version: FuseVersion.V1, - [FuseV1Options.RunAsNode]: false, - [FuseV1Options.EnableCookieEncryption]: true, - [FuseV1Options.EnableNodeOptionsEnvironmentVariable]: false, - [FuseV1Options.EnableNodeCliInspectArguments]: false, - [FuseV1Options.EnableEmbeddedAsarIntegrityValidation]: true, - [FuseV1Options.OnlyLoadAppFromAsar]: true, - }), - ], -}; - -export default config; +import type { ForgeConfig } from '@electron-forge/shared-types'; +import { MakerSquirrel } from '@electron-forge/maker-squirrel'; +import { MakerZIP } from '@electron-forge/maker-zip'; +import { MakerDeb } from '@electron-forge/maker-deb'; +import { MakerRpm } from '@electron-forge/maker-rpm'; +import { VitePlugin } from '@electron-forge/plugin-vite'; +import { FusesPlugin } from '@electron-forge/plugin-fuses'; +import { FuseV1Options, FuseVersion } from '@electron/fuses'; + +// Windows code signing via Azure Trusted Signing. Dormant unless the workflow +// provisions the dlib + metadata file and exports these env vars, so local +// `yarn make` and unsigned CI builds both work unchanged. +// @electron/windows-sign prepends `sign /tr /td sha256 /fd sha256` +// to the sha256 pass, so `signWithParams` only carries the Azure Trusted Signing +// bits. Skip the sha1 pass (deprecated; not supported by Trusted Signing). +const windowsSign = process.env.AZURE_METADATA_JSON_PATH ? { + debug: true, + signToolPath: process.env.SIGNTOOL_PATH, + hashes: ['sha256' as any], + timestampServer: 'http://timestamp.acs.microsoft.com', + signWithParams: [ + '/v', + '/dlib', process.env.AZURE_DLIB_PATH, + '/dmdf', process.env.AZURE_METADATA_JSON_PATH, + ].join(' '), +} : undefined; + +const config: ForgeConfig = { + packagerConfig: { + asar: true, + icon: './assets/flowy', + appBundleId: 'live.flowy.llink', + protocols: [ + { name: 'llink', schemes: ['llink'] }, + ], + extendInfo: { + NSMicrophoneUsageDescription: 'llink needs microphone access to record audio messages.', + NSCameraUsageDescription: 'llink needs camera access to record video messages.', + }, + osxSign: {}, + osxNotarize: { + keychainProfile: 'default', + }, + windowsSign + }, + publishers: [ + { + name: '@electron-forge/publisher-gcs', + config: { + storageOptions: { + projectId: 'flowy-prod-440017' + }, + bucket: 'flowy-releases', + folder: 'llink', + // NOTE: commented out because we do not want to apply per object ACL which conflicts with uniform bucket-level access that's already public + // public: true + } + } + ], + rebuildConfig: {}, + makers: [ + new MakerSquirrel((arch) => ({ + remoteReleases: `https://storage.googleapis.com/flowy-releases/llink/win32/${arch}`, + setupIcon: './assets/flowy.ico', + iconUrl: 'https://storage.googleapis.com/flowy-releases/llink/win32/x64/flowy.ico', + windowsSign + })), + new MakerZIP((arch) => ({ + macUpdateManifestBaseUrl: `https://storage.googleapis.com/flowy-releases/llink/darwin/${arch}` + }), ['darwin']), + new MakerRpm({}), + new MakerDeb({}), + ], + plugins: [ + new VitePlugin({ + // `build` can specify multiple entry builds, which can be Main process, Preload scripts, Worker process, etc. + // If you are familiar with Vite configuration, it will look really familiar. + build: [ + { + // `entry` is just an alias for `build.lib.entry` in the corresponding file of `config`. + entry: 'src/main.ts', + config: 'vite.main.config.ts', + target: 'main', + }, + { + entry: 'src/preload.ts', + config: 'vite.preload.config.ts', + target: 'preload', + }, + ], + renderer: [ + { + name: 'main_window', + config: 'vite.renderer.config.mts', + }, + { + name: 'autoplay_window', + config: 'vite.autoplay.config.mts', + }, + { + name: 'huddle_window', + config: 'vite.huddle.config.mts', + }, + { + name: 'screen_record_window', + config: 'vite.screen-record.config.mts', + }, + ], + }), + // Fuses are used to enable/disable various Electron functionality + // at package time, before code signing the application + new FusesPlugin({ + version: FuseVersion.V1, + [FuseV1Options.RunAsNode]: false, + [FuseV1Options.EnableCookieEncryption]: true, + [FuseV1Options.EnableNodeOptionsEnvironmentVariable]: false, + [FuseV1Options.EnableNodeCliInspectArguments]: false, + [FuseV1Options.EnableEmbeddedAsarIntegrityValidation]: true, + [FuseV1Options.OnlyLoadAppFromAsar]: true, + }), + ], +}; + +export default config; diff --git a/js/forge.env.d.ts b/js/desktop/forge.env.d.ts similarity index 100% rename from js/forge.env.d.ts rename to js/desktop/forge.env.d.ts diff --git a/js/index.html b/js/desktop/index.html similarity index 100% rename from js/index.html rename to js/desktop/index.html diff --git a/js/package.json b/js/desktop/package.json similarity index 97% rename from js/package.json rename to js/desktop/package.json index 2fd8cc6..53e3ebd 100644 --- a/js/package.json +++ b/js/desktop/package.json @@ -1,84 +1,84 @@ -{ - "name": "Flowy.llink", - "productName": "Flowy.llink", - "version": "1.3.0", - "description": "Flowy.llink is a team communication app for teams", - "main": ".vite/build/main.js", - "private": true, - "scripts": { - "start": "electron-forge start", - "package:mac": "APP_ENV=prod electron-forge package --arch=arm64 && APP_ENV=prod electron-forge package --arch=x64", - "make:mac": "APP_ENV=prod electron-forge make --arch=arm64 && APP_ENV=prod electron-forge make --arch=x64", - "make:win": "electron-forge make --platform=win32 --arch=x64", - "publish:win": "electron-forge publish --platform=win32 --arch=x64", - "publish:mac": "echo '\n⚠️ Have you bumped the version in package.json? (current: '$(node -p \"require('./package.json').version\")') [y/N]' && read -r answer && [ \"$answer\" = \"y\" ] && APP_ENV=prod electron-forge publish --arch=arm64 && APP_ENV=prod electron-forge publish --arch=x64", - "invalidate-gcs-cache": "gsutil setmeta -h 'Cache-Control:no-cache, no-store, must-revalidate' gs://flowy-releases/llink/darwin/arm64/RELEASES.json && gsutil setmeta -h 'Cache-Control:no-cache, no-store, must-revalidate' gs://flowy-releases/llink/darwin/x64/RELEASES.json && gsutil setmeta -h 'Cache-Control:no-cache, no-store, must-revalidate' gs://flowy-releases/llink/win32/x64/RELEASES", - "lint": "eslint --ext .ts,.tsx .", - "compile": "npx tsc --noEmit 2>&1 | grep '^src/'" - }, - "keywords": [], - "author": { - "name": "talksik", - "email": "patel.arjun50@gmail.com" - }, - "license": "MIT", - "packageManager": "yarn@1.22.22", - "devDependencies": { - "@electron-forge/cli": "^7.11.1", - "@electron-forge/maker-deb": "^7.11.1", - "@electron-forge/maker-rpm": "^7.11.1", - "@electron-forge/maker-squirrel": "^7.11.1", - "@electron-forge/maker-zip": "^7.11.1", - "@electron-forge/plugin-auto-unpack-natives": "^7.11.1", - "@electron-forge/plugin-fuses": "^7.11.1", - "@electron-forge/plugin-vite": "^7.11.1", - "@electron-forge/publisher-gcs": "^7.11.1", - "@electron/fuses": "^1.8.0", - "@tailwindcss/vite": "^4.2.0", - "@tanstack/eslint-plugin-query": "^5.91.4", - "@types/electron-squirrel-startup": "^1.0.2", - "@types/node": "^25.3.0", - "@types/react": "^19.2.14", - "@types/react-dom": "^19.2.3", - "@typescript-eslint/eslint-plugin": "^5.62.0", - "@typescript-eslint/parser": "^5.62.0", - "@vitejs/plugin-react": "^5.1.4", - "electron": "40.6.0", - "eslint": "^8.57.1", - "eslint-plugin-import": "^2.32.0", - "eslint-plugin-react-hooks": "^7.0.1", - "typescript": "^5.9.3", - "vite": "^5.4.21" - }, - "dependencies": { - "@livekit/components-react": "^2.9.20", - "@livekit/components-styles": "^1.2.0", - "@sentry/electron": "^7.11.0", - "@tanstack/react-query": "^5.90.21", - "class-variance-authority": "^0.7.1", - "clsx": "^2.1.1", - "electron-squirrel-startup": "^1.0.1", - "firebase": "^12.10.0", - "highlight.js": "^11.11.1", - "livekit-client": "^2.18.0", - "lucide-react": "^0.575.0", - "next-themes": "^0.4.6", - "radix-ui": "^1.4.3", - "react": "^19.2.4", - "react-dom": "^19.2.4", - "react-error-boundary": "^6.1.1", - "react-markdown": "^10.1.0", - "react-router-dom": "^7.13.0", - "react-use": "^17.6.0", - "rehype-highlight": "^7.0.2", - "remark-gfm": "^4.0.1", - "shadcn": "^3.8.5", - "sonner": "^2.0.7", - "tailwind-merge": "^3.5.0", - "tailwindcss": "^4.2.0", - "tw-animate-css": "^1.4.0", - "update-electron-app": "^3.1.2", - "zod": "^4.3.6", - "zustand": "^5.0.11" - } -} +{ + "name": "Flowy.llink", + "productName": "Flowy.llink", + "version": "1.3.0", + "description": "Flowy.llink is a team communication app for teams", + "main": ".vite/build/main.js", + "private": true, + "scripts": { + "start": "electron-forge start", + "package:mac": "APP_ENV=prod electron-forge package --arch=arm64 && APP_ENV=prod electron-forge package --arch=x64", + "make:mac": "APP_ENV=prod electron-forge make --arch=arm64 && APP_ENV=prod electron-forge make --arch=x64", + "make:win": "electron-forge make --platform=win32 --arch=x64", + "publish:win": "electron-forge publish --platform=win32 --arch=x64", + "publish:mac": "echo '\n⚠️ Have you bumped the version in package.json? (current: '$(node -p \"require('./package.json').version\")') [y/N]' && read -r answer && [ \"$answer\" = \"y\" ] && APP_ENV=prod electron-forge publish --arch=arm64 && APP_ENV=prod electron-forge publish --arch=x64", + "invalidate-gcs-cache": "gsutil setmeta -h 'Cache-Control:no-cache, no-store, must-revalidate' gs://flowy-releases/llink/darwin/arm64/RELEASES.json && gsutil setmeta -h 'Cache-Control:no-cache, no-store, must-revalidate' gs://flowy-releases/llink/darwin/x64/RELEASES.json && gsutil setmeta -h 'Cache-Control:no-cache, no-store, must-revalidate' gs://flowy-releases/llink/win32/x64/RELEASES", + "lint": "eslint --ext .ts,.tsx .", + "compile": "npx tsc --noEmit 2>&1 | grep '^src/'" + }, + "keywords": [], + "author": { + "name": "talksik", + "email": "patel.arjun50@gmail.com" + }, + "license": "MIT", + "packageManager": "yarn@1.22.22", + "devDependencies": { + "@electron-forge/cli": "^7.11.1", + "@electron-forge/maker-deb": "^7.11.1", + "@electron-forge/maker-rpm": "^7.11.1", + "@electron-forge/maker-squirrel": "^7.11.1", + "@electron-forge/maker-zip": "^7.11.1", + "@electron-forge/plugin-auto-unpack-natives": "^7.11.1", + "@electron-forge/plugin-fuses": "^7.11.1", + "@electron-forge/plugin-vite": "^7.11.1", + "@electron-forge/publisher-gcs": "^7.11.1", + "@electron/fuses": "^1.8.0", + "@tailwindcss/vite": "^4.2.0", + "@tanstack/eslint-plugin-query": "^5.91.4", + "@types/electron-squirrel-startup": "^1.0.2", + "@types/node": "^25.3.0", + "@types/react": "^19.2.14", + "@types/react-dom": "^19.2.3", + "@typescript-eslint/eslint-plugin": "^5.62.0", + "@typescript-eslint/parser": "^5.62.0", + "@vitejs/plugin-react": "^5.1.4", + "electron": "40.6.0", + "eslint": "^8.57.1", + "eslint-plugin-import": "^2.32.0", + "eslint-plugin-react-hooks": "^7.0.1", + "typescript": "^5.9.3", + "vite": "^5.4.21" + }, + "dependencies": { + "@livekit/components-react": "^2.9.20", + "@livekit/components-styles": "^1.2.0", + "@sentry/electron": "^7.11.0", + "@tanstack/react-query": "^5.90.21", + "class-variance-authority": "^0.7.1", + "clsx": "^2.1.1", + "electron-squirrel-startup": "^1.0.1", + "firebase": "^12.10.0", + "highlight.js": "^11.11.1", + "livekit-client": "^2.18.0", + "lucide-react": "^0.575.0", + "next-themes": "^0.4.6", + "radix-ui": "^1.4.3", + "react": "^19.2.4", + "react-dom": "^19.2.4", + "react-error-boundary": "^6.1.1", + "react-markdown": "^10.1.0", + "react-router-dom": "^7.13.0", + "react-use": "^17.6.0", + "rehype-highlight": "^7.0.2", + "remark-gfm": "^4.0.1", + "shadcn": "^3.8.5", + "sonner": "^2.0.7", + "tailwind-merge": "^3.5.0", + "tailwindcss": "^4.2.0", + "tw-animate-css": "^1.4.0", + "update-electron-app": "^3.1.2", + "zod": "^4.3.6", + "zustand": "^5.0.11" + } +} diff --git a/js/signing-metadata.json b/js/desktop/signing-metadata.json similarity index 100% rename from js/signing-metadata.json rename to js/desktop/signing-metadata.json diff --git a/js/src/App.tsx b/js/desktop/src/App.tsx similarity index 100% rename from js/src/App.tsx rename to js/desktop/src/App.tsx diff --git a/js/src/api/client.ts b/js/desktop/src/api/client.ts similarity index 100% rename from js/src/api/client.ts rename to js/desktop/src/api/client.ts diff --git a/js/src/api/types.ts b/js/desktop/src/api/types.ts similarity index 100% rename from js/src/api/types.ts rename to js/desktop/src/api/types.ts diff --git a/js/src/assets.d.ts b/js/desktop/src/assets.d.ts similarity index 100% rename from js/src/assets.d.ts rename to js/desktop/src/assets.d.ts diff --git a/js/src/autoplay_window/AutoplayApp.tsx b/js/desktop/src/autoplay_window/AutoplayApp.tsx similarity index 100% rename from js/src/autoplay_window/AutoplayApp.tsx rename to js/desktop/src/autoplay_window/AutoplayApp.tsx diff --git a/js/src/autoplay_window/index.html b/js/desktop/src/autoplay_window/index.html similarity index 100% rename from js/src/autoplay_window/index.html rename to js/desktop/src/autoplay_window/index.html diff --git a/js/src/autoplay_window/renderer.tsx b/js/desktop/src/autoplay_window/renderer.tsx similarity index 100% rename from js/src/autoplay_window/renderer.tsx rename to js/desktop/src/autoplay_window/renderer.tsx diff --git a/js/src/components/app-error-boundary.tsx b/js/desktop/src/components/app-error-boundary.tsx similarity index 100% rename from js/src/components/app-error-boundary.tsx rename to js/desktop/src/components/app-error-boundary.tsx diff --git a/js/src/components/audio/audio-level-bars.tsx b/js/desktop/src/components/audio/audio-level-bars.tsx similarity index 100% rename from js/src/components/audio/audio-level-bars.tsx rename to js/desktop/src/components/audio/audio-level-bars.tsx diff --git a/js/src/components/audio/use-audio-source.ts b/js/desktop/src/components/audio/use-audio-source.ts similarity index 100% rename from js/src/components/audio/use-audio-source.ts rename to js/desktop/src/components/audio/use-audio-source.ts diff --git a/js/src/components/composing-indicator.tsx b/js/desktop/src/components/composing-indicator.tsx similarity index 100% rename from js/src/components/composing-indicator.tsx rename to js/desktop/src/components/composing-indicator.tsx diff --git a/js/src/components/confirm-destructive-overlay.tsx b/js/desktop/src/components/confirm-destructive-overlay.tsx similarity index 100% rename from js/src/components/confirm-destructive-overlay.tsx rename to js/desktop/src/components/confirm-destructive-overlay.tsx diff --git a/js/src/components/copyable-email.tsx b/js/desktop/src/components/copyable-email.tsx similarity index 100% rename from js/src/components/copyable-email.tsx rename to js/desktop/src/components/copyable-email.tsx diff --git a/js/src/components/error-fallback.tsx b/js/desktop/src/components/error-fallback.tsx similarity index 100% rename from js/src/components/error-fallback.tsx rename to js/desktop/src/components/error-fallback.tsx diff --git a/js/src/components/keybindings-overlay.tsx b/js/desktop/src/components/keybindings-overlay.tsx similarity index 100% rename from js/src/components/keybindings-overlay.tsx rename to js/desktop/src/components/keybindings-overlay.tsx diff --git a/js/src/components/link-preview-card.tsx b/js/desktop/src/components/link-preview-card.tsx similarity index 100% rename from js/src/components/link-preview-card.tsx rename to js/desktop/src/components/link-preview-card.tsx diff --git a/js/src/components/relative-timestamp.tsx b/js/desktop/src/components/relative-timestamp.tsx similarity index 100% rename from js/src/components/relative-timestamp.tsx rename to js/desktop/src/components/relative-timestamp.tsx diff --git a/js/src/components/screen-source-picker.tsx b/js/desktop/src/components/screen-source-picker.tsx similarity index 100% rename from js/src/components/screen-source-picker.tsx rename to js/desktop/src/components/screen-source-picker.tsx diff --git a/js/src/components/ui/avatar.tsx b/js/desktop/src/components/ui/avatar.tsx similarity index 100% rename from js/src/components/ui/avatar.tsx rename to js/desktop/src/components/ui/avatar.tsx diff --git a/js/src/components/ui/badge.tsx b/js/desktop/src/components/ui/badge.tsx similarity index 100% rename from js/src/components/ui/badge.tsx rename to js/desktop/src/components/ui/badge.tsx diff --git a/js/src/components/ui/breadcrumb.tsx b/js/desktop/src/components/ui/breadcrumb.tsx similarity index 100% rename from js/src/components/ui/breadcrumb.tsx rename to js/desktop/src/components/ui/breadcrumb.tsx diff --git a/js/src/components/ui/button.tsx b/js/desktop/src/components/ui/button.tsx similarity index 100% rename from js/src/components/ui/button.tsx rename to js/desktop/src/components/ui/button.tsx diff --git a/js/src/components/ui/card.tsx b/js/desktop/src/components/ui/card.tsx similarity index 100% rename from js/src/components/ui/card.tsx rename to js/desktop/src/components/ui/card.tsx diff --git a/js/src/components/ui/checkbox.tsx b/js/desktop/src/components/ui/checkbox.tsx similarity index 100% rename from js/src/components/ui/checkbox.tsx rename to js/desktop/src/components/ui/checkbox.tsx diff --git a/js/src/components/ui/context-menu.tsx b/js/desktop/src/components/ui/context-menu.tsx similarity index 100% rename from js/src/components/ui/context-menu.tsx rename to js/desktop/src/components/ui/context-menu.tsx diff --git a/js/src/components/ui/dialog.tsx b/js/desktop/src/components/ui/dialog.tsx similarity index 100% rename from js/src/components/ui/dialog.tsx rename to js/desktop/src/components/ui/dialog.tsx diff --git a/js/src/components/ui/dropdown-menu.tsx b/js/desktop/src/components/ui/dropdown-menu.tsx similarity index 100% rename from js/src/components/ui/dropdown-menu.tsx rename to js/desktop/src/components/ui/dropdown-menu.tsx diff --git a/js/src/components/ui/input.tsx b/js/desktop/src/components/ui/input.tsx similarity index 100% rename from js/src/components/ui/input.tsx rename to js/desktop/src/components/ui/input.tsx diff --git a/js/src/components/ui/label.tsx b/js/desktop/src/components/ui/label.tsx similarity index 100% rename from js/src/components/ui/label.tsx rename to js/desktop/src/components/ui/label.tsx diff --git a/js/src/components/ui/progress.tsx b/js/desktop/src/components/ui/progress.tsx similarity index 100% rename from js/src/components/ui/progress.tsx rename to js/desktop/src/components/ui/progress.tsx diff --git a/js/src/components/ui/radio-group.tsx b/js/desktop/src/components/ui/radio-group.tsx similarity index 100% rename from js/src/components/ui/radio-group.tsx rename to js/desktop/src/components/ui/radio-group.tsx diff --git a/js/src/components/ui/scroll-area.tsx b/js/desktop/src/components/ui/scroll-area.tsx similarity index 100% rename from js/src/components/ui/scroll-area.tsx rename to js/desktop/src/components/ui/scroll-area.tsx diff --git a/js/src/components/ui/select.tsx b/js/desktop/src/components/ui/select.tsx similarity index 100% rename from js/src/components/ui/select.tsx rename to js/desktop/src/components/ui/select.tsx diff --git a/js/src/components/ui/separator.tsx b/js/desktop/src/components/ui/separator.tsx similarity index 100% rename from js/src/components/ui/separator.tsx rename to js/desktop/src/components/ui/separator.tsx diff --git a/js/src/components/ui/skeleton.tsx b/js/desktop/src/components/ui/skeleton.tsx similarity index 100% rename from js/src/components/ui/skeleton.tsx rename to js/desktop/src/components/ui/skeleton.tsx diff --git a/js/src/components/ui/slider.tsx b/js/desktop/src/components/ui/slider.tsx similarity index 100% rename from js/src/components/ui/slider.tsx rename to js/desktop/src/components/ui/slider.tsx diff --git a/js/src/components/ui/sonner.tsx b/js/desktop/src/components/ui/sonner.tsx similarity index 100% rename from js/src/components/ui/sonner.tsx rename to js/desktop/src/components/ui/sonner.tsx diff --git a/js/src/components/ui/switch.tsx b/js/desktop/src/components/ui/switch.tsx similarity index 100% rename from js/src/components/ui/switch.tsx rename to js/desktop/src/components/ui/switch.tsx diff --git a/js/src/components/ui/tabs.tsx b/js/desktop/src/components/ui/tabs.tsx similarity index 100% rename from js/src/components/ui/tabs.tsx rename to js/desktop/src/components/ui/tabs.tsx diff --git a/js/src/components/ui/toggle-group.tsx b/js/desktop/src/components/ui/toggle-group.tsx similarity index 100% rename from js/src/components/ui/toggle-group.tsx rename to js/desktop/src/components/ui/toggle-group.tsx diff --git a/js/src/components/ui/toggle.tsx b/js/desktop/src/components/ui/toggle.tsx similarity index 100% rename from js/src/components/ui/toggle.tsx rename to js/desktop/src/components/ui/toggle.tsx diff --git a/js/src/components/ui/tooltip.tsx b/js/desktop/src/components/ui/tooltip.tsx similarity index 100% rename from js/src/components/ui/tooltip.tsx rename to js/desktop/src/components/ui/tooltip.tsx diff --git a/js/src/components/ui/typography.tsx b/js/desktop/src/components/ui/typography.tsx similarity index 100% rename from js/src/components/ui/typography.tsx rename to js/desktop/src/components/ui/typography.tsx diff --git a/js/src/components/video-audio-toggle.tsx b/js/desktop/src/components/video-audio-toggle.tsx similarity index 100% rename from js/src/components/video-audio-toggle.tsx rename to js/desktop/src/components/video-audio-toggle.tsx diff --git a/js/src/components/window-controls.tsx b/js/desktop/src/components/window-controls.tsx similarity index 100% rename from js/src/components/window-controls.tsx rename to js/desktop/src/components/window-controls.tsx diff --git a/js/src/config/env.ts b/js/desktop/src/config/env.ts similarity index 100% rename from js/src/config/env.ts rename to js/desktop/src/config/env.ts diff --git a/js/src/electron.d.ts b/js/desktop/src/electron.d.ts similarity index 100% rename from js/src/electron.d.ts rename to js/desktop/src/electron.d.ts diff --git a/js/src/features/attachments/attachment-lightbox.tsx b/js/desktop/src/features/attachments/attachment-lightbox.tsx similarity index 100% rename from js/src/features/attachments/attachment-lightbox.tsx rename to js/desktop/src/features/attachments/attachment-lightbox.tsx diff --git a/js/src/features/auth/code-step.tsx b/js/desktop/src/features/auth/code-step.tsx similarity index 100% rename from js/src/features/auth/code-step.tsx rename to js/desktop/src/features/auth/code-step.tsx diff --git a/js/src/features/auth/email-step.tsx b/js/desktop/src/features/auth/email-step.tsx similarity index 100% rename from js/src/features/auth/email-step.tsx rename to js/desktop/src/features/auth/email-step.tsx diff --git a/js/src/features/auth/login-page.tsx b/js/desktop/src/features/auth/login-page.tsx similarity index 100% rename from js/src/features/auth/login-page.tsx rename to js/desktop/src/features/auth/login-page.tsx diff --git a/js/src/features/compose/attachment-strip.tsx b/js/desktop/src/features/compose/attachment-strip.tsx similarity index 100% rename from js/src/features/compose/attachment-strip.tsx rename to js/desktop/src/features/compose/attachment-strip.tsx diff --git a/js/src/features/compose/compose-overlay.tsx b/js/desktop/src/features/compose/compose-overlay.tsx similarity index 100% rename from js/src/features/compose/compose-overlay.tsx rename to js/desktop/src/features/compose/compose-overlay.tsx diff --git a/js/src/features/compose/compose-quota-indicator.tsx b/js/desktop/src/features/compose/compose-quota-indicator.tsx similarity index 100% rename from js/src/features/compose/compose-quota-indicator.tsx rename to js/desktop/src/features/compose/compose-quota-indicator.tsx diff --git a/js/src/features/compose/configure-stream-step.tsx b/js/desktop/src/features/compose/configure-stream-step.tsx similarity index 100% rename from js/src/features/compose/configure-stream-step.tsx rename to js/desktop/src/features/compose/configure-stream-step.tsx diff --git a/js/src/features/compose/recording-overlay.tsx b/js/desktop/src/features/compose/recording-overlay.tsx similarity index 100% rename from js/src/features/compose/recording-overlay.tsx rename to js/desktop/src/features/compose/recording-overlay.tsx diff --git a/js/src/features/compose/text-compose-step.tsx b/js/desktop/src/features/compose/text-compose-step.tsx similarity index 100% rename from js/src/features/compose/text-compose-step.tsx rename to js/desktop/src/features/compose/text-compose-step.tsx diff --git a/js/src/features/compose/text-editor.tsx b/js/desktop/src/features/compose/text-editor.tsx similarity index 100% rename from js/src/features/compose/text-editor.tsx rename to js/desktop/src/features/compose/text-editor.tsx diff --git a/js/src/features/compose/use-recorder.ts b/js/desktop/src/features/compose/use-recorder.ts similarity index 100% rename from js/src/features/compose/use-recorder.ts rename to js/desktop/src/features/compose/use-recorder.ts diff --git a/js/src/features/compose/use-screen-recorder.ts b/js/desktop/src/features/compose/use-screen-recorder.ts similarity index 100% rename from js/src/features/compose/use-screen-recorder.ts rename to js/desktop/src/features/compose/use-screen-recorder.ts diff --git a/js/src/features/layout.tsx b/js/desktop/src/features/layout.tsx similarity index 100% rename from js/src/features/layout.tsx rename to js/desktop/src/features/layout.tsx diff --git a/js/src/features/network-billing.tsx b/js/desktop/src/features/network-billing.tsx similarity index 100% rename from js/src/features/network-billing.tsx rename to js/desktop/src/features/network-billing.tsx diff --git a/js/src/features/network-root.tsx b/js/desktop/src/features/network-root.tsx similarity index 100% rename from js/src/features/network-root.tsx rename to js/desktop/src/features/network-root.tsx diff --git a/js/src/features/network-selector.tsx b/js/desktop/src/features/network-selector.tsx similarity index 100% rename from js/src/features/network-selector.tsx rename to js/desktop/src/features/network-selector.tsx diff --git a/js/src/features/network-settings.tsx b/js/desktop/src/features/network-settings.tsx similarity index 100% rename from js/src/features/network-settings.tsx rename to js/desktop/src/features/network-settings.tsx diff --git a/js/src/features/particles/delete-particle-overlay.tsx b/js/desktop/src/features/particles/delete-particle-overlay.tsx similarity index 100% rename from js/src/features/particles/delete-particle-overlay.tsx rename to js/desktop/src/features/particles/delete-particle-overlay.tsx diff --git a/js/src/features/particles/deleted-particle-view.tsx b/js/desktop/src/features/particles/deleted-particle-view.tsx similarity index 100% rename from js/src/features/particles/deleted-particle-view.tsx rename to js/desktop/src/features/particles/deleted-particle-view.tsx diff --git a/js/src/features/particles/fallback-particle-view.tsx b/js/desktop/src/features/particles/fallback-particle-view.tsx similarity index 100% rename from js/src/features/particles/fallback-particle-view.tsx rename to js/desktop/src/features/particles/fallback-particle-view.tsx diff --git a/js/src/features/particles/folder-view.tsx b/js/desktop/src/features/particles/folder-view.tsx similarity index 100% rename from js/src/features/particles/folder-view.tsx rename to js/desktop/src/features/particles/folder-view.tsx diff --git a/js/src/features/particles/media-particle-view.tsx b/js/desktop/src/features/particles/media-particle-view.tsx similarity index 100% rename from js/src/features/particles/media-particle-view.tsx rename to js/desktop/src/features/particles/media-particle-view.tsx diff --git a/js/src/features/particles/particle-attachments.tsx b/js/desktop/src/features/particles/particle-attachments.tsx similarity index 100% rename from js/src/features/particles/particle-attachments.tsx rename to js/desktop/src/features/particles/particle-attachments.tsx diff --git a/js/src/features/particles/particle-list-view.tsx b/js/desktop/src/features/particles/particle-list-view.tsx similarity index 100% rename from js/src/features/particles/particle-list-view.tsx rename to js/desktop/src/features/particles/particle-list-view.tsx diff --git a/js/src/features/particles/particle-preview.tsx b/js/desktop/src/features/particles/particle-preview.tsx similarity index 100% rename from js/src/features/particles/particle-preview.tsx rename to js/desktop/src/features/particles/particle-preview.tsx diff --git a/js/src/features/particles/particle-view-resolver.tsx b/js/desktop/src/features/particles/particle-view-resolver.tsx similarity index 100% rename from js/src/features/particles/particle-view-resolver.tsx rename to js/desktop/src/features/particles/particle-view-resolver.tsx diff --git a/js/src/features/particles/playback-page-indicator.tsx b/js/desktop/src/features/particles/playback-page-indicator.tsx similarity index 100% rename from js/src/features/particles/playback-page-indicator.tsx rename to js/desktop/src/features/particles/playback-page-indicator.tsx diff --git a/js/src/features/particles/reaction-bar.tsx b/js/desktop/src/features/particles/reaction-bar.tsx similarity index 100% rename from js/src/features/particles/reaction-bar.tsx rename to js/desktop/src/features/particles/reaction-bar.tsx diff --git a/js/src/features/particles/rename-stream-overlay.tsx b/js/desktop/src/features/particles/rename-stream-overlay.tsx similarity index 100% rename from js/src/features/particles/rename-stream-overlay.tsx rename to js/desktop/src/features/particles/rename-stream-overlay.tsx diff --git a/js/src/features/particles/stream-card.tsx b/js/desktop/src/features/particles/stream-card.tsx similarity index 100% rename from js/src/features/particles/stream-card.tsx rename to js/desktop/src/features/particles/stream-card.tsx diff --git a/js/src/features/particles/stream-context-menu.tsx b/js/desktop/src/features/particles/stream-context-menu.tsx similarity index 100% rename from js/src/features/particles/stream-context-menu.tsx rename to js/desktop/src/features/particles/stream-context-menu.tsx diff --git a/js/src/features/particles/stream-members-overlay.tsx b/js/desktop/src/features/particles/stream-members-overlay.tsx similarity index 100% rename from js/src/features/particles/stream-members-overlay.tsx rename to js/desktop/src/features/particles/stream-members-overlay.tsx diff --git a/js/src/features/particles/stream-presence-context.tsx b/js/desktop/src/features/particles/stream-presence-context.tsx similarity index 100% rename from js/src/features/particles/stream-presence-context.tsx rename to js/desktop/src/features/particles/stream-presence-context.tsx diff --git a/js/src/features/particles/stream-top-bar.tsx b/js/desktop/src/features/particles/stream-top-bar.tsx similarity index 100% rename from js/src/features/particles/stream-top-bar.tsx rename to js/desktop/src/features/particles/stream-top-bar.tsx diff --git a/js/src/features/particles/stream-view.tsx b/js/desktop/src/features/particles/stream-view.tsx similarity index 100% rename from js/src/features/particles/stream-view.tsx rename to js/desktop/src/features/particles/stream-view.tsx diff --git a/js/src/features/particles/text-edit-overlay.tsx b/js/desktop/src/features/particles/text-edit-overlay.tsx similarity index 100% rename from js/src/features/particles/text-edit-overlay.tsx rename to js/desktop/src/features/particles/text-edit-overlay.tsx diff --git a/js/src/features/particles/text-particle-view.tsx b/js/desktop/src/features/particles/text-particle-view.tsx similarity index 100% rename from js/src/features/particles/text-particle-view.tsx rename to js/desktop/src/features/particles/text-particle-view.tsx diff --git a/js/src/features/particles/text-reaction-input.tsx b/js/desktop/src/features/particles/text-reaction-input.tsx similarity index 100% rename from js/src/features/particles/text-reaction-input.tsx rename to js/desktop/src/features/particles/text-reaction-input.tsx diff --git a/js/src/features/particles/transcript-overlay.tsx b/js/desktop/src/features/particles/transcript-overlay.tsx similarity index 100% rename from js/src/features/particles/transcript-overlay.tsx rename to js/desktop/src/features/particles/transcript-overlay.tsx diff --git a/js/src/features/settings-page.tsx b/js/desktop/src/features/settings-page.tsx similarity index 100% rename from js/src/features/settings-page.tsx rename to js/desktop/src/features/settings-page.tsx diff --git a/js/src/features/settings/audio-video-settings-page.tsx b/js/desktop/src/features/settings/audio-video-settings-page.tsx similarity index 100% rename from js/src/features/settings/audio-video-settings-page.tsx rename to js/desktop/src/features/settings/audio-video-settings-page.tsx diff --git a/js/src/firebase.ts b/js/desktop/src/firebase.ts similarity index 100% rename from js/src/firebase.ts rename to js/desktop/src/firebase.ts diff --git a/js/src/hooks/use-billing.ts b/js/desktop/src/hooks/use-billing.ts similarity index 100% rename from js/src/hooks/use-billing.ts rename to js/desktop/src/hooks/use-billing.ts diff --git a/js/src/hooks/use-channel.ts b/js/desktop/src/hooks/use-channel.ts similarity index 100% rename from js/src/hooks/use-channel.ts rename to js/desktop/src/hooks/use-channel.ts diff --git a/js/src/hooks/use-create-particle.ts b/js/desktop/src/hooks/use-create-particle.ts similarity index 100% rename from js/src/hooks/use-create-particle.ts rename to js/desktop/src/hooks/use-create-particle.ts diff --git a/js/src/hooks/use-dock-badge.ts b/js/desktop/src/hooks/use-dock-badge.ts similarity index 100% rename from js/src/hooks/use-dock-badge.ts rename to js/desktop/src/hooks/use-dock-badge.ts diff --git a/js/src/hooks/use-download-url.ts b/js/desktop/src/hooks/use-download-url.ts similarity index 100% rename from js/src/hooks/use-download-url.ts rename to js/desktop/src/hooks/use-download-url.ts diff --git a/js/src/hooks/use-effective-device-id.ts b/js/desktop/src/hooks/use-effective-device-id.ts similarity index 100% rename from js/src/hooks/use-effective-device-id.ts rename to js/desktop/src/hooks/use-effective-device-id.ts diff --git a/js/src/hooks/use-file-input.ts b/js/desktop/src/hooks/use-file-input.ts similarity index 100% rename from js/src/hooks/use-file-input.ts rename to js/desktop/src/hooks/use-file-input.ts diff --git a/js/src/hooks/use-link-metadata.ts b/js/desktop/src/hooks/use-link-metadata.ts similarity index 100% rename from js/src/hooks/use-link-metadata.ts rename to js/desktop/src/hooks/use-link-metadata.ts diff --git a/js/src/hooks/use-media-devices.ts b/js/desktop/src/hooks/use-media-devices.ts similarity index 100% rename from js/src/hooks/use-media-devices.ts rename to js/desktop/src/hooks/use-media-devices.ts diff --git a/js/src/hooks/use-member-management.ts b/js/desktop/src/hooks/use-member-management.ts similarity index 100% rename from js/src/hooks/use-member-management.ts rename to js/desktop/src/hooks/use-member-management.ts diff --git a/js/src/hooks/use-network-usage.ts b/js/desktop/src/hooks/use-network-usage.ts similarity index 100% rename from js/src/hooks/use-network-usage.ts rename to js/desktop/src/hooks/use-network-usage.ts diff --git a/js/src/hooks/use-networks.ts b/js/desktop/src/hooks/use-networks.ts similarity index 100% rename from js/src/hooks/use-networks.ts rename to js/desktop/src/hooks/use-networks.ts diff --git a/js/src/hooks/use-particle-attachments.ts b/js/desktop/src/hooks/use-particle-attachments.ts similarity index 100% rename from js/src/hooks/use-particle-attachments.ts rename to js/desktop/src/hooks/use-particle-attachments.ts diff --git a/js/src/hooks/use-particle.ts b/js/desktop/src/hooks/use-particle.ts similarity index 100% rename from js/src/hooks/use-particle.ts rename to js/desktop/src/hooks/use-particle.ts diff --git a/js/src/hooks/use-playback-keys.ts b/js/desktop/src/hooks/use-playback-keys.ts similarity index 100% rename from js/src/hooks/use-playback-keys.ts rename to js/desktop/src/hooks/use-playback-keys.ts diff --git a/js/src/hooks/use-prefetch-adjacent-media.ts b/js/desktop/src/hooks/use-prefetch-adjacent-media.ts similarity index 100% rename from js/src/hooks/use-prefetch-adjacent-media.ts rename to js/desktop/src/hooks/use-prefetch-adjacent-media.ts diff --git a/js/src/hooks/use-presence-positions.ts b/js/desktop/src/hooks/use-presence-positions.ts similarity index 100% rename from js/src/hooks/use-presence-positions.ts rename to js/desktop/src/hooks/use-presence-positions.ts diff --git a/js/src/hooks/use-recording-mode.ts b/js/desktop/src/hooks/use-recording-mode.ts similarity index 100% rename from js/src/hooks/use-recording-mode.ts rename to js/desktop/src/hooks/use-recording-mode.ts diff --git a/js/src/hooks/use-stream-action-keys.ts b/js/desktop/src/hooks/use-stream-action-keys.ts similarity index 100% rename from js/src/hooks/use-stream-action-keys.ts rename to js/desktop/src/hooks/use-stream-action-keys.ts diff --git a/js/src/hooks/use-stream-autoplay.ts b/js/desktop/src/hooks/use-stream-autoplay.ts similarity index 100% rename from js/src/hooks/use-stream-autoplay.ts rename to js/desktop/src/hooks/use-stream-autoplay.ts diff --git a/js/src/hooks/use-stream-keyboard-nav.ts b/js/desktop/src/hooks/use-stream-keyboard-nav.ts similarity index 100% rename from js/src/hooks/use-stream-keyboard-nav.ts rename to js/desktop/src/hooks/use-stream-keyboard-nav.ts diff --git a/js/src/hooks/use-stream-navigation-keys.ts b/js/desktop/src/hooks/use-stream-navigation-keys.ts similarity index 100% rename from js/src/hooks/use-stream-navigation-keys.ts rename to js/desktop/src/hooks/use-stream-navigation-keys.ts diff --git a/js/src/hooks/use-stream-particles.ts b/js/desktop/src/hooks/use-stream-particles.ts similarity index 100% rename from js/src/hooks/use-stream-particles.ts rename to js/desktop/src/hooks/use-stream-particles.ts diff --git a/js/src/hooks/use-stream-playback.ts b/js/desktop/src/hooks/use-stream-playback.ts similarity index 100% rename from js/src/hooks/use-stream-playback.ts rename to js/desktop/src/hooks/use-stream-playback.ts diff --git a/js/src/hooks/use-suspend-playback.ts b/js/desktop/src/hooks/use-suspend-playback.ts similarity index 100% rename from js/src/hooks/use-suspend-playback.ts rename to js/desktop/src/hooks/use-suspend-playback.ts diff --git a/js/src/hooks/use-transcript-playback.ts b/js/desktop/src/hooks/use-transcript-playback.ts similarity index 100% rename from js/src/hooks/use-transcript-playback.ts rename to js/desktop/src/hooks/use-transcript-playback.ts diff --git a/js/src/huddle_window/HuddleApp.tsx b/js/desktop/src/huddle_window/HuddleApp.tsx similarity index 100% rename from js/src/huddle_window/HuddleApp.tsx rename to js/desktop/src/huddle_window/HuddleApp.tsx diff --git a/js/src/huddle_window/index.html b/js/desktop/src/huddle_window/index.html similarity index 100% rename from js/src/huddle_window/index.html rename to js/desktop/src/huddle_window/index.html diff --git a/js/src/huddle_window/renderer.tsx b/js/desktop/src/huddle_window/renderer.tsx similarity index 100% rename from js/src/huddle_window/renderer.tsx rename to js/desktop/src/huddle_window/renderer.tsx diff --git a/js/src/index.css b/js/desktop/src/index.css similarity index 100% rename from js/src/index.css rename to js/desktop/src/index.css diff --git a/js/src/lib/autoplay-ipc.ts b/js/desktop/src/lib/autoplay-ipc.ts similarity index 100% rename from js/src/lib/autoplay-ipc.ts rename to js/desktop/src/lib/autoplay-ipc.ts diff --git a/js/src/lib/constants.ts b/js/desktop/src/lib/constants.ts similarity index 100% rename from js/src/lib/constants.ts rename to js/desktop/src/lib/constants.ts diff --git a/js/src/lib/errors.ts b/js/desktop/src/lib/errors.ts similarity index 100% rename from js/src/lib/errors.ts rename to js/desktop/src/lib/errors.ts diff --git a/js/src/lib/firestore-particles.ts b/js/desktop/src/lib/firestore-particles.ts similarity index 100% rename from js/src/lib/firestore-particles.ts rename to js/desktop/src/lib/firestore-particles.ts diff --git a/js/src/lib/humans.ts b/js/desktop/src/lib/humans.ts similarity index 100% rename from js/src/lib/humans.ts rename to js/desktop/src/lib/humans.ts diff --git a/js/src/lib/image-thumbnail.ts b/js/desktop/src/lib/image-thumbnail.ts similarity index 100% rename from js/src/lib/image-thumbnail.ts rename to js/desktop/src/lib/image-thumbnail.ts diff --git a/js/src/lib/keyboard.ts b/js/desktop/src/lib/keyboard.ts similarity index 100% rename from js/src/lib/keyboard.ts rename to js/desktop/src/lib/keyboard.ts diff --git a/js/src/lib/link-metadata.ts b/js/desktop/src/lib/link-metadata.ts similarity index 100% rename from js/src/lib/link-metadata.ts rename to js/desktop/src/lib/link-metadata.ts diff --git a/js/src/lib/particle-path.ts b/js/desktop/src/lib/particle-path.ts similarity index 100% rename from js/src/lib/particle-path.ts rename to js/desktop/src/lib/particle-path.ts diff --git a/js/src/lib/platform.ts b/js/desktop/src/lib/platform.ts similarity index 100% rename from js/src/lib/platform.ts rename to js/desktop/src/lib/platform.ts diff --git a/js/src/lib/pusher-client.ts b/js/desktop/src/lib/pusher-client.ts similarity index 100% rename from js/src/lib/pusher-client.ts rename to js/desktop/src/lib/pusher-client.ts diff --git a/js/src/lib/pusher-provider.tsx b/js/desktop/src/lib/pusher-provider.tsx similarity index 100% rename from js/src/lib/pusher-provider.tsx rename to js/desktop/src/lib/pusher-provider.tsx diff --git a/js/src/lib/query-client.ts b/js/desktop/src/lib/query-client.ts similarity index 100% rename from js/src/lib/query-client.ts rename to js/desktop/src/lib/query-client.ts diff --git a/js/src/lib/random-name.ts b/js/desktop/src/lib/random-name.ts similarity index 100% rename from js/src/lib/random-name.ts rename to js/desktop/src/lib/random-name.ts diff --git a/js/src/lib/sentry.ts b/js/desktop/src/lib/sentry.ts similarity index 100% rename from js/src/lib/sentry.ts rename to js/desktop/src/lib/sentry.ts diff --git a/js/src/lib/sound-effects/engine.ts b/js/desktop/src/lib/sound-effects/engine.ts similarity index 100% rename from js/src/lib/sound-effects/engine.ts rename to js/desktop/src/lib/sound-effects/engine.ts diff --git a/js/src/lib/sound-effects/sound-effects-provider.tsx b/js/desktop/src/lib/sound-effects/sound-effects-provider.tsx similarity index 100% rename from js/src/lib/sound-effects/sound-effects-provider.tsx rename to js/desktop/src/lib/sound-effects/sound-effects-provider.tsx diff --git a/js/src/lib/sound-effects/sounds.ts b/js/desktop/src/lib/sound-effects/sounds.ts similarity index 100% rename from js/src/lib/sound-effects/sounds.ts rename to js/desktop/src/lib/sound-effects/sounds.ts diff --git a/js/src/lib/sound-effects/use-sound-effect.ts b/js/desktop/src/lib/sound-effects/use-sound-effect.ts similarity index 100% rename from js/src/lib/sound-effects/use-sound-effect.ts rename to js/desktop/src/lib/sound-effects/use-sound-effect.ts diff --git a/js/src/lib/stream-visibility.ts b/js/desktop/src/lib/stream-visibility.ts similarity index 100% rename from js/src/lib/stream-visibility.ts rename to js/desktop/src/lib/stream-visibility.ts diff --git a/js/src/lib/time-utils.ts b/js/desktop/src/lib/time-utils.ts similarity index 100% rename from js/src/lib/time-utils.ts rename to js/desktop/src/lib/time-utils.ts diff --git a/js/src/lib/utils.ts b/js/desktop/src/lib/utils.ts similarity index 100% rename from js/src/lib/utils.ts rename to js/desktop/src/lib/utils.ts diff --git a/js/src/main.ts b/js/desktop/src/main.ts similarity index 100% rename from js/src/main.ts rename to js/desktop/src/main.ts diff --git a/js/src/main/ipc-utils.ts b/js/desktop/src/main/ipc-utils.ts similarity index 100% rename from js/src/main/ipc-utils.ts rename to js/desktop/src/main/ipc-utils.ts diff --git a/js/src/main/sentry.ts b/js/desktop/src/main/sentry.ts similarity index 100% rename from js/src/main/sentry.ts rename to js/desktop/src/main/sentry.ts diff --git a/js/src/preload.ts b/js/desktop/src/preload.ts similarity index 100% rename from js/src/preload.ts rename to js/desktop/src/preload.ts diff --git a/js/src/renderer.tsx b/js/desktop/src/renderer.tsx similarity index 100% rename from js/src/renderer.tsx rename to js/desktop/src/renderer.tsx diff --git a/js/src/screen_record_window/ScreenRecordControlApp.tsx b/js/desktop/src/screen_record_window/ScreenRecordControlApp.tsx similarity index 100% rename from js/src/screen_record_window/ScreenRecordControlApp.tsx rename to js/desktop/src/screen_record_window/ScreenRecordControlApp.tsx diff --git a/js/src/screen_record_window/index.html b/js/desktop/src/screen_record_window/index.html similarity index 100% rename from js/src/screen_record_window/index.html rename to js/desktop/src/screen_record_window/index.html diff --git a/js/src/screen_record_window/renderer.tsx b/js/desktop/src/screen_record_window/renderer.tsx similarity index 100% rename from js/src/screen_record_window/renderer.tsx rename to js/desktop/src/screen_record_window/renderer.tsx diff --git a/js/src/stores/auth-store.ts b/js/desktop/src/stores/auth-store.ts similarity index 100% rename from js/src/stores/auth-store.ts rename to js/desktop/src/stores/auth-store.ts diff --git a/js/src/stores/autoplay-store.ts b/js/desktop/src/stores/autoplay-store.ts similarity index 100% rename from js/src/stores/autoplay-store.ts rename to js/desktop/src/stores/autoplay-store.ts diff --git a/js/src/stores/media-devices-store.ts b/js/desktop/src/stores/media-devices-store.ts similarity index 100% rename from js/src/stores/media-devices-store.ts rename to js/desktop/src/stores/media-devices-store.ts diff --git a/js/src/stores/media-settings-store.ts b/js/desktop/src/stores/media-settings-store.ts similarity index 100% rename from js/src/stores/media-settings-store.ts rename to js/desktop/src/stores/media-settings-store.ts diff --git a/js/src/stores/playback-pause-store.ts b/js/desktop/src/stores/playback-pause-store.ts similarity index 100% rename from js/src/stores/playback-pause-store.ts rename to js/desktop/src/stores/playback-pause-store.ts diff --git a/js/src/stores/session-store.ts b/js/desktop/src/stores/session-store.ts similarity index 100% rename from js/src/stores/session-store.ts rename to js/desktop/src/stores/session-store.ts diff --git a/js/src/stores/sound-effects-store.ts b/js/desktop/src/stores/sound-effects-store.ts similarity index 100% rename from js/src/stores/sound-effects-store.ts rename to js/desktop/src/stores/sound-effects-store.ts diff --git a/js/src/styles/globals.css b/js/desktop/src/styles/globals.css similarity index 100% rename from js/src/styles/globals.css rename to js/desktop/src/styles/globals.css diff --git a/js/src/vite-env.d.ts b/js/desktop/src/vite-env.d.ts similarity index 100% rename from js/src/vite-env.d.ts rename to js/desktop/src/vite-env.d.ts diff --git a/js/tsconfig.json b/js/desktop/tsconfig.json similarity index 100% rename from js/tsconfig.json rename to js/desktop/tsconfig.json diff --git a/js/vite.autoplay.config.mts b/js/desktop/vite.autoplay.config.mts similarity index 100% rename from js/vite.autoplay.config.mts rename to js/desktop/vite.autoplay.config.mts diff --git a/js/vite.env.ts b/js/desktop/vite.env.ts similarity index 100% rename from js/vite.env.ts rename to js/desktop/vite.env.ts diff --git a/js/vite.huddle.config.mts b/js/desktop/vite.huddle.config.mts similarity index 100% rename from js/vite.huddle.config.mts rename to js/desktop/vite.huddle.config.mts diff --git a/js/vite.main.config.ts b/js/desktop/vite.main.config.ts similarity index 100% rename from js/vite.main.config.ts rename to js/desktop/vite.main.config.ts diff --git a/js/vite.preload.config.ts b/js/desktop/vite.preload.config.ts similarity index 100% rename from js/vite.preload.config.ts rename to js/desktop/vite.preload.config.ts diff --git a/js/vite.renderer.config.mts b/js/desktop/vite.renderer.config.mts similarity index 100% rename from js/vite.renderer.config.mts rename to js/desktop/vite.renderer.config.mts diff --git a/js/vite.screen-record.config.mts b/js/desktop/vite.screen-record.config.mts similarity index 100% rename from js/vite.screen-record.config.mts rename to js/desktop/vite.screen-record.config.mts diff --git a/js/yarn.lock b/js/desktop/yarn.lock similarity index 100% rename from js/yarn.lock rename to js/desktop/yarn.lock