- 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. - The built-in Push notifications plugin works on iOS when the bb server can
reach
exp.host. The server needs no Apple or Google keys. Android push support remains untested.
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 start,pnpm start:worktree, orpnpm start:worktree-remote - 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 supported teardown hook is POSIX
.bb-env-teardown.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.