Skip to content

SVG Badge

The app serves a dynamic SVG badge that reflects the live status of any issue's checklist. Embed it anywhere Markdown is rendered.

Badge URL

GET /api/badge/{owner}/{repo}/{issue_number}

Example:

https://app.signed-off.dev/api/badge/acme/backend/42

Embedding in Markdown

![Checklist status](https://app.signed-off.dev/api/badge/acme/backend/42)

With a link back to the checklist:

[![Checklist status](https://app.signed-off.dev/api/badge/acme/backend/42)](https://app.signed-off.dev/checklist/acme/backend/42)

Privacy

Badge availability depends on whether the repository is public or private:

Repository Default behaviour To enable badges
Public Badge served to anyone Nothing to do
Private Returns a checklist \| private placeholder Set "publicBadges": true in checklist-app.json

Private repos return a neutral placeholder badge (grey, labelled "private") rather than a 404, so embedded images don't break. No checklist data is exposed.

If your org uses private repos internally and you want badges in dashboards or wikis, opt in explicitly:

{ "publicBadges": true }

Badge states

Checklist status Badge colour
All items done or na Green
Some items pending Blue
Any item exception without approval Orange
No checklist found Grey
Private repo (opt-out) Grey — "private"

Caching

The badge endpoint sets Cache-Control: s-maxage=60. Cloudflare edge nodes cache it for up to 60 seconds, keeping GitHub API usage well within rate limits even on busy repos.

If you need a fresh badge immediately after a state update, append a cache-busting query parameter:

/api/badge/acme/backend/42?v=2