John301 downloadsCreate multiple timeline event streams on a single organized custom timeline to reveal context between them.
Timeline Canvas is an Obsidian plugin that generates vertical timeline backgrounds as scalable SVG images and places them on a Canvas. You lay out notes, cards, and media on top of a shared time axis, so events stay aligned by date while you organize the story however you want.
Use it for a single clean timeline, or for several parallel tracks (columns) so you can compare different streams of events on the same calendar.
Obsidian Canvas is excellent for spatial thinking, but it has no built-in time grid. Without a background, cards drift and “when” becomes hard to see at a glance.
Here's the problem I'd have.
Once a timeline like this starts including many items in parallel related timelines, I can see how they all fit together in time visually and quickly... But... half the time is spent stretching out old timelines and tweaking things so that everything fits and everything aligned left to right across the page still lines up as a single point in time as you're going down the timeline.
My solution was to create a simple but customizable canvas background that keeps everything in it's final location from the start.
If necessary, it is possible to do some editing after the fact without starting over with a new canvas just because you want to edit the background image. As long as you leave the incremental spacing representing months (or days, or years, etc.) all your cards will stay put if you add another column to make it wider, or crop things down smaller.
This plugin draws the time axis for you:
The background is a real vault file (SVG), so it stays sharp when you zoom and can be widened or edited later without starting over.
Split the background into vertical bands so multiple sequences share the same dates:
| Column | Example |
|---|---|
| General history | Wars, inventions, cultural events |
| Family history | Births, moves, letters |
| Company / project | Funding rounds, releases |
| Personal | Health, travel, study |
You can see a family event in the context of the wider world, or a product launch against industry news, without juggling separate canvases.
A .canvas file opens with the SVG timeline at the back. Add cards from the Canvas UI as usual and position them along the axis.
Date format: YYYY-MM-DD or with time, e.g. 2022-01-01 or 2022-01-01 08:00.
| Option | Purpose |
|---|---|
| Start / End date/time | Outer bounds of the timeline |
| Increment | Years, quarters, months, weeks, days, hours, minutes, or Custom |
| Increment size | e.g. every 1 month or every 3 months |
| Pixels between increments | Vertical spacing on the generated image |
| Timeline width | Horizontal size of the background (room for cards / columns) |
| Label format | How tick labels are written (automatic, year, month+year, full date, …) |
| Major line every | Emphasize every n ticks (0 = no major lines) |
| Show minor lines | Toggle lighter intermediate lines |
Choose Custom when the axis is conceptual rather than calendar-based:
Semester, Phase, Chapter Example: start 2025-01-01, end 2025-12-31, name Semester, count 4 → four labels (Semester 1 … Semester 4) spaced evenly between the year boundaries.
Use multiple sections when you care about disconnected spans of time:
2000-01-01 → 2001-01-01, Section 2 2003-01-01 → 2004-01-01You can change sections later with Edit timeline sections (see Command palette). Cards that still fall on remaining time are shifted to keep date alignment. Cards whose time was removed are moved outside the background so they are easy to spot and need manual attention.
| Option | Purpose |
|---|---|
| Timeline title | Optional title drawn at the top of the SVG |
| Columns | Number of vertical bands (1–20) for parallel timelines |
| Column N title | Header for each band (e.g. General history, Family history) |
With more than one column, dashed vertical dividers separate the tracks. Horizontal date lines still run across the full width so every column shares the same time axis.
.canvas file is created (pre-filled from plugin settings; leave blank for vault root). Place text cards, notes, images, and groups on the Canvas. Align them to tick marks so their vertical position means “when.” Use columns to keep different themes in different horizontal bands.
Obsidian draws Canvas nodes in array order (first = back). The plugin marks the timeline SVG as the background and can:
pointer-events: none) so clicks select your cards instead of the backgroundObsidian does not lock individual cards natively; lock here is the plugin’s way to make the background non-interactive while you work.
Most structural edits regenerate the SVG in place. The background’s top-left stays fixed so existing cards keep their canvas coordinates unless the command intentionally repositions them (sections / date-range remapping).
| Situation | What happens to cards |
|---|---|
| Widen | Not moved — only more room on the right |
| Columns / title | Not moved — grid and headers update |
| Date range | Remapped by date; collapses to one continuous section |
| Sections | Remapped by date across the new layout |
| Orphaned time (card’s date no longer on the timeline) | Card is moved outside the nearest left/right edge of the background; a notice reports how many need manual attention |
| Crop | All nodes shift so content sits near the origin; background frame is resized |
After these commands, open canvas tabs reload so the new SVG appears without closing the tab by hand.
Open a timeline .canvas file first (most of these only appear when a canvas is active):
| Command | When | What it does |
|---|---|---|
| Create timeline canvas | Anytime | Opens the create dialog (also available from the calendar ribbon icon) |
| Widen timeline background | Canvas active | Regenerates a wider SVG. Top-left stays fixed; only width grows to the right. Cards are not moved. |
| Edit timeline columns and title | Canvas active | Change title, column count, column headers, and optionally width. SVG regenerates; cards stay put. |
| Edit timeline date range | Canvas active | Change overall start and/or end. Becomes a single continuous section. Cards are remapped by date. Orphans are parked outside the background. |
| Edit timeline sections | Canvas active | Add/remove sections, edit each range, set gap size. Cards are remapped by date. Orphans are parked outside the background with a notice. |
| Crop timeline canvas to content | Canvas active | Show content bounds, choose a buffer, shift nodes toward the origin, and resize the background (useful before export). |
| Send timeline background to back | Canvas active | Put the SVG node at the bottom of the stack. |
| Toggle lock timeline background | Canvas active | Lock or unlock the background for the current canvas (non-clickable when locked). |
Settings → Timeline Canvas:
| Setting | Purpose |
|---|---|
| Default canvas folder | Default location for new .canvas files (create dialog is pre-filled) |
| Default SVG folder | Where timeline SVGs are stored (e.g. your attachments folder). Empty = same folder as the canvas |
| Keep timeline background at the back | After plugin actions, keep the SVG as the bottom-most node |
| Lock timeline background by default | New timelines start with a non-clickable background |
.timeline-meta.json sidecar so columns, title, width, date range, and sections can be edited later. Prefer timelines created with the current plugin version for full edit support. Manual install:
Copy main.js, manifest.json, and styles.css into:
<vault>/.obsidian/plugins/timeline-canvas/
In Obsidian: Settings → Community plugins → enable Timeline Canvas.
Reload the app if the plugin was already installed and you updated files.
Requires Obsidian 1.5.0 or newer.
| File | Role |
|---|---|
Timeline YYYY-MM-DD–YYYY-MM-DD.canvas |
Canvas board with the SVG as a file node |
Timeline YYYY-MM-DD–YYYY-MM-DD.svg |
Timeline artwork (title, columns, sections/gaps, date grid) |
Timeline … .timeline-meta.json |
Sidecar settings for later edits (columns, title, width, dates, sections) |
You can rename files in the vault; keep the canvas node pointing at the correct SVG if you move them by hand.