Releases: luke321/vault-graph
Release list
2.9.0 - Mobile & Sort
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.
If Vault Graph is useful to you:
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 aurl()or acalc()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
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, 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
- 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:
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
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
- 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:
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
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.
If Vault Graph is useful to you:
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
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).
- 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).
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
constructorortoStringcould 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
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
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.
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 default — Follow 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.
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 offolders, 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 inCLAUDE.mdfor the next person who reads a blocked
plugin as a code fault.
2.3.0 - Gauge
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 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 default — Count 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
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
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
collapseact 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 underdocs/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.mjsreports 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...
2.1.0 - Mobile
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
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
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.mjsis 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.













