This guide covers the basic local development and verification workflow for Beam on macOS. Run the commands from the repository root in Terminal.
- macOS 13 or newer
- Node.js 22 or newer and Bun 1.4.2
- Rust stable for native rebuilds
- Xcode Command Line Tools
- Git
Install the project dependencies once after cloning or when the lockfile changes:
bun install --frozen-lockfileStart Vite and Electron together in one terminal:
bun run devRun the same command in another worktree to test independent Beam instances in parallel. Each worktree uses a separate persistent profile and an available Vite port. For another session in the same worktree:
bun run dev --session previewStop the session with Ctrl+C. See the session guide for storage locations and manual renderer-only launches.
On first launch, grant Beam the macOS permissions it requests for Screen Recording, Microphone, and Camera when those sources are enabled.
bun run electron:dev checks Cargo before starting. When Cargo is available, it rebuilds the engine and stops if compilation fails. Without Cargo, it looks for the exact application version and Apple Silicon architecture in packages/native-recorder. If the engine is missing in an interactive terminal, confirm the verified download with Y; answer N to stop. A non-interactive process never prompts and downloads only when BEAM_DOWNLOAD_CAPTURE_ENGINE=1 is set explicitly.
Create a DMG without publishing a release:
bun run electron:build -- --mac dmg --publish neverTo create both a DMG and a ZIP archive:
bun run electron:build -- --mac dmg zip --publish neverThe packages and their build metadata are written to dist_electron/. Build macOS installers on macOS.
Run the JavaScript tests, the Vitest suite with coverage, and the TypeScript check with:
bun run test
bun run test:coverage
bun run typecheckThe TypeScript coverage gate is 90% for statements, branches, functions, and lines. For Rust changes, run the native test suite directly:
cargo test --workspace --all-features
cargo fmt --all --check
cargo clippy --workspace --all-targets --all-features -- -D warningsRead and follow the repository guidelines: