Changelog
Every user-visible change, newest first.
Unreleased
- Three hosts: the API is served from its own host, sign-in, the dashboard, badges and verification pages from the app host, and the documentation from the docs host. Badge and verification URLs returned by the API are on the app host.
- The docs have a new layout, with the CI examples as tabs: a grouped sidebar, an "On this page" list, previous and next links, notes and warnings, and a search box at the top (press / to focus it). Search works without JavaScript.
- Guides at the root of the docs host: quick start (GitHub Actions, GitLab CI, curl), badge embed, verification page, authentication and errors, limits, and versioning policy.
- Interactive API reference at `/reference` on the docs host, and the OpenAPI 3.1 description at `/v1/openapi.json` on the API host.
- `/llms.txt` for AI tools, and this changelog at `/changelog`.
- Error responses and examples are now documented for every endpoint.
- Sign in at `/login` with a one-time email link or Google. Projects created with the API are claimed when you sign in with the same verified email.
- `/dashboard` lists your projects with latest status and usage against the free limit.
- `/dashboard/projects/:id` shows the badge, copy-ready embed snippets, recent runs, key rotation, and notification settings (locked on Free).
- The verification page `/v/:badgeId` now follows the Virdify design system, in light and dark themes.
- Badge colours now come from the Virdify status tokens.
- `GET /v1/healthz` checks the database.
- `POST /v1/projects` creates a project and returns the write key once.
- `POST /v1/results` stores the latest result. Send `run_id` so retries are safe. Free projects accept 300 results a month; we email at 90% and 100%.
- `POST /v1/keys/rotate` issues a new write key and revokes the old one.
- `GET /badge/:badgeId.svg` and `.json` (Shields.io endpoint format) show passing, partial, failing, stale or no data. Badge colours are placeholders until the design tokens are added.
- `GET /v/:badgeId` verification page (unstyled until the design system is added).
- Rate limits per IP and per key, and a daily ingest cap.
- Unknown API versions return `unknown_api_version`.