- macOS persistent host
- Linux persistent host
- Windows via Ubuntu on WSL2
Minimum runtime: Node.js 22.19. Pi no longer sets the floor: its bridge is a
plugin and the pi CLI is user-installed like codex and claude, so the
22.19 line is bb's own tested floor (install-machine.sh and the root
engines gate on it). A lower floor needs its own test pass before it moves.
Tested npm package runtimes:
- Node.js 22.19 or newer in the Node.js 22 release line
- Node.js 24 LTS
- Node.js 26 Current
Newer release lines are not blocked. install-machine.sh gates on the 22.19
floor only, so a release line we have not tested yet still installs rather than
failing hard on the day it ships. The bb-app npm engines field lists the
tested lines, which npm surfaces as a warning rather than an install failure.
Windows support means the Linux stack runs entirely inside WSL2:
- all
bbprocesses run inside the same Ubuntu WSL2 distro - Node.js, Git, provider CLIs, and pnpm for source-development flows are installed inside WSL2
- local project paths use Linux-style absolute paths from inside WSL2
- native Windows PowerShell, CMD, drive-letter paths, and UNC paths are not supported product paths
apps/mobile is a native phone client for a bb server
(Expo / React Native). It runs no agents, host daemon, or plugins itself; it
talks to a server over the same HTTP + WebSocket contract as the web app.
- Platforms: iOS first (iPhone; iPad runs the phone layout). Android is planned next; the code is platform-neutral but no Android build has been produced or tested yet.
- Connecting: Direct mode takes any
http(s)://URL the phone can reach (the iOS Simulator'shttp://127.0.0.1:<port>, a LAN address with--server-bind-host 0.0.0.0, a Tailscale Serve HTTPS URL). It is unauthenticated, the same trust model as the browser PWA on a LAN; iOS allows plainhttp://only for LAN IPs and.localnames, so Tailscale hosts need Serve HTTPS. bb connect mode pairs the phone as a connect machine (QR / code from Settings → Remote access orbb connect machine-code, both behind themobileAppexperiment during early access), keeps the credential in the device keychain, and mints short-lived sessions; see multiple-devices.md. - Distribution: developer builds from source (Xcode 26.2, iOS 26 simulator
runtime) today; TestFlight / Play builds go through EAS once the Expo
account exists (see
apps/mobile/README.md). No store release yet. - Push notifications arrive in a later PR; they will need an EAS project,
APNs / FCM credentials, a physical device, and a server that can reach
exp.host.
Not available on the phone (use the web app or desktop for these):
- Plugin frontends: nav panels (Automations, Tasks, Docs, GitHub), DOM
settingsSectionpages (connect Remote access, memory, custom instructions, keep-awake), composer customization, message-action callbacks, content scripts, side-chat panels. Plugin backends (tools, CLI, mentions, declarative settings, pending-interaction forms forask-user-questionandsecrets) work. - Provider sign-in (
codex login,claude /login): still needs a terminal on the host; the phone assumes a signed-in host. - Local editor integration, "Open in …", native folder picker, local daemon features: phones have no host daemon. The remote path browser works.
- Custom CSS themes and plugin themes: only the built-in palettes map to the native tokens.
- Splits, drag reorder, the keyboard shortcut editor, desktop browser automation. Text-selection quoting is per paragraph. KaTeX / Mermaid render as source; video files open outside the app.
npx bb-appnpx --package bb-app bb ...- source checkout package startup with
pnpm startorpnpm start:worktree - source checkout validation with
pnpm install,pnpm build,pnpm exec turbo run typecheck, andpnpm exec turbo run test - app + server + host-daemon startup on supported persistent-host OSes
- local-path project creation and update in the app
- unmanaged environments
- managed worktree environments
- provider runtime startup where the provider itself supports the host environment
npx bb-apppackage startup on supported npm package runtimesnpx --package bb-app bb ...CLI execution through the published package
@bb/configis the only source of dev/prod defaults.- Repo-root source-development commands such as
pnpm start,pnpm bb,pnpm bb:dev, andpnpm resetare thin wrappers around local packages and scripts. - Those wrappers set
NODE_ENVexplicitly so ambient shell state does not change which bb instance they target. - Explicit
BB_*values override theNODE_ENV-selected defaults. - Process-to-process handoff, such as daemon-injected CLI environment, must use
explicit
BB_*values for the exact target instance instead of relying on mode defaults.
- Run
npx bb-app, source checkout commands such aspnpm install,pnpm dev,pnpm bb:dev, and host-daemon commands from a WSL2 shell, not from native Windows terminals. - Repositories inside the WSL filesystem are recommended for best behavior.
/mnt/c/...mounted paths are deliberately supported so WSL2 users can keep working with existing Windows checkouts instead of relocating every repo into the WSL filesystem, but they are a tradeoff: slower filesystem I/O and weaker file-watching behavior than the WSL filesystem.- Native Windows drive-letter and UNC paths are rejected at the app/server boundary so unsupported input fails clearly.
- workspace-owned QA helpers under
tests/qa/ - dev restart internals that are not part of the shipped product path
- native Windows PowerShell, CMD, and host-daemon runtime flows
We are standardizing on a small set of cross-platform packages:
cross-env- portable environment injection in package scripts
rimraf- portable recursive cleanup in package scripts
cross-spawn- shared subprocess launch for portability-sensitive runtime paths
open- OS-specific file/URL opening behind a repo-local helper
We are explicitly not adopting:
shx- we prefer small Node scripts for copy/create-directory logic
- generic path helper libraries
node:pathis sufficient
- generic filesystem helper libraries
fs/promisesis sufficient
The npm package keeps native add-ons as runtime dependencies instead of bundling
one platform-specific .node binary into bb's JavaScript artifacts. This lets
npm install the correct native artifacts on the target machine for packages such
as better-sqlite3 and @parcel/watcher.
Known failure modes remain the normal native-addon ones:
- changing Node versions after install without reinstalling or rebuilding
- copying
node_modulesacross operating systems, CPU architectures, or libc variants - disabling package lifecycle scripts
- running on a platform where no prebuild exists and no local build toolchain is available
The recovery path after a Node/runtime change is to reinstall the package or
rebuild the native dependency, for example npm rebuild better-sqlite3.
- The supported setup hook is POSIX
.bb-env-setup.sh. - The same shell-based hook contract is used across macOS, Linux, and WSL2.
- No parallel
.bb-env-setup.tsproduct-path mechanism is supported. - The
.worktreeincludecopy step runs no shell. It works on every platform, including native Windows.
- The repository enforces LF checkout for supported text files via .gitattributes.
- Supported Linux and WSL2 flows must work with those repository rules applied.
- Native Windows checkouts are outside the support contract unless we later choose to support a native Windows product path.
- GitHub Actions uses Ubuntu as the required support gate for build, typecheck, lint, test, and Linux smoke coverage.
- Full build, typecheck, lint, and test checks run on Ubuntu with Node.js 22 only.
- Pull requests run the
bb-apptarball smoke on Ubuntu and macOS with Node.js 22, validating the packed npm artifact throughnpx --package. - Pushes to
mainand manually dispatched CI runs also run thebb-apptarball smoke on Ubuntu and macOS with Node.js 24 and 26. - Branch protection should require
Checks (ubuntu-latest, Node 22.x),Package Smoke (ubuntu-latest, Node 22.x), andPackage Smoke (macos-latest, Node 22.x). The Node.js 24 and 26 compatibility smoke jobs do not run on pull requests and should not be configured as required PR checks. - Native Windows CI is intentionally not required because Windows support uses the Linux runtime path inside WSL2 rather than a separate native Windows product path.
apps/mobiletypecheck, lint, and unit tests run inside the UbuntuChecksandTests (packages)jobs like every other workspace package. The iOS simulator Maestro flows run inMobile E2E(.github/workflows/mobile-e2e.yml) on the macOS runner only when a pull request carries themobile-e2elabel, nightly onmain, or on manual dispatch; they are not a required check.