HAPI is a local-first, self-hosted platform for running and controlling AI coding agents remotely (Claude Code, Codex, Cursor Agent, Grok Build, OpenCode, and more — see Supported Agents). It lets you start coding sessions on your computer and monitor/control them from your phone.
HAPI (哈皮) is a Chinese transliteration of "Happy", reflecting the project's goal of making AI coding assistance a happier experience by freeing you from the terminal.
Yes, HAPI is open source and free to use under the AGPL-3.0-only license.
HAPI supports several coding agents, with Claude Code as the recommended option. See Supported Agents for the full list and per-agent setup notes.
HAPI includes an embedded hub. Just run hapi hub on your machine - no external hub required.
hapi server remains supported as an alias.
For local network access:
http://<your-computer-ip>:3006
If your phone cannot connect, make sure the hub is not only listening on 127.0.0.1. For LAN access, set listenHost to 0.0.0.0 in ~/.hapi/settings.json or set HAPI_LISTEN_HOST=0.0.0.0, then restart hapi hub.
For internet access:
- Use the built-in relay tunnel: start the hub with
hapi hub --relayto get a public URL via the tunwg relay (defaults to the officialrelay.hapi.run) - If the hub has a public IP, access it directly (use HTTPS via reverse proxy for production)
- If behind NAT, set up your own tunnel (Cloudflare Tunnel, Tailscale, or ngrok)
The CLI_API_TOKEN is a shared secret that authenticates:
- CLI connections to the hub
- Web app logins
- Telegram account binding
It's auto-generated on first hub start and saved to ~/.hapi/settings.json.
Yes. We support lightweight multi-account access via namespaces for shared team hubs. See Namespace (Advanced).
Yes. Telegram is optional. You can use the web app directly in any browser or install it as a PWA.
- When your AI agent requests permission (e.g., to edit a file), you'll see a notification
- Open HAPI on your phone
- Navigate to the active session
- Approve or deny the pending permission
HAPI supports three methods:
- PWA Push Notifications - Enable when prompted, works even when app is closed
- Telegram Bot - See Telegram Setup
- FCM native push - Used by the Android/Wear OS companion apps; notifications are delivered via Firebase Cloud Messaging
Yes, with runner mode:
- Run
hapi runner starton your computer - Your machine appears in the "Machines" list in the web app
- Tap to spawn new sessions from anywhere
In the session view, tap the "Files" tab to:
- Browse project files
- View git status
- See diffs of changed files
Yes. Open any session and use the chat interface to send messages directly to the AI agent.
Some agents (especially Cursor) can resume after idle from harness signals such as background Shell notify_on_output or /loop, without you sending a new HAPI message. HAPI treats real ACP agent activity (and permission requests) as thinking again so the session list matches the agent - same keepalive path as a normal turn. This is different from session-attached jobs (hapi job), which show progress while the agent stays idle on purpose.
Yes. Open a session in the web app and tap the Terminal tab for a remote shell.
Linux and macOS hosts use Bun's POSIX PTY support. Windows hosts use Bun's ConPTY support, which requires Bun 1.3.14 or newer.
The voice assistant supports three backends: ElevenLabs, Gemini Live, and Qwen Realtime. Configure at least one, open a session in the web app, and click the microphone button. See Voice Assistant for setup details.
Yes. HAPI is local-first:
- All data stays on your machine
- Nothing is uploaded to external servers
- The database is stored locally in
~/.hapi/
The auto-generated token is 256-bit (cryptographically secure). For external access, always use HTTPS via a tunnel.
Only if they have your access token. For additional security:
- Use a strong, unique token
- Always use HTTPS for external access
- Consider Tailscale for private networking
- Ensure hub is running:
hapi hub - Check firewall allows port 3006
- Verify
HAPI_API_URLis correct
If HAPI works on your computer but not from another device on the same LAN, check the hub bind address first. By default, HAPI listens on 127.0.0.1, which only accepts localhost connections.
Use one of these:
{
"listenHost": "0.0.0.0"
}export HAPI_LISTEN_HOST=0.0.0.0Then restart hapi hub and open:
http://<your-computer-ip>:3006Also verify your OS firewall allows inbound connections on port 3006.
Run hapi doctor first - it shows whether CLI_API_TOKEN is set and where it comes from (environment variable or settings file).
- Re-run
hapi auth login - Check token matches in CLI and hub
- Verify
~/.hapi/settings.jsonhas correctcliApiToken
Run hapi doctor first - it shows runner status (including stale state), all hapi processes, and recent log files.
# Check status
hapi runner status
# List sessions the runner is aware of
hapi runner list
# Stop a specific runner-spawned session
hapi runner stop-session <session-id>
# Clear stale lock file
rm ~/.hapi/runner.state.json.lock
# Check logs
hapi runner logs
# Kill runaway hapi processes
hapi doctor cleanInstall Claude Code or set custom path:
npm install -g @anthropic-ai/claude-code
# or
export HAPI_CLAUDE_PATH=/path/to/claudeInstall Cursor Agent CLI:
# macOS/Linux
curl https://cursor.com/install -fsS | bash
# Windows (PowerShell)
irm 'https://cursor.com/install?win32=true' | iexEnsure agent is on your PATH.
hapi doctorThis is the first diagnostic step for most issues. It prints:
- CLI version, platform, and spawn diagnostics
- Configuration and relevant environment variables
- Contents of
settings.json(token redacted) - Whether
CLI_API_TOKENis set, and its source (it does not contact the hub or validate the token) - Runner status and runner state (including stale state)
- All running hapi processes
- Recent log files (including runner logs)
To clean up runaway processes:
hapi doctor clean| Aspect | Happy | HAPI |
|---|---|---|
| Design | Cloud-first | Local-first |
| Users | Multi-user | Single user by default; lightweight multi-account isolation via namespaces |
| Deployment | Multiple services | Single binary |
| Data | Encrypted on server | Never leaves your machine |
See Why HAPI for detailed comparison.
| Feature | Claude Code | HAPI + Claude Code |
|---|---|---|
| Remote access | No | Yes |
| Mobile control | No | Yes |
| Permission approval | Terminal only | Phone/web |
| Session persistence | No | Yes |
| Multi-machine | Manual | Built-in |
Visit our GitHub repository to:
- Report issues
- Submit pull requests
- Suggest features
Open an issue on GitHub Issues.