DapperCode controls ACP-compatible coding agents from a phone. The desktop app owns an authenticated Rust bridge beside your repositories; the Expo mobile app connects over a trusted LAN, VPN, or Tailscale network.
The bridge is private-network software. Keep authentication enabled and never expose it directly to the public internet.
apps/desktop: Rustdappercodeoperator plus the native macOS SwiftUI/AppKit shellservices/rust-bridge: Axum bridge and ACP process managerapps/mobile: Expo and React Native clientcontracts: versioned bridge RPC fixturesscripts: development, contract, version, coverage, and app-bundle automation
There is no npm bridge package and no JavaScript operator CLI. npm is used only for the mobile and repository development toolchain. The macOS app bundles both Rust executables:
DapperCode.app
├── Contents/MacOS/DapperCode # native SwiftUI/AppKit shell
└── Contents/Resources/bin/
├── dappercode # Rust operator CLI
└── dappercode-bridge # Rust bridge
Build and open the self-contained app:
npm ci
npm run desktop:build:macos
open apps/desktop/dist/DapperCode.appThe app provides native menu-bar lifecycle, first-time setup, bridge start/stop/restart, authenticated status, pairing QR, logs, workspace selection, and launch-at-login.
The shell uses standard SwiftUI and AppKit controls, menus, forms, materials, panels, and SF Symbols. It does not draw or freeze a custom theme. Appearance is inherited from the installed macOS version, so changes such as Liquid Glass are supplied by the OS without a DapperCode update. The equivalent guarantee on Windows will require a native WinUI shell so Mica and future Windows styling come from Windows itself.
First-time setup registers an ACP executable already installed on the Mac, such as OpenCode. The
Rust operator hashes that executable and stores the resulting configuration centrally, in
~/Library/Application Support/dev.dappercode.desktop, never inside your repositories. Distinct
workspace bearer tokens are kept together in one macOS keychain vault. It does not invoke npm, npx, Node.js, shell setup
scripts, or floating package resolution.
Every workspace keeps an isolated profile, vault entry, manifest, state directory, and attachment root. One authenticated desktop broker owns the stable mobile RPC endpoint. A workspace bridge and ACP child start only after that workspace's credential has authenticated and a request needs the runtime. Active browser previews keep per-workspace origins rather than sharing broker cookies. Admitted runs survive mobile disconnects; idle workers are retired conservatively after a grace period, while queued work, active runs, approvals, user input, steers, previews, and reconnect replay keep their worker alive.
For direct terminal operation from a source checkout:
npm run operator -- discover-agent --agent-id opencode
npm run operator -- setup --workspace "$PWD" --network local --host 192.168.1.20 \
--agent-id opencode --agent-args acp
npm run operator -- start --workspace "$PWD"
npm run operator -- status --workspace "$PWD" --human
npm run operator -- restart --workspace "$PWD"
npm run operator -- stop --workspace "$PWD"The installed app's operator is at:
DapperCode.app/Contents/Resources/bin/dappercode
The operator is the only broker process-control authority. It serializes transitions with a global broker lock and verifies PID, process start time, executable, data directory, and config identity before signaling the process. The broker owns and reaps isolated workspace workers.
Requirements: Node.js 22.13+, npm 10+, Rust 1.97.1, and Git.
npm ci
npm run mobileUse a LAN or Tailscale bridge address on physical devices. localhost on a phone refers to the
phone, not the Mac running the bridge.
npm run lint
npm run duplicates:check
npm run typecheck
npm run test
npm run contract:check
npm run coverage:check
npm run coverage:rust
npm run desktop:build:macosnpm run duplicates:check scans authored mobile TypeScript and native Rust/Swift sources with
separate production-focused thresholds. Generated artifacts and dedicated test files/directories
are excluded; inline Rust unit tests remain subject to the native high-signal threshold.
GitHub Actions validates repository policy, RPC contracts, mobile quality/coverage, Rust bridge quality/coverage, and a signed macOS app bundle. Mobile EAS distribution remains a separate protected workflow. There is no npm publication workflow for the bridge.
- Setup and operations
- Troubleshooting
- Realtime streaming limitations
- Push notifications
- Browser preview limitations
- Privacy policy
- Terms of service
- Security policy
DapperCode is distributed under the MIT License.