Skip to content

Repository files navigation

🦦 OpenOtters

Declarative AI agents — like Docker, but for autonomous agents.

openotters.io →

Go Reference Go Report Card License: MIT Status: experimental Website

otters chat — recorded session

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.

Contents

Get started

brew install openotters/tap/otters
brew services start otters

Or with Go:

go install github.com/openotters/openotters/cmd/otters@latest
go install github.com/openotters/openotters/cmd/ottersd@latest
ottersd serve &

Quickstart

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: reachable

Demo agents

Public 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

Build your own agent

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:v1

Full grammar reference: Agentfile spec →

CLI cheat sheet

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 status

Run otters <cmd> --help for details.

Gallery

otters chat in the terminal otters chat in the browser

Same agent, two surfaces — terminal (left) and browser (right).

Dashboard Agents view Providers

Dashboard · Agents · Providers

Roadmap

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.Provider is the seam)
  • ✅ Provider config via otters provider add (interactive + scripted)
  • ✅ Multi-session chat, log persistence, structured-output mode

License

MIT — see LICENSE.md.

About

CLI and daemon for building, running, and managing autonomous AI agents

Topics

Resources

Stars

6 stars

Watchers

0 watching

Forks

Contributors

Languages