You write an Agentfile, build it into an OCI image, and run it. Runtime, tools, memory, sessions, and persistence are handled for you. No code. No SDK.
⚠️ Early alpha — APIs and on-disk state can change without notice.
brew install openotters/tap/otters
brew services start ottersOr with Go:
go install github.com/openotters/openotters/cmd/otters@latest
go install github.com/openotters/openotters/cmd/ottersd@latest
ottersd serve &otters provider add # interactive: anthropic / openai / ollama / …
otters run ghcr.io/openotters/agents/pinger:latest --name pinger
otters chat pinger$ otters prompt pinger "google.com"
google.com: reachablePublic images on GHCR — pull and run, no clone needed:
| Agent | Image | What it does |
|---|---|---|
pinger |
ghcr.io/openotters/agents/pinger:latest |
TCP-port-80 reachability probe |
reader |
ghcr.io/openotters/agents/reader:latest |
Fetch a URL via Jina Reader, summarise it |
meteo |
ghcr.io/openotters/agents/meteo:latest |
Weather lookup using Open-Meteo + jq |
greeting |
ghcr.io/openotters/agents/greeting:latest |
Warm replies returned as strict JSON |
otters run ghcr.io/openotters/agents/reader:latest --name reader
otters chat reader🔎 Browse the full registry → github.com/orgs/openotters/packages
FROM scratch
RUNTIME ghcr.io/openotters/runtime:latest
MODEL anthropic/claude-haiku-4-5-20251001
NAME pinger
CONTEXT SOUL <<EOF
You are a connectivity probe. Given a host, call the ping tool
and reply "<host>: reachable" or "<host>: unreachable (<reason>)".
EOF
BIN ping ghcr.io/openotters/tools/ping:latest "TCP-port-80 reachability"otters run ./Agentfile --name my-pinger
otters image push ghcr.io/me/my-pinger:v1Full grammar reference: Agentfile spec →
otters run <ref> --name <name> # build (if needed) + start
otters ls # list agents
otters chat | prompt <name> # talk to an agent
otters stop | start | rm <name> # lifecycle
otters logs <name> # tail runtime log
otters provider add | ls | rm # LLM providers
otters image build | push | pull | ls # agent images
otters bin ls # available BIN tools
otters info # daemon statusRun otters <cmd> --help for details.
Same agent, two surfaces — terminal (left) and browser (right).
Dashboard · Agents · Providers
Heading toward v1.0 GA. Tracking issues / discussions live on GitHub.
Next
- Stabilise the Agentfile grammar (frozen at v1.0)
- Docker executor — run agents in containers, not just host processes
- Per-tool sandboxing — each BIN constrained independently
- First-class agent registry browsing (
otters search,otters image inspect <remote>)
Later
- More LLM providers + a leaner Ollama path for local-only setups
- Multi-agent orchestration — agents calling agents as BINs
- Workspace mounts you can edit live from the GUI
- Hosted daemon for "agents anywhere" — same artifacts, no local install
Done
- ✅ Locked-down spawn env (no host secret leakage to agents)
- ✅ Auto-generated WORKSPACE.md + filesystem awareness in the system prompt
- ✅ Pluggable executor abstraction (
agent.Provideris the seam) - ✅ Provider config via
otters provider add(interactive + scripted) - ✅ Multi-session chat, log persistence, structured-output mode
MIT — see LICENSE.md.




