diff --git a/.github/workflows/publish.yml b/.github/workflows/publish.yml
index 5e0b9e5be..7e121dbf4 100644
--- a/.github/workflows/publish.yml
+++ b/.github/workflows/publish.yml
@@ -16,16 +16,16 @@ jobs:
id-token: write
steps:
- uses: actions/checkout@v4
+ - uses: oven-sh/setup-bun@v2
- uses: pnpm/action-setup@v4
with:
version: 10
- uses: actions/setup-node@v4
with:
node-version: 24
- cache: pnpm
registry-url: "https://registry.npmjs.org"
- - run: pnpm install --frozen-lockfile
- - run: pnpm build
+ - run: bun install --frozen-lockfile
+ - run: bun run build
- name: Publish @hyperframes/core
run: pnpm --filter @hyperframes/core publish --access public --provenance --no-git-checks
diff --git a/.github/workflows/regression.yml b/.github/workflows/regression.yml
index 99f8f9708..fb1168c04 100644
--- a/.github/workflows/regression.yml
+++ b/.github/workflows/regression.yml
@@ -23,7 +23,6 @@ jobs:
- "packages/**"
- "scripts/**"
- "Dockerfile*"
- - "pnpm-lock.yaml"
regression-shards:
needs: changes
diff --git a/docs/contributing.mdx b/docs/contributing.mdx
index fa8879ce1..43d40095f 100644
--- a/docs/contributing.mdx
+++ b/docs/contributing.mdx
@@ -16,21 +16,21 @@ Thanks for your interest in contributing to Hyperframes! This guide covers every
```
- Hyperframes uses [pnpm](https://pnpm.io/) for package management:
+ Hyperframes uses [bun](https://bun.sh/) for package management:
```bash
- pnpm install
+ bun install
```
Build the monorepo to ensure everything compiles:
```bash
- pnpm build
+ bun run build
```
Start the development server to verify your setup:
```bash
- pnpm dev
+ bun run dev
```
If the studio opens at `http://localhost:3000` with a preview, your environment is ready.
@@ -47,33 +47,33 @@ Thanks for your interest in contributing to Hyperframes! This guide covers every
### Common Commands
```bash
-pnpm install # Install all dependencies
-pnpm dev # Start the studio (composition editor + live preview)
-pnpm build # Build all packages
-pnpm -r typecheck # Type-check all packages
+bun install # Install all dependencies
+bun run dev # Start the studio (composition editor + live preview)
+bun run build # Build all packages
+bun run --filter '*' typecheck # Type-check all packages
```
### Running Tests
```bash Core
-pnpm --filter @hyperframes/core test
+bun run --filter @hyperframes/core test
```
```bash Engine
-pnpm --filter @hyperframes/engine test
+bun run --filter @hyperframes/engine test
```
```bash Runtime Contract
-pnpm --filter @hyperframes/core test:hyperframe-runtime-ci
+bun run --filter @hyperframes/core test:hyperframe-runtime-ci
```
```bash Producer (Docker)
-cd packages/producer && pnpm docker:build:test && pnpm docker:test
+cd packages/producer && bun run docker:build:test && bun run docker:test
```
### Running All Tests
```bash
-pnpm -r test
+bun run --filter '*' test
```
## Packages
@@ -114,8 +114,8 @@ test: add regression test for nested composition timing
All of the following must pass before your PR can be merged:
-- **Build** — `pnpm build` succeeds
-- **Type check** — `pnpm -r typecheck` reports no errors
+- **Build** — `bun run build` succeeds
+- **Type check** — `bun run --filter '*' typecheck` reports no errors
- **Tests** — all test suites pass
- **Semantic PR title** — PR title follows conventional commit format
diff --git a/docs/packages/core.mdx b/docs/packages/core.mdx
index f9c4b4e33..7ec889c54 100644
--- a/docs/packages/core.mdx
+++ b/docs/packages/core.mdx
@@ -126,7 +126,7 @@ The runtime is the JavaScript that runs inside the browser (or headless Chrome)
Build the runtime from source:
```bash
-pnpm --filter @hyperframes/core build:hyperframes-runtime
+bun run --filter @hyperframes/core build:hyperframes-runtime
```
diff --git a/docs/packages/producer.mdx b/docs/packages/producer.mdx
index 689aa2e98..1750de583 100644
--- a/docs/packages/producer.mdx
+++ b/docs/packages/producer.mdx
@@ -131,13 +131,13 @@ The producer includes a regression harness for comparing render output against g
cd packages/producer
# Build the test Docker image
-pnpm docker:build:test
+bun run docker:build:test
# Run regression tests (compares output against golden baselines)
-pnpm docker:test
+bun run docker:test
# Regenerate golden baselines after intentional changes
-pnpm docker:test:update
+bun run docker:test:update
```
## Benchmarking
@@ -150,7 +150,7 @@ npx hyperframes benchmark
# Directly from the producer package
cd packages/producer
-pnpm benchmark
+bun run benchmark
```
The benchmark runs several compositions with different quality and FPS settings and reports timing for each combination.
diff --git a/docs/packages/studio.mdx b/docs/packages/studio.mdx
index 4f953026c..61b5456cc 100644
--- a/docs/packages/studio.mdx
+++ b/docs/packages/studio.mdx
@@ -39,10 +39,10 @@ This starts the studio development server, opens your composition in the browser
```bash
# From the root
-pnpm dev
+bun run dev
# Or target the studio package directly
-pnpm --filter @hyperframes/studio dev
+bun run --filter @hyperframes/studio dev
```
The studio starts at `http://localhost:3000` by default.
diff --git a/docs/quickstart.mdx b/docs/quickstart.mdx
index 1feba800a..7eca13ebd 100644
--- a/docs/quickstart.mdx
+++ b/docs/quickstart.mdx
@@ -163,7 +163,7 @@ A 1920x1080 video with an animated title that fades in from above — rendered t
| Dependency | Required | Notes |
|-----------|----------|-------|
| **Node.js** 20+ | Yes | Runtime for CLI and dev server |
-| **pnpm** or npm | Yes | Package manager (pnpm recommended) |
+| **bun** or npm | Yes | Package manager (bun recommended) |
| **FFmpeg** | Yes | Video encoding for local renders |
| **Docker** | No | Optional — for deterministic, reproducible renders |
diff --git a/packages/core/scripts/check-hyperframe-static.ts b/packages/core/scripts/check-hyperframe-static.ts
index 6fc4b0a54..0d1d7d851 100644
--- a/packages/core/scripts/check-hyperframe-static.ts
+++ b/packages/core/scripts/check-hyperframe-static.ts
@@ -34,7 +34,7 @@ function main() {
const inputPath = positionalArgs[0];
if (!inputPath) {
console.error(
- "Usage: pnpm check:hyperframe-html [--json] \nExample: pnpm check:hyperframe-html core/src/tests/broken-video.html",
+ "Usage: bun run check:hyperframe-html [--json] \nExample: bun run check:hyperframe-html core/src/tests/broken-video.html",
);
process.exit(2);
}
diff --git a/packages/core/scripts/debug-timeline.ts b/packages/core/scripts/debug-timeline.ts
index 86af843fc..f8c015ee9 100644
--- a/packages/core/scripts/debug-timeline.ts
+++ b/packages/core/scripts/debug-timeline.ts
@@ -195,7 +195,7 @@ function resolveRootTag(tags: ParsedTag[]): ParsedTag | null {
function main() {
const { inputPath, forcedFps, forcedMaxDuration } = parseArgs();
if (!inputPath) {
- console.error("Usage: pnpm debug:timeline [--fps 30] [--max-duration 1800]");
+ console.error("Usage: bun run debug:timeline [--fps 30] [--max-duration 1800]");
process.exit(2);
}
diff --git a/packages/core/src/runtime/README.md b/packages/core/src/runtime/README.md
index 50474311d..55b647e31 100644
--- a/packages/core/src/runtime/README.md
+++ b/packages/core/src/runtime/README.md
@@ -41,7 +41,7 @@ Determinism baseline:
## Build
```bash
-pnpm -C core build:hyperframes-runtime
+bun run --filter @hyperframes/core build:hyperframes-runtime
```
## Security Expectations
diff --git a/packages/producer/src/benchmark.ts b/packages/producer/src/benchmark.ts
index e28f9473d..fb3357f47 100644
--- a/packages/producer/src/benchmark.ts
+++ b/packages/producer/src/benchmark.ts
@@ -6,10 +6,10 @@
* Results are saved to producer/tests/perf/benchmark-results.json.
*
* Usage:
- * pnpm benchmark # 3 runs per fixture (default)
- * pnpm benchmark -- --runs 5 # 5 runs per fixture
- * pnpm benchmark -- --only chat # single fixture
- * pnpm benchmark -- --exclude-tags slow
+ * bun run benchmark # 3 runs per fixture (default)
+ * bun run benchmark -- --runs 5 # 5 runs per fixture
+ * bun run benchmark -- --only chat # single fixture
+ * bun run benchmark -- --exclude-tags slow
*/
import {
@@ -196,7 +196,7 @@ async function runBenchmark(): Promise {
avg(
fixtureRuns
.filter((r) => r.perfSummary.captureAvgMs != null)
- .map((r) => r.perfSummary.captureAvgMs!),
+ .map((r) => r.perfSummary.captureAvgMs ?? 0),
) || null,
stages: avgStages,
},
diff --git a/packages/producer/tests/parity/README.md b/packages/producer/tests/parity/README.md
index 465fa5a58..c34187f7d 100644
--- a/packages/producer/tests/parity/README.md
+++ b/packages/producer/tests/parity/README.md
@@ -16,7 +16,7 @@ Then in another terminal:
```bash
cd producer
-pnpm parity:check \
+bun run parity:check \
--preview-url "http://127.0.0.1:4173/minimal-wysiwyg.html" \
--producer-url "http://127.0.0.1:4173/minimal-wysiwyg.html?mode=producer" \
--checkpoints "0,0.5,1,1.5" \
diff --git a/scripts/set-version.ts b/scripts/set-version.ts
index 0e5d569d1..43c89e82e 100644
--- a/scripts/set-version.ts
+++ b/scripts/set-version.ts
@@ -3,8 +3,8 @@
* Set the version across all publishable packages in the monorepo.
*
* Usage:
- * pnpm set-version 0.1.1
- * pnpm set-version 0.1.1 --tag # also creates a git commit and tag
+ * bun run set-version 0.1.1
+ * bun run set-version 0.1.1 --tag # also creates a git commit and tag
*
* All packages share a single version number (fixed versioning).
*/
@@ -29,8 +29,8 @@ function main() {
const shouldTag = args.includes("--tag");
if (!version) {
- console.error("Usage: pnpm set-version [--tag]");
- console.error("Example: pnpm set-version 0.1.1 --tag");
+ console.error("Usage: bun run set-version [--tag]");
+ console.error("Example: bun run set-version 0.1.1 --tag");
process.exit(1);
}