Demand source: Robolly (GET render.jpg?title=...&photo=...) and Bannerbear Simple/Signed URLs — primary use case: blog engines / platforms fetch the OG image via a plain URL, no client library, no POST.
Proposed design:
- Endpoint
GET /r/:template.jpg?d=<base64url(JSON)>&sig=<hmac>.
sig = HMAC-SHA256(d, COSY_API_KEY) — prevents abuse (bandwidth becomes our cost). Unsigned mode remains dev-only.
- Support png/webp responses via extension.
- Cache-Control: public, max-age=3600 (OG image re-crawl).
Acceptance:
- A blog engine can set
<meta property="og:image" content="https://cosy.host/r/og-image.jpg?d=...&sig=...">.
- Invalid signature = 403. Oversized query (>8KB) = 413.
Effort: M. Priority #4.
Demand source: Robolly (GET render.jpg?title=...&photo=...) and Bannerbear Simple/Signed URLs — primary use case: blog engines / platforms fetch the OG image via a plain URL, no client library, no POST.
Proposed design:
GET /r/:template.jpg?d=<base64url(JSON)>&sig=<hmac>.sig= HMAC-SHA256(d, COSY_API_KEY) — prevents abuse (bandwidth becomes our cost). Unsigned mode remains dev-only.Acceptance:
<meta property="og:image" content="https://cosy.host/r/og-image.jpg?d=...&sig=...">.Effort: M. Priority #4.