A browser-based Gantt/roadmap visualizer. Define your roadmap in YAML and edit it through a visual UI — no database, no build step.
uv sync
uv run appFor hot reload during development:
RELOAD=true uv run app- SVG timeline — renders groups and tasks as a scrollable Gantt chart
- Click to edit — click any group or task to open an edit modal
- Filters — filter by assignee, tag, overdue status, or hide completed tasks
- Swimlane view — toggle grouping by assignee
- Undo / redo — full history with Ctrl+Z / Ctrl+Y
- Zoom — switch between day, week, month, quarter, and year views
- Dependencies — declare
depends_onbetween tasks or groups; cycles are rejected - Progress — optional 0–100 progress field renders as a fill on task bars
- Import / Export — load a YAML file from disk or download the current roadmap
- Export PNG — screenshot the SVG to a PNG file
- Read-only mode — display a roadmap from a remote source URL without editing
- Templates — start from a pre-built roadmap structure
- Dark mode — sun/moon toggle in the toolbar switches between light and dark themes; preference is persisted to
localStorageand respects the OS default on first visit
The roadmap is defined in YAML and managed entirely in the browser — there is no server-side persistence. State is kept in localStorage and can be imported from a local file or a remote URL.
title: My Roadmap
start: 2025-01-01
end: 2025-12-31
groups:
- id: backend
name: Backend
color: "#4A90D9"
tasks:
- id: auth
name: Authentication
start: 2025-01-15
end: 2025-02-28
assignee: Alice
progress: 80
tags: [security]
depends_on: []
notes: OAuth2 + JWTConstraints enforced on import:
idfields must be lowercase alphanumeric + underscorescolormust be a hex color (#RRGGBB)- Task and group
endmust be on or afterstart - Task IDs must be unique across the entire roadmap
depends_onmust not form cycles
Append ?url= to the app URL to load a YAML file from a remote source:
http://localhost:5006/?url=https://example.com/roadmap.yaml
The app fetches the file, displays it in read-only mode, and remembers the source URL across page reloads. Editing is disabled while in read-only mode.
To serve the app under a sub-path (e.g. behind a reverse proxy at /roadmap):
ROOT_PATH=/roadmap uv run appuv run pytest -vTests use temporary files.
| Layer | Technology |
|---|---|
| Backend | FastAPI + uvicorn |
| Frontend | Vanilla JS SPA (no framework, no build step) |
| Data | Browser localStorage + YAML import/export (ruamel.yaml) |
| Validation | Pydantic v2 |
src/roadmaptool/main.py— FastAPI app, mounts the API router and servesstatic/as the SPA rootsrc/roadmaptool/api.py— REST routes for import and exportsrc/roadmaptool/models.py— Pydantic models:Roadmap > Group > Tasksrc/roadmaptool/parser.py— YAML load/save with ruamel.yamlstatic/app.js— all frontend logic: SVG rendering, modals, undo/redo, filters