Repository navigation
feat: bring desktop Studio UI and local playback to web #614
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| name: Recording Reliability | |
| on: | |
| workflow_dispatch: | |
| pull_request: | |
| paths: | |
| - "apps/chrome-extension/**" | |
| - "apps/web/**" | |
| - "apps/media-server/**" | |
| - "packages/editor-solid-web/**" | |
| - "packages/editor-cap-bundle/**" | |
| - "packages/recorder-core/**" | |
| - "packages/database/**" | |
| - "packages/web-*/**" | |
| - "crates/recording/**" | |
| - "crates/rendering/src/shaders/**" | |
| - "bun.lock" | |
| - ".github/workflows/recording-reliability.yml" | |
| push: | |
| branches: [main] | |
| paths: | |
| - "apps/chrome-extension/**" | |
| - "apps/web/**" | |
| - "apps/media-server/**" | |
| - "packages/editor-solid-web/**" | |
| - "packages/editor-cap-bundle/**" | |
| - "packages/recorder-core/**" | |
| - "packages/database/**" | |
| - "packages/web-*/**" | |
| - "crates/recording/**" | |
| - "crates/rendering/src/shaders/**" | |
| - "bun.lock" | |
| - ".github/workflows/recording-reliability.yml" | |
| permissions: | |
| contents: read | |
| concurrency: | |
| group: recording-reliability-${{ github.head_ref || github.ref_name }} | |
| cancel-in-progress: true | |
| jobs: | |
| browser-cap-import: | |
| name: Web editor recording folder import (Chromium/WebKit) | |
| runs-on: ubuntu-24.04 | |
| timeout-minutes: 15 | |
| steps: | |
| - uses: actions/checkout@11d5960a326750d5838078e36cf38b85af677262 | |
| - uses: ./.github/actions/setup-js | |
| - name: Install Playwright browsers | |
| run: bunx playwright install --with-deps chromium webkit | |
| - name: Replay browser recording import | |
| run: bun run --filter @cap/media-server test:browser-cap-import | |
| - name: Replay long captions in Chromium and WebKit | |
| run: bun apps/media-server/src/__tests__/routes/editor-caption-cache-browser-replay.ts | |
| browser-studio-compositor: | |
| name: Web Studio local compositor (${{ matrix.browser }}) | |
| strategy: | |
| fail-fast: false | |
| matrix: | |
| include: | |
| - browser: chromium | |
| runner: ubuntu-24.04 | |
| headed: "0" | |
| - browser: firefox | |
| runner: ubuntu-24.04 | |
| headed: "1" | |
| - browser: webkit | |
| runner: macos-15 | |
| headed: "1" | |
| runs-on: ${{ matrix.runner }} | |
| timeout-minutes: 15 | |
| steps: | |
| - uses: actions/checkout@11d5960a326750d5838078e36cf38b85af677262 | |
| - uses: ./.github/actions/setup-js | |
| - name: Install browser on Ubuntu | |
| if: matrix.browser != 'webkit' | |
| run: bunx playwright install --with-deps ${{ matrix.browser }} | |
| - name: Install WebKit on macOS | |
| if: matrix.browser == 'webkit' | |
| run: bunx playwright install webkit | |
| - name: Build browser compositor replay | |
| run: bunx vite build --config packages/editor-solid-web/browser-replay/vite.config.ts | |
| - name: Replay separate screen and camera clips on the local GPU | |
| if: matrix.browser != 'firefox' | |
| run: bun packages/editor-solid-web/browser-replay/replay.cjs ${{ matrix.browser }} | |
| env: | |
| CAP_REPLAY_HEADED: ${{ matrix.headed }} | |
| - name: Check screen and camera frame parity at 8x | |
| if: matrix.browser != 'firefox' | |
| run: bun packages/editor-solid-web/browser-replay/replay.cjs ${{ matrix.browser }} | |
| env: | |
| CAP_REPLAY_HEADED: ${{ matrix.headed }} | |
| CAP_REPLAY_INDEXED: "1" | |
| - name: Replay Firefox clips through software WebGL under Xvfb | |
| if: matrix.browser == 'firefox' | |
| run: xvfb-run -a bun packages/editor-solid-web/browser-replay/replay.cjs firefox | |
| env: | |
| CAP_REPLAY_HEADED: ${{ matrix.headed }} | |
| - name: Check Firefox screen and camera frame parity at 8x | |
| if: matrix.browser == 'firefox' | |
| run: xvfb-run -a bun packages/editor-solid-web/browser-replay/replay.cjs firefox | |
| env: | |
| CAP_REPLAY_HEADED: ${{ matrix.headed }} | |
| CAP_REPLAY_INDEXED: "1" | |
| - name: Stress continuous HTML video playback on a slow decoder | |
| run: | | |
| if [ "${{ matrix.browser }}" = "firefox" ]; then | |
| xvfb-run -a bun packages/editor-solid-web/browser-replay/replay.cjs firefox | |
| else | |
| bun packages/editor-solid-web/browser-replay/replay.cjs ${{ matrix.browser }} | |
| fi | |
| env: | |
| CAP_REPLAY_HEADED: ${{ matrix.headed }} | |
| CAP_REPLAY_FORCE_HTML: "1" | |
| CAP_REPLAY_SLOW_HTML: "1" | |
| browser-studio-webgpu: | |
| name: Web Studio GPU auto-selection (Chromium Intel macOS) | |
| runs-on: macos-15-intel | |
| timeout-minutes: 15 | |
| steps: | |
| - uses: actions/checkout@11d5960a326750d5838078e36cf38b85af677262 | |
| - uses: ./.github/actions/setup-js | |
| - name: Install Chromium on macOS | |
| run: bunx playwright install chromium | |
| - name: Build browser compositor replay | |
| run: bunx vite build --config packages/editor-solid-web/browser-replay/vite.config.ts | |
| - name: Replay paired clips with visible GPU output | |
| run: bun packages/editor-solid-web/browser-replay/replay.cjs chromium | |
| env: | |
| CAP_REPLAY_HEADED: "1" | |
| CAP_REPLAY_REQUIRE_WEBGPU: "1" | |
| CAP_REPLAY_ALLOW_AUTO_FALLBACK: "1" | |
| - name: Check visible screen and camera frame parity at 8x | |
| run: bun packages/editor-solid-web/browser-replay/replay.cjs chromium | |
| env: | |
| CAP_REPLAY_HEADED: "1" | |
| CAP_REPLAY_INDEXED: "1" | |
| CAP_REPLAY_REQUIRE_WEBGPU: "1" | |
| CAP_REPLAY_ALLOW_AUTO_FALLBACK: "1" | |
| browser-studio-intel-webgl: | |
| name: Web Studio WebGL2 fallback (Chromium Intel macOS) | |
| runs-on: macos-15-intel | |
| timeout-minutes: 15 | |
| steps: | |
| - uses: actions/checkout@11d5960a326750d5838078e36cf38b85af677262 | |
| - uses: ./.github/actions/setup-js | |
| - name: Install Chromium on macOS | |
| run: bunx playwright install chromium | |
| - name: Build browser compositor replay | |
| run: bunx vite build --config packages/editor-solid-web/browser-replay/vite.config.ts | |
| - name: Check visible WebGL2 fallback and paired 8x frame parity | |
| run: bun packages/editor-solid-web/browser-replay/replay.cjs chromium | |
| env: | |
| CAP_REPLAY_HEADED: "1" | |
| CAP_REPLAY_INDEXED: "1" | |
| CAP_REPLAY_ONLY_WEBGL: "1" | |
| browser-studio-arm-webgpu: | |
| name: Web Studio hardware WebGPU and probe fallback (Chromium arm64 macOS) | |
| runs-on: macos-15 | |
| timeout-minutes: 15 | |
| steps: | |
| - uses: actions/checkout@11d5960a326750d5838078e36cf38b85af677262 | |
| - uses: ./.github/actions/setup-js | |
| - name: Install Chromium on macOS | |
| run: bunx playwright install chromium | |
| - name: Build browser compositor replay | |
| run: bunx vite build --config packages/editor-solid-web/browser-replay/vite.config.ts | |
| - name: Require healthy WebGPU playback | |
| run: bun packages/editor-solid-web/browser-replay/replay.cjs chromium | |
| env: | |
| CAP_REPLAY_HEADED: "1" | |
| CAP_REPLAY_REQUIRE_WEBGPU: "1" | |
| - name: Require WebGL2 after a failed presentation probe | |
| run: bun packages/editor-solid-web/browser-replay/replay.cjs chromium | |
| env: | |
| CAP_REPLAY_HEADED: "1" | |
| CAP_REPLAY_SIMULATE_FAILED_PROBE: "1" | |
| browser-paired-recording: | |
| name: Web recorder paired capture (${{ matrix.browser }}) | |
| strategy: | |
| fail-fast: false | |
| matrix: | |
| include: | |
| - browser: chromium | |
| runner: ubuntu-24.04 | |
| headed: false | |
| - browser: webkit | |
| runner: macos-15-intel | |
| headed: true | |
| runs-on: ${{ matrix.runner }} | |
| timeout-minutes: 15 | |
| steps: | |
| - uses: actions/checkout@11d5960a326750d5838078e36cf38b85af677262 | |
| - uses: ./.github/actions/setup-js | |
| - name: Install Chromium | |
| if: matrix.browser == 'chromium' | |
| run: bunx playwright install --with-deps chromium | |
| - name: Install WebKit | |
| if: matrix.browser == 'webkit' | |
| run: bunx playwright install webkit | |
| - name: Replay paired web recorder capture | |
| working-directory: apps/web | |
| run: bun __tests__/web-recorder-paired-browser-replay.mjs ${{ matrix.browser }} | |
| env: | |
| CAP_REPLAY_HEADED: ${{ matrix.headed }} | |
| extension-paired-recording: | |
| name: Chrome extension paired capture and recovery (Chromium) | |
| runs-on: ubuntu-24.04 | |
| timeout-minutes: 15 | |
| steps: | |
| - uses: actions/checkout@11d5960a326750d5838078e36cf38b85af677262 | |
| - uses: ./.github/actions/setup-js | |
| - name: Install Chromium | |
| run: bunx playwright install --with-deps chromium | |
| - name: Build Chrome extension | |
| run: bun run --filter @cap/chrome-extension build | |
| - name: Verify private tab input is omitted | |
| working-directory: apps/chrome-extension | |
| run: bun src/content/input-events-browser-replay.ts | |
| - name: Replay paired capture and recovery in the built extension | |
| working-directory: apps/chrome-extension | |
| run: | | |
| bunx playwright test e2e/recording-upload.spec.ts \ | |
| --grep 'records a separate camera sidecar|keeps screen-only Instant recordings working without a webcam|recovers an offscreen start response lost|offers separate clip downloads|recovers camera, microphone and screen spools|uploads a camera multipart part during a long recording on a constrained network|hides confirmed uploaded backups from the options recovery list' | |
| recording-contract: | |
| name: Recording ownership, preservation, and recovery | |
| runs-on: ubuntu-24.04 | |
| timeout-minutes: 15 | |
| steps: | |
| - uses: actions/checkout@11d5960a326750d5838078e36cf38b85af677262 | |
| - uses: ./.github/actions/setup-js | |
| - name: Verify recording contracts | |
| working-directory: apps/web | |
| run: | | |
| bun run vitest run \ | |
| __tests__/editor-image-file.test.ts \ | |
| __tests__/unit/audio-level-publication.test.ts \ | |
| __tests__/unit/recording-output.test.ts \ | |
| __tests__/unit/recording-storage-lifecycle.test.ts \ | |
| __tests__/unit/desktop-recording-*.test.ts \ | |
| __tests__/unit/desktop-segments-*.test.ts \ | |
| __tests__/unit/finalize-desktop-recording.test.ts \ | |
| __tests__/unit/media-server-progress.test.ts \ | |
| __tests__/unit/media-processing-budget.test.ts \ | |
| __tests__/unit/playback-source.test.ts \ | |
| __tests__/unit/share-page-loading.test.ts \ | |
| __tests__/unit/media-player-store-refs.test.ts \ | |
| __tests__/unit/video-edit-processing.test.ts \ | |
| __tests__/unit/video-edit-published-output.test.ts \ | |
| __tests__/unit/upload-progress-playback.test.ts \ | |
| __tests__/unit/recording-prepare.test.ts \ | |
| __tests__/unit/s3-bucket-connections.test.ts | |
| - name: Verify browser Solid caption cache | |
| run: bun --conditions=browser test packages/editor-solid-web/src/tauri-bridge.test.ts |