Many agents, one table, all on your computer.
01
antiBot is a local multi-agent desktop assistant. Each agent is a persistent chat backed by an AI coding CLI you already have installed and signed in to: Claude Code, OpenAI Codex CLI, Gemini CLI, or any other command. Different agents can use different providers. There is no server to rent and no API key field.
The window is Tauri v2. Process management, schedules, memory, SQLite and agent-to-agent messaging run in a Rust backend. The command-line tool is called openbot.
02
Installers for Windows, macOS and Linux are not published yet. planned Until then, run it from source.
You need Rust 1.85 or newer, Node.js 20+ for the window's build, and a C toolchain. On Debian or Ubuntu:
sudo apt install libwebkit2gtk-4.1-dev build-essential curl wget file \
libxdo-dev libssl-dev libayatana-appindicator3-dev librsvg2-dev patchelf pkg-config
macOS needs the Xcode command line tools. Windows needs the Tauri prerequisites.
Install the CLIs you want and sign in with their own login. antiBot never asks for an API key.
03
npm install && npm run tauri dev
The window opens. The local API listens on http://127.0.0.1:47221. Then:
PATH.04
Each agent gets a workspace folder under ~/.openbot/workspaces/, created as a git repo when git is available.
| Provider | Command | Default extra argument |
|---|---|---|
| Claude Code | claude -p --output-format stream-json | --permission-mode bypassPermissions |
| Codex CLI | codex exec --json | --full-auto |
| Gemini CLI | gemini -p --output-format stream-json | --yolo |
The extra arguments let a headless run proceed without a prompt; you can remove them in Settings. Session ids are stored and passed back with each CLI's resume flag.
Any CLI that prints text works. Put placeholders in the arguments: {prompt}, {message}, {system} and {session}. Arguments are not run through a shell.
05
Every turn starts with a preamble built from the agent's instructions, your shared memory, the agent's own memory notes and the list of other agents. Claude Code receives it with --append-system-prompt; Codex and Gemini receive it in the prompt.
06
Routines are cron schedules (UTC) that run an agent in the background and post the result into its chat. Disabled routines are skipped, and a missed one-shot routine catches up.
07
Each agent is told how to reach the others:
openbot send --to "Other Agent" --body "your message"
That calls POST /v1/send on the local API. The message appears in the recipient's chat and that agent takes a turn. After 4 hops the API refuses to deliver, so two agents cannot loop forever. An agent cannot message itself.
08
Every turn an agent takes becomes a task with an id like OB-123, a status, a priority, an assignee and an audit log. You can create tasks too. A message with a title and at least two numbered or bulleted steps becomes a task with sub-tasks. List, board, activity, projects and cycles sit next to the inbox.
| Key | Action |
|---|---|
Ctrl+K or / | Search |
C | Create a task |
1–6 | Change the open task's status |
Token use and cost are recorded per turn when the CLI reports them; ~/.openbot/pricing.json prices the rest. The Usage view charts it. Built-in role skills (SKILL.md) are picked per call, up to four.
09
Each agent has its own MCP connectors, from the built-in catalog or added as a stdio, SSE or HTTP server. Secrets go to the OS keychain, not SQLite.
A folder scope sets the working directory and adds the provider's own limits: --add-dir for Claude Code, --sandbox workspace-write for Codex, --sandbox for Gemini. This is not a perfect jail; a container sandbox is on the roadmap. planned
10
Everything lives in ~/.openbot: the SQLite database openbot.db, workspaces and pricing. Override the folder with OPENBOT_DATA_DIR and the port with OPENBOT_PORT.
openbot serve # API without the window
openbot doctor # check CLIs and setup
openbot agents # list agents
openbot send --to Ada --body "look at the workspace"11
The CLI is not on your PATH. Install it, sign in, and restart antiBot.
antiBot shows the CLI's own error. Sign in with that CLI in a terminal, then try again.
12