-
Knowledge graph: live Obsidian-like simulation with tunable physics
All checks were successfulCD / Build and push images (push) Successful in 4m2sCD / Deploy to Test (push) Successful in 9sCI / Lint, typecheck, test (push) Successful in 4m28sCI / Build container images (push) Has been skippedCD / Smoke tests against Test (push) Successful in 1m13sCD / Promote to Int (push) Successful in 11sCI / Auth e2e pack (push) Successful in 6m42sCI / Import/export fidelity gate (push) Successful in 49sRelease / Build release images and notes (push) Successful in 1m7sRelease / Release-candidate operations QA (push) Successful in 42sProd deploy / Deploy the released images to Prod (push) Successful in 21sreleased this
2026-07-15 11:29:03 +02:00 | 169 commits to main since this releaseThe force layout used to run once (tick(250)) and freeze; dragging
moved a single node with no reaction from its neighbors. The simulation
now stays alive: React renders the SVG structure (testids, edge/ring
classes — the e2e contract is unchanged) while each tick writes
positions imperatively into the element refs, and it settles to rest
via alpha decay, which also keeps Playwright's stability wait happy.
Dragging pins the node (fx/fy) and reheats the physics, so the
neighborhood gets pulled along; a plain click still just opens the
page. Surviving nodes keep their positions across data refreshes, e.g.
when a phantom becomes a real page.The graph page gains four sliders — attraction, repulsion, node size,
font size — persisted per pond (ui.graph.settings.) with a
reset; the inner view is keyed by pond id because usePersistentState
reads its key only on mount (#108 trap). The local panel adopts those
settings (no second set of sliders) and swaps the two fixed hop
buttons for a 1–5 depth slider.Fixes #123
Co-Authored-By: Claude Fable 5 noreply@anthropic.com
Claude-Session: https://claude.ai/code/session_01Fb2VzvcoBPHkjh8bZ6PzQnDownloads