Deployment
Two deployment methods: binary (direct install) and Docker.
Binary
From Release
Download a pre-built binary from GitHub Releases. Binaries are available for linux, macOS, and Windows on amd64/arm64.
# Example: Linux amd64
curl -LO https://github.com/vaayne/anna/releases/latest/download/anna_linux_amd64.tar.gz
tar xzf anna_linux_amd64.tar.gz
chmod +x anna
sudo mv anna /usr/local/bin/From Source
go install github.com/vaayne/anna@latest
# or
git clone https://github.com/vaayne/anna.git
cd anna && go build -o anna .Running
Run the setup command to open the admin panel and configure anna (providers, channels, agents, etc.):
anna --openThis starts a local web UI where you set up API keys, channels, and agent profiles. All configuration is stored in ~/.anna/anna.db -- no manual config files needed.
Start the daemon:
annaTo serve the admin panel alongside the daemon (for runtime config changes):
anna --port 8080
anna --host 0.0.0.0 --port 8080Version And Self-Upgrade
anna version
anna upgrade
anna upgrade --install-dir "$HOME/.local/bin"anna upgrade fetches the latest stable release from GitHub, downloads the matching archive for the current OS/architecture, and installs the binary into $HOME/.local/bin by default.
Systemd Service (Linux)
A ready-to-use unit file is provided at scripts/anna.service.
# Create a dedicated user
sudo useradd --system --no-create-home --shell /bin/false anna
sudo mkdir -p /home/anna/.anna
sudo chown anna:anna /home/anna/.anna
# Install the unit file, substituting the actual anna binary path
sudo sed "s|ANNA_BIN|$(which anna)|g" scripts/anna.service \
> /etc/systemd/system/anna.service
sudo systemctl daemon-reload
sudo systemctl enable --now anna
sudo journalctl -u anna -f # follow logsAll configuration (channels, agents, scheduler jobs) is stored in anna.db. Use anna --open or the admin panel to manage it.
boxsh Sandbox Prerequisites (Linux)
On Linux, Anna uses the managed boxsh sandbox by default for the local workspace tools (bash, read, write, edit). boxsh needs user namespaces and subordinate ID mapping support on the host.
Install the user namespace helpers:
# Debian / Ubuntu
sudo apt update
sudo apt install uidmap
# Verify helpers exist
which newuidmap
which newgidmap
ls -l /usr/bin/newuidmap /usr/bin/newgidmapMake sure the service user has subordinate UID/GID ranges:
grep '^anna:' /etc/subuid
grep '^anna:' /etc/subgidExpected shape:
anna:100000:65536If the entries are missing, add them:
sudo usermod --add-subuids 100000-165535 anna
sudo usermod --add-subgids 100000-165535 annaVerify the kernel allows unprivileged user namespaces:
sysctl kernel.unprivileged_userns_clone
sysctl user.max_user_namespacesTypical working values are:
kernel.unprivileged_userns_clone = 1
user.max_user_namespaces = 15000Some Ubuntu hosts also block unprivileged user namespaces through AppArmor even when the kernel settings above are enabled. Check:
sysctl kernel.apparmor_restrict_unprivileged_usernsIf boxsh fails with sandbox_apply failed: write uid_map: Operation not permitted, temporarily disable that restriction and retest:
sudo sysctl -w kernel.apparmor_restrict_unprivileged_userns=0To persist the Linux prerequisites across reboot:
sudo tee /etc/sysctl.d/99-anna-boxsh.conf >/dev/null <<'EOF'
kernel.unprivileged_userns_clone=1
user.max_user_namespaces=15000
kernel.apparmor_restrict_unprivileged_userns=0
EOF
sudo sysctl --systemSmoke-test boxsh directly as the service user:
$ANNA_HOME/bin/boxsh --version
$ANNA_HOME/bin/boxsh --rpc --sandboxIf the second command exits immediately with a uid_map error, the host is still blocking user namespace setup. If you need Anna working before the host is fixed, configure the agent sandbox backend to docker as a temporary fallback (requires a reachable docker daemon).
LaunchAgent (macOS)
A ready-to-use plist is provided at scripts/com.vaayne.anna.plist.
# Install — substitutes $HOME and anna binary path automatically
sed "s|HOME_DIR|$HOME|g; s|ANNA_BIN|$(which anna)|g" scripts/com.vaayne.anna.plist \
> ~/Library/LaunchAgents/com.vaayne.anna.plist
mkdir -p ~/Library/Logs/anna
launchctl load ~/Library/LaunchAgents/com.vaayne.anna.plist
# Manage
launchctl start com.vaayne.anna
launchctl stop com.vaayne.anna
# Uninstall
launchctl unload ~/Library/LaunchAgents/com.vaayne.anna.plist
rm ~/Library/LaunchAgents/com.vaayne.anna.plistLogs are written to ~/Library/Logs/anna/anna.log. The agent starts automatically on login and restarts on crash. Configure API keys and everything else via anna --open or the admin panel.
Docker
Images are published to ghcr.io/vaayne/anna for linux/amd64 and linux/arm64.
Tags
| Tag | Description |
|---|---|
latest | Latest stable release |
v1.2.3 | Specific version |
sha-<commit> | Specific commit |
Quick Start
First, run setup to configure anna:
docker run -it --rm \
--security-opt seccomp=unconfined \
-v ~/.anna:/home/nonroot/.anna \
-p 8080:8080 \
ghcr.io/vaayne/anna:latest \
anna --openThen start the daemon:
docker run -d \
--name anna \
--security-opt seccomp=unconfined \
-v ~/.anna:/home/nonroot/.anna \
-e ANTHROPIC_API_KEY=sk-... \
ghcr.io/vaayne/anna:latestThe container runs as nonroot user. Mount ~/.anna to persist the database, skills, and cache. You can set ANNA_HOME to change the data directory inside the container. If you want the default boxsh-backed sandbox to work inside Docker, run the container with --security-opt seccomp=unconfined so boxsh can call unshare(2). Without that option, sandboxed core tools fall back to a Docker runtime limitation rather than an anna bug.
Docker Compose
# docker-compose.yml
services:
anna:
image: ghcr.io/vaayne/anna:latest
restart: unless-stopped
security_opt:
- seccomp=unconfined
volumes:
- ./anna-data:/home/nonroot/.anna
environment:
- ANTHROPIC_API_KEY=sk-...
# - OPENAI_API_KEY=sk-...docker compose up -dTo run initial setup, use docker compose exec anna anna --open or start the daemon with --port 8080 and configure via the web UI.
Build Locally
# Single platform
docker build -t anna .
# Multi-platform
docker buildx build --platform linux/amd64,linux/arm64 -t anna .Docker as a Sandbox Backend
Running anna inside a Docker container (described above) is separate from using Docker as a sandbox backend for agent tool execution. The two can be combined (Docker-in-Docker or a mounted socket), but each is independently useful.
When to prefer the docker sandbox backend
- Windows:
boxshis Linux/macOS only. Thedockerbackend gives Windows users a real isolation boundary via Docker Desktop. - Custom toolchain: You need a specific Python/Node/Go version or a clean Linux userspace that differs from the host.
- Side-effect isolation: You want reproducible filesystem state and do not want host-level side effects from agent scripts.
Tradeoffs
- Startup latency: ~200ms for a warm container start; ~1–3s on first pull.
- Bind-mount performance: On Docker Desktop for macOS/Windows, bind-mount filesystem operations are 5–20× slower than native disk. Avoid the
dockerbackend for heavy read/write workloads on those platforms. - No copy-on-write isolation: Unlike
boxsh(which uses overlayfs), the docker backend does not provide overlay-based COW. A runaway script can modify or damage the mounted workspace.
See the Configuration guide for sandbox.docker config keys and an example JSON payload.
Volumes & Data
All data lives under the anna home directory (~/.anna by default, configurable via ANNA_HOME).
| Path | Purpose |
|---|---|
~/.anna/anna.db | Single database (config, memory, scheduler) |
~/.anna/workspaces/{agent-id}/skills/ | Per-agent installed skills |
~/.anna/workspaces/{agent-id}/SOUL.md | Optional per-agent soul/identity override |
~/.anna/cache/ | Model cache (regenerable, safe to delete) |
The anna.db file is the only critical data to back up. It contains all configuration, message history, summaries, and scheduler jobs.
Environment Variables
Configuration is managed through the admin panel (via anna --open or --port). HOST and PORT are supported for binding the admin server, and only a small set of other environment variables is supported:
| Variable | Required | Description |
|---|---|---|
ANNA_HOME | No | Anna home directory (default ~/.anna) |
ANTHROPIC_API_KEY | Yes* | Anthropic provider key |
OPENAI_API_KEY | Yes* | OpenAI provider key |
* At least one provider key is required. API keys can also be configured via the admin panel.
Health Check
The daemon logs to stdout. Verify it is running:
# Binary
anna # Logs appear in terminal
# Docker
docker logs anna