Skip to content

Development

Keyosk is a Go program; the dev stack in dev/ provides everything it talks to, so nothing outside the checkout is needed.

Running locally

cp .env.example .env
docker compose -f dev/docker-compose.yml up -d --wait   # or podman compose
go run ./cmd/server

Open http://localhost:8080 and log in by entering admin (admin panel) or student at the mock's prompt. Keys are issued on a local LiteLLM gateway at http://localhost:4000, whose mock models answer without reaching any provider, and mail lands in Mailpit at http://localhost:8025. Stop it all with docker compose -f dev/docker-compose.yml down.

The app needs an OIDC provider before it will serve traffic — it fetches the discovery document at startup. The mock starts in seconds and needs no configuration, but serves no back-channel logout, so that path cannot be exercised against it. When touching anything auth-shaped, switch to Keycloak, a full IdP that also serves back-channel logout: start --profile keycloak, which runs next to the mock, and set OIDC_ISSUER_URL=http://localhost:8082/realms/keyosk. See dev/README.md for details.

Tests

The auth-path tests need neither the mock nor Keycloak: they run an in-process issuer (internal/oidc/oidctest), so go test ./... requires nothing external. The LiteLLM end-to-end tests run against the local gateway with go test -tags e2e ./internal/litellm/ ./internal/limitsync/. make check runs everything CI runs, and starts the dev stack if needed.