Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
97 commits
Select commit Hold shift + click to select a range
6a7ca6e
build: wire Linux capture dependencies and GPUI patches
richiemcilroy Aug 30, 2026
3feb85d
fix: preserve requested media and recording lifecycle
richiemcilroy Aug 30, 2026
297200b
fix: drain software output and count distinct preview frames
richiemcilroy Aug 30, 2026
2388931
perf: use compact thumbnails for editor backgrounds
richiemcilroy Aug 30, 2026
5f5e216
fix: correct desktop platform build guards
richiemcilroy Aug 30, 2026
ed6328e
fix: regenerate native capture bindings for desktop startup
richiemcilroy Aug 30, 2026
1617a74
fix: speed up clean recording finalization and reveal the editor
richiemcilroy Aug 30, 2026
7af8b85
fix: let DASH own manifest publication on Windows
richiemcilroy Aug 30, 2026
9355fe0
fix: scope Wayland stop routes to Linux and tests
richiemcilroy Aug 30, 2026
6d64ffd
test: wait for a published DASH segment before fault injection
richiemcilroy Aug 30, 2026
0efe813
fix: preserve access to valid 0.5.9 recordings with omitted tracks
richiemcilroy Aug 30, 2026
ca52333
fix: monitor macOS capture failures before completing uploads
richiemcilroy Aug 30, 2026
9bb0e36
fix: surface recording errors in the GPUI controls
richiemcilroy Aug 30, 2026
8ae3ef3
fix: retain the editor destination when restarting a recording
richiemcilroy Aug 30, 2026
fa3c3af
test: fix Windows recording harness compilation
richiemcilroy Aug 30, 2026
f79e084
test: release the recovery lock before inspecting its file
richiemcilroy Aug 30, 2026
6ae38bc
fix: reduce recording snapshot hashing overhead
richiemcilroy Aug 30, 2026
9f38f19
fix: release recovery locks inherited by child processes
richiemcilroy Aug 30, 2026
15dc698
fix: defer disposable recording staging flushes
richiemcilroy Aug 30, 2026
2631653
fix: propagate macOS Instant audio finalization failures
richiemcilroy Aug 30, 2026
c871d2f
fix: avoid full video decoding after clean Instant stops
richiemcilroy Aug 30, 2026
82a1290
fix: validate clean recording fragments while remuxing
richiemcilroy Aug 30, 2026
3469c99
fix: preserve macOS shared capture stop ordering
richiemcilroy Aug 30, 2026
526dc80
fix: preserve saved recordings when temporary cleanup fails
richiemcilroy Aug 30, 2026
7f4506c
fix: preserve recording metadata during failed saves
richiemcilroy Aug 30, 2026
6124114
fix: withhold incomplete recording upload completion
richiemcilroy Aug 30, 2026
9d68bb3
test: add shared recording reliability checks
richiemcilroy Aug 30, 2026
a7cc600
test: include Windows recording process supervision
richiemcilroy Aug 30, 2026
e8c2616
fix: replace Windows recording metadata with open readers
richiemcilroy Aug 30, 2026
7e3b355
improve: avoid a redundant clean recording source scan
richiemcilroy Aug 30, 2026
3dd86ca
test: preserve input timestamps in recording verification
richiemcilroy Aug 30, 2026
0ff3240
fix: omit account identity from plan fetch logs
richiemcilroy Aug 30, 2026
4d896fa
fix: verify remote recording content and upload identity
richiemcilroy Aug 31, 2026
8e64483
fix: require verified upload receipts before desktop cleanup
richiemcilroy Aug 31, 2026
743ae25
fix: share recording upload ownership and verification contracts
richiemcilroy Aug 31, 2026
7c17b79
fix: retain and resume verified GPUI recording uploads
richiemcilroy Aug 31, 2026
afcfe88
fix: retain automation recordings without verified uploads
richiemcilroy Aug 31, 2026
35a2ac6
fix: prevent Instant export repair from racing active uploads
richiemcilroy Aug 31, 2026
4311d3e
ci: retain signed desktop packages for native release testing
richiemcilroy Aug 31, 2026
06922ca
docs: record upload durability design and native release gates
richiemcilroy Aug 31, 2026
fe3f6fd
fix: bind recording receipts to verified audio coverage
richiemcilroy Aug 31, 2026
699e7de
fix: preserve Tauri recordings through upload retry and cancellation
richiemcilroy Aug 31, 2026
236be4e
ci: verify recording integrity with production media dependencies
richiemcilroy Aug 31, 2026
22ec1ac
ci: retain updater signatures with release test packages
richiemcilroy Aug 31, 2026
31808b1
fix: redact signed upload URLs from persisted GPUI errors
richiemcilroy Aug 31, 2026
bdf4a89
test: inspect decoder cleanup in minimal Linux images
richiemcilroy Aug 31, 2026
707fe9f
fix: preserve upload lock permissions without Windows warnings
richiemcilroy Aug 31, 2026
a9470e0
test: keep upload redaction failures free of secret values
richiemcilroy Aug 31, 2026
d23ed2a
fix: preserve active macOS GPUI instances on relaunch
richiemcilroy Aug 31, 2026
4c11c25
fix: acknowledge Linux recording window visibility synchronously
richiemcilroy Aug 31, 2026
ab4716f
fix: serialize recording menu creation and popup
richiemcilroy Aug 31, 2026
f3d6563
fix: open recording checkpoint files with Windows flush access
richiemcilroy Aug 31, 2026
6de3052
fix: select Linux recording windows beneath the picker
richiemcilroy Aug 31, 2026
53e2354
fix: preserve Instant recording ownership through recovery
richiemcilroy Aug 31, 2026
009be2b
fix: drain buffered Linux window events before waiting
richiemcilroy Aug 31, 2026
41f2f5d
fix: release X11 borrows before window close callbacks
richiemcilroy Aug 31, 2026
fff19ce
fix: reconnect GPUI camera preview after recording
richiemcilroy Aug 31, 2026
ff72219
fix: align GPUI recording controls and device persistence
richiemcilroy Aug 31, 2026
f2a8ab4
fix: restore GPUI zoom placement and scene previews
richiemcilroy Aug 31, 2026
6e38f61
test: stabilize macOS singleton process fixtures
richiemcilroy Aug 31, 2026
24c75ae
fix: preserve editor projects during MP4 clip imports
richiemcilroy Aug 31, 2026
218d3d7
fix: make GPUI shutdown and recording controls safe
richiemcilroy Aug 31, 2026
1c53429
fix: apply saved GPUI device formats with readiness checks
richiemcilroy Aug 31, 2026
32f9130
fix: keep recording windows reachable across macOS displays
richiemcilroy Aug 31, 2026
e0ff00e
fix: protect recording finalization across desktop lifecycle actions
richiemcilroy Aug 31, 2026
00ddf06
fix: clarify capture warnings and desktop handoff
richiemcilroy Aug 31, 2026
6ba1062
improve: make animated backgrounds visibly responsive
richiemcilroy Aug 31, 2026
5461153
fix: normalize native Quit results on Intel macOS
richiemcilroy Aug 31, 2026
75b4f4e
chore: pin reviewed release and sync workflow actions
richiemcilroy Aug 31, 2026
24b8e32
improve: compact GPUI recorder layout and unify source hover
richiemcilroy Aug 31, 2026
d189567
fix: restore GPUI controls after editor deletion
richiemcilroy Aug 31, 2026
e834857
fix: forward macOS relaunch requests to the running recorder
richiemcilroy Aug 31, 2026
a0eda87
test: match saved aspect ratio without equality trait
richiemcilroy Aug 31, 2026
290dafc
test: isolate AppImage launcher process fixtures
richiemcilroy Aug 31, 2026
d12196a
fix: propagate confirmed muxer failure without losing capture ownership
richiemcilroy Aug 31, 2026
97653d9
fix: preserve recorder lifecycle during onboarding and native close
richiemcilroy Aug 31, 2026
66b260a
feat: align GPUI onboarding with the Tauri guided tour
richiemcilroy Aug 31, 2026
4feab05
fix: notarize and verify release disk images before upload
richiemcilroy Aug 31, 2026
3b97ac8
fix: correct Windows recorder activation display lookup
richiemcilroy Aug 31, 2026
c9059c3
fix: restore GPUI recorder interaction parity
richiemcilroy Sep 1, 2026
6560beb
fix: isolate recording unit tests in CI
richiemcilroy Sep 1, 2026
74746fb
fix: restore GPUI recorder icons and input feedback
richiemcilroy Sep 1, 2026
a5af7b3
fix: guard rapid GPUI Dock visibility transitions
richiemcilroy Sep 1, 2026
94cdc7a
fix: retire Tauri Dock presence during GPUI handoff
richiemcilroy Sep 1, 2026
d111614
fix: keep camera masks aligned with preview bounds
richiemcilroy Sep 1, 2026
f76d611
fix: show microphone levels in capture overlays
richiemcilroy Sep 1, 2026
462619f
fix: fit GPUI menus and library content within windows
richiemcilroy Sep 1, 2026
a34af77
fix: center desktop sign-in confirmation
richiemcilroy Sep 1, 2026
1a2d22b
fix: recover malformed camera preferences on startup
richiemcilroy Sep 1, 2026
04c7c69
feat: add optional text layer backgrounds
richiemcilroy Sep 1, 2026
ff54c95
fix: correct canvas resize cursor directions
richiemcilroy Sep 1, 2026
900301d
fix: restore desktop title and recording window interactions
richiemcilroy Sep 1, 2026
8d49546
fix: sign and verify every Windows release executable
richiemcilroy Sep 1, 2026
657e0f1
fix: implement native GPUI clipboard transfers
richiemcilroy Sep 1, 2026
60bad80
fix: preserve custom cursor detail when scaled down
richiemcilroy Sep 1, 2026
0733e79
fix: preserve GPUI patch line endings on Windows
richiemcilroy Sep 1, 2026
b02cf38
fix: retry transient macOS package timestamp failures
richiemcilroy Sep 1, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions .gitattributes
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
/apps/desktop-gpui/patches/*.patch text eol=lf
9 changes: 7 additions & 2 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -32,6 +32,7 @@ jobs:
with:
filters: |
desktop:
- '.gitattributes'
- '.github/actions/install-desktop-deps/**'
- '.github/workflows/ci.yml'
- 'apps/cli/**'
Expand All @@ -44,7 +45,8 @@ jobs:
- 'packages/web-api-contract/**'
- 'scripts/build-desktop-binaries*'
- 'scripts/build-gpui-binary.sh'
- 'scripts/prepare-gpui-dependency.sh'
- 'scripts/build-macos-packages*'
- 'scripts/prepare-gpui-dependency*'
- 'scripts/run-gpui-build*'
- 'scripts/sync-desktop-versions.mjs'
- 'scripts/verify-gpui-release-inputs.mjs'
Expand Down Expand Up @@ -233,6 +235,9 @@ jobs:
- name: Checkout repository
uses: actions/checkout@v4

- name: Test desktop build preparation
run: node --test scripts/prepare-gpui-dependency.test.mjs scripts/build-macos-packages.test.mjs

- name: Install Linux desktop dependencies
if: ${{ runner.os == 'Linux' }}
uses: ./.github/actions/install-desktop-deps
Expand Down Expand Up @@ -282,7 +287,7 @@ jobs:
pnpm --dir apps/desktop exec vitest run scripts/prepare.test.js
cargo test --locked -p cap-utils -p cap-cli-install --lib
cargo test --locked -p cap --bin cap record::tests
cargo test --locked -p cap-recording --lib
cargo test --locked -p cap-recording --lib -- --test-threads=1
cargo test --locked -p cap-enc-ffmpeg
env:
LD_LIBRARY_PATH: ${{ format('{0}/target/native-deps/lib:{0}/target/debug:{0}/target/{1}/debug', github.workspace, matrix.settings.target) }}
Expand Down
154 changes: 137 additions & 17 deletions .github/workflows/desktop-release.yml
Original file line number Diff line number Diff line change
Expand Up @@ -218,6 +218,14 @@ jobs:
with:
ref: ${{ inputs.sha }}

- name: Test GPUI patch checkout
if: ${{ hashFiles('scripts/prepare-gpui-dependency.test.mjs') != '' }}
run: node --test scripts/prepare-gpui-dependency.test.mjs

- name: Test macOS packaging retries
if: ${{ hashFiles('scripts/build-macos-packages.test.mjs') != '' }}
run: node --test scripts/build-macos-packages.test.mjs

# Nightly and promoted builds carry a version that differs from the
# committed Cargo.toml; Tauri reads the app version from package.version.
- name: Stamp build version
Expand Down Expand Up @@ -340,7 +348,7 @@ jobs:

- name: Build app
working-directory: apps/desktop
run: ${{ runner.os == 'Linux' && 'CARGO_PROFILE_RELEASE_DEBUG=0 node ../../scripts/build-linux-packages.mjs' || 'pnpm build:tauri --target' }} ${{ matrix.settings.target }} --config src-tauri/tauri.prod.conf.json ${{ runner.os == 'Windows' && '--bundles nsis' || runner.os == 'Linux' && '--verbose' || '' }}
run: ${{ runner.os == 'Linux' && 'CARGO_PROFILE_RELEASE_DEBUG=0 node ../../scripts/build-linux-packages.mjs' || runner.os == 'macOS' && hashFiles('scripts/build-macos-packages.mjs') != '' && 'node ../../scripts/build-macos-packages.mjs' || 'pnpm build:tauri --target' }} ${{ matrix.settings.target }} --config src-tauri/tauri.prod.conf.json ${{ runner.os == 'Windows' && '--bundles nsis' || runner.os == 'Linux' && '--verbose' || '' }}
env:
# https://github.com/tauri-apps/tauri-action/issues/740
CI: false
Expand All @@ -359,6 +367,55 @@ jobs:
TAURI_SIGNING_PRIVATE_KEY_PASSWORD: ${{ secrets.TAURI_SIGNING_PRIVATE_KEY_PASSWORD }}
RUST_TARGET_TRIPLE: ${{ matrix.settings.target }}

# Tauri patches Cap.exe with the NSIS marker during the first bundle.
# Sign those patched bytes, then rebundle with the same package type.
- name: Stage Windows payload for Authenticode signing
if: ${{ runner.os == 'Windows' }}
shell: pwsh
run: |
./scripts/windows-release-signing.ps1 -Operation Stage -Target "${{ matrix.settings.target }}" -WorkspaceRoot "$env:GITHUB_WORKSPACE"

- name: Upload unsigned Windows payload
if: ${{ runner.os == 'Windows' }}
id: upload_unsigned_windows_payload
uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4.6.2
with:
name: unsigned-windows-payload
path: target/${{ matrix.settings.target }}/release/windows-signing/payload
if-no-files-found: error

- name: Submit SignPath payload signing request
if: ${{ runner.os == 'Windows' }}
timeout-minutes: 90
id: submit_signpath_payload_signing_request
uses: signpath/github-action-submit-signing-request@ced31329c0317e779dad2eec2a7c3bb46ea1343e # v1
with:
api-token: ${{ secrets.SIGNPATH_API_TOKEN }}
organization-id: ${{ secrets.SIGNPATH_ORGANIZATION_ID }}
project-slug: ${{ secrets.SIGNPATH_PROJECT_SLUG }}
signing-policy-slug: ${{ secrets.SIGNPATH_SIGNING_POLICY_SLUG }}
artifact-configuration-slug: ${{ secrets.SIGNPATH_ARTIFACT_CONFIGURATION_SLUG }}
github-artifact-id: ${{ steps.upload_unsigned_windows_payload.outputs.artifact-id }}
wait-for-completion: true
wait-for-completion-timeout-in-seconds: 5400
service-unavailable-timeout-in-seconds: 5400
output-artifact-directory: signed-windows-payload

- name: Restore and verify signed Windows payload
if: ${{ runner.os == 'Windows' }}
shell: pwsh
run: |
./scripts/windows-release-signing.ps1 -Operation Restore -Target "${{ matrix.settings.target }}" -WorkspaceRoot "$env:GITHUB_WORKSPACE"

- name: Bundle Windows installer
if: ${{ runner.os == 'Windows' }}
working-directory: apps/desktop
shell: bash
run: pnpm tauri bundle --target ${{ matrix.settings.target }} --bundles nsis --config src-tauri/tauri.prod.conf.json
env:
TAURI_SIGNING_PRIVATE_KEY: ${{ secrets.TAURI_SIGNING_PRIVATE_KEY }}
TAURI_SIGNING_PRIVATE_KEY_PASSWORD: ${{ secrets.TAURI_SIGNING_PRIVATE_KEY_PASSWORD }}

- name: Verify macOS app contents and signing
if: ${{ runner.os == 'macOS' }}
shell: bash
Expand Down Expand Up @@ -396,6 +453,48 @@ jobs:
fi
codesign --verify "$DMG"

- name: Notarize and verify macOS disk image
if: ${{ runner.os == 'macOS' }}
timeout-minutes: 25
shell: bash
env:
APPLE_API_ISSUER: ${{ secrets.APPLE_API_ISSUER }}
APPLE_API_KEY: ${{ secrets.APPLE_API_KEY }}
APPLE_API_KEY_PATH: ${{ github.workspace }}/api.p8
run: |
set -euo pipefail
shopt -s nullglob
DMGS=(target/${{ matrix.settings.target }}/release/bundle/dmg/*.dmg)
if [[ ${#DMGS[@]} -eq 0 ]]; then
echo "::error::No macOS disk image is available for notarization."
exit 1
fi
[[ -n "$APPLE_API_KEY" && -n "$APPLE_API_ISSUER" && -s "$APPLE_API_KEY_PATH" ]]
for DMG in "${DMGS[@]}"; do
[[ -f "$DMG" && -s "$DMG" && ! -L "$DMG" ]]
codesign --verify "$DMG"
NOTARY_RESULT="$(mktemp "$RUNNER_TEMP/cap-dmg-notary.XXXXXX")"
NOTARY_EXIT=0
xcrun notarytool submit "$DMG" \
--key "$APPLE_API_KEY_PATH" --key-id "$APPLE_API_KEY" --issuer "$APPLE_API_ISSUER" \
--wait --timeout 20m --output-format json > "$NOTARY_RESULT" || NOTARY_EXIT=$?
node -e '
const fs = require("node:fs");
const result = JSON.parse(fs.readFileSync(process.argv[1], "utf8"));
if (!/^[0-9a-f]{8}(?:-[0-9a-f]{4}){3}-[0-9a-f]{12}$/i.test(result.id ?? "")) {
throw new Error("Notarization submission ID is missing or invalid.");
}
console.log(JSON.stringify({ submissionId: result.id, status: result.status }));
if (process.argv[2] !== "0" || result.status !== "Accepted") {
throw new Error("Disk image notarization did not complete with Accepted status.");
}
' "$NOTARY_RESULT" "$NOTARY_EXIT"
xcrun stapler staple "$DMG"
xcrun stapler validate "$DMG"
codesign --verify "$DMG"
spctl --assess --type open --context context:primary-signature "$DMG"
done

# Guards against the Linux packaging regressions:
# 1. Frontend missing: vinxi must produce apps/desktop/.output/public,
# which Tauri EMBEDS into the binary (it is NOT shipped as a loose
Expand Down Expand Up @@ -609,16 +708,17 @@ jobs:
- name: Upload unsigned Windows installer
if: ${{ runner.os == 'Windows' }}
id: upload_unsigned_windows_installer
uses: actions/upload-artifact@v4
uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4.6.2
with:
name: unsigned-windows-installer
path: target/${{ matrix.settings.target }}/release/bundle/nsis/*.exe
if-no-files-found: error

- name: Submit SignPath signing request
if: ${{ runner.os == 'Windows' }}
timeout-minutes: 90
id: submit_signpath_signing_request
uses: signpath/github-action-submit-signing-request@v1
uses: signpath/github-action-submit-signing-request@ced31329c0317e779dad2eec2a7c3bb46ea1343e # v1
with:
api-token: ${{ secrets.SIGNPATH_API_TOKEN }}
organization-id: ${{ secrets.SIGNPATH_ORGANIZATION_ID }}
Expand All @@ -627,20 +727,11 @@ jobs:
artifact-configuration-slug: ${{ secrets.SIGNPATH_ARTIFACT_CONFIGURATION_SLUG }}
github-artifact-id: ${{ steps.upload_unsigned_windows_installer.outputs.artifact-id }}
wait-for-completion: true
# SignPath Foundation requires a human to approve each signing
# request, so this step blocks until someone clicks approve. Raising
# wait-for-completion-timeout-in-seconds alone did NOT extend the
# window: while a request sits "WaitingForApproval" the action's
# per-call retry budget (service-unavailable-timeout-in-seconds,
# default 600s) is what expires and fails the job at ~10 min, so both
# must be raised. GitHub-hosted jobs are hard-capped at 6h total and
# the Windows build already consumes part of that, so ~4h is the
# practical ceiling for a blocking wait; the action times out cleanly
# here rather than letting GitHub kill the runner mid-build. For a
# genuinely longer (12h+) window the signing has to be decoupled from
# the build job (submit without waiting, finalise in a later job).
wait-for-completion-timeout-in-seconds: 14400
service-unavailable-timeout-in-seconds: 14400
# Both signing stages share the six-hour job budget with the build.
# Match the approval and retry budgets so waiting for approval does
# not expire at the action's shorter default retry timeout.
wait-for-completion-timeout-in-seconds: 5400
service-unavailable-timeout-in-seconds: 5400
output-artifact-directory: signed-windows-installer

- name: Restore signed Windows installer
Expand Down Expand Up @@ -680,6 +771,18 @@ jobs:
}
}

- name: Verify extracted Windows payload signatures and hashes
if: ${{ runner.os == 'Windows' }}
shell: pwsh
run: |
$installers = Get-ChildItem -Path "target/${{ matrix.settings.target }}/release/bundle/nsis" -Filter *.exe
if (-not $installers) {
throw "No Windows installer exists for extracted payload verification."
}
foreach ($installer in $installers) {
./scripts/windows-release-signing.ps1 -Operation VerifyInstaller -Target "${{ matrix.settings.target }}" -WorkspaceRoot "$env:GITHUB_WORKSPACE" -InstallerPath $installer.FullName
}

- name: Re-sign Windows installer for Tauri updater
if: ${{ runner.os == 'Windows' }}
shell: bash
Expand All @@ -701,6 +804,23 @@ jobs:
TAURI_SIGNING_PRIVATE_KEY: ${{ secrets.TAURI_SIGNING_PRIVATE_KEY }}
TAURI_SIGNING_PRIVATE_KEY_PASSWORD: ${{ secrets.TAURI_SIGNING_PRIVATE_KEY_PASSWORD }}

- name: Retain signed packages for release validation
uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4.6.2
with:
name: desktop-release-${{ matrix.settings.target }}-${{ inputs.sha }}
path: |
target/${{ matrix.settings.target }}/release/bundle/dmg/*.dmg
target/${{ matrix.settings.target }}/release/bundle/nsis/*.exe
target/${{ matrix.settings.target }}/release/bundle/nsis/*.sig
target/${{ matrix.settings.target }}/release/windows-signing/payload-manifest.json
target/${{ matrix.settings.target }}/release/bundle/deb/*.deb
target/${{ matrix.settings.target }}/release/bundle/deb/*.sig
target/${{ matrix.settings.target }}/release/bundle/appimage/*.AppImage
target/${{ matrix.settings.target }}/release/bundle/appimage/*.sig
if-no-files-found: error
retention-days: 3
compression-level: 0

- name: Upload assets
if: ${{ runner.os != 'Linux' }}
uses: crabnebula-dev/cloud-release@v0
Expand Down
10 changes: 10 additions & 0 deletions .github/workflows/docker-build-media-server.yml
Original file line number Diff line number Diff line change
Expand Up @@ -60,6 +60,16 @@ jobs:
cache-from: type=gha,scope=media-server-${{ matrix.platform }}
cache-to: type=gha,mode=max,scope=media-server-${{ matrix.platform }}

- name: Verify recording decode in the production image
env:
MEDIA_IMAGE: ghcr.io/${{ env.REPOSITORY_OWNER }}/cap-media-server@${{ steps.build.outputs.digest }}
run: |
docker run --rm --network none --entrypoint bun "$MEDIA_IMAGE" test \
src/__tests__/lib/recording-verification.integration.test.ts \
src/__tests__/lib/job-manager.test.ts
docker run --rm --network none --entrypoint bun "$MEDIA_IMAGE" test \
src/__tests__/routes/recording-verification.test.ts

- name: Export Digest
run: |
mkdir -p /tmp/digests
Expand Down
24 changes: 22 additions & 2 deletions .github/workflows/sync-tests.yml
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,10 @@ on:
- "crates/editor/**"
- "crates/audio/**"
- "crates/media-info/**"
- "crates/project/**"
- "scripts/recording-reliability.py"
- "scripts/recording-reliability-owned-process.cs"
- "scripts/test-recording-reliability.py"
- ".github/workflows/sync-tests.yml"

concurrency:
Expand Down Expand Up @@ -67,6 +71,11 @@ jobs:
with:
node-version: 24

- name: Setup Python
uses: actions/setup-python@a26af69be951a213d495a4c3e4e4022e16d87065 # v5.6.0
with:
python-version: "3.13"

- name: Native dependencies
env:
RUST_TARGET_TRIPLE: ${{ runner.os == 'Linux' && 'x86_64-unknown-linux-gnu' || runner.os == 'Windows' && 'x86_64-pc-windows-msvc' || 'aarch64-apple-darwin' }}
Expand All @@ -77,6 +86,17 @@ jobs:
shell: pwsh
run: Add-Content -Path $env:GITHUB_PATH -Value "${{ github.workspace }}\\target\\ffmpeg\\bin"

- name: Recording metadata and harness regression tests
shell: bash
run: |
cargo test --locked -p cap-project --lib
python -B scripts/test-recording-reliability.py

- name: Compile recording process supervisor (Windows)
if: runner.os == 'Windows'
shell: pwsh
run: Add-Type -Path scripts/recording-reliability-owned-process.cs

- name: Install software Vulkan driver (Linux)
if: runner.os == 'Linux'
run: |
Expand Down Expand Up @@ -116,7 +136,7 @@ jobs:
shell: bash
run: |
cargo test --locked -p cap-timestamp -p cap-enc-ffmpeg
cargo test --locked -p cap-recording --lib
cargo test --locked -p cap-recording --lib -- --test-threads=1
# --nocapture so a WARP-adapter notch skip prints instead of
# looking identical to a pass in the CI log.
cargo test --locked -p cap-rendering -- --nocapture
Expand Down Expand Up @@ -230,7 +250,7 @@ jobs:

- name: Upload findings
if: always()
uses: actions/upload-artifact@v4
uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4.6.2
with:
name: sync-matrix-${{ matrix.runner }}
path: ${{ github.workspace }}/sync-matrix-${{ matrix.runner }}.json
Expand Down
Loading
Loading