- Node.js 22 or higher
- bun — Package manager & runtime (install)
- Python 3.11+ (for native module compilation)
- prek — PR code checker (
npm install -g @j178/prek)
# Clone the repository
git clone https://github.com/ActiveInAI/PanAI.git
cd PanAI
# Install dependencies
bun install
# Start development server (Electron desktop mode)
bun start| Command | Description |
|---|---|
bun start |
Start Electron app in development mode (desktop) |
bun run start:multi |
Start a second Electron instance alongside an existing one (see Multi-Instance) |
bun run cli |
Alias for bun start |
bun run webui |
Start in WebUI mode (browser-based, no Electron window) |
bun run webui:remote |
Start in WebUI mode with remote access enabled |
bun run webui:prod |
Start WebUI in production mode |
bun run webui:prod:remote |
Start WebUI in production mode with remote access |
bun run resetpass |
Reset user password via CLI |
| Command | Description |
|---|---|
bun run package |
Build all processes (main, preload, renderer) to out/ |
bun run make |
Alias for bun run package |
bun run dist |
Build and package distributable for current platform |
bun run dist:mac |
Build distributable for macOS |
bun run dist:win |
Build distributable for Windows |
bun run dist:linux |
Build distributable for Linux |
bun run build-mac |
Build macOS distributable for both arm64 and x64 |
bun run build-mac:arm64 |
Build macOS distributable for Apple Silicon only |
bun run build-mac:x64 |
Build macOS distributable for Intel only |
bun run build-win |
Build Windows distributable |
bun run build-win:arm64 |
Build Windows distributable for ARM64 |
bun run build-win:x64 |
Build Windows distributable for x64 |
bun run build-deb |
Build Linux (.deb) distributable |
bun run build |
Alias for bun run build-mac |
| Command | Description |
|---|---|
bun run build:renderer:web |
Build renderer for standalone web deployment |
bun run build:server |
Build standalone server bundle to dist-server/ |
bun run server:start |
Run standalone server in development mode |
bun run server:start:remote |
Run standalone server with remote access |
bun run server:start:prod |
Run standalone server in production mode |
bun run server:start:prod:remote |
Run standalone server in production mode with remote access |
bun run server:resetpass |
Reset password via standalone server CLI |
bun run server:resetpass:prod |
Reset password via standalone server CLI (production) |
| Command | Description |
|---|---|
bun run lint |
Check for lint issues (oxlint, read-only) |
bun run lint:fix |
Auto-fix lint issues |
bun run format |
Auto-format code (oxfmt) |
bun run format:check |
Check formatting without modifying files |
bun run i18n:types |
Generate TypeScript types for i18n keys |
| Command | Description |
|---|---|
bun run test |
Run all unit tests (vitest) |
bun run test:watch |
Run tests in watch mode |
bun run test:coverage |
Run tests with coverage report |
bun run test:contract |
Run contract tests |
bun run test:integration |
Run integration tests |
bun run test:bun |
Run Bun-specific database driver tests |
bun run test:e2e |
Run end-to-end tests (Playwright) |
bun run test:packaged:i18n |
Run i18n integration tests against packaged build |
bun run test:packaged:bun |
Run Bun packaged integration tests |
| Command | Description |
|---|---|
bun run debug:perf |
Start app with performance monitoring enabled |
bun run debug:perf:report |
Generate performance report from collected data |
bun run debug:mcp |
Debug MCP server connections |
bun run debug:mcp:list |
List configured MCP servers |
bun run debug:mcp:validate |
Validate MCP server configurations |
bun run debug:custom-agent |
Debug custom agent connections |
When you have two clones of the repository (e.g. PanAI and PanAI-refactor) and need to run both simultaneously, the second instance can be started with:
bun run start:multiThis sets PANAI_MULTI_INSTANCE=1, which:
- Skips the Electron single-instance lock
- Uses a separate userData directory (
PanAI-Dev-2) to avoid database and config conflicts - Isolates data/config symlink paths (
~/.panai-dev-2,~/.panai-config-dev-2) - Vite renderer, CDP, and WebUI proxy ports auto-increment to avoid collisions
Note: The multi-instance WebUI defaults to port 25810 (instead of 25809). When accessing WebUI in a browser, use an incognito/private window for the second instance — both instances share the
localhostcookie jar, and their JWT secrets differ, causing authentication failures if the same browser session is reused.
The project uses prek (a Rust implementation of pre-commit) for code checks, configured in .pre-commit-config.yaml:
# Install prek
npm install -g @j178/prek
# Install git hooks (optional, auto-check before commit)
prek install
# Run checks on staged files
prek run
# Run checks on changes vs main (same as CI)
prek run --from-ref origin/main --to-ref HEADPanAI uses electron-vite for fast bundling:
- Main process: bundled with Vite (ESM)
- Renderer process: bundled with Vite (React + TypeScript)
- Preload scripts: bundled with Vite
The build output goes to out/ directory:
out/main/- Main process codeout/renderer/- Renderer process codeout/preload/- Preload scripts
- Electron - Cross-platform desktop framework
- React 19 - UI framework
- TypeScript - Type safety
- Vite - Fast bundler (via electron-vite)
- UnoCSS - Atomic CSS engine
- better-sqlite3 - Local database
- vitest - Testing framework