RoadmapSnap turns a single config file into a live Gantt dashboard with milestones, dependency graphs, KPI cards, and one-click exports. Edit and refresh — no build step, ever.
The tools exist. The problem is that none of them are fast, free, and stakeholder-ready without IT involvement.
Excel timelines collapse under real program complexity. Dates drift, formulas break, and the "latest version" is never the one being shown.
Blocking relationships between workstreams live in someone's head or buried in meeting notes — never in the roadmap itself.
What you track in detail and what leadership needs to see are two different things. Most tools force you to maintain both separately.
SaaS tools need procurement, licenses, and IT onboarding. You want a roadmap dashboard, not a six-week setup project.
Define deliverables, milestones, dependencies, and metadata in js/config.js. RoadmapSnap renders the rest.
Define any lifecycle as alternating states and milestones. Status auto-calculates — no manual updates after initial setup.
Recursive dependency visualization with directional arrows. Simple strings or precise milestone-to-milestone links.
3, 6, or 12-month zoom. Milestone diamonds overlaid on bars. Group rows, sort, filter, and search — all in-browser.
Presentation-ready snapshot in one click. No screen capture required — the export is clean and properly sized.
Auto-tallied counts of total, in-progress, done, and at-risk items. Click any card to filter the timeline instantly.
Attach tags to deliverables and search across the full roadmap in real time. Filter by team, priority, or any custom label.
Mark items as at-risk or descoped. Visual indicators surface problems immediately — no need to read through every row.
No data leaves your machine. Run from a shared drive, internal intranet, or private GitHub repo for sensitive programs.
No mock-ups. This is a live screenshot from a deployed RoadmapSnap instance.
```
Dependency graph, dark mode, export panel, timeline zoom, filter bar — all live.
One config file. One HTML file. Everything else is rendered in the browser.
Define deliverables, groups, milestone dates, dependencies, and metadata. Use the sample project to learn the format.
Set up the lifecycle that matches your program — states, milestones, colors, and labels are all yours to define.
The engine reads your config and renders KPI cards, Gantt timeline, and dependency graph. No server, no compile step.
GitHub Pages, Cloudflare Pages, Netlify, shared drive, or internal intranet. Static HTML goes everywhere.
Everything you need to go from a blank template to a fully working program roadmap, step by step.
```After cloning, you'll find two starter config files. Use config_base.js as your blank slate and config.js as a fully populated reference.
RoadmapSnap/ ``` ├── index.html # the rendering engine — never edit this ├── js/ │ ├── config.js # ← your roadmap lives here │ └── config_base.js # blank template to start from ├── css/ # styles (customise for branding) └── docs/ └── preview.png
Copy config_base.js over config.js to start clean. Study config.js (the e-commerce sample) whenever you need a working example of any feature.
Each item in the DELIVERABLES array represents one row in your timeline. The only two required fields are name and milestones.
DELIVERABLES: [
```
{
name: “User Authentication”, // required — must be unique
group: “Backend”, // optional — groups rows together
milestones: { // required — at least one date
M0: “01/03/2026”,
M1: “30/03/2026”,
M3: “01/05/2026”
}
}
]
| Field | Type | Required | Description |
|---|---|---|---|
name | string | Required | Unique identifier and label shown in the timeline row |
group | string | Optional | Organises rows under a labelled group/stream header |
milestones | object | Required | Key-value pairs of milestone key → date (DD/MM/YYYY) |
showInTimeline | boolean | Optional | Set to false to hide the row from the Gantt (default: true) |
Milestone keys must match the keys defined in your WORKFLOW. Status (Not Started / In Dev / Done / etc.) is automatically calculated at runtime based on which milestone dates have passed relative to today.
// Milestones use DD/MM/YYYY format ``` milestones: { M0: “01/03/2026”, // Dev kickoff M1: “28/03/2026”, // Dev complete M2: “18/04/2026”, // UAT signed off M3: “05/05/2026” // Go live — you don’t need all milestones }
A deliverable only needs the milestone dates that are relevant to it. If an item has no M2 date it will simply skip from M1 to M3 in the status calculation.
Dependencies tell RoadmapSnap which deliverables are blocked by others. They are visualised as a recursive arrow graph in the dependency view. There are two ways to define them.
A string with another deliverable's exact name. Links the last milestone of that deliverable to the start (M0) of this one.
An object with task, from, and to to link specific milestones between two deliverables.
{
```
name: “API Gateway”,
dependencies: [
```
// Simple: "Database Setup" M3 → "API Gateway" M0
"Database Setup",
// Advanced: "Auth Service" M1 must complete before
// "API Gateway" M1 can start
{ task: "Auth Service", from: "M1", to: "M1" },
// Another example: DB migration M2 → this item's M1
{ task: "DB Migration", from: "M2", to: "M1" }
```
],
milestones: { M0: “15/03/2026”, M1: “20/04/2026”, M3: “10/05/2026” }
}
The task string (or the simple string) must be the exact name of another deliverable in the same config — including case and spacing. A mismatch silently omits the dependency arrow.
name value.Tags are free-form strings attached to any deliverable. They make the real-time search bar significantly more useful — especially when a program has 40+ rows.
{
```
name: “Payment Processing”,
tags: [“P0”, “finance”, “external-vendor”, “PCI-DSS”],
milestones: { M0: “01/04/2026”, M1: “30/04/2026” }
}
Use “P0”, “P1” to quickly filter by business priority. Search “P0” to see all critical items.
Add the owning team: “platform-team”, “data-eng”. Filter the roadmap to one team’s scope instantly.
Label by domain: “security”, “frontend”, “compliance”. Useful for cross-functional reporting.
Mark external dependencies: “vendor-X”, “API-v2”. Filter to see all third-party blocked items at once.
The search bar in the dashboard finds matches in both the deliverable name and its tags array simultaneously. You don’t need to be precise — partial matches work.
The link field attaches a clickable icon to any deliverable row in the timeline. Use it to point directly to the Jira epic, Confluence page, or any other URL relevant to that item.
{
```
name: “Data Warehouse Setup”,
tags: [“data-eng”, “P0”],
// Links to a Jira epic
link: “https://your-org.atlassian.net/browse/DATA-142”,
milestones: { M0: “01/02/2026”, M1: “28/02/2026” }
},
{
name: “Auth & SSO”,
// Links to a Confluence design doc
link: “https://your-org.atlassian.net/wiki/spaces/ARCH/pages/123456”,
milestones: { M0: “10/02/2026”, M1: “15/03/2026”, M3: “01/04/2026” }
}
Link directly to the epic or story covering this deliverable. Stakeholders can drill in without asking the PM for the ticket number.
Point to the design document, PRD, or decision log. Makes the roadmap a genuine entry point to all program artefacts.
Any HTTPS URL works — SharePoint folders, Google Drive docs, Monday boards, Notion pages.
Only one link is supported per row. Use the most useful destination — typically the Jira epic or the Confluence spec page.
When a link is set, a small info icon appears next to the deliverable name. Clicking it opens the URL in a new tab. It doesn’t affect the bar or milestone rendering.
Two boolean flags let you surface delivery risk and scope changes visually — without touching the Gantt bars or milestone dates.
{
```
name: “Mobile App v2”,
atRisk: true, // shows a ⚠️ risk indicator on the row
descoped: false, // strikes through and greys out the row
milestones: { M0: “01/05/2026”, M1: “30/06/2026” }
},
{
name: “Legacy Portal Shutdown”,
atRisk: false,
descoped: true, // removed from scope — shown crossed out
milestones: { M0: “01/03/2026” }
}
Adds a visible risk indicator to the timeline row. The item still counts in the “at risk” KPI card. Click the KPI card to filter to all at-risk items.
Strikes through the row and renders it grey. The item is still visible (useful for auditing scope changes) but excluded from active KPI counts.
Groups organise the timeline into labelled stream sections. Use GROUP_ORDER to control how they appear top-to-bottom. Groups not listed will appear alphabetically after the explicitly ordered ones.
// Controls top-to-bottom stream order in the timeline ``` GROUP_ORDER: [“Data Platform”, “Integration”, “Frontend”, “Infrastructure”], // Groups listed here won’t appear in the filter dropdown NON_FILTERABLE_GROUPS: [“Infrastructure”, “Planning”]
Infrastructure, planning, and governance work often shouldn’t appear in team-level filters. Add these group names to NON_FILTERABLE_GROUPS and they’ll always show but won’t appear as filter options.
The WORKFLOW array defines your entire lifecycle. States and milestones must alternate. RoadmapSnap calculates each deliverable's current status by comparing milestone dates to today.
WORKFLOW: [
```
{ type: ‘state’, key: ‘NS’, title: ‘Not Started’ },
{ type: ‘milestone’, key: ‘START’, title: ‘Kickoff’, color: ’#7C3AED’ },
{ type: ‘state’, key: ‘BUILD’, title: ‘In Build’ },
{ type: ‘milestone’, key: ‘M1’, title: ‘Build Complete’, color: ’#059669’ },
{ type: ‘state’, key: ‘TEST’, title: ‘In Testing’ },
{ type: ‘milestone’, key: ‘M2’, title: ‘Test Sign-off’, color: ’#D97706’ },
{ type: ‘milestone’, key: ‘GO’, title: ‘Go Live’, color: ’#DC2626’ },
{ type: ‘state’, key: ‘DONE’, title: ‘Done’ }
]
Whatever you set as key in a milestone workflow entry is what you use in each deliverable’s milestones object. You can rename them to anything — M0/M1/M2, KICKOFF/BUILD/UAT/GOLIVE, or any other convention.
Control the visible date range and the today marker. Leave TODAY empty to auto-detect from the system clock.
TIMELINE: {
```
TODAY: “16/02/2026”, // DD/MM/YYYY or “” for auto
START_MONTH: “01/2026”, // MM/YYYY — left edge of Gantt
END_MONTH: “12/2026” // MM/YYYY — right edge of Gantt
}
If you’re exporting to PNG for a board pack or status report, set TODAY to a fixed date so the today-line appears in exactly the right place in the export, regardless of when it’s opened.
Change the vocabulary of the dashboard to match your program. Replace "Feature" with "Initiative", "Epic", "Project", or any term your stakeholders use.
ENTITY_LABELS: {
```
singular: “Initiative”,
plural: “Initiatives”,
scopeLabel: “initiatives” // lowercase for sentence use
},
DASHBOARD_TEXT: {
title: “Digital Transformation 2026”,
totalSubtitleSuffix: “in scope”
}
For logo and colour changes, edit css/styles.css. The CSS uses straightforward class names and custom properties — no deep knowledge of the rendering engine needed.
RoadmapSnap supports three export formats, all accessible from the toolbar inside the dashboard.
TODAY date before exporting for reproducible snapshots.For programs with confidential data, use a private GitHub repository and enable GitHub Pages access controls, or deploy to an internal intranet. You can also create a sanitised config.public.js with only the information safe to share externally.
From PMO governance to consulting engagements — wherever a stakeholder-ready roadmap needs to appear fast.
Single source of truth across all programs. Export weekly board packs with one click. No more "which version is current?"
Multi-stream programs with complex cross-dependencies. Keep executives aligned on the critical path without a 40-slide deck.
Track schema discovery, ETL pipelines, data quality rules, and analytics delivery with clear milestone accountability.
Long-running programs with formal phase gates. Surface at-risk workstreams before they become programme blockers.
White-label via CSS. Deliver polished client presentations without SaaS licenses or lengthy procurement processes.
Filter by group, status, or risk to surface what needs attention. One config file per portfolio item, one folder per programme.
Three deployment options. None of them require a build tool, a server, or a package manager.
Clone and open in any browser. Zero setup.
Edit js/config.js → refresh → done.
No build command needed.
/ → DeployDirectly from your repository.
main as sourceusername.github.io/RoadmapSnap/Use a private repo + Pages for sensitive programme data.
DELIVERABLES array in js/config.js with at minimum a unique name and a milestones object containing your key-date pairs. Save and refresh the browser — the new row appears immediately.dependencies array to any deliverable. Use a plain string (matching another deliverable's exact name) for a simple last-milestone-to-M0 link, or use an object {task, from, to} to link specific milestones. RoadmapSnap renders a recursive directed graph with arrows automatically.link field on any deliverable to any HTTPS URL. An info icon appears on that row in the timeline — clicking it opens the URL in a new tab. Works with Jira epics, Confluence pages, Google Drive documents, SharePoint folders, or any other link./, and deploy. Global CDN is included at no cost.No backend. No build step. No license fees. Clone, configure, and ship a stakeholder-ready dashboard today.