Skip to content

How it Works ​

HAPI connects coding agents, a self-hosted hub, and web/native clients for remote control.

Architecture Overview ​

text
CLI + Agent  <---- Socket.IO /cli ---->  Hub + SQLite
Runner       <---- Socket.IO /cli ---->       |
  |                                          | REST + SSE
  +-- spawns CLI sessions                    |
                                     Web / PWA / Mini App
                                     Native iOS / Android

The hub can run on your local desktop or a remote host (VPS, cloud, etc.). Clients reach it directly or through an optional tunnel/reverse proxy. Use an HTTPS hub origin for native pairing; see Deployment.

Components ​

HAPI CLI ​

The CLI is a wrapper around AI coding agents. It supports multiple agent flavors out of the box — see Supported agents for the full list. It:

  • Starts and manages coding sessions
  • Registers sessions with the HAPI hub
  • Relays messages and permission requests
  • Provides MCP (Model Context Protocol) tools

Key Commands:

bash
hapi              # Choose an agent interactively and start a session
hapi <agent>      # Start a supported agent directly (required in scripts)
hapi runner start # Run background service for remote session spawning
hapi ping-peer --list  # Shell peer shortlist (prefer MCP list_peers in-session)

MCP peer tools (same hub/namespace as the session): list_peers (discover), inspect_peer (read), ping_peer (message). These work from runner-spawned sessions even when the hub is on another host - see Installation → Split hub + remote runner.

HAPI Hub ​

The hub is the central service that connects everything:

  • HTTP API - RESTful endpoints for sessions, messages, permissions
  • Socket.IO - Real-time bidirectional communication with CLI
  • SSE (Server-Sent Events) - Live updates pushed to web and native clients
  • SQLite Database - Persistent storage for sessions and messages
  • Telegram Bot - Notifications and Mini App integration

Web App ​

A React-based PWA usable in a browser, as an installed PWA, or as a Telegram Mini App:

  • Session List - View all active and past sessions
  • Chat Interface - Send messages and view agent responses
  • Permission Management - Approve or deny tool access
  • File Browser - Browse project files and view git diffs
  • Terminal View - Run commands on the working machine from your browser
  • Voice Assistant - Talk to your agent and approve permissions by voice (see Voice input and assistant)
  • Session References - Copy a session reference or mention another conversation for context
  • Remote Spawn - Start new sessions on any connected machine

Native apps ​

The iOS SwiftUI/UIKit and Android Kotlin Compose apps are independent clients of the hub. Both support sessions/chat, approvals and questions, new sessions, attachments, files/Git, Scratchlist, dictation and native push. Their interactive traffic uses the same REST + SSE client API; background notifications use FCM/APNs with the native push contract.

The apps have their own navigation and rendering. Protocol fixture conformance does not imply web UI parity: the terminal, Work Graph and realtime voice controls remain web features. See Native apps for current capabilities, platform differences and build/pairing instructions.

Data Flow ​

Starting a Session ​

1. User runs `hapi` and chooses an agent
         │
         ▼
2. CLI starts the selected agent
         │
         ▼
3. CLI connects to hub via Socket.IO
         │
         ▼
4. Hub creates session in database
         │
         ▼
5. Web/native clients receive SSE update
         │
         ▼
6. Session appears in mobile app

Permission Request Flow ​

1. AI agent requests tool permission (e.g., file edit)
         │
         ▼
2. CLI sends permission request to hub
         │
         ▼
3. Hub stores request and sends SSE + configured notifications
         │
         ▼
4. User receives notification on phone
         │
         ▼
5. User approves/denies in a native or web client
         │
         ▼
6. Hub relays decision to CLI via Socket.IO
         │
         ▼
7. CLI informs AI agent, execution continues

Message Flow ​

User (Phone)                 Hub                     CLI
     │                         │                       │
     │──── Send message ──────►│                       │
     │                         │─── Socket.IO emit ───►│
     │                         │                       │
     │                         │                       ├── AI processes
     │                         │                       │
     │                         │◄── Stream response ───│
     │◄─────── SSE ────────────│                       │
     │                         │                       │

Communication Protocols ​

CLI ↔ Hub: Socket.IO ​

Real-time bidirectional communication for:

  • Session registration and heartbeat
  • Message relay (user input → agent)
  • Permission requests and responses
  • Metadata and state updates
  • RPC method invocation

Hub ↔ Web/native clients: REST + SSE ​

  • REST API for actions (send message, approve permission)
  • SSE stream for real-time updates (new messages, status changes)

External Access: Tunnel ​

For remote access outside your local network:

  • Built-in relay (hapi hub --relay) - Managed tunwg tunnel (WireGuard + TLS), no third-party account required
  • Cloudflare Tunnel (recommended) - Free, secure, reliable
  • Tailscale - Mesh VPN for private networks
  • ngrok - Quick setup for testing

Seamless Handoff ​

HAPI's defining feature is the ability to seamlessly hand off control between local terminal and remote devices without losing session state.

Local Mode ​

When working in local mode, you have the full terminal experience — it is the native agent CLI (Claude Code, Codex, OpenCode, and more):

  • Direct keyboard input with instant response
  • Full terminal UI with syntax highlighting
  • Best for focused, uninterrupted coding sessions
  • Agent tools run on your machine; model requests use the provider configured in the agent

Remote Mode ​

Switch to remote mode when you need to step away:

  • Control via Web/PWA/Telegram from any device
  • Approve permissions on the go
  • Monitor progress while away from your desk
  • Session continues running on your local machine

How Switching Works ​

┌─────────────────┐                    ┌─────────────────┐
│   Local Mode    │◄──────────────────►│   Remote Mode   │
│   (Terminal)    │                    │   (Phone/Web)   │
└─────────────────┘                    └─────────────────┘
        │                                      │
        │  ┌────────────────────────────┐      │
        └─►│  Same Session, Same State  │◄─────┘
           └────────────────────────────┘

Local → Remote:

  • Open the session on your phone/web and send a message
  • HAPI keeps the conversation going on the same working machine

Remote → Local:

  • Continue typing in the terminal
  • If the terminal shows the remote-control screen, press double-space to return to local input

Some agents keep both interfaces available at once, so no switch is needed. For Codex terminal-exit and resume behavior, see Usage and limits.

Use Cases ​

  1. Remote Control While Away - Start a session at your desk, continue from your phone during commute or coffee break

  2. Permission Approval - AI requests file access, you get notified on phone, approve with one tap, session continues

  3. Multi-Device Collaboration - View session progress on your phone while your desktop does the heavy lifting

Released under the AGPL-3.0 License. · Privacy Policy