From roadmap
Generate a self-contained interactive HTML Gantt chart from a markdown roadmap file
How this skill is triggered — by the user, by Claude, or both
Slash command
/roadmap:roadmap [path/to/roadmap.md][path/to/roadmap.md]This skill is limited to the following tools:
The summary Claude sees in its skill listing — used to decide when to auto-load this skill
Turn a plain-text roadmap into a polished, dark-theme HTML Gantt chart with milestones, a today-line, and hover tooltips. Output is a single self-contained file (no CDN, no framework).
Turn a plain-text roadmap into a polished, dark-theme HTML Gantt chart with milestones, a today-line, and hover tooltips. Output is a single self-contained file (no CDN, no framework).
$ARGUMENTS has a path, use it.roadmap.md.Roadmaps look like this:
March 2026
- "Quality Review" until 3/20
- "Fix Gaps" until 3/27
- "Public Beta" Begins 3/30
April 2026
- "Deployment Pipeline" by 5/8
May 2026
- "Rollout" from 5/18-29
Extract per task:
| Field | Source |
|---|---|
| name | the quoted string |
| start | explicit from / Begins, else inferred from section month or the day after the previous task |
| end | until, by, or the upper bound of from X–Y |
| phase | the section heading; assign sequential phase numbers |
Compute chart start = first day of the earliest month, chart end = last day of the latest. When a date is inferred rather than stated, remember it for the report in step 7 — users want to verify guesses.
Pick from this palette by task role; cycle if more than 10 tasks. Roles are guidance, not a contract — the goal is that adjacent phases read as visually distinct.
| Class | Hex | Typical role |
|---|---|---|
bar-blue | #1d4ed8 | First task in Phase 1 |
bar-indigo | #4338ca | Phase 1 build tasks |
bar-violet | #6d28d9 | Additional Phase 1 |
bar-teal | #0f766e | Fix / gap / patch |
bar-green | #15803d | Beta / launch |
bar-cyan | #0e7490 | Infrastructure |
bar-slate | #334155 | Pipeline / ops |
bar-orange | #c2410c | Rollout / release |
bar-amber | #b45309 | Warning / hotfix |
bar-rose | #be123c | Critical / urgent |
Any task with an explicit end date is a milestone (inferred ends are not). Render:
transform: rotate(45deg)).roadmap.htmlWrite next to the source file. Single file, inline CSS and JS.
#0f1117, text #e2e8f0, system font stack, min-width: 1100px.<h1> title plus a subtitle showing the date range.Every header, ruler, and grid element gets margin-left: 280px. Row labels sit in the gutter:
position: absolute; left: -280px; width: 268px;
text-align: right; padding-right: 14px;
white-space: normal; line-height: 1.35; /* wrap, never clip */
Phase section headers above each group: 9px uppercase.
Month YYYY, left border aligned with the grid.28px tall, margin-bottom: 8px, ticks every 7 days.
10px tick, label font-weight: 700; color: #94a3b8.6px tick, label color: #475569.transform: translateX(-50%).Grid lines must render behind bars; otherwise hairlines cut through the bars and the chart looks broken.
position: relative; margin-left: 280px; border-left: 1px solid #1e293b. Month-boundary lines and weekly sub-grid lines (background: #151c29) at z-index: 0.z-index: 2, height 24px, top: 7px in a 38px row, border-radius: 5px. Truncate text with ellipsis. Hover: filter: brightness(1.25).left = pct(daysFromStart), width = pct(durationDays) (see coordinate helper below)./* default */
background: rgba(15,17,23,0.88);
border: 1px solid #334155; border-radius: 999px;
padding: 2px 7px; font-size: 9px; font-weight: 700; color: #f1f5f9;
/* highlight (phase boundary / launch) */
background: rgba(251,191,36,0.15);
border-color: #fbbf24; color: #fde68a;
Pill position: top: -2px; transform: translate(-50%, -100%). Diamond at z-index: 6.
Compute with new Date() in JS:
z-index: 10."← TODAY (Mon DD)" so the user still sees where "now" is.A position: fixed div, hidden by default, z-index: 1000. On bar mouseenter show name (with a coloured dot) and date range; on mousemove follow the cursor and clamp to viewport edges. Skip native title= attributes — they conflict with the custom tooltip.
Style: background: #1e293b; border: 1px solid #334155; border-radius: 8px; padding: 8px 12px; box-shadow: 0 8px 24px rgba(0,0,0,.5).
Flex row at the bottom (flex-wrap: wrap; gap: 20px): one swatch per colour class actually used, plus a diamond for milestones and a dashed amber swatch for the today line.
const SPAN = (END - START) / 86400000; // days in chart
const pct = (day) => (day / SPAN) * 100;
Use pct() for every left and width so the chart scales with viewport width.
Try to open in the default browser; fall back to printing the path.
# macOS
open roadmap.html
# Linux
xdg-open roadmap.html
Detect platform via uname or process.platform. If the open command fails, just tell the user the absolute path.
Creates, edits, and optimizes skills for Claude Code, including drafting, evaluating with test prompts, iterating on performance, and improving skill descriptions for better triggering accuracy.
npx claudepluginhub mikersays/mikersays-plugins --plugin roadmap