AI pair programming
in your terminal.

A native Claude client. One binary, no runtime. Reads your codebase, edits files, runs commands — sandboxed by default.

Installcurl -fsSL https://github.com/1ay1/moha/releases/latest/download/moha-linux-x86_64 -o moha

or build from source — Linux x86_64/ARM64, macOS

type a message…
⏎ send · ↑↓ newline · ^E expand│ W R I T E │
● Ready   0.0 t/s ▁▁▁▁▁▁▁▁   0♦ Sonnet · CTX —/—░░░░░░░░░░
^K palette ^J threads ^T todo S-Tab profile ^/ models ^C quit
BINARY~9 MBRUNTIMEnoneLANGUAGEC++26LICENSEMIT

Everything runs locally. Nothing phones home except the API call.

Streaming with input queueing

Type while the model answers. Your message queues and lands when the stream finishes. No waiting, no interrupted thoughts.

🛡

Sandboxed by default

bash runs inside bwrap (Linux) / sandbox-exec (macOS). Workspace and system libs reachable; ~/.ssh, /etc, other projects read-only. Even an approved command can't exfiltrate keys.

🔒

Air-gapped SSH

One command: moha airgap user@host. SOCKS5 over SSH, TLS end-to-end with the real upstream. The tunnel can't MITM you.

🔧

16 tools, purpose-built widgets

read, write, edit, bash, grep, glob, list_dir, find_definition, web_fetch, web_search, todo, diagnostics, git_*. Diffs render as diffs. Search results group by file.

🧵

Persistent threads

Conversations persist under ~/.moha/. Browse, fork, and delete from ^J. Resume any thread exactly where you left off.

Permission profiles

Write — autonomous. Ask — prompt before Exec/WriteFs/Net. Minimal — prompt for everything except Pure. Cycle with S-Tab.


The niche pick for single-binary, air-gapped Claude.

mohaClaude Codeaider
Language / runtimeC++26 — static binaryTypeScript / NodePython
Footprint~9 MBnpm + Node runtimepip + Python runtime
Air-gapped modeYes (SOCKS5 over SSH)NoNo
AuthOAuth (Pro/Max) + API keyOAuth + API keyper-provider env vars
ModelsClaude (Anthropic)Claude (Anthropic)many (OpenAI / local / …)
Sandboxbwrap / sandbox-execNoNo

Multi-model? aider. Anthropic's first-party experience? Claude Code. Single binary with no runtime and air-gapped SSH? moha. Read more →


Pure-functional update loop. Strong types. Zero runtime.

Elm architecture

Pure-functional (Model, Msg) → (Model, Cmd). The reducer is one std::visit over a closed event sum. View is a single function Model → Element.

Strong ID newtypes

ThreadId, ToolCallId, ModelId, CheckpointId — swapping arguments is a compile error, not a debugging session.

maya TUI engine

Rendering delegated to maya, a sister header-mostly TUI engine. SIMD frame diff, Yoga flexbox layout, 69 widgets. moha builds widget Configs from Model state; maya owns every glyph.

Effect-based permissions

Tools declare EffectSet capabilities: ReadFs, WriteFs, Net, Exec, Pure. The permission policy reads these tags and only these — no per-tool overrides, no stringly-typed trust.


Try it.

cd your-project && moha