Skip to content

Releases: luke321/vault-graph

2.9.0 - Mobile & Sort

Choose a tag to compare

@github-actions github-actions released this 19 Sep 15:24
a482126

A phone finally gets a layout built for it instead of the desktop's borrowed one, and the disc now orders itself the way your vault's own file explorer does.

A layout built for a phone

The panel below the disc, in scroll, on a phone

  • Reported by a reader on Reddit: the desktop's own panel and buttons used to sit on top of the disc on a phone, covering the animation the page exists to show.
  • The panel now lives below the disc in the page's own scroll flow instead of over it — nothing covers the circle, and a note's card opens inline in that scroll instead of as a sheet.
  • Panning is off on a phone — the disc doesn't drift under your thumb — and pinch-to-zoom, a rotation, or a settings change mid-gesture no longer confuse it.
  • Buttons throughout are sized for a finger, and the heatmap band's own controls, which used to overflow their row at that width, now fit it.
  • This applies specifically on a real touchscreen at a phone's width; a narrow desktop window with a mouse keeps the existing folding-panel behaviour.

Wedges follow your own order

Wedges reordering to a File Explorer sort spec, then back

  • A new Folder order setting in the gear menu: Name (today's default, numbers read as numbers), File explorer, or Size. File explorer follows a Custom File Explorer Sorting spec if your vault has one — pinned names first, then ascending or descending order, in that plugin's own precedence.
  • The vault's root notes take their place among the folders under either mode, instead of always sitting first or last.
  • Only the top-level wedges and both levels of the legend follow the chosen order; a folder's own subfolders stay ordered by size, which is what gives its fan of tints their gradient.
  • A spec that can't be read falls back to name order rather than applying half of it, naming the line it skipped the same way the plugin it mirrors reports its own syntax errors.

If Vault Graph is useful to you:

Support me on Ko-fi


2.9.0 — "Mobile & Sort" — 2026-09-19

A phone finally gets a layout built for it instead of the desktop's borrowed one, and the disc
now orders itself the way your vault's own file explorer does.

A layout built for a phone

  • Reported by a reader on Reddit: the desktop's own panel and buttons used to sit on top of the
    disc on a phone, covering the animation the page exists to show.
  • The panel now lives below the disc in the page's own scroll flow instead of over it — nothing
    covers the circle, and a note's card opens inline in that scroll instead of as a sheet.
  • Panning is off on a phone — the disc doesn't drift under your thumb — and pinch-to-zoom, a
    rotation, or a settings change mid-gesture no longer confuse it.
  • Buttons throughout are sized for a finger, and the heatmap band's own controls, which used to
    overflow their row at that width, now fit it.
  • This applies specifically on a real touchscreen at a phone's width; a narrow desktop window
    with a mouse keeps the existing folding-panel behaviour.

Wedges follow your own order

  • A new Folder order setting in the gear menu: Name (today's default, numbers read as
    numbers), File explorer, or Size. File explorer follows a Custom File Explorer Sorting
    spec if your vault has one — pinned names first, then ascending or descending order, in that
    plugin's own precedence.
  • The vault's root notes take their place among the folders under either mode, instead of
    always sitting first or last.
  • Only the top-level wedges and both levels of the legend follow the chosen order; a folder's
    own subfolders stay ordered by size, which is what gives its fan of tints their gradient.
  • A spec that can't be read falls back to name order rather than applying half of it, naming the
    line it skipped the same way the plugin it mirrors reports its own syntax errors.

Fixed

  • A disc that was fit to the window re-centres when the window resizes; it used to stay put and
    drift off-frame.
  • Note names are escaped before they're written into the page's own click targets, so one with
    quotes or brackets in it can no longer break them.
  • A background word-count read can no longer land after a newer one and overwrite its numbers.

Smaller things

  • A right-click menu behind the Developer setting: grid lines and slow motion, for anyone
    poking at the cascade itself.
  • The comment gate runs on every push instead of only at release, and understands CSS well
    enough to stop mistaking a url() or a calc() slash for a comment.
  • The release workflow runs the same five static gates the pre-push hook does.
  • The exporter's placeholder node for a missing note carries the two fields the renderer
    requires.

2.8.0 - Recent

Choose a tag to compare

@github-actions github-actions released this 14 Sep 23:06
eafd1fb

The calendar band becomes something you point at the disc. Ask it what you touched today, in the last week, or since you last had the graph open.

Halo what you touched recently

Today clicked and the notes added that day haloed while the rest of the disc dims, then Last 7 widening the window, the band switched to count by Touched and back to Added, and the chip clicked again to let the lens go

  • Three chips under the band — Today, Last 7, Since last open. The notes they match wear a halo, everything else dims a little, and nothing on the disc moves.
  • Last 7 is a rolling seven days, so it never collapses into Today on a Monday.
  • Since last open appears only inside Obsidian, which keeps that clock. The exported page has no such stamp, so it does not offer a chip that cannot answer.
  • The band counts either date — Added or Touched — and every chip says which one it means.

Fewer greys on a crowded disc

A folder's swatch opened and its colour changed, the change following every note in the wedge, then the palette's own greys left where they belong

  • The two grey colour slots stay out of the automatic rotation, so a group is grey only when it is meant to be. On a disc of a hundred tags, twenty greyish groups become two.

Smaller things

  • The band's controls sit in one row at one height, and the fewer–more key is gone.
  • The inner ring gets room in proportion to what it carries, and the outer ring's first row sits on the ring instead of crossing it.
  • A dot no longer changes size on the single frame a cascade lands.
  • A link written relative to its note resolves against that note, and two different missing notes no longer collapse into one ghost.
  • Pins are stored by the note's path, so adding a note no longer silently repins a different one.
  • An idle PNG export no longer saves the background and the logo with no graph on them.
  • The renderer recovers when the browser takes the WebGL context away.
  • A vault where every folder is small no longer collapses into a single ring.

If Vault Graph is useful to you:

Support me on Ko-fi


2.8.0 — "Recent" — 2026-09-15

The calendar band becomes something you point at the disc — ask it what you touched today, in the last week, or since you last had the graph open.

Halo what you touched recently

  • Three chips under the band: Today, Last 7 and Since last open. The notes they match
    wear a halo, everything else dims a little, and nothing on the disc moves.
  • Last 7 is a rolling seven days, so it never collapses into Today on a Monday.
  • Since last open appears only inside Obsidian, which keeps that clock. The exported page has
    no such stamp, so it does not offer the chip rather than offering one that cannot answer.
  • The band counts either date — Added or Touched — and every chip's label says which one
    it means, so a window never claims a date the band is not counting.

Fewer greys on a crowded disc

  • The two grey colour slots stay out of the automatic rotation, so a group is grey only when it
    is meant to be. On a disc of a hundred tags, twenty greyish groups become two.

The rings share the room fairly

  • The inner ring gets room in proportion to what it carries, so its dots are no longer packed
    tighter than the outer ring's for no reason.
  • The outer ring's first row sits with its dots' edges on the ring, not their centres, so hiding
    a big folder no longer makes the ring look as though it walked inward.
  • A dot no longer changes size on the single frame a cascade lands.

Fixed

  • A link written relative to its note resolves against that note, not the vault root, and two
    different missing notes no longer collapse into one ghost.
  • Pins are stored by the note's path, so adding a note no longer silently repins a different one.
  • An idle PNG export no longer saves the background and the logo with no graph on them.
  • The renderer recovers when the browser takes the WebGL context away, and Refresh rebuilds it.
  • A plugin render that finishes after its view was closed no longer mounts over the new one.
  • Refresh on the exported page rebuilds the band for the date it names; disarming a chip eases
    the disc back instead of flashing it dim; the since-last-open window uses the local calendar
    day; and a settings save that fails no longer skips the view's render or teardown.
  • A vault where every folder is small no longer collapses into a single ring.

Smaller things

  • The band's controls sit in one row at one height, and the fewer–more key under it is gone.
  • The JavaScript is compiler-checked, the test runner fails on a runtime error it captured
    instead of printing a pass over it, and the quality gates run in CI where a merge boundary can
    see them.
  • The architecture entry point and the record index match the code again.

2.7.0 - Reader

Choose a tag to compare

@github-actions github-actions released this 12 Sep 16:35
5a34729

The note card stops covering the disc. Click a note and the sidebar reads it, where the folder list was — the graph stays where you left it.

Read a note without losing the disc

Clicking a note, its reading appearing in the sidebar while the disc stays put, walking four links deep with the camera flying to each one, stepping back with the arrow, jumping to the first crumb, then closing the reading and returning to the folder list

  • The sidebar holds two readings, Groups and Selected note, and shows one at a time.
  • Click a note and it switches to that note. Nothing lands over the graph.
  • Close the reading, or click empty stage, and you are back on the groupings.
  • Each reading keeps its own scroll position, so you land where you left the folder list.
  • On a phone nothing changes: the reading still slides up over the canvas, where there is no room for a second column.

Smaller things

  • The disc fills more of the window. A square pane — which an Obsidian pane usually is — gains the most.
  • Panning no longer freezes when notes arrive under it.
  • Leaving the view open and coming back no longer costs memory.
  • A right-click on the disc is no longer mistaken for a drag.
  • The update strip's Got it button sits under the text, on the left.
  • Every clip in the gallery is re-recorded square, which is what the thumbnails actually want.

If Vault Graph is useful to you:

Support me on Ko-fi


2.7.0 — "Reader" — 2026-09-12

The note card stops covering the disc — and three things that got in the way of reading it are fixed.

Read a note without losing the disc

  • The sidebar now holds two readings, Groups and Selected note, and shows one at a time.
  • Click a note and the sidebar switches to its reading, instead of a card landing over the graph.
  • The card's close button, or a click on empty stage, takes you back to the groupings.
  • Each reading keeps its own scroll position, so coming back lands where you left the folder list.
  • On a phone nothing changes: the card still slides up over the canvas, where there is no room
    for a second column.

Fixed

  • The disc fills more of the window. Fit leaves a smaller margin at every window size, and a
    square window — which an Obsidian pane usually is — gains the most.
  • Panning no longer freezes when notes arrive under it.
  • Leaving the view open and coming back no longer costs memory.
  • A right-click on the disc is no longer mistaken for a drag.
  • The update strip's Got it button sits under the text, on the left.

Smaller things

  • Every gallery clip and the hero are re-recorded square, which is what the thumbnails and the
    community page actually want.
  • Harness runs hand the keyboard back instead of keeping it — invisible in the plugin, but it is
    why the machine stays usable while the test suite runs.

2.6.0 - Minimap

Choose a tag to compare

@github-actions github-actions released this 11 Sep 19:38
5bec8f5

Three things the disc used to leave you guessing about: where you are when you zoom in, what a colour will do before you pick it, and what changed when the plugin updated.

Know where you are when you zoom in

Zooming in until the disc is cut off, the small map appearing beside Fit with a box marking the visible part, dragging to pan so the box moves, then resetting and the map disappearing

  • Zoom in and a small map appears next to Fit, with a box marking the part you are looking at.
  • Click it to jump back to the whole disc.
  • It shows up only while the disc is cut off, and takes itself away when everything fits again.

See a colour before you pick it

Two folders right-clicked in turn, the swatches each showing the dots they will draw with the lighter subfolder shades underneath, one picked and the disc taking it, then both put back to automatic

  • Every swatch now shows the dots it will actually draw, including the lighter shades the
    subfolders get.
  • The plugin's settings show the same swatches as the right-click menu.

The plugin tells you what is new

  • After an update, a strip at the top says what changed. Dismiss it and it stays gone.
  • Miss a few releases and it catches you up on all of them, oldest first.
  • Whatever the release added lights up while the strip is there, so you can see where to look.

Smaller things

  • The legend keeps up when you switch light and dark.
  • Switching between Folders and Tags no longer nudges the sidebar sideways.
  • Dots in the inner ring are sized against their own ring, so a busy one looks right.
  • Animations follow your system's reduced-motion setting.
  • The colour swatches in the plugin's settings line up, and are big enough to see.

If Vault Graph is useful to you:

Support me on Ko-fi


2.6.0 — "Minimap" — 2026-09-11

Three things the disc used to leave you guessing about: where you are when you zoom in, what a colour will do before you pick it, and what changed when the plugin updated.

Know where you are when you zoom in

  • Zoom in and a small map appears next to Fit, with a box marking the part you are looking at.
  • Click it to jump back to the whole disc.
  • It shows up only while the disc is cut off, and takes itself away when everything fits again.

See a colour before you pick it

  • Every swatch now shows the dots it will actually draw, including the lighter shades the
    subfolders get.
  • The plugin's settings show the same swatches as the right-click menu.

The plugin tells you what is new

  • After an update, a strip at the top says what changed. Dismiss it and it stays gone.
  • Miss a few releases and it catches you up on all of them, oldest first.
  • Whatever the release added lights up while the strip is there, so you can see where to look.

Smaller things

  • The legend keeps up when you switch light and dark.
  • Switching between Folders and Tags no longer nudges the sidebar sideways.
  • Dots in the inner ring are sized against their own ring, so a busy one looks right.
  • Animations follow your system's reduced-motion setting.
  • The colour swatches in the plugin's settings line up, and are big enough to see.

2.5.0 - Tags

Choose a tag to compare

@github-actions github-actions released this 11 Sep 12:12
15afc47

Tags. A second way to cut the disc, alongside folders — same layout mechanism, fed a
different grouping, nested tags earning their own sub-wedge exactly the way a subfolder does.

Grouping by tag

The group list's heading is now a segmented control, Folders or Tags — switch and the
whole disc redraws, one hand erasing the old wedges while the other brings in the new ones,
with the links, the heat strip and the group list following the notes. A note's first listed
tag files it; a nested tag such as area/health nests as a sub-wedge of area, opened and
pushed out the same way a subfolder is. Untagged notes land in their own (untagged) bucket,
grey like (unlinked).

The disc cut by tag instead of by folder, a nested tag's twisty opened to reach its sub-tag, clicked to halo and push the sub-wedge out then let back down, folded away again, and the disc switched back to folders

  • Where a tag's wedge holds fewer notes than carry the tag, its row says so.
  • The grouping control takes the full panel's width now, split evenly between the two sides,
    each carrying its own count — instead of one shared count sitting above four buttons that
    used to read as one group.

Smaller things

  • The stats line now names the version that built the page, so a rebuilt-but-not-reloaded
    install in Obsidian doesn't read as a stuck bug.
  • The disc-to-window margin is half what it was.
  • The docs site has its own dark theme instead of GitHub Pages' generic default.

☕ If Vault Graph is useful to you, support it on Ko-fi.


2.5.0 — "Tags" — 2026-09-11

A second way to cut the disc: by tag instead of by folder. The group list's heading is now
a segmented control, Folders or Tags — switch and the whole disc redraws, one hand
erasing the old wedges while the other brings in the new ones, with the links, the heat strip
and the group list following the notes. A note's first listed tag files it; a nested tag such
as area/health nests as a sub-wedge of area, opened and pushed out exactly the way a
subfolder is — the same grouping-dimension mechanism underneath, just fed tags instead of
folder paths. Untagged notes land in their own (untagged) bucket, grey like (unlinked).

The disc cut by tag instead of by folder, a nested tag's twisty opened to reach its sub-tag, clicked to halo and push the sub-wedge out then let back down, folded away again, and the disc switched back to folders

Grouping by tag

  • Folders or Tags, a segmented control above the legend. The disc keeps its hub and its
    rings across the switch; nothing about walking a nested tag needed its own code.
  • Where a tag's wedge holds fewer notes than carry the tag, its row says so.
  • The grouping control takes the full panel's width now, split evenly between the two sides,
    each carrying its own count — instead of one shared count sitting above four buttons that
    used to read as one group.

Fixes

  • A frontmatter value containing a literal </script> could close the standalone export's own
    data script and run whatever followed it.
    The exported data is escaped now, so this can't
    happen.
  • A folder literally named constructor or toString could crash the plugin, via an
    inherited property the planner mistook for its own. Fixed everywhere the layout keys a map by
    folder or tag name.

Also in this release

  • The stats line now names the version that built the page, so a rebuilt-but-not-reloaded
    install in Obsidian doesn't read as a stuck bug.
  • The disc-to-window margin is half what it was.
  • The docs site has its own dark theme instead of GitHub Pages' generic default.

2.4.1

Choose a tag to compare

@github-actions github-actions released this 11 Sep 09:54
70aa8b3

2.4.1 — 2026-09-10

The README's "Try it live" and feature-list links now go somewhere. 2.4.0 shipped the docs
as a real site but the README still carried the placeholder line from before the site resolved —
"this line gets its links the moment it's live" — and GitHub Pages itself had never been switched
on for the repository, so there was nothing to link to. Pages is enabled now, serving from
main's docs/, and the README points at it: the live
demo
, the feature
gallery
, and the site
itself
. Nothing in the plugin changed.


2.4.0 - Auto

Choose a tag to compare

@github-actions github-actions released this 10 Sep 21:06
0a2bfc3

2.4.0 — "Auto" — 2026-09-10

Write a note, link three people, and the disc beside you notices. Refresh used to be the
only way to see a change you just made — a full teardown, a fresh build and the intro cascade
from the vault's first note, which also threw away your filters, your date range, your pins and
wherever you'd moved the camera. The graph now watches the vault and walks itself to the new
state on the ordinary cascade instead.

Obsidian with the vault graph in one tab: a second tab opened, a meeting note typed into it, the graph tab clicked and the outer ring taking the new note in one cascade, the new dot hovered; then a weekly review written in another tab, the graph tab clicked again and the inner ring taking that one the same way

The disc follows the vault

  • A written, renamed or deleted note moves the disc, not a page load. An added note fades in
    where its folder puts it, sized zero-to-rest the same way the timeline's own reveal works; a
    removed note fades out; a note whose link weight or folder changed takes the existing moves
    tween. Filters, date range, pins and camera all survive — which is exactly what Refresh clears.
  • Nothing animates while you aren't looking. A rebuild is held while the graph's own tab is
    hidden, so a burst of edits doesn't play out behind your back — it lands as one cascade the
    moment you switch back to it, rather than as several you never saw.
  • Typing prose moves nothing. Word counts are deliberately left out of what triggers a
    rebuild, so editing a note's text produces an empty diff and no motion at all — only a
    structural change (a link, a folder, a rename, a date) starts a cascade.
  • A big enough batch is a sync, not an edit. Past 200 changed notes at once the plugin falls
    back to a full rebuild instead of animating each one in.
  • A view setting, on by defaultFollow the vault, per vault, in the plugin. Turn it off
    and the graph waits for Refresh as it always did.
  • The standalone page can't watch a vault, so its own clip is honest about that: the storyboard
    hands it exactly what the plugin would after a save, and the cascade from there is the same
    code path.

The standalone page handed one note into its biggest folder, the outer ring absorbing it in one cascade and the new dot hovered where it landed, then a second note into a small folder and the inner ring taking it the same way

Smaller things

  • The docs are a real site now, not just files read on GitHub — a home page, the feature
    gallery, and a live demo of the exported page anyone can click, hover and filter for
    themselves, published alongside it. The README points at all three.
  • The feature gallery is grouped by theme now, seven of them, instead of sixteen sections in
    recording order — and the count bars, which shipped in 2.3.0 without ever getting an entry,
    finally have one: a crop of folders, where they actually move, rather than a recording of
    their own.
  • A vault that isn't yours opens in restricted mode, and no version of the plugin loads until
    the trust prompt is confirmed and Settings is closed
    — a standing trap for any fixture or
    freshly generated vault, written down in CLAUDE.md for the next person who reads a blocked
    plugin as a code fault.

2.3.0 - Gauge

Choose a tag to compare

@github-actions github-actions released this 09 Sep 16:29
739589b

2.3.0 — "Gauge" — 2026-09-09

Every legend row rendered identically, so a 406-note folder and a 1-note folder looked the
same.
Each row whose count is a plain number now draws a 2px rule along the bottom, in that
folder's own colour.

The folder list zoomed in: each row carrying a coloured bar under its name, the largest folder's bar full width and the rest proportional, then one folder soloed and every other bar shrinking away

  • The largest folder currently shown fills its row, and every other bar is read against it.
    Hide that folder and the next one grows into its place. The count's tooltip names whichever
    folder the bar is measured against, so the scale is never implied.
  • A hidden folder draws no bar at all, so soloing one leaves exactly a single bar, full width.
  • The bars move with the disc. They ride the cascade's own clock, so they walk up and shrink
    down over the same 1600 ms rather than snapping, and a bar whose folder is going away shrinks
    to nothing instead of blinking out.
  • A view setting, on by defaultCount bars in the legend, remembered per vault. Turn it
    off and the rows, the counts and their shared right edge are untouched.
  • Parenthesised counts and subfolder rows stay bare, because those notes are tallied somewhere
    other than that row's own wedge.

Known: after a live theme switch a bar and its swatch both keep the old palette while the
settings picker repaints (github#84). They stay consistent with each other, and the divergence
predates this release.


2.2.0 - Fold

Choose a tag to compare

@github-actions github-actions released this 08 Sep 15:56
3957923

Fold. The folder list and the notes-added calendar could be put away on a phone; on a PC the
two buttons that do it were not drawn, so a small monitor had no way to give the disc the screen.
Two people asked for it within a day of each other. Now either panel folds at any width, and the
way you leave it is how the graph opens next time.

The disc gets the window

A desktop-width window with the folder list beside the disc and the calendar band above it: the band folded away first, so the disc grows into the row it had, then the folder list folded away, so its column collapses and the disc re-centres in the whole window with nothing beside it

Two buttons at the top left of the disc. A phone summons its folder list as a sheet over the
disc; a PC collapses the column and hands its width to the graph, so the panel leaves the layout
rather than covering it.

Only the calendar's fold makes the dots bigger, and it is worth knowing which one to reach
for: the disc is fitted to the shorter side of the window, so on a landscape monitor that is the
height the calendar is eating. On a 1600x1000 window over 1403 notes, folding it takes the median
dot from 2.19 px to 2.68 px and the dots under 2 px from 515 to 232. Folding the folder
list buys 288 px of framing and not one pixel of radius. The camera stays where you put it in
both cases.

The untouched desktop layout is unchanged against 2.1.0 — the same source exactly — and the
≤720 px layout is unchanged with it.

Every asset here was built on GitHub's runner from the tagged commit and carries a build
provenance attestation; check one with gh attestation verify main.js --repo luke321/vault-graph.

The full technical record follows, verbatim from CHANGELOG.md.


2.2.0 — "Fold" — 2026-09-08

Either panel folds away, at any width. The folder list and the notes-added calendar could
already be put away on a phone; on a PC the two buttons that do it were not drawn, so a small
monitor or a narrow window had no way to give the disc the screen. Two people asked for it on
the 2.0 thread within a day of each other, which is what a control nobody can find looks like
from the outside — the state machine had shipped in 2.1.0 and was reachable only from a console.

The panels fold on a PC too

Two buttons at the top left of the disc, wearing the camera cluster's look in the opposite
corner of the same canvas. One folds the folder list, search and view buttons; the other folds
the calendar and its date strip. Fold both and the disc has the window to itself.

The toggles sit 12px into the disc's corner in the plugin too. They had been taking the camera cluster's inset, which the plugin widens to 44px so Obsidian's floating status bar clears the corner that cluster sits in — a problem the opposite corner does not have. The panel buttons have their own spacing now, the same in the exported file and in the plugin.

The two buttons ride the disc's corner, and follow it rather than jumping. They sit where the year strip meets the legend counts, which is the corner a fold actually moves — 288px left when the folder list goes, 230px up when the calendar does. The pair now slides over 180ms instead of teleporting. If your system asks for reduced motion it snaps instead, like every other animation here.

A wide window gets a different fold from a phone's, and that is the only new thing here. On
a phone the folder list is a sheet that slides up over the disc. On a PC it is a grid column, and
a column gets out of the way by collapsing rather than overlaying: it goes to zero and hands its
width to the graph. It leaves the layout entirely rather than being clipped to zero width, so it
also leaves the tab order and the accessibility tree — a panel nobody can see must not keep its
controls focusable while its own button reports that it is closed. The calendar needed no new
presentation at all: it already had its own row, and hiding the row is what 2.1.0 chose over
floating the band above the disc.

Whichever way you leave it is how the graph opens next time, per vault in the exported file
and per vault in the plugin. This reverses a decision 2.1.0 made deliberately — panel state was
session state there, on the grounds that a fold on a phone is a passing act. At a desktop it is
an arrangement somebody chose. The page itself still stores nothing; it takes the state in and
hands changes back, the same channel the folder colours have used since 2.0.0. Nothing stored
yet means the width decides the first open, so a phone still summons its legend and a desktop
still starts with it beside the disc.

One consequence, stated rather than left to be discovered: Obsidian shares one settings file
between desktop and mobile, so a desktop user who has folded the sidebar and put it back gives
their phone a sheet that is already up when the view opens. It closes with its own button or a
tap on the disc.

Only one of the two folds makes the dots bigger

The disc is fitted to whichever side of the window is shorter, so on a landscape monitor that is
the height — and the calendar is what is eating it. Measured on a 1600x1000 window over 1403
notes:

canvas drawn radius min/p50/max dots under 2 px
both panels up 1312x770 0.89 / 2.19 / 4.06 px 515 of 1403
calendar folded 1312x1000 1.05 / 2.68 / 5.38 px 232 of 1403
calendar + folder list folded 1600x1000 1.05 / 2.68 / 5.38 px 232 of 1403
folder list folded alone 1600x770 0.89 / 2.19 / 4.06 px 515 of 1403
both back up 1312x770 0.89 / 2.19 / 4.06 px 515 of 1403

The calendar is worth 22% of the median dot radius and halves the population under 2 px. The
folder list is worth 288 px of framing and not one pixel of radius — worth knowing which one to
reach for when the dots are too small to aim at. It is the same effect 2.1.0 measured on a phone,
where showing the band cost no dot size at all.

The camera is left where it is, and needs no help. Neither fold re-centres or re-zooms
anything you had moved; the camera ratio held at 1.08 at 0.5,0.5 through all five states above,
because the disc simply re-fills the box it has now. Auto-fitting on a fold would have fought a
rule this suite has asserted since 1.9.0 — that a camera you moved by hand is left alone by a
visibility toggle.

The resting desktop layout does not move

Compared against 2.1.0's page — which is the same source exactly, since nothing between that tag
and this feature touched src or plugin — the untouched desktop layout is identical: folder
list 288x1000, stage 1312x1000, calendar 1312x230, disc box 1312x770, drawn radii 0.89/2.19/4.06.
The two new buttons are the only pixels that differ, and they are the point.

The ≤720 px layout is unchanged too: disc box 390x564 on an iPhone 14 viewport, median dot
1.38 px, the sheet's 44 px targets, the calendar still on by default, the round trip still
closing.

Two defects the phone's code was carrying into the desktop

Clicking bare disc, and opening a note, both put the sheet away — right for a panel that covers
the disc, and both would have folded the sidebar out from under you on a PC, where it sits beside
the disc rather than over it. Neither was reachable before this release, because the toggles were
not drawn; both are fixed with it, and the suite asserts the round trip rather than the reasoning.

One lock for the two things two agents cannot do at once

Not user-facing, and the reason five parallel worktrees stopped blaming each other's code.
A screen recording grabs a display region, so a second take started while the first is rolling
captures the first one's window — both files exist, both look plausible, both are ruined. A full
invariant-suite run has the same shape through its debugging ports, and there the symptom is
worse: two runs fight and each reads as a regression in the branch. scripts/lock.mjs is one
mutex for both, living in the OS temp directory so every worktree shares it rather than guarding
its own, with a stale entry after 20 minutes for a recording and 30 for a suite rather than a
lock nobody can release. Screenshots deliberately need none: they are captured over the
debugging port, so overlapping windows are harmless.

Smaller things

  • The full demo walk ends on the fold. The collapse act is the storyboard's last one, so
    nothing after it needs the legend it folds away, and the hero closes on the disc with the
    window to itself. All sixteen clips under docs/features/ and the README's hero were
    re-recorded for this release, because the two buttons are now part of the desktop disc and no
    clip taken before them showed it — the hero is 159.9 s of the 126-beat walk.
  • An act that flies the camera hands it back fitted, and the hero was broken without it. The
    linked-notes walk leaves the camera wherever its last hop flew, and the act that follows drags
    a specific note into the hub. Re-recording found what that costs: two of the three pins missed,
    because their notes were off-screen — one target at y -1205, another at -1293 — so the
    driver reported the drop missed the hub and skipped the card beats after it. It has been
    broken since the walk was recorded, which is why nobody saw it: the hero last came out at
    2.0.0, and the linked-notes walk landed in 2.1.0, so the two acts had never been filmed in
    sequence. The walk now fits the disc before it hands over, and the whole 126 beats run with no
    missed target.
  • scripts/mobile-check.mjs reports its panel round trip at every width, not only under
    touch emulation — it always pressed with mouse events, so nothing in it was ever
    touch-specific. It also re-reads the button's box between the two presses, because folding a
    grid column slides the whole clu...
Read more

2.1.0 - Mobile

Choose a tag to compare

@github-actions github-actions released this 07 Sep 16:27
deca048

Mobile. The disc claimed to work on a phone and did not: a finger could neither pan it, pinch
it, nor tap a note, and it was drawn in under a third of the screen. Both halves are fixed. Two
other things ride along in this release — a way back along the linked-notes walk, and cascades
that draw nearly twice the frames on a large vault.

The disc, in a hand

A phone-sized window with a fingertip for a pointer, each tap leaving a ring: the disc zoomed in until its dots are finger-sized, a note tapped so its card rises as a sheet at the foot, the folder list slid up as a sheet, one folder soloed from inside it, the sheet put away so the rest recedes, then a double-tap fitting what is left back into view

One finger pans, two pinch about their midpoint, a tap raises a note and opens its card, a
double-tap fits the disc back. Below 720 px the disc takes the screen: the folder list, search and
view buttons slide up as a sheet, the calendar stays on and can be put away, and a note's card
rises as a sheet at the foot so the disc is still visible above what you tapped.

Two things had been in the way — the renderer listened for a mouse and nothing else, and the
page's own touch-action: none suppressed even the click a tap would have fallen back to. And
because a fingertip is nothing like a mouse arriving in whole pixels, a tap now reaches for the
nearest note within about half a fingertip while the pointer keeps its own measured catchment.

Walking the links, and back

A card opened on a well-linked note, four of its linked notes clicked in turn so the trail grows a back arrow and crumbs, folded to the first and the last two, then two steps back with the arrow and a jump straight to the first crumb, which truncates the walk there

Click a linked note on a card and the graph walks there — a hop. The card grows a back arrow and
a trail of where you came from, folded to the first and the last two once the walk gets long. The
arrow steps back one hop; any crumb jumps straight to that note and drops everything after it.
Pointer-only on purpose: a view that claimed a hotkey would overrule one you had bound yourself.

Faster cascades on a big vault

Every frame of a cascade used to re-derive the whole plan; it now carries a skeleton through the
frame loop. On the 10,000-note fixture that is 37.3 → 23.6 ms of script per frame and
56–59 → 85–89 frames drawn per cascade. The disc at rest is untouched.

Every asset here was built on GitHub's runner from the tagged commit and carries a build
provenance attestation; check one with gh attestation verify main.js --repo luke321/vault-graph.

The full technical record follows, verbatim from CHANGELOG.md.


2.1.0 — "Mobile" — 2026-09-07

The disc works on a phone. It always claimed to: the plugin ships as not desktop-only and
the README calls the exported single file "how the graph reaches a phone". Measured, a finger
could neither pan it, pinch it, nor tap a note — and the disc was given under a third of the
screen. Both halves are fixed, and the desktop picture is unchanged, which is asserted rather
than assumed.

A finger drives the disc

One finger pans, two pinch about their midpoint, a tap raises a note and opens its card, and a
double-tap fits the disc back into view — the same meaning the desktop double-click has. Node
dragging stays a pointer gesture; on a phone the same pin is the button on the note's own card.

Two things were in the way. The renderer's input layer listened for a mouse and nothing else, so
a finger reached nothing. And a tap did not even fall back to a click, because the page sets
touch-action: none on the layer that takes input — right for stopping the browser panning the
page out from under a drag, and it suppresses the tap-to-click as well. Picking and selection
were fine all along: the same coordinates with a click always selected the right note.

A tap also does the hover's job, because selecting a note is what raises it, lights its links
and dims the rest. Nothing fakes a hover on a surface that has none.

A finger is not a pointer, and picking learned the difference. The pointer's catchment is
sized for a mouse arriving in whole pixels — at most 1.41 px from a true centre. Every dot on a
phone draws under 2 px, so a tap that had to land within a pixel and a half would be supported
and useless. A tap reaches for the nearest note within about half a fingertip instead; the
pointer keeps its own measured catchment exactly.

The disc gets the screen

Below 720 px the disc takes the viewport instead of 31% of it under a folder list. The folders,
search and view buttons slide up as a sheet from two buttons at the top left. The notes-added
calendar and its date strip stay on and can be put away — showing them costs the disc no dot
size at all, since the disc is fit to the narrower axis and the extra height buys margin rather
than radius. A note's card rises as a sheet at the foot, so the disc stays visible above whatever
you tapped, and both control clusters moved to the top corners to clear it. A tap on the disc, or
on the button that opened it, puts a sheet away.

The iPad keeps the two-column desktop layout on purpose: at 744 px it is above the breakpoint,
and there it is the better one.

Walking the links, and back

The linked notes on a card are clickable, and clicking one walks the graph — a hop. Each hop is
remembered: the card grows a back arrow and a trail of where you came from, oldest first, folded
to the first and the last two once the walk gets long. The arrow steps back one hop; any crumb
jumps straight to that note and drops everything after it. A crumb whose note a filter or the
date range is currently hiding greys out and stays clickable. Opening a note from the disc or the
search box starts a new walk, and closing the card ends it.

It claims no keyboard shortcut, and that is a decision rather than an omission. The first cut
bound Backspace, Alt+ArrowLeft and Escape; they came out a day later, because Obsidian users bind
their own hotkeys and a view that takes a key overrules a setting the user made, invisibly. The
trail is pointer-only: the back arrow and the crumbs. The keyboard cost is real and unmitigated —
Tab reaches the crumbs, which are buttons in a nav, and that is the whole keyboard story.

The feature came from a contributor's patch (github#40), reworked; the credit is in the README.

Cascades draw nearly twice the frames on a big vault

Every frame of a cascade used to re-derive the whole plan. It now carries a skeleton through the
frame loop — the membership walk, the seating walk and the per-cell hub-rank sort are cached,
while everything the weights actually change is re-summed each frame — and isPushed is only
asked when something is highlighted.

Measured on the 10,000-note fixture, hiding and showing one folder: script per cascade frame
37.3 / 39.3 → 23.6 / 23.8 ms with Size dots from the frame on, 30.0 / 28.7 → 23.0 / 22.7
with it off, and 56–59 → 85–89 frames drawn per cascade. The disc at rest is untouched.

This is a pass at github#19 rather than the end of it, so the issue stays open.

The mobile work moved nothing on the desktop

Compared against the page as it stood immediately before it — develop's own source, which
already carried the hop trail and the cascade work above — across all three fixtures, seven
states and three camera ratios: node positions identical, drawn radii identical, not one stage
pixel different, and the stage, canvas, heatmap, ribbon and legend screenshots byte-identical.
The only pixels that differ anywhere are the build clock in the sidebar's footer.

That is a claim about the mobile change alone, and it is worth being exact about the baseline:
the hop trail does change the desktop picture, because it adds the back arrow and the crumbs to
a note's card.

Smaller things

  • The band's control row wraps on a narrow screen. At 390 px the second date field and All
    dates
    were clipped off the right edge, invisible and unreachable.
  • A closed sheet leaves the tab order and the accessibility tree, rather than staying focusable
    off-screen where focusing a control scrolls the page out of view with no way back.
  • scripts/mobile-check.mjs is new: it sizes a real Chrome window to a device, turns touch on,
    and reports the layout, the drawn dot sizes and whether real gestures reach the camera. It
    carries a desktop control column, because it measured the wrong thing four times before it
    agreed with a window where pan, zoom and selection are known to work.