Mobile-first agent development environment in Rust. Create projects and direct Claude Code and Codex on your computers from your phone, continue across paired kimos, or build on the API.
翻譯準備中
取自儲存庫 README
正在載入完整 README。
檢視完整 README ↗Run kimo on a Mac mini, MacBook, Linux PC or GPU machine, then connect from its phone or tablet PWA. Create a project from nothing on that host, start Claude Code or Codex in its folder, and ask the agent to build it and publish it when you are ready. Agents, terminals and builds use the host's resources; your phone is where you direct the work.
Pair your other kimos to continue that work from another computer while the project stays on its original host. kimo keeps the Rust core small, shows resource pressure, and lets you switch authenticated accounts while continuing the same conversations. Its shared API and SDK also let you build your own PWA for cooperating agent teams.
With several machines, kimo-fleet coordinates them from one always-on board such as a Raspberry Pi:
The product direction records these principles, acceptance scenarios and remaining gaps.
gh) and Agents. On the phone each
project has files and changes.[Image #1]
for Claude Code and Codex), or send photos from the phone's camera or gallery.kimo usage.claude -p, codex exec) can run to its end,
detached from kimo. It survives kimo updating or crashing, ends with a real exit code, and
keeps its log and the agent's answer. It runs in its own folder, a folder of yours, or a
fresh git checkout of a commit (API /api/jobs, SDK createJob).kimo-fleet on an always-on machine knows your machines (GPUs,
Jetson, Hailo, Xcode, load). It wakes them for work and switches them off when idle. It
places jobs on the best one: one that is already on, otherwise the cheapest to keep on.
Workflows pass files between steps on different machines and wait for your approval.
See Several machines.kimo agents, kimo send, kimo wait, kimo read and kimo new to list, message, wait
for and start other agents; the bundled kimo-agents skill teaches them how.gpu-lab/trainer-1a2b. The phone reaches every paired kimo through the one
it is paired with.<kimo-terminal>.Linux (x86_64, ARM64) and macOS (Apple silicon, Intel):
curl -fsSL https://raw.githubusercontent.com/vallverdu/kimo/main/install.sh | sh
# without the window, for headless machines (servers, Raspberry Pi):
curl -fsSL https://raw.githubusercontent.com/vallverdu/kimo/main/install.sh | sh -s -- --server
The script puts kimo (and kimo-fleet, the fleet coordinator) in ~/.local/bin, checks
the release's SHA-256 first, and on macOS adds kimo.app to Applications.
From source (Rust stable):
cargo install --git https://github.com/vallverdu/kimo kimo
cargo install --git https://github.com/vallverdu/kimo kimo --no-default-features # server only
cargo install --git https://github.com/vallverdu/kimo kimo-fleet # coordinator
kimo runs the agent CLIs you already have: install Claude Code and/or Codex first.
kimo serve for a headless server,
or kimo for the native window and background server. Closing the window leaves agents
running. Install the agent CLIs and authenticate an account on the host first; Codex
sign-in currently needs a browser on that machine.kimo pair on the host, or show the QR code in
Devices, and scan it. The devices need a reachable network such as your LAN, Tailscale
or ZeroTier. See Phone and web to install the PWA and enable HTTPS.kimo pair on the other machine; in Devices → Other kimos,
enter its address and code (or use kimo peer add <address> <code>). Select that machine
to access its projects and agents from the PWA or native window.In the native window, dropping a folder on the projects panel adds it. If Claude or Codex
already worked there, kimo continues their latest conversations; earlier ones are in the
project's history. Add more accounts in Subscriptions, and install the bundled
kimo-agents skill from Skills to teach agents how to work together.
Inside any kimo session, agents (and you) can use:
kimo agents # ID, NAME, HOST, KIND, STATE, RESUME ID, FOLDER
kimo send reviewer "Review src/parser.rs and report problems"
kimo wait reviewer # until it is idle, needs input or stops
kimo read reviewer # its last answer, from its own transcript
kimo read reviewer --screen # its recent terminal screen
kimo new claude --name reviewer --prompt "Review src/parser.rs" # start a helper
kimo send gpu-lab/trainer-1a2b "Start the training run" # an agent on another machine
Messages arrive signed: [kimo message from agent coordinator (id mini/coordinator-0bffa3); reply with: kimo send mini/coordinator-0bffa3 "…"], so the receiver knows who asks and how
to answer. The id is kimo's; the resume id is the agent's own conversation id (Claude's
session id, or the id Codex writes in its log). Both show in the window and in kimo agents.
Every kimo can pair with others (a one-time code; both sides learn about each other). Then:
kimo agents lists the agents of every machine as host/id, and send, read, wait and
the API's session calls work on them;ssh -L and -R).Give each machine a clear name with --name or KIMO_NAME (default: its hostname).
Paired kimos that do not answer (asleep, switched off) are left alone for 20 seconds, so they do not slow the others down.
When some machines should sleep and others stay on, add the coordinator, kimo-fleet, on an
always-on machine. A Raspberry Pi 4 runs it in a few MB.
phone ─► kimo (Pi) ─/api/fleet─► kimo-fleet (Pi) ─fleet keys─► kimo on each machine
kimo-fleet serve (contrib/kimo-fleet.service) and start its kimo
with KIMO_FLEET=http://127.0.0.1:7780.~/.kimo-fleet/devices.yaml: address, MAC for Wake-on-LAN,
power policy, labels, GPUs, idle watts.kimo pair; on the Pi run
kimo-fleet pair <id> <code>, or tap pair in the Fleet tab. The pairing is one
way: the coordinator's key reaches only that machine's facts, jobs and power, never its
terminals, files or accounts. The machine gets no key for the Pi.kimo-fleet run job.yaml, from the Fleet tab, or kimo.fleet.submit():workflow: model-to-release
steps:
- task: train
requires: { labels: [cuda], vram_gb: 10 } # wakes the NUC, switched off 20 min after
run: python train.py --export onnx
outputs: [out/model.onnx]
- task: bench
needs: [train]
requires: { labels: [jetson] }
inputs: { model: train/out/model.onnx } # copied over, even with the NUC off
run: ./bench_trt.sh out/model.onnx
- task: approve-release
runner: approval # waits for you in the Fleet tab
needs: [bench]
By default:
power: { wake: wol, sleep: shutdown } to change that;Adding machines without sitting at them. Find machines in the Fleet tab (or
kimo-fleet discover) lists what is on your Tailscale or ZeroTier network, whether kimo and
SSH answer there, and which hardware model it looks like. Add then works over SSH (your
keys or Tailscale SSH, never a password): it installs kimo as a service on that network,
pairs one way with a code made on the machine itself, and gives the machine its model
(NUC 11, Jetson Orin Nano, Raspberry Pi 5 with Hailo, Pi 4, Mac mini, MacBook Air, Linux PC)
and role (agent host, GPU worker, build worker, edge target, Apple builder, spare). Each model
sets labels, power policy, slots and idle watts; each role is a label jobs can ask for.
Everything is in docs/fleet.md.
The Map tab draws every machine and phone on your tailnet in 3D, to scale, live while it is open: who is online, what each machine runs (projects, agents, facts, fleet jobs), and a pulse when work starts or ends. Machines take the shape of their hardware model, and one that is on the tailnet but not in the fleet can be added from there.
| Map | Fleet |
|---|---|
The phone client is a web app served by kimo itself. It has:
To install it as an app: on an iPhone, open the address in Safari, Share → Add to Home
Screen, then open kimo from the home screen and type the code (an installed app keeps its own
storage, so it pairs by itself). Android installs apps over HTTPS only: enable HTTPS in
Devices (tailscale serve, one click), scan the QR code and tap install.
Create a key for your app (web client → Apps, or POST /api/clients), limited to its origin
and to read or control, and load the SDK from kimo:
import { Kimo } from 'https://kimo.your-tailnet.ts.net/sdk/kimo.js';
import 'https://kimo.your-tailnet.ts.net/sdk/kimo-terminal.js'; // <kimo-terminal session="…">
const kimo = new Kimo({ url: 'https://kimo.your-tailnet.ts.net', token: 'kimo_…' });
kimo.subscribe(({ sessions }) => render(sessions)); // live updates
const { project } = await kimo.createProject({ mode: 'new', name: 'invoices', git: true });
const agent = await kimo.createSession({ name: 'builder', kind: 'claude', cwd: project.path });
await kimo.send(agent.id, 'Create the invoice model with tests');
await kimo.waitFor(agent.id); // until it stops working
console.log((await kimo.reply(agent.id)).text); // its answer
examples/agent-board is a complete app in one HTML file. The full
HTTP API, SDK and CLI reference is in docs/api.md.
cp contrib/kimo.service ~/.config/systemd/user/, then
systemctl --user enable --now kimo and loginctl enable-linger $USER.cp contrib/ai.kimo.plist ~/Library/LaunchAgents/, then
launchctl load -w ~/Library/LaunchAgents/ai.kimo.plist.kimo.app in
Applications (or ~/Applications), with the same binary; kimo install-app does it by
hand. Updates keep the app and ~/.local/bin/kimo at the same version. Opened from the
Dock, kimo takes your login shell's PATH, so it finds claude and codex.contrib/kimo.desktop.cp contrib/kimo-fleet.service ~/.config/systemd/user/, then
systemctl --user enable --now kimo-fleet, and add KIMO_FLEET=http://127.0.0.1:7780 to
kimo's environment on the same machine.Flags or environment variables (see .env.example):
| Variable | Default | |
|---|---|---|
KIMO_BIND | all | where to listen: all, localhost, tailscale, zerotier or an IP |
KIMO_PORT | 7777 | |
KIMO_NAME | hostname | this machine's name for paired kimos |
KIMO_PROJECTS_DIR | ~/dev | where new projects are created |
KIMO_LOCAL_OWNER | true | requests from this machine itself are the owner |
KIMO_TOKEN | optional owner token for scripts | |
KIMO_DATA_DIR | ~/.kimo | state, account homes, jobs, backups |
KIMO_FLEET | the fleet coordinator on this machine, e.g. http://127.0.0.1:7780 (shows the Fleet tab) | |
KIMO_SHUTDOWN_COMMAND | systemctl poweroff (Linux), System Events (macOS) | what /api/power/shutdown runs |
KIMO_SHUTDOWN_IGNORE_LOGINS | 1: people logged in do not keep the machine on |
The coordinator has its own settings:
KIMO_FLEET_DIR (default ~/.kimo-fleet)KIMO_FLEET_PORT (default 7780)KIMO_FLEET_BIND (default 127.0.0.1)KIMO_FLEET_TOKEN (for scripts from elsewhere)| Default | Change it in | |
|---|---|---|
| Listening | every network, port 7777 | KIMO_BIND, KIMO_PORT |
| Who is the owner | this machine itself, paired devices | KIMO_LOCAL_OWNER, Devices |
| New projects | ~/dev | KIMO_PROJECTS_DIR |
| New agents | the active subscription; the CLI's own model and effort; the agent's own approval prompts (not yolo) | Subscriptions, Settings → Agents, or per agent |
| Plan limits | shown (Claude's usage API, Codex itself) | Settings |
| Keeping awake | off (the computer sleeps as usual) | bottom bar, Settings |
| Memory | idle agents stopped only when memory is critical; no idle timer; "heavy" above 1.5 GB | Settings → Memory |
| Updates | a notification per new version; installed only when you say | Settings → Updates |
| Colours | the system's light or dark | Settings → Appearance |
| Jobs | kimo keeps the newest 200; a job without a folder gets a fresh one; no time limit | the job's cwd, git, timeout_s |
| Fleet | coordinator only on 127.0.0.1:7780; machines never woken or switched off until devices.yaml says so | devices.yaml |
KIMO_TOKEN if
you set one. The owner can do everything, including running commands on this machine
through terminals.read or control; they never
manage logins, keys, devices, peers, skills or settings.~/.kimo/accounts/<id>);
kimo's state file (keys included) is readable only by you.KIMO_LOCAL_OWNER=false and pair your devices.See SECURITY.md to report a vulnerability.
v0.1.15 native window, with invented projects, conversations and usage. Images switch with your GitHub theme; see how they are made.
| Usage per day, project and subscription | A project’s agents and earlier conversations |
|---|---|
| Earlier conversations of a project | Claude Code in kimo |
| Someone needs you | Subscriptions |
| Skills | Settings |
| A project's changes | A project's files |
| Devices and other machines | Accounts on the phone |
/api/jobs) keep running through a crash too.codex login completes in a browser on the machine itself; sign Codex accounts in there once.systemctl poweroff under a user service and the GPU, Jetson and
Hailo facts are tested with stand-ins, not yet on real NUCs, Jetsons or Pis. Unattended
shutdown on Linux may need a sudoers rule (docs/fleet.md).cargo run # the window (starts a server in the background)
cargo run -- serve # only the server
cargo test --workspace # unit, API, PTY, two-server and fleet tests
cargo run -p kimo-fleet # the coordinator
Layout:
src/core: pure logicsrc/services: sessions, projects, accounts, usage, peers, skills, jobs, node facts, power…src/api: HTTP and websocketssrc/desktop: the windowsrc/cli.rs: kimo agents, send…web/: phone client and SDKfleet/: the coordinator, with the same layersSee CONTRIBUTING.md.
MIT OR Apache-2.0, at your option. Bundled third-party components are listed in THIRD_PARTY_NOTICES.md.