# Run lint checks (fastest, Docker-based)
act -W .github/workflows/test-local.yml -j lint
# Run Playwright E2E tests (runs natively on your machine)
act -W .github/workflows/test-local.yml -j playwright
# Debug build issues (runs natively on your machine)
act -j build -W .github/workflows/test.yml 2>&1 | tee /tmp/act-build.log
# List all available workflows and jobs
act -l
# Run all local tests
act -W .github/workflows/test-local.ymlact is invaluable for debugging CI failures:
- Reproduce errors locally - Run the exact same steps as CI
- Iterate quickly - No need to push/wait for CI
- See full output - All logs captured (even what's hidden in CI)
- Native execution - Self-hosted runners run on your machine with all your tools
Example: Debug build failures by capturing full output:
act -j build 2>&1 | tee /tmp/act-build.log
grep -i "error" /tmp/act-build.logThe test-local.yml workflow is designed exclusively for local testing:
- β
Never runs in GitHub Actions (uses
workflow_dispatch:trigger) - β No node24 runtime issues (skips problematic GitHub Actions)
- β Installs tools directly (Deno, etc.)
- β Fast feedback loop
- β Works in Docker containers
The main test.yml workflow uses newer GitHub Actions that require node24 runtime, which act doesn't support yet.
The .actrc file handles platform mappings:
# Self-hosted runners run natively (no Docker)
-P macOS=-self-hosted
-P ARM64=-self-hosted
-P studio=-self-hosted
# Ubuntu runs in Docker
-P ubuntu-latest=catthehacker/ubuntu:act-latest
# Match host architecture
--container-architecture=linux/arm64
# Reuse containers for speed
--reuseThe Playwright E2E tests in CI can be flaky - they sometimes fail in CI but pass locally. If you see accessibility test failures in CI:
-
Run locally first to verify they pass:
cd app/frontend npx playwright test tests/accessibility.spec.js
-
Run via act for CI-like environment:
act -W .github/workflows/test-local.yml -j playwright
-
Known flaky tests:
can navigate to player controls via Tabcan navigate sidebar sections with Tab
These tests pass consistently locally but occasionally fail in CI due to timing issues.
If you see: The runs.using key in action.yml must be one of: [composite docker node12 node16 node20], got node24
Solution: Use test-local.yml instead of test.yml
# Clear stale Docker credentials
rm ~/.docker/config.json
docker logoutIf you see a wall of [DEBUG] setupEnv text with environment variables, stale containers from --reuse are caching old verbose state. Fix with:
act -j build -W .github/workflows/test.yml --rmThis forces fresh containers. For a one-time cleanup of all act containers:
docker rm -f $(docker ps -a -q --filter "label=act") 2>/dev/nullJobs with runs-on: [macOS, ARM64] or runs-on: studio will run on your machine natively. This is expected behavior defined in .actrc.