# Changelog template

> A release card with a version, date, tag, and up to five highlights. Render it on-brand from an AI agent or the REST API.

Canonical URL: https://vectorfast.ai/render/templates/changelog
Markdown URL: https://vectorfast.ai/render/templates/changelog.md
Last modified: 2026-10-30

VectorFast Render is in early access: billing is not connected yet, and API keys are issued to waitlist members as access opens.

## Summary
- Template id: `changelog` (pin the major version as `changelog@1`; current version 1.0.0)
- Sizes: 1200×630, 1080×1080 (default 1200×630)
- Formats: PNG, JPEG, WebP
- Use it for: Release notes on social and in-product; Weekly shipped-this-week posts; Open-source release announcements

## Previews
- English: ![Changelog template rendered in English at 1200×630 with the built-in VectorFast brand kit.](https://vectorfast.ai/i/changelog.png?brand=default&date=Oct%2030%2C%202026&h=630&items=%5B%22Remote%20MCP%20server%20for%20Claude%2C%20Cursor%20and%20Codex%22%2C%22Signed%20image%20URLs%20that%20never%20expire%22%2C%22WebP%20and%20JPEG%20output%20next%20to%20PNG%22%5D&tag=Release&version=v2.4.0&w=1200&sig=XZpBG19fl8y7x0Qk7SN_q1PpyaLs0vmUQDR0pYHG3hs)
- Chinese: ![Changelog template rendered in Chinese at 1200×630 with the built-in VectorFast brand kit.](https://vectorfast.ai/i/changelog.png?brand=default&date=2026%20%E5%B9%B4%2010%20%E6%9C%88%2030%20%E6%97%A5&h=630&items=%5B%22%E8%BF%9C%E7%A8%8B%20MCP%EF%BC%9A%E5%9C%A8%20Claude%E3%80%81Cursor%20%E9%87%8C%E7%9B%B4%E6%8E%A5%E5%87%BA%E5%9B%BE%22%2C%22%E7%AD%BE%E5%90%8D%E5%9B%BE%E7%89%87%E9%93%BE%E6%8E%A5%EF%BC%8C%E9%95%BF%E6%9C%9F%E6%9C%89%E6%95%88%22%2C%22%E9%99%A4%20PNG%20%E5%A4%96%E6%94%AF%E6%8C%81%20WebP%20%E4%B8%8E%20JPEG%20%E8%BE%93%E5%87%BA%22%5D&tag=%E6%96%B0%E7%89%88%E6%9C%AC&version=v2.4.0&w=1200&sig=WlhzmM0SufL58u39rGeKb8Fjw1NR6U7D9L2VkXjU-vg)

## Parameters
All string params are trimmed. Limits come from the schema `POST /v1/renders` validates.

| Param | Type | Required | Limit | Notes |
| --- | --- | --- | --- | --- |
| `version` | string | yes | ≤ 24 chars | Version label such as "v2.3". |
| `date` | string | no | ≤ 30 chars | Free text release date. |
| `items` | string[] | yes | 1–5 items, ≤ 80 chars each | One to five highlights. Pass an array of strings; signed URLs carry it as a JSON-encoded array string. |
| `tag` | string | no | ≤ 24 chars | Small label such as "Release" or "Hotfix". |

## Ask an agent
Prompt:

> Make a changelog card for our v2.3 release today, tagged "Release", with three highlights: brand kits with versioning, logo vectorization on upload, and 40% faster cold renders.

The MCP `render` tool call it should become:

```json
{
  "name": "render",
  "arguments": {
    "template": "changelog",
    "params": {
      "version": "v2.3",
      "date": "Oct 30, 2026",
      "tag": "Release",
      "items": [
        "Brand kits with versioning",
        "Logo vectorization on upload",
        "40% faster cold renders"
      ]
    }
  }
}
```

## REST
```bash
curl https://vectorfast.ai/v1/renders \
  -H "Authorization: Bearer $VECTORFAST_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
  "template": "changelog@1",
  "format": "png",
  "width": 1200,
  "height": 630,
  "params": {
    "version": "v2.3",
    "date": "Oct 30, 2026",
    "tag": "Release",
    "items": [
      "Brand kits with versioning",
      "Logo vectorization on upload",
      "40% faster cold renders"
    ]
  }
}'
```

## Signed URL (server-side Node.js)
Per-key signing secrets are not issued yet in early access; until then, reuse the signed `url` that `POST /v1/renders` returns. The algorithm below is what the server verifies. Keep the secret on your server.

```js
import { createHmac } from 'node:crypto'

// Server-side only. Never ship the signing secret to a browser, a mobile app or a repo.
const SIGNING_SECRET = process.env.VECTORFAST_SIGNING_SECRET

function encode(value) {
  return encodeURIComponent(value).replace(/[!'()*]/g, c => '%' + c.charCodeAt(0).toString(16).toUpperCase())
}

export function signRenderUrl({ template, format = 'png', params, brand, width, height, keyId }, secret = SIGNING_SECRET) {
  const query = {}
  for (const [key, value] of Object.entries(params)) {
    if (value === undefined || value === null)
      continue
    query[key] = typeof value === 'string' ? value : Array.isArray(value) ? JSON.stringify(value) : String(value)
  }
  if (brand) query.brand = brand
  if (keyId) query.k = keyId
  if (width) query.w = String(width)
  if (height) query.h = String(height)

  const canonical = Object.entries(query)
    .map(([key, value]) => [encode(key), encode(value)])
    .sort((a, b) => (a[0] < b[0] ? -1 : a[0] > b[0] ? 1 : a[1] < b[1] ? -1 : a[1] > b[1] ? 1 : 0))
    .map(([key, value]) => key + '=' + value)
    .join('&')
  const path = '/i/' + template + '.' + format
  const sig = createHmac('sha256', secret).update(path + '?' + canonical).digest('base64url')
  return 'https://vectorfast.ai' + path + '?' + (canonical ? canonical + '&' : '') + 'sig=' + sig
}

const url = signRenderUrl({
  template: 'changelog',
  format: 'png',
  width: 1200,
  height: 630,
  params: {
    "version": "v2.4.0",
    "date": "Oct 30, 2026",
    "tag": "Release",
    "items": "[\"Remote MCP server for Claude, Cursor and Codex\",\"Signed image URLs that never expire\",\"WebP and JPEG output next to PNG\"]"
  },
})
```

## FAQ
### Which sizes does the changelog template support?
1200×630, 1080×1080. The default is 1200×630; pass width and height to pick another supported size.

### Which parameters are required?
version and items. Every other parameter is optional and has a rendering default.

### Does rendering the same parameters twice cost twice?
No. The same template version, parameters, brand kit version, format, and size produce the same cache key, so a repeat request is served from cache instead of rendering again. Billing is not connected yet in early access.

## Related
- All templates: https://vectorfast.ai/render/templates
- Template reference: https://vectorfast.ai/render/docs/templates
- Connect Claude: https://vectorfast.ai/render/agents/claude
