Living Graph
unlistedby Rishabh (built by Opus)
Keeps the graph's physics simulation permanently warm so it never settles, breathes its repel force so the whole graph swells and shrinks (its own toggle now, independent of drift), pulses every node on its own phase, slowly orbits the camera, and loops the native vault-growth timelapse as a screensaver that starts itself when you walk away. Zoom buttons and every slider sit in the graph view's own control panel, under Forces. Local-only, no network calls. Part of the Graph Aesthetic Planner's Living Creature upgrade.
Living Graph
A plugin for Obsidian that turns the graph view into something that never sits still: perpetual drift, breathing forces, per-node pulse, an orbiting camera, and a self-starting timelapse screensaver of your vault's growth. Everything is driven straight through Obsidian's own physics worker and camera — no custom renderer, no replacement graph view, no network calls.
Purely aesthetic. It doesn't change how the graph works for navigation — it changes what it looks like when you leave it open.
Features
- Perpetual drift — the graph's simulation is kept permanently "warm" so nodes never settle into a static hairball.
- Breathing — the whole graph slowly swells and shrinks, riding your own repel/link-distance settings on two independent, out-of-phase cycles so the motion never visibly repeats.
- Node pulse — every node swells and shrinks on its own phase (derived from its file path, so it's stable across sessions). A stagger slider goes from "whole graph pulsing as one body" to "every node fully independent."
- Orbit camera — the viewport slowly circles and pushes in/out. Stands down the instant you touch the graph, and restores your exact camera position when it stops.
- Timelapse screensaver — replays your vault's growth from oldest note to newest on a loop, riding Obsidian's own native
renderProgression()(the same engine behind the graph's built-in "wand" animation button), with completion detection and reset since the native version never stops. - Idle auto-start — drops into the timelapse screensaver automatically after a configurable idle period, and restores your view the moment you touch anything.
- Zoom controls — zoom in/out buttons, a step-size slider, a log-spaced zoom slider (linear sliders waste most of their range once you're below 1×), and a "fit the whole graph" button.
- Everything lives on the graph screen — a "Living graph" section is injected into the graph view's own control panel, right under Forces, styled to match Obsidian's native sections (collapsible, same fonts, same full-width sliders). The settings tab and the in-graph panel are two views over the same state and stay in sync live.
- Action-bar icons — drift, breathe, pulse, screensaver, orbit, zoom in, zoom out — directly on the graph pane's icon row, no command palette required.
- Command palette entries for every toggle and zoom action, if you'd rather bind hotkeys.
- Pause when hidden — the physics worker and animation loop stop when the graph tab isn't visible or the window is backgrounded, so it doesn't run forever in the background.
Install
Community plugin store submission is a possible future step; for now, install manually:
- Download
main.jsandmanifest.jsonfrom a release (or clone this repo). - Copy both files into
<your-vault>/.obsidian/plugins/graph-jiggle/. - Reload Obsidian, then enable Living Graph under Settings → Community plugins.
Settings
All settings are available both in Settings → Community plugins → Living Graph and inline in the graph view's own control panel:
| Setting | What it does |
|---|---|
| Drift intensity | How restless the nodes are once the simulation is kept warm (alphaTarget). |
| Pause when hidden | Stop the physics worker when the graph tab isn't visible. |
| Breathe depth / period | Amplitude and cycle length of the whole-graph swell/shrink. |
| Node pulse depth / period / stagger | Per-node size oscillation and how out-of-phase nodes are with each other. |
| Orbit period / closeness / zoom swing | Camera orbit speed, radius, and whether it also pulses zoom. |
| Orbit: screensaver-only | Restrict camera orbit to when the timelapse screensaver is running, vs. always. |
| Idle minutes | How long to wait with no input before auto-starting the screensaver. |
| Timelapse length / hold | How long one full growth pass takes, and how long it holds on the finished graph before looping. |
| Zoom step | Multiplier applied per zoom in/out click. |
How it works (technical notes)
Obsidian's graph is a pixi.js WebGL canvas whose physics simulation runs off the main thread in a Web Worker. The worker's loop only keeps running while alpha stays above a small threshold, and alpha converges toward alphaTarget — the exact same message Obsidian posts to the worker while you manually drag a node ({ alpha, alphaTarget, run: true }). Sending that message periodically with a nonzero alphaTarget is what keeps the simulation "alive" instead of settling.
A few other internals this plugin relies on, all read directly from Obsidian's own bundled source rather than guessed:
renderer.changed()only queues a repaint of positions the worker already computed — it does not restart the simulation. (An earlier version of this plugin assumed it did; it was a measurable no-op. See the changelog.)renderer.setForces()pinsalphato0.3(the node-drag heat level) on every call, so it's unsuitable for smooth animation — this plugin posts to the worker directly instead, carrying its own alpha.- The repel force slider value is cubed before being sent to the worker, so breathing has to oscillate in slider space and cube the result for the amplitude to mean anything.
- Node size is recomputed from scratch every frame (
fNodeSizeMult * clamp(3*sqrt(weight+1), 8, 30)), so patching the node prototype's size getter animates node radius, link endpoints, and arrowheads together with zero per-node bookkeeping. - The graph's control panel has no plugin API — its sections are just DOM built the same way Obsidian's own "Forces" section is, so this plugin's panel is built with the same shape and picks up the native stylesheet for free.
Compatibility
Built and verified against Obsidian 1.12.7–1.13.4. Desktop and mobile (isDesktopOnly: false). No network calls, no writes outside the plugin's own settings file, no changes to vault notes — disable any time from Settings → Community plugins.
License
MIT — see LICENSE.
For plugin developers
Search results and similarity scores are powered by semantic analysis of your plugin's README. If your plugin isn't appearing for searches you'd expect, try updating your README to clearly describe your plugin's purpose, features, and use cases.