User Guide

Connect your AI agent

The ACP connector is a small program you run on your own computer. It plugs your personal Claude or Codex into a Cheers bot so it can read channels, see the files you attach, and reply β€” all using your own agent subscription. This guide walks a non-developer through it: install, connect, keep it updated, and fix the most common surprise.

The one thing to remember: when the connector is out of date, your bot quietly loses new features β€” most visibly, it stops seeing files you attach to a message. If a bot replies "please upload the files or give me the path" even though you attached them, jump to step 6 β€” keep it updated.

1. What the connector is (30-second version)

Cheers has no AI built in. Instead, you bring your own agent and connect it from your machine. Three pieces talk to each other:

your browser ──▢ Cheers gateway (the server) ◀──── connector (runs on your PC) ──▢ your AI agent
                                                    β”” one config file = one bot

One config file describes one bot. Want two bots (say a Claude bot and a Codex bot)? Two files, run two of them. They're fully independent.

2. Before you start

You needHow to check
A Cheers server you can reachAsk your admin for the address, e.g. ws://localhost:8000 or your team's URL
Your agent installedRun command -v claude-agent-acp (or codex-acp) β€” it should print a path
Your agent signed inThe folder ~/.claude (or ~/.codex) exists β€” that's your subscription login
Permission to manage a botYou (or an admin) can open Settings β†’ Bots in Cheers

That's it β€” you do not need Rust, Docker, or an API key. Signing into your agent once is enough.

3. Install the connector

Download the prebuilt binary for your OS β€” no toolchain required. Paste this into a terminal:

# pick the right file for your OS/CPU, download it, make it runnable
os=$(uname -s | tr 'A-Z' 'a-z'); arch=$(uname -m | sed -e 's/x86_64/amd64/' -e 's/aarch64/arm64/')
mkdir -p ~/.cheers/bin ~/.cheers/workspace   # workspace = where the agent works β€” must exist, or the connector refuses to start
curl -fsSL -o ~/.cheers/bin/cce-acp-connector \
  "https://github.com/ElePerson/Cheers/releases/latest/download/cce-acp-connector-$os-$arch"
chmod +x ~/.cheers/bin/cce-acp-connector
export PATH="$HOME/.cheers/bin:$PATH"   # add this line to your ~/.zshrc so it sticks
cce-acp-connector --help                # prints help = success
If the repo is private, plain curl returns a 404. Download with the GitHub CLI instead, e.g. gh release download -R ElePerson/Cheers -p "cce-acp-connector-$os-$arch" -O ~/.cheers/bin/cce-acp-connector (with no tag, gh fetches the latest release).

4. Create the bot and get its token

A token is the connector's password to log in to the gateway as your bot. Get one in the UI:

  1. Sign in to Cheers and open Settings β†’ Bots.
  2. Create a bot (or open an existing one). Give it a name like claude, and set its bridge/provider type to generic / ACP.
  3. Issue a token and copy it. Save it into a small file that only you can read:
    mkdir -p ~/.cheers/secrets && chmod 700 ~/.cheers/secrets
    # paste the token in place of PASTE_TOKEN_HERE:
    printf '%s' 'PASTE_TOKEN_HERE' > ~/.cheers/secrets/claude.token
    chmod 600 ~/.cheers/secrets/claude.token
Keep the token in a file, never inside the config. Config files get shared, screenshotted, and committed to git β€” a token pasted inline leaks. Issuing a new token also replaces the old one, so only one connector should use a bot at a time.

5. Write one config file

Create ~/.cheers/cheers-daemon.claude.toml. This is the minimal form β€” the rest have sensible defaults. Change the two URLs to match your gateway, and the command to your agent's path:

version = 1

[daemon]
state_path = "state-claude.json"   # these are relative to this file's folder (~/.cheers)
log_dir    = "logs-claude"

[accounts.claude.bridge]
control_url    = "ws://localhost:8000/ws/agent-bridge/control"
data_url       = "ws://localhost:8000/ws/agent-bridge/data"
bot_token_file = "secrets/claude.token"   # the file from step 4 β€” never paste the token here

[accounts.claude.adapter]
type    = "stdio"
command = "/opt/homebrew/bin/claude-agent-acp"   # output of: command -v claude-agent-acp
args    = []

[accounts.claude.policy.prompt]
allow             = true
allow_attachments = true    # ← lets the bot receive files you attach to a message
allow_images      = true

[accounts.claude.policy.workspace]
default_cwd   = "~/.cheers/workspace"
allowed_roots = ["~/.cheers/workspace"]
backend_may_set_cwd = true

[accounts.claude.policy.env]
inherit = false
allow   = ["HOME", "PATH"]   # HOME lets the agent read your ~/.claude subscription login

[accounts.claude.policy.permission]
forward_to_backend = true    # tool-use asks show up as an approval card in the channel
wait_timeout_ms    = 900000
on_timeout         = "cancel"
auto_allow         = false

[accounts.claude.policy.mcp]
inject_cheers = true         # gives the agent the Cheers tools (read files, post messages…)

The config folder ends up looking like this:

~/.cheers/
β”œβ”€ cheers-daemon.claude.toml     # one file = one bot
β”œβ”€ secrets/claude.token          # the token, chmod 600
β”œβ”€ workspace/                    # where the agent works
└─ logs-claude/                  # its logs

Start it & check it's online

cce-acp-connector start  --config ~/.cheers/cheers-daemon.claude.toml --name claude
cce-acp-connector status --name claude          # β†’ status=running
cce-acp-connector logs   --name claude --lines 40
# expect "initialized ACP agent" + "BridgeRuntime started", no ERROR lines

Now @-mention the bot in a Cheers channel. A reply means you're connected. πŸŽ‰ Because the token lives in a file, restarts need no extra steps: cce-acp-connector restart --name claude.

6. Keep it updated (important)

New Cheers features often need a matching connector version. An outdated connector still connects and runs fine β€” it just silently skips whatever it doesn't understand yet. The most common casualty is attached context: the file chips show in the chat, but your bot never receives them and asks you to upload the files. Updating fixes it.

See whether you're behind

cce-acp-connector status --name claude
# if a newer release exists you'll see an "update available:" line here,
# and a warning in the logs at startup.

Option A β€” turn on signed auto-update (connector β‰₯ 0.1.27)

Add this to your config, then restart once. From then on the connector updates itself safely (it checks an ed25519 signature and checksum, waits until it's idle, swaps in place, and rolls back if the new one is unhealthy):

[update]
auto = true
Upgrading a very old install? Binaries older than 0.1.27 reject a config that contains [update]. In that case update the binary first (Option B), then add the [update] section.

Option B β€” update by hand

Re-run the download from step 3 (it overwrites the old binary), then restart:

os=$(uname -s | tr 'A-Z' 'a-z'); arch=$(uname -m | sed -e 's/x86_64/amd64/' -e 's/aarch64/arm64/')
curl -fsSL -o ~/.cheers/bin/cce-acp-connector \
  "https://github.com/ElePerson/Cheers/releases/latest/download/cce-acp-connector-$os-$arch"
chmod +x ~/.cheers/bin/cce-acp-connector
cce-acp-connector restart --name claude

Auto-update is off by default on purpose β€” updating runs downloaded code, so the owner of the machine opts in. You can hard-disable it anytime with CHEERS_ACP_NO_SELF_UPDATE=1.

7. How attaching files works

In the message composer, Add context lets you attach a file (or a line range like review.md:1-1, or a file from a workspace). Each attachment becomes a small chip on your message. When you send, Cheers passes those references to the bot's connector, which puts them into the agent's prompt so it knows what you're pointing at.

8. Troubleshooting

What you seeLikely causeFix
Bot ignores files you attached β€” asks you to upload them or give a path, even though the chips are on your messageThe connector is older than the version that renders attached context into the promptUpdate the connector (β‰₯ 0.1.28), then restart. Also confirm allow_attachments = true.
start exits right away, log mentions the tokenThe token file is missing or emptyRe-do step 4; check ~/.cheers/secrets/<name>.token exists and isn't empty
start exits right away, log: allowed_roots does not existThe folder your config points at (allowed_roots / default_cwd) hasn't been created β€” it must exist before startupmkdir -p ~/.cheers/workspace (or whichever directory your config names), then start again
log: command not foundWrong path to your agentcommand -v claude-agent-acp and put the absolute path in adapter.command
Agent starts but never replies / auth failsThe agent can't read your subscription loginMake sure policy.env.allow includes HOME
Keeps reconnecting / never connectsWrong gateway address, or gateway downCheck the two ws://… URLs with your admin; confirm the server is up
unsupported protocolVersion … ClosingYour agent's version doesn't match the connectorUpdate the agent (claude-agent-acp / codex-acp) to a current version
A tool action hangs "waiting for approval"auto_allow = false (the safe default)Approve it on the channel's approval card, or set auto_allow = true to trust it locally

Read more