Start Here
Setup
Install Gooselake, run the runtime locally, and verify the first control-plane loop.
What you are starting
Gooselake is a host-side runtime. It exposes HTTP and SSE APIs for agent sessions while keeping provider auth, process lifetime, worktrees, event replay, and recovery on the machine where the work happens.
Your first success criterion is not a pretty chat screen. It is a running control plane that can answer health checks, authenticate protected routes, create a session, and stream durable events.
Install
From a checkout:
make install
Or install a pinned release:
make install VERSION=v0.1.2
The install bundle places the server, sidecars, config example, and systemd examples under ~/.local.
Create a config
cp "$HOME/.local/runtime-server.toml.example" ./runtime-server.toml
For local development, prefer a localhost bind and an explicit token:
[server]
bind_address = "127.0.0.1:8080"
public_base_url = "http://127.0.0.1:8080"
[auth]
mode = "static_bearer"
token = "replace-with-local-token"
The full configuration reference lives in Configuration.
Login providers
Use whichever providers you plan to run:
codex login
claude login
ACP is configured differently: set [providers.acp].command, args, and env for an ACP-compatible stdio agent. ACP auth is agent-managed in the current runtime.
Validate and start
gg-runtime-server --check-config --config ./runtime-server.toml
gg-runtime-server --config ./runtime-server.toml
In another terminal:
BASE_URL="http://127.0.0.1:8080"
TOKEN="replace-with-local-token"
curl -fsS "$BASE_URL/health"
curl -fsS -H "Authorization: Bearer $TOKEN" "$BASE_URL/v1/health"
curl -fsS -H "Authorization: Bearer $TOKEN" "$BASE_URL/v1/diagnostics/providers"
First session smoke
SESSION_JSON=$(curl -fsS -X POST \
-H "Authorization: Bearer $TOKEN" \
-H "Content-Type: application/json" \
-d '{"provider":"codex","model":"gpt-5.4-mini"}' \
"$BASE_URL/v1/sessions")
SESSION_ID=$(echo "$SESSION_JSON" | jq -r '.id')
curl -N -H "Authorization: Bearer $TOKEN" \
"$BASE_URL/v1/sessions/$SESSION_ID/events/stream?after_seq=0"
Send a turn from another terminal:
curl -fsS -X POST \
-H "Authorization: Bearer $TOKEN" \
-H "Content-Type: application/json" \
-d '{"input":[{"type":"text","text":"Reply with ok."}]}' \
"$BASE_URL/v1/sessions/$SESSION_ID/turns"
If the stream shows replayed and live events, the runtime boundary is working.
Always-on deployment
For a Linux VPS or long-lived host:
make vps-deploy
That path stages releases under ~/.local/share/gg-runtime, keeps mutable state outside the release, validates the config, and starts a systemd service.