# Development
Part of the [skgate README](../README.md).
```sh
go build ./... && go vet ./... && go test ./...
docker build -t skgate . # full (default target)
docker build --target slim -t skgate:slim .
SKGATE_E2E=1 go test ./internal/mcp -run E2E # opt-in: real npx and uvx servers, needs network
```
`SKGATE_E2E_CACHE=
` keeps the npm and uv caches of the E2E run.
- Icons: `internal/admin/static/` holds `favicon.svg`, `favicon.ico`, `apple-touch-icon.png` and the PNG sizes; they are embedded and served without login at `/favicon.svg`, `/favicon.ico` and `/apple-touch-icon.png`. Replace the files to change them.
- Admin UI: server-rendered templates and one shared stylesheet in `internal/admin`. Design changes go through the shared CSS and components; tests forbid inline styles, inline handlers and query-string notifications.
- The SQLite schema migrates idempotently on start.