Skip to content

Docker

From a checkout of the release you want:

Terminal window
git clone https://github.com/frogg-app/frogg.git && cd frogg
git checkout v0.6.19
npm ci
scripts/release/build-docker.sh # builds froggapp/frogg:<version> for this machine

--platform linux/arm64 builds another architecture; --push builds amd64 and arm64 and pushes (set FROGG_IMAGE_REPO to push to your own registry).

compose.yaml
services:
frogg:
image: froggapp/frogg:0.6.19
container_name: frogg-daemon
restart: unless-stopped
ports:
- "0.0.0.0:9999:9999"
environment:
FROGG_PASSWORD: "change-me"
# FROGG_HOSTNAMES: "frogg.example.com,.lan"
volumes:
- ./frogg-home:/home/frogg/.frogg # agents, config, pairing
- ./workspace:/workspace # code the agents work on
Terminal window
docker compose up -d
docker logs -f frogg-daemon

Open http://<host>:9999/.

What the image does:

  • Runs frogg daemon start --foreground on 0.0.0.0:9999 as user frogg (uid 1000), with the web app on and JSON logs.
  • Fixes ownership of mounted volumes, then drops privileges.
  • Health check: GET /api/health.
  • CLAUDE_CONFIG_DIR and CODEX_HOME point inside /home/frogg, so provider logins persist in the frogg-home volume.
  • Warns in the log while the daemon is unclaimed.

Inside a container every client address looks like the Docker bridge, not your LAN. Set a password (FROGG_PASSWORD) or pair devices; do not rely on LAN trust.

The base image has no agent CLIs. Extend it:

Dockerfile.agents
FROM froggapp/frogg:0.6.19
USER root
RUN npm install -g @anthropic-ai/claude-code @openai/codex opencode-ai

Leave the user as root; the entrypoint drops to frogg for the daemon and its agents. Then sign in inside the container:

Terminal window
docker exec -it -u frogg frogg-daemon claude
docker exec -it -u frogg frogg-daemon codex login

deploy/docker/Dockerfile.agents.example in the repository is the same pattern.

install-docker.sh wraps docker run with sensible defaults and safe updates:

Terminal window
curl -fsSL https://frogg.app/install-docker.sh | FROGG_IMAGE=froggapp/frogg:0.6.19 FROGG_NO_PULL=1 bash

FROGG_NO_PULL=1 uses the image you built locally instead of pulling from Docker Hub.

It runs container frogg-daemon with --restart unless-stopped, maps $FROGG_BIND:$FROGG_PORT to 9999, mounts $FROGG_HOME (default ~/.frogg) and optionally $FROGG_WORKSPACE at /workspace, and passes ANTHROPIC_API_KEY, OPENAI_API_KEY, ANTHROPIC_BASE_URL, OPENAI_BASE_URL and FROGG_HOSTNAMES through if set. All variables are in the environment reference.

Useful afterwards:

Terminal window
docker exec frogg-daemon frogg auth pair
docker exec frogg-daemon frogg auth claim-status
Terminal window
curl -fsSL https://frogg.app/install-docker.sh | FROGG_IMAGE=froggapp/frogg:0.6.20 FROGG_NO_PULL=1 bash -s -- --update

--update keeps the old container as frogg-daemon-previous, starts the new one, and rolls back if it is not healthy within FROGG_HEALTH_TIMEOUT seconds (default 90). frogg update does not work inside a container.

Run uninstall-docker.sh from the release assets. It removes only containers labelled as this product; the state directory stays.