Go to file
王性驊 7edc05ba9b setup --refresh-service: keep the launcher executable
systemd starts ~/.local/bin/anybot-run directly. install_systemd set 0755,
the refresh path rewrote the file without it, and the unit then died with
status=203/EXEC in a restart loop (seen on a Ubuntu hands box: service
enabled, binary fresh, nothing running). One make_executable for both.
2026-11-10 14:46:30 +08:00
.gitea/workflows Bug sweep: gates, relay 2FA, Windows input, snapshots, encodings 2026-11-10 11:46:17 +08:00
bench/computer-use Injection defences and a red-team suite (S3) 2026-11-09 17:19:21 +08:00
box GTK 2 apps in the box get numbers, a quick model's answer always goes past the bot's own model, and a bot finishes what it was asked 2026-11-09 12:53:06 +08:00
deploy install.sh: stop dying on macOS at the compile step 2026-11-10 14:32:56 +08:00
docs One computer-and-phone still, and the README stops advertising its style guide 2026-11-10 14:21:06 +08:00
fonts AnyBot: first commit of the working desktop app 2026-11-04 16:51:51 +08:00
icons Remove what nothing uses and keep one copy of what was written several times 2026-11-05 23:21:47 +08:00
install One installer for every platform, first run included 2026-11-10 14:07:01 +08:00
mobile One installer for every platform, first run included 2026-11-10 14:07:01 +08:00
relay Bug sweep: gates, relay 2FA, Windows input, snapshots, encodings 2026-11-10 11:46:17 +08:00
shots/readme One computer-and-phone still, and the README stops advertising its style guide 2026-11-10 14:21:06 +08:00
skills Skills you can hold in your hand: skill files, install, 示範即教學 (P7+C8) 2026-11-09 20:46:02 +08:00
src setup --refresh-service: keep the launcher executable 2026-11-10 14:46:30 +08:00
.dockerignore AnyBot: first commit of the working desktop app 2026-11-04 16:51:51 +08:00
.gitignore Readmes: lead with the picture, and take the pictures fresh 2026-11-10 14:07:02 +08:00
Cargo.lock Bug sweep: gates, relay 2FA, Windows input, snapshots, encodings 2026-11-10 11:46:17 +08:00
Cargo.toml Bug sweep: gates, relay 2FA, Windows input, snapshots, encodings 2026-11-10 11:46:17 +08:00
FEATURES.md A screen never runs its own box or VM, from the start 2026-11-09 15:32:36 +08:00
LICENSE Apache-2.0: license file, manifest fields, README section 2026-11-09 16:36:36 +08:00
MECHANICS.md AnyBot: first commit of the working desktop app 2026-11-04 16:51:51 +08:00
Makefile install.sh: stop dying on macOS at the compile step 2026-11-10 14:32:56 +08:00
README.en.md One computer-and-phone still, and the README stops advertising its style guide 2026-11-10 14:21:06 +08:00
README.md One computer-and-phone still, and the README stops advertising its style guide 2026-11-10 14:21:06 +08:00
SECURITY.md Say what the walls are: SECURITY.md + threat model (P5) 2026-11-09 20:33:56 +08:00
install.cmd One installer for every platform, first run included 2026-11-10 14:07:01 +08:00
install.ps1 One installer for every platform, first run included 2026-11-10 14:07:01 +08:00
install.sh install.sh: stop dying on macOS at the compile step 2026-11-10 14:32:56 +08:00
mechanics.json AnyBot: first commit of the working desktop app 2026-11-04 16:51:51 +08:00

README.en.md

AnyBot

AnyBot

An AI assistant that runs on your own computers.
It chats, and it does things: files, commands, web pages, the screen in front of you, and jobs on a clock.

中文 · English

Apache-2.0 macOS, Linux, Windows Rust 1.95 self-hosted

A list of bots on the left, a chat with one of them on the right

You bring the model key: xAI, OpenAI, Claude, Gemini, OpenRouter, OpenCode Go, Ollama at home, or anything that speaks the OpenAI API. Chats, files, and passwords stay on your machines instead of landing in someone else's account server. Each row on the left is a bot — research, writing, “touch the computer” — and each can use a different model.


Install in 30 seconds

Open a terminal and paste one line.

# macOS, Linux (not Ubuntu-only: apt, dnf, yum, pacman, zypper, apk, xbps)
curl -fsSL https://code.30cm.net/daniel.w/AnyBot/raw/branch/main/install.sh | sh
# Windows 10/11 (x64, arm64)
irm https://code.30cm.net/daniel.w/AnyBot/raw/branch/main/install.ps1 | iex

It installs what it needs, asks which piece you want, and walks through the first setup. The first build takes 5–15 minutes, later updates 1–2. It lives in your user folder and needs no administrator account.

Then open AnyBot (on a Mac, the first time: right-click the icon › Open), paste an API key under Settings › Models, make a bot, and talk to it. No key? Pick Ollama and it runs on your own machine.

Account server + brain (any Linux with Docker, 2 GB RAM or more; it asks for a domain, a user, a password, and handles HTTPS itself):

curl -fsSL https://code.30cm.net/daniel.w/AnyBot/raw/branch/main/install.sh | sh -s -- server

Headless hands (a computer for the bot to use; a screen is optional). The URL and the pairing code come from “Add a computer” in AnyBot:

curl -fsSL https://code.30cm.net/daniel.w/AnyBot/raw/branch/main/install.sh \
  | sh -s -- hands https://your-address 482913
# Hands on Windows
$env:ANYBOT_MODE='hands'
$env:ANYBOT_PAIR_URL='https://your-address'
$env:ANYBOT_PAIR_CODE='482913'
irm https://code.30cm.net/daniel.w/AnyBot/raw/branch/main/install.ps1 | iex

Running this from an agent, with no questions asked: sh install.sh --print reports what fits this machine, then use the environment variables — see install/AGENT.md.


It asks before it acts

Say “do this on my computer” and it does not just run it. You see the exact step and choose allow once, always, or no. Sending, paying, and deleting are asked every time, even when you turned the other prompts off.

Left: a card asking permission before a command runs on your computer. Right: the phone page, asking you to sign in

  • Files and commands — it asks first. Or it works only inside its own computer, a small desktop kept apart from yours.
  • Web pages and forms — its own browser. Passwords and card numbers are filled by the app, not read out to the model.
  • The screen you are using — it reads the buttons in the screenshot, then clicks. If it needs you to sign in, it hands you the screen.
  • A clock — “every weekday at 9, three news items” becomes a routine.
  • A phone, from anywhere — open your URL in a browser, sign in, and it is the same chat; watch it from outside.

A weekday 9:00 news routine created from the chat


One machine thinks, others get used

One machine remembers and thinks (the brain). Others are there to be used (the hands). The phone is only a window. They all meet on an account server you run, so the computers at home do not open a port or need a public address.

  you on the phone          you on a laptop         a computer with no screen
        \                      |                      /
         └───── account server (it only connects them) ─────┘
                               |
               brain: bots, chats, memory, routines live here
                               |
        hands: the brain asks this machine to see, click, read, browse
Role What you do
Brain Set up the server once, or use a Mac that stays awake
Screen Install the desktop app and sign in to the same account
Hands Press “Add a computer” and paste the line it shows
Phone Open your URL in a browser and add it to the Home screen

No server yet? Use one always-on Mac as the brain — see option B in docs/multi-device.md.


What happens to a sentence

flowchart TD
  you[You: desktop app or phone]
  relay[Account server<br/>relays only, stores no chats]
  brain[AnyBot on the brain]
  model[The model you picked]
  ask[Touch the computer? Ask first]
  box[The bot's own computer<br/>a small desktop in Docker]
  hands[One of the hands<br/>your Mac, Linux, or Windows]

  you --> relay --> brain
  brain --> model
  brain --> ask
  ask --> box
  ask --> hands
  1. You send a message on the desktop or the phone. The phone does not think for itself; it reads the same chat on the brain.
  2. The brain hands that sentence, the bot's instructions, and its tools to the model you picked.
  3. If the model only answers, it writes back. If it wants to read a file, open a page, or click something, it proposes an action.
  4. That action goes through AnyBot's own rules first — the model does not decide whether it is allowed.
  5. Once you allow it, the action runs on the computer you chose: the isolated desktop, the one you are using, or a paired hand.
  6. The result goes back into the chat. Phone and laptop show the same thing because both read the brain.

Three programs are enough, and there is no database server: anybot (the desktop, the background service anybot --serve, and the terminal setup anybot setup are this one file), anybot-relay (the account server; computers connect out to it), and the phone page (one file, built into the app). Details in docs/architecture.md.


Documents

You want… Read
Phone, brain, hands, “it will not connect” docs/multi-device.md
A platform failed, build it yourself docs/install.md
How the code is layered docs/architecture.md
The account server's API docs/protocol.md
Trust boundaries, where keys live SECURITY.md
Every feature, listed FEATURES.md
Packaging, CI docs/release.md

Chinese is the source of truth; docs/en/ is a summary for people who do not read Chinese.

Hack on it

git clone https://code.30cm.net/daniel.w/AnyBot.git
cd AnyBot
make deps && make && make install

make run opens it, make test runs the tests, make help lists everything.

License

Apache-2.0, see LICENSE.