Your roadmap
lives in git.
Plain-markdown pucks in each repo — read and written by you and your AI agents — aggregated into one zero-backend board. No SaaS, no lock-in, no second source of truth.
---
title: Add dark mode
status: now
tags: [ui]
updated: 2026-08-16
owner: tor2dbear
depends: [design-tokens]
---
## Goal
One markdown file per roadmap item.
Edit it by hand or with the roadmap CLI —
both you and an agent can.
Not another tracker. A roadmap layer in your code.
Linear and GitHub Projects are team-PM tools. Etapp is different by construction — the difference is structural, not a feature list.
Truth lives in git
Each item is a markdown file in its own repo. Your roadmap diffs in pull requests and travels with the code — nothing to sync.
Agent-native
A coding agent reads roadmap.json to know what's ready and writes back with the CLI or the board — no API keys, no integration.
Zero backend
A static board aggregates every repo. No database, no service to run, nothing to lock you in. Deploy your own in minutes.
Where Etapp is different by design.
It deliberately cedes real-time co-editing, notifications and sprints — that's Linear's turf. The moat is being git-native and agent-native.
| Linear / Projects | Etapp | |
|---|---|---|
| Truth lives | their cloud / GitHub | in each repo, in git |
| Format | proprietary / issues | plain markdown |
| Backend | SaaS | none — static |
| Multi-repo | clunky | core |
| Agent read / write | API + keys | direct — md + JSON + CLI |
| Lock-in | yes | none |
Harvest the markdown. Render one board.
A scheduled job reads every source repo's pucks and generates the board — humans and agents read the same files.
roadmap/*.md
One puck per item, in each project. The source of truth.
roadmap.json · ROADMAP.md
Aggregated, machine-readable, with drift signals + blocked-by.
the board
A static page — search, filter, sort, deep links. No backend.
Built for the agent era.
The roadmap an AI operates natively — reads to know what to do, writes to mark it done. No integration to maintain.
- Find what's ready — unblocked now / next pucks, in one query.
- Update via the CLI — roadmap done <slug>, straight to git.
- Route to a specialist — set agent: backend and it joins that discipline's queue; you act as PO.
- One contract — AGENTS.md spells out read + write.
$ node -e "…filter roadmap.json…"
pia-terminal/python-sandbox-csp-fix
meta-matic/seller-order-notifications
cadence/bring-your-own-markup
# unblocked now/next — nothing guessed
Point it at your repos. Ship in minutes.
Config-driven — no code changes, no backend, no build step.
Use the template
Fork tor2dbear/etapp — the whole engine and board come with it.
List your repos
Edit sources.json — repo, name, colour, adapter. Each project keeps its own roadmap/.
Brand it
Set title, description and source link in board.config.json.
Publish it
Enable Actions (forks start with them off), then Settings → Pages → Source: GitHub Actions. Nothing but GitHub needed. The board is a plain static bundle, so any static host serves it just as well.
Stays fresh
The included action harvests and republishes — hourly, on every push to the board repo, and whenever you ask, from the Actions tab or the board's own sync now. Change the schedule in pages.yml.
Your roadmap already lives in git. Give it a board.
Try the interactive demo, or grab the code and stand up your own.