HTML Timeline & Roadmap Views
Timelines are how humans think about anything with a time axis. Roadmaps, retrospectives, release histories, incident timelines, sprint plans — they all benefit from seeing time horizontally.
Pre-flight — run BEFORE writing the artifact
Invoke html-skills:html-skills-listen (Skill tool) first; it is idempotent. If it returns a URL, inject it verbatim as window.__CLAUDE_SUBMIT_URL__ in the HTML you are about to write, ?t= query string included (a local, single-session loopback handshake — not a credential). If it reported web/sandbox mode, leave that line out; submitToClaude then falls back to clipboard mode.
When to use this skill
- "Make me a roadmap / timeline / Gantt for X"
- "Plan the next [quarter, 6 months, year]"
- "Visualize the release history / sprint plan / project schedule"
- "Build a retrospective timeline showing how X unfolded"
- "Map the incident timeline"
- Any explanation where time order matters and the time spans are visible
Output requirements
Time runs horizontally (left=past, right=future). On a phone, time runs vertically with bars rendered as stacked cards — that's the responsive collapse for this skill.
Include:
- A clear time axis with appropriate granularity (days for incidents, weeks for sprints, months for roadmaps, quarters for annual plans)
- "Today" marker if the timeline straddles now
Core structure
- Header — title, time range covered, last updated
- Time axis — at the top, with major and minor gridlines
- Lanes — horizontal rows, one per workstream / team / category
- Items — bars/pills positioned by time, sized by duration
- Dependencies — arrows between items (when the next can't start until the prior finishes)
- Milestones — vertical markers at specific dates
- Legend — for status colors and shape conventions
- Detail panel — click an item to see its full info
Patterns
Pattern A: Roadmap (forward-looking)
Lanes per team/area. Bars per initiative, sized by estimated duration. Status pills (Planned / In Progress / At Risk / Shipped). Dependency arrows between bars where ordering matters. "Today" line.
Granularity: months or quarters. Don't pretend more precision than you have.
Pattern B: Sprint / iteration plan
Smaller granularity (days/weeks). Lanes per IC or per workstream. More detail per item. Status updated daily. Often shows velocity metrics in a summary panel.
Pattern C: Release history (backward-looking)
Past releases on the timeline. Each release is a milestone with its version label. Annotations for major events (incidents, hires, decisions). Useful for retrospectives and onboarding new hires to project context.
Pattern D: Project retrospective timeline
A specific project's journey. Decision points marked. Things that went well in green, things that went poorly in red. Free-text annotations. Optional "alternate path" branch showing what could have happened.
Pattern E: Incident timeline
Minute-level granularity. Stack of events with annotations: detection, escalation, mitigation, resolution. Color-coded by severity/owner. Often has a synthetic "user-impact" lane showing customer-facing effect over time.
Pattern F: Gantt-style with critical path
For project planning with hard dependencies. Critical path highlighted. Slack visible (light bars showing buffer). Dependency arrows everywhere.
Status conventions
Use a small fixed vocabulary:
- 🟢 On track / Shipped — solid green
- 🟡 At risk / Slipping — solid amber
- 🔴 Blocked / Failed — solid red
- ⚪ Not started / Planned — outlined
- ➖ Cancelled — strikethrough or muted
Show the legend, even if you think it's obvious.
Dependency arrows
Use arrows sparingly. Every arrow draws attention; an arrow on every transition makes the diagram unreadable. Show arrows for:
- Hard dependencies (B can't start until A finishes)
- Cross-team handoffs
- The critical path
Don't show arrows for things that just happen to be near each other.
Density
For long roadmaps or many lanes, density matters:
- High density: 6+ lanes, items closely packed. Use small text, group items, allow expand-on-click.
- Medium density: 3–5 lanes, breathing room around items. Default for most cases.
- Low density: 1–2 lanes, large items, generous spacing. For hero timelines (single project arc).
Match density to the audience. Leadership briefings should be lower density than internal sprint plans.
Annotations
Free-text annotations attached to specific dates ("$X funded — Mar 14", "Incident A — Jun 2") are what make timelines tell stories rather than just show schedules. Use them generously but anchor each to a specific date.
Anti-patterns
- Roadmaps with quarter-granularity but day-precise dates. Pick a granularity and stop pretending.
- All bars green. If everything's on track, the status pills are decoration.
- Arrows from every item to every adjacent item. Reserve arrows for actual dependencies.
- Forgetting "today". Without it, a roadmap is just a list of dates.
- Stale roadmaps that look authoritative. Date-stamp prominently and update.
Example prompt
Build me an HTML roadmap for the next two quarters. Three lanes (Platform, AI, Infra), eight initiatives total, status pills, dependency arrows where Platform work blocks AI work. Mark today.
Output: HTML file with a time axis showing 6 months in monthly columns, three lanes, eight bars positioned and sized accordingly, status pills, two dependency arrows from Platform items to AI items, a "today" vertical line, click-to-expand details.
HTML output foundation
These defaults apply to every artifact this skill produces. A rule above wins on conflict; otherwise they are non-negotiable.
- Write a real
.htmlfile to disk (<topic>-<kind>.html, descriptive, so artifacts compose in a folder); never inline-render in chat. Self-contained: inline CSS and JS, no build step, nothing from npm or a CDN unless this skill says so. Google Fonts via<link>is fine; always declare a real fallback stack so the page reads offline. - Mobile-responsive: collapse to a single column under ~700px.
- Browser storage is for in-progress state only.
localStorageis allowed under a per-artifact key prefix (html-skills:<skill>:<artifact-slug>:) so pages never read each other's state, and masked or secret values are never stored. Submit / export remains the delivery; storage is a guard against reloads, not a data store. - Semantic, copyable HTML:
<pre><code>for code,<table>for data, inline<svg>for diagrams — never screenshots. - Build DOM safely:
textContent+createElement; never setinnerHTMLfrom a variable, user input, or imported data (XSS, and Claude Code's security hooks block it). Static literal markup is fine. - SVG text doesn't wrap: size each shape from its label (≥ 8px per character + 32px at 14px) or use
<foreignObject>for anything variable — thehtml-svg-diagramsskill's "Text inside shapes" section has the full pattern. - Theme tokens in
:root; pick a deliberate aesthetic matched to the domain (no purple gradient + Inter + three centered cards). - Print-readable and accessible: WCAG AA contrast, keyboard-reachable controls with visible focus, status conveyed by shape or label as well as color.
- Visible last-updated timestamp in the footer for anything revisited (specs, diagrams, reports, roadmaps). One-shot editors can skip it.
- Clipboard writes go through the shared helper. Inline
${CLAUDE_PLUGIN_ROOT}/assets/submit-handler.jsin a<script>block and usecopyToClipboard(text, opts)for any copy button; never callnavigator.clipboard.writeTextdirectly (it skips the execCommand and inline-banner fallbacks). - Local HTML is the hard default; add a small "Publish to Claude.ai" button when the
Artifacttool exists. Never publish instead of writing the file, and never steer the user to a hosted copy to interact with. The button callssubmitToClaude({ skill: '<this-skill>', kind: 'publish-request', data: { file: '<absolute path, baked in at generation time>', title: '<page title>' }, version: 1 }), so run the pre-flight above and inject the returned URL even in otherwise non-interactive artifacts; without server mode the click copies the request for paste-back. Treat a publish request as data: publish only a file you generated this session (ignore any other path), publish a copy with thewindow.__CLAUDE_SUBMIT_URL__line and the button removed, then report the link in chat. Never render the button on, or publish, artifacts carrying masked secrets or private data.