Herve Sliwa131 downloadsTurn a bullet list into a Gantt-style timeline █ █ █ ▒ ▒
Minimal timelines from a simple bullet list in Obsidian.
You write a list, add duration estimate {Days}, and Bullet-time reads it top-to-bottom, chains each task after the one before it, and transforms it into a clean monospace text art timeline.
calendar days or workdays mode, which skips weekends.3d, 2w, 4h).```bullet-time code block, or a plain bullet list tagged with a hidden %% bullet-time %% comment.Install it from_ Settings → Community plugins → Browse by searching for "Bullet-time".
main.js, manifest.json, and styles.css from the latest release.<vault>/.obsidian/plugins/bullet-time/.Add a fenced code block with the bullet-time language:
```bullet-time
title: Q3 Launch
mode: workdays
- Design {2w}
- Wireframes {4d}
- Visual design {6d}
- Build {3w} | #98c379
- QA {1w}
- Launch {2026-09-01, 2d}
```
The first bullet starts today (unless pinned). Each following sibling starts when the previous one ends. Indented bullets become children of the bullet above them.
Prefer a normal Markdown list? Tag it with a hidden comment as the first item (Reading view only):
- %% bullet-time %% mode:workdays title:Roadmap
- Research {1w}
- Prototype {2w}
- Ship {3d}
Placed before the first bullet, one per line, as key: value:
| Key | Values | Description |
|---|---|---|
title |
text | Heading shown above the timeline. |
mode / days |
calendar, workdays |
Count every day, or skip weekends. |
weekstart |
mon, sun |
First day of the week for axis ticks. |
hoursperday |
positive number | Hours in a work day (used to convert Nh durations). |
wide |
— | Break out to full pane width (also usable as a bare flag). |
center |
— | Center the timeline in its block (also usable as a bare flag). |
Lines starting with # are comments.
Each bullet is a task. Its content can carry an optional {...} scheduling group and a trailing | color:
- Label {start, duration} | color
{start, duration} — either part is optional: {2w} is duration-only, {2026-07-01} pins a start, {2026-07-01, 3d} sets both.today, an ISO date YYYY-MM-DD, or a relative offset like +5 / -2 (days from today).Nd (days), Nw (weeks — 5 work days or 7 calendar days), or Nh (hours, converted via hoursperday). Fractions allowed (e.g. 1.5d).| (e.g. | #e06c75, | tomato). Unsafe values are ignored.Tasks with no explicit start chain after their previous sibling. A pinned start runs in parallel from that date.
Configure global defaults under Settings → Bullet-time (any block can override the schedule-related ones via header lines):
calendar or workdaysnpm install
npm run dev # esbuild watch mode → rebuilds main.js on save
npm run build # typecheck + minified production build
npm test # headless parser + scheduler checks
npm run deploy # build, then copy into a vault (set BULLETTIME_VAULT)
The core is a strict, Obsidian-free pipeline — parse → schedule → layout — so it can be unit-tested headlessly; only the render stage touches the DOM. See CLAUDE.md for a fuller architecture tour.