# wheelofnames Self-hosted API that renders wheel-of-names GIF animations with Remotion. ## API ```http POST /api/gif Content-Type: application/json Accept: image/gif Authorization: Bearer change-me ``` ```json { "options": ["alice", "bob", "carol"], "winnerIndex": 1, "durationMs": 6500, "holdMs": 1200, "fps": 15, "size": 512, "theme": "classic" } ``` Response is `image/gif` with winner metadata headers: - `X-Wheel-Winner-Index` - `X-Wheel-Winner` - `X-Render-Duration-Ms` `X-Wheel-Winner` is URL-encoded so non-ASCII labels are safe in HTTP headers. ## Local ```sh pnpm install pnpm dev ``` Smoke render: ```sh pnpm browser:ensure pnpm render:smoke pnpm api:smoke ``` Quality gates: ```sh pnpm lint pnpm typecheck pnpm test ``` ## Deploy Use a container runtime first. Static-only platforms cannot satisfy `POST /api/gif` because Remotion server rendering needs Node, Chromium/runtime dependencies, and FFmpeg/compositor support. ```sh docker build -t wheelofnames . docker run --rm -p 3000:3000 -e API_TOKEN=change-me wheelofnames ``` Recommended starting resources: 1-2 vCPU and 1-2 GB RAM, with `MAX_CONCURRENT_RENDERS=1`. `RENDER_TIMEOUT_MS` defaults to `15000` and is raised to Remotion's `7000ms` browser timeout floor when configured lower. `API_TOKEN` is required when `NODE_ENV=production`.