TwoMinuteTimeline
Slide Deck Quality Gantt Charts in 2 minutes or less

HTTP API

POST a small JSON description and get back a deck-ready PNG (or SVG). The endpoint is open and CORS-enabled, so it works from browsers, scripts, CI, and anywhere else you can make an HTTP call.

POST /api/timeline
Fair use: The endpoint is rate-limited to 20 requests / minute per IP (short-burst cap 5/sec) with a 64KB body cap. No auth required. Self-host for higher throughput.

Try it

Code samples

Live preview

Click Render to call the API.

Request body

FieldTypeDescription
titlestringProject title shown above the chart. Default: "Project Timeline".
columnsnumberNumber of time-unit columns (2–52). Default 8.
unitstringColumn unit label, e.g. "Week", "Sprint", "Month". Default "Week".
startnumberStarting column number — header reads "Week 1", "Week 2", …. Default 1.
widthnumberOutput width in pixels (640–2400). Default 1280. PNG renders at 2× DPR.
labelsInBarsbooleanShow task names inside each bar. Default true.
tasksRow[]Array of rows (max 100). Normally just task bars — section dividers are entirely optional. See below.

Row object

FieldTypeDescription
typestringEntirely optional — most charts never set this. "section" renders a full-width labeled divider band that groups the rows below it (start/duration are ignored), e.g. { "type": "section", "name": "Phase 1" }. Omit for a normal task bar.
namestringTask or section label (truncated if it overflows).
startnumberColumn offset from the left of the track (supports 0.25 increments, e.g. 2.75). Tasks only.
durationnumberLength in columns. 0.25 renders as a milestone diamond. Tasks only.
colorstringHex color. Tasks default to #4f46e5; sections default to a neutral light grey (#e2e8f0). Section label text automatically flips between dark and white for contrast.

Response & query options

  • POST /api/timelineimage/png (default)
  • POST /api/timeline?format=svgimage/svg+xml
  • GET /api/timeline?d=<payload> → renders a chart from a URL-embedded payload: the JSON body, raw-deflate compressed (plain uncompressed also accepted), base64url-encoded. Nothing is stored server-side — the link is permanent, re-renders on demand, and is cached immutably. Ideal for sharing a download link from chat tools.
  • GET /api/timeline?demo=1 → returns the example chart for quick tests
  • Errors return JSON: { error: string, ... } with status 400/413/429/500

Calling from an AI assistant?

You probably want the hosted MCP server instead — it wraps this exact endpoint as a create_timeline tool that Claude, Cursor, and other MCP clients can call directly. See the MCP page →