Open Source MIT License · No backend required · by Moisés Prat

Roadmap dashboards that
your stakeholders actually read

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.

0 build steps
Open in browser immediately
1 file to edit
config.js controls everything
MIT licensed
Free for commercial use
roadmapsnap.pages.dev
RoadmapSnap dashboard: KPI cards, Gantt timeline with milestone diamonds, and grouped workstreams
Screenshot loads on the deployed page Open live demo ↗

Program roadmaps fail before they're presented

The tools exist. The problem is that none of them are fast, free, and stakeholder-ready without IT involvement.

🗂️

Spreadsheet entropy

Excel timelines collapse under real program complexity. Dates drift, formulas break, and the "latest version" is never the one being shown.

🔗

Hidden dependencies

Blocking relationships between workstreams live in someone's head or buried in meeting notes — never in the roadmap itself.

📊

Executive translation gap

What you track in detail and what leadership needs to see are two different things. Most tools force you to maintain both separately.

🔧

Infrastructure overhead

SaaS tools need procurement, licenses, and IT onboarding. You want a roadmap dashboard, not a six-week setup project.

Everything in one config file

Define deliverables, milestones, dependencies, and metadata in js/config.js. RoadmapSnap renders the rest.

🎯

Configurable workflow

Define any lifecycle as alternating states and milestones. Status auto-calculates — no manual updates after initial setup.

🔗

Dependency graph

Recursive dependency visualization with directional arrows. Simple strings or precise milestone-to-milestone links.

📅

Gantt timeline

3, 6, or 12-month zoom. Milestone diamonds overlaid on bars. Group rows, sort, filter, and search — all in-browser.

📤

Export to PNG / CSV / JSON

Presentation-ready snapshot in one click. No screen capture required — the export is clean and properly sized.

📊

Executive KPI cards

Auto-tallied counts of total, in-progress, done, and at-risk items. Click any card to filter the timeline instantly.

🏷️

Tags & search

Attach tags to deliverables and search across the full roadmap in real time. Filter by team, priority, or any custom label.

⚠️

Risk & descope flags

Mark items as at-risk or descoped. Visual indicators surface problems immediately — no need to read through every row.

🔒

Works offline & privately

No data leaves your machine. Run from a shared drive, internal intranet, or private GitHub repo for sensitive programs.

The actual dashboard

No mock-ups. This is a live screenshot from a deployed RoadmapSnap instance.

```
RoadmapSnap — Main Dashboard View Live Preview
Full RoadmapSnap dashboard: KPI summary cards, interactive Gantt timeline with coloured deliverable bars, milestone diamond markers, group streams, and today-line indicator
Screenshot loads on the deployed page Open live demo ↗
Auto-calculated KPI cards
Milestone diamond markers
Group / stream rows
Today-line indicator
Click-to-filter KPIs
At-risk visual flags

Explore the full interactive experience

Dependency graph, dark mode, export panel, timeline zoom, filter bar — all live.

Open live demo →
```

How it works

One config file. One HTML file. Everything else is rendered in the browser.

1

Edit config.js

Define deliverables, groups, milestone dates, dependencies, and metadata. Use the sample project to learn the format.

2

Configure your workflow

Set up the lifecycle that matches your program — states, milestones, colors, and labels are all yours to define.

3

Open index.html

The engine reads your config and renders KPI cards, Gantt timeline, and dependency graph. No server, no compile step.

4

Deploy anywhere

GitHub Pages, Cloudflare Pages, Netlify, shared drive, or internal intranet. Static HTML goes everywhere.

NS
Not Started
M0
Dev Start
Kickoff
DEV
In Dev
M1
Dev Complete
Code freeze
M2
UAT Complete
Signed off
M3
Production
Go live
Done

Complete configuration reference

Everything you need to go from a blank template to a fully working program roadmap, step by step.

```
Project structure

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.

repository roottree
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
💡

Start from the base template

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.


```
Defining deliverables

Each item in the DELIVERABLES array represents one row in your timeline. The only two required fields are name and milestones.

js/config.jsjavascript
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”
}
}
]
FieldTypeRequiredDescription
namestringRequiredUnique identifier and label shown in the timeline row
groupstringOptionalOrganises rows under a labelled group/stream header
milestonesobjectRequiredKey-value pairs of milestone key → date (DD/MM/YYYY)
showInTimelinebooleanOptionalSet to false to hide the row from the Gantt (default: true)

```
Setting milestones

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.

js/config.jsjavascript
// 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
}

You don’t need every milestone

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.


```
Tracking dependencies

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.

Simple dependency

A string with another deliverable's exact name. Links the last milestone of that deliverable to the start (M0) of this one.

Advanced dependency

An object with task, from, and to to link specific milestones between two deliverables.

js/config.jsjavascript
{
```

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” }
}
```
⚠️

Names must match exactly

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.

  • 1
    Identify the blocking deliverable
    Find the deliverable whose completion gates another one. Note its exact name value.
  • 2
    Choose simple or advanced
    Use a plain string if the default "last milestone → M0" link is sufficient. Use the object form to connect specific milestones.
  • 3
    Add to the dependencies array
    You can mix strings and objects freely in the same array. Multiple dependencies per deliverable are fully supported.
  • 4
    Check the dependency view
    Reload and switch to the dependency graph tab. Arrows will appear between the linked milestones, and blocked items will be highlighted.

Tagging deliverables for easy search

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.

js/config.jsjavascript
{
```

name: “Payment Processing”,
tags: [“P0”, “finance”, “external-vendor”, “PCI-DSS”],
milestones: { M0: “01/04/2026”, M1: “30/04/2026” }
}

🏷️ Priority tags

Use “P0”, “P1” to quickly filter by business priority. Search “P0” to see all critical items.

👥 Team tags

Add the owning team: “platform-team”, “data-eng”. Filter the roadmap to one team’s scope instantly.

📦 Domain tags

Label by domain: “security”, “frontend”, “compliance”. Useful for cross-functional reporting.

🔗 Integration tags

Mark external dependencies: “vendor-X”, “API-v2”. Filter to see all third-party blocked items at once.

Search works across names AND tags

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.


```
```
Risk & descope flags

Two boolean flags let you surface delivery risk and scope changes visually — without touching the Gantt bars or milestone dates.

js/config.jsjavascript
{
```

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” }
}

⚠️ atRisk: true

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.

🚫 descoped: true

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 & ordering

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.

js/config.jsjavascript
// 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”]

Use NON_FILTERABLE_GROUPS for overhead items

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.


```
Custom workflows

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.

js/config.jsjavascript
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’            }
]
💡

The keys become your milestone names

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.


```
Timeline settings

Control the visible date range and the today marker. Leave TODAY empty to auto-detect from the system clock.

js/config.jsjavascript
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
}

Set TODAY manually for static presentations

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.


```
Custom labels & branding

Change the vocabulary of the dashboard to match your program. Replace "Feature" with "Initiative", "Epic", "Project", or any term your stakeholders use.

js/config.jsjavascript
ENTITY_LABELS: {
```

singular:   “Initiative”,
plural:     “Initiatives”,
scopeLabel: “initiatives”   // lowercase for sentence use
},

DASHBOARD_TEXT: {
title:                “Digital Transformation 2026”,
totalSubtitleSuffix: “in scope”
}
💡

Branding via CSS

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.


```
Exporting & sharing

RoadmapSnap supports three export formats, all accessible from the toolbar inside the dashboard.

  • 📷
    PNG export
    Captures the current viewport as a clean, high-resolution image. Best for embedding in slide decks, board packs, and status reports. Set a fixed TODAY date before exporting for reproducible snapshots.
  • 📊
    CSV export
    Exports all deliverable data as a flat table. Useful for feeding into reporting tools, pivot tables, or for audit trails. Includes name, group, milestone dates, status, and flags.
  • {}
    JSON export
    Full structured export of the rendered state. Use for integration with other tools, archiving point-in-time snapshots, or generating reports programmatically.

Sharing sensitive roadmaps

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.

```

Who uses RoadmapSnap

From PMO governance to consulting engagements — wherever a stakeholder-ready roadmap needs to appear fast.

🏛️

PMO Governance

Single source of truth across all programs. Export weekly board packs with one click. No more "which version is current?"

🔄

Enterprise Transformation

Multi-stream programs with complex cross-dependencies. Keep executives aligned on the critical path without a 40-slide deck.

☁️

Data Platform Migration

Track schema discovery, ETL pipelines, data quality rules, and analytics delivery with clear milestone accountability.

⚙️

ERP & Platform Upgrades

Long-running programs with formal phase gates. Surface at-risk workstreams before they become programme blockers.

📋

Consulting Roadmaps

White-label via CSS. Deliver polished client presentations without SaaS licenses or lengthy procurement processes.

📈

Portfolio Reporting

Filter by group, status, or risk to surface what needs attention. One config file per portfolio item, one folder per programme.

Up and running in 60 seconds

Three deployment options. None of them require a build tool, a server, or a package manager.

⌨️ Local — fastest start

Clone and open in any browser. Zero setup.

# Clone git clone https://github.com/ moises-prat-epm/RoadmapSnap cd RoadmapSnap # Open directly open index.html # macOS start index.html # Windows

Edit js/config.js → refresh → done.

🌐 Cloudflare Pages — free global CDN

No build command needed.

1
Fork or push the repo to your GitHub account
2
Go to Cloudflare Pages → Connect to Git
3
Select your repo and branch
4
Leave Build command empty
5
Set root directory / → Deploy

🐙 GitHub Pages — free from your repo

Directly from your repository.

1
Push the repo to your GitHub account
2
Go to Settings → Pages
3
Select branch main as source
4
Live at username.github.io/RoadmapSnap/

Use a private repo + Pages for sensitive programme data.

Common questions

A roadmap visualization tool converts project plans into interactive visual dashboards. RoadmapSnap renders Gantt timelines, milestones, and dependency graphs entirely in the browser from a single JavaScript config file — no server, no database, no build step.
Add an object to the 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.
Add a 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.
Yes. Set the 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.
Yes. Connect your GitHub repository to Cloudflare Pages, select your branch, leave the build command empty (no build step needed), set root directory to /, and deploy. Global CDN is included at no cost.
Yes — MIT License. Use, modify, and distribute freely for personal or commercial projects with no restrictions.

Your roadmap, clear in minutes

No backend. No build step. No license fees. Clone, configure, and ship a stakeholder-ready dashboard today.