A browser-based workspace for the Pi Coding Agent. Vue 3 + Bun thin shell wrapping pi with a real shell terminal.
Requires Bun (the backend runs on it).
bun i -g @amagicpear/pichamberRun pichamber --help for all options.
pichamber open # open the current workspace
pichamber open ../another-project
pichamber --json open # print the session URL as JSON without opening a browser
pichamber status # inspect the background server
pichamber logs -f # follow server logs
pichamber stop # stop it cleanly
# Foreground mode for debugging, containers, or an SSH tunnel
pichamber serve --host 127.0.0.1 --port 3000State and logs are stored under
~/Library/Application Support/pichamber on macOS,
$XDG_STATE_HOME/pichamber on Linux, and %LOCALAPPDATA%\\pichamber on
Windows. Set PICHAMBER_STATE_DIR to override that location or
PICHAMBER_PORT to change the default port.
pichamber keeps local diagnostic events to make intermittent failures
actionable. Server events are stored as rolling JSONL files under the state
directory's logs/ folder; browser events are retained in IndexedDB. Nothing
is uploaded automatically.
Use Settings → Diagnostics → Export diagnostic report to download a report containing recent browser and server events for a bug report. The report excludes conversation content, thinking, tool input/output, credentials, and environment-variable values. Review an export before sharing it. A renderer crash cannot write a final browser event, but the report preserves the events recorded before the crash and marks an unclean previous page lifetime when the browser can detect one.
A monorepo workspace using Bun workspaces.
- earendil-works/pi — provides the coding-agent runtime used by the server.
- openchamber/openchamber — served as a reference for the UI design.
pichamber is MIT — see LICENSE. Bundled third-party packages
(pi-coding-agent, markstream-vue, mermaid, katex, vue, monaco-editor,
catppuccin-vsc-icons, and others) are listed with their respective
licenses in THIRD_PARTY_LICENSES.md; the
upstream LICENSE files ship in node_modules/<package>/LICENSE after
bun install.
pichamber/
├── package.json # workspace root, dev orchestration scripts
├── tsconfig.json # references all packages
├── .oxlintrc.json # lint config applied to all packages
├── bun.lock
└── packages/
├── web/ # Vue 3 + Vite frontend (@amagicpear/pichamber-web)
└── server/ # Bun HTTP server (@amagicpear/pichamber-server)
| Package | Stack | Purpose |
|---|---|---|
@amagicpear/pichamber-web |
Vue 3 (rc) · Vite · Pinia · Vue Router | Browser SPA |
@amagicpear/pichamber-server |
Bun runtime | HTTP server |
Remote-host and Pi runtime decisions are documented in
docs/architecture.md.
- Bun ≥ 1.3
bun installThis installs all workspaces' dependencies in one pass thanks to Bun workspaces.
Run from the repo root:
# Start web dev server (Vite, http://localhost:5173) AND server (Bun, http://localhost:3000)
bun run dev
# Start them individually
bun run dev:web
bun run dev:server
# Build everything
bun run build
# Type-check all packages (uses project references)
bun run type-check
# Run focused logic tests
bun run test
# Lint everything with oxlint
bun run lintPer-package scripts use Bun's --filter:
bun --filter @amagicpear/pichamber-web dev
bun --filter @amagicpear/pichamber-server start- Vue 3 + Vite + Pinia + Vue Router conventions live in
packages/web/. - The server uses Bun's native
Bun.serve()HTTP runtime — keep imports Bun-compatible. - Use TypeScript path aliases within a package (e.g.
@/*→packages/web/src/*).
The root tsconfig.json references each package via project references. To type-check everything:
bun run type-checkThis uses tsc --build under the hood for each package.
oxlint is configured at the root and scans the workspace. Run:
bun run lint