Plan release trains, share the dates, export to your calendar.
Visit: www.rail.sh
Pick a first GA date and a cadence, list the milestones that lead up to each release, and the planner lays out every release on a timeline and in a table.
- Milestones are offsets from GA: "Branch cut β6 weeks", "RC1 β4 weeks", "First patch +2 weeks".
- Release names come from a template.
{YYYY},{YY}, and{MM}come from the GA date,{N}is the nth release that year, and{SEQ}is a running number. Edit a name in the table to override it. - Presets cover an RC train, a calendar-versioned biannual release, and a simple monthly release.
A date that lands on a weekend or inside a blackout (a holiday freeze, say) moves to the nearest earlier working day. Moved dates are marked βΆ with the original date and the reason. Dates are calendar dates, so your timezone never shifts them.
- Copy link: the whole schedule lives in the URL, so a link reproduces it exactly. Nothing is stored on a server.
- Download .ics: every milestone becomes an all-day calendar event. As long as the first GA date stays the same, re-importing an updated schedule updates the same events in calendars that support it.
- Copy as Markdown: a table ready for a GitHub issue, a wiki page, or Slack.
Plain HTML, CSS, and JavaScript modules. No dependencies, no build step.
planner.js: schedule math, validation, link encoding, .ics and Markdown output (no DOM)app.js: the pagetest/planner.test.js: tests forplanner.js
Run the tests (Node 24+):
npm testPreview locally. ES modules need HTTP, so opening index.html directly won't work:
python3 -m http.server 8000Then open http://localhost:8000.
Made by @rail



