Reference implementation of the BoxLite Box API. Use this to validate client implementations against the spec.
Box responses include the native SDK's persisted privileged mode when known.
REST clients use it to verify named get_or_create reuse; a missing value is
unknown and cannot establish a match with either requested mode.
Not production-ready — no persistence, single-tenant.
# 1. Build the BoxLite Python SDK (installs into project .venv)
make dev:python
# 2. (Optional) Copy server defaults for local development
cp openapi/reference-server/.env.example openapi/reference-server/.env
# 3. Start the server (uv installs server deps, --active uses the project .venv)
cd openapi/reference-server
uv run --active server.pyBy default the server accepts any non-empty Authorization: Bearer <token>
header (format-agnostic, matching the spec's BearerAuth scheme — token
issuance and real validation are out of scope for a reference server).
GET /v1/config needs no auth; every other endpoint requires a non-empty
bearer.
Set BOXLITE_SERVER_API_KEY to require an exact key: the bearer must then
equal it (constant-time check) or the request gets 401. A missing/empty
bearer is always 401 regardless. This lets clients exercise both the success
and failure auth paths against the reference server.
# The reference server accepts any non-empty bearer
TOKEN=dev-token
# Server config (no auth required)
curl -s http://localhost:8080/v1/config | python3 -m json.tool
# Identity + scopes for the calling credential
curl -s http://localhost:8080/v1/me \
-H "Authorization: Bearer $TOKEN" | python3 -m json.tool
# Create a box
curl -s -X POST http://localhost:8080/v1/demo/boxes \
-H "Authorization: Bearer $TOKEN" \
-H "Content-Type: application/json" \
-d '{"image":"alpine:latest"}' | python3 -m json.tool
# List boxes
curl -s http://localhost:8080/v1/demo/boxes \
-H "Authorization: Bearer $TOKEN" | python3 -m json.tool
# Start a box (replace BOX_ID)
curl -s -X POST http://localhost:8080/v1/demo/boxes/$BOX_ID/start \
-H "Authorization: Bearer $TOKEN" | python3 -m json.tool
# Execute a command
curl -s -X POST http://localhost:8080/v1/demo/boxes/$BOX_ID/exec \
-H "Authorization: Bearer $TOKEN" \
-H "Content-Type: application/json" \
-d '{"command":"echo","args":["hello world"]}' | python3 -m json.tool
# Stream output (WebSocket /attach — see SDK)
# Runtime metrics
curl -s http://localhost:8080/v1/demo/metrics \
-H "Authorization: Bearer $TOKEN" | python3 -m json.tool
# Remove box
curl -s -X DELETE http://localhost:8080/v1/demo/boxes/$BOX_ID \
-H "Authorization: Bearer $TOKEN" -w "%{http_code}\n"| Endpoint | Method | Description |
|---|---|---|
/v1/config |
GET | Server configuration |
/v1/me |
GET | Identity + scopes for the credential |
/{prefix}/boxes |
POST | Create box |
/{prefix}/boxes |
GET | List boxes |
/{prefix}/boxes/{id} |
GET | Get box |
/{prefix}/boxes/{id} |
HEAD | Check exists |
/{prefix}/boxes/{id} |
DELETE | Remove box |
/{prefix}/boxes/{id}/start |
POST | Start box |
/{prefix}/boxes/{id}/stop |
POST | Stop box |
/{prefix}/boxes/{id}/exec |
POST | Execute command |
/{prefix}/boxes/{id}/executions/{eid} |
GET | Execution status |
/{prefix}/boxes/{id}/executions/{eid}/signal |
POST | Send signal |
/{prefix}/boxes/{id}/executions/{eid}/resize |
POST | Resize TTY |
/{prefix}/boxes/{id}/files |
PUT | Upload files |
/{prefix}/boxes/{id}/files |
GET | Download files |
/{prefix}/boxes/{id}/metrics |
GET | Box metrics |
/{prefix}/metrics |
GET | Runtime metrics |
Not implemented: the /{prefix}/images… and /{prefix}/images/registries… routes, WebSocket TTY.
uv run --active server.py [--env-file /path/to/.env] [--host 0.0.0.0] [--port 8080] [--log-level info]
The server supports openapi/reference-server/.env by default.
Use --env-file to load a different file.
| Variable | Default |
|---|---|
BOXLITE_SERVER_HOST |
0.0.0.0 |
BOXLITE_SERVER_PORT |
8080 |
BOXLITE_SERVER_LOG_LEVEL |
info |
BOXLITE_SERVER_JWT_SECRET |
boxlite-reference-server-secret |
BOXLITE_SERVER_JWT_EXPIRY_SECONDS |
3600 |
BOXLITE_SERVER_API_KEY |
(unset → permissive; set → exact-match required) |
| Variable | Default |
|---|---|
BOXLITE_RUNTIME_HOME_DIR |
~/.boxlite |
BOXLITE_RUNTIME_IMAGE_REGISTRIES |
mirror.gcr.io,docker.io |
For host, port, and log-level:
- CLI args (
--host,--port,--log-level) - Environment (
BOXLITE_SERVER_*) - Built-in defaults