Arrows inherit the marker's --snap-marker-color so they match the
node color (blue for regular, purple for node snapshots, green for
current, etc).
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Fork group fills full timeline height with space-between layout.
Arrow buttons flex to fill remaining space so both arrow tips reach
their respective edges of the timeline bar.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Use margin-bottom:-3px on the top arrow to compensate for the Unicode
glyph's built-in whitespace and pull it tight against the marker.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Restore 8px size for both arrows. Top arrow uses align-items:flex-end
to push glyph down against marker, bottom arrow uses flex-start to
push glyph up against marker, making them symmetrical.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Reduce arrow button font-size and height from 8px to 6px and set
line-height to 0 so both arrows sit symmetrically tight against the
marker.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
New "Branch" button next to "Hide Auto" in the search row. When
toggled off: captures have no parentId, sidebar/timeline show a flat
timestamp-sorted list, branch navigators are hidden, and pruning
skips tree-aware protection.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Remove the fork count badge from timeline markers and the wrapper div.
Reduce arrow button height and remove extra spacing so the up arrow
sits flush against the marker.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Replace horizontal arrow layout with vertical stack: up/down arrows
above and below the marker, with a small blue badge showing the fork
count on the marker node.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Add documentation for snapshot branching, session profiles,
hide auto-saves toggle, and timeline branch navigation.
Update features list, usage sections, architecture, and FAQ.
Align pyproject.toml and README badge to 3.0.0.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Toggle button next to the search bar hides Auto and Initial
snapshots to reduce clutter. Filter combines with text search
and persists across refreshes.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Branching: snapshots now track parentId to form a tree structure.
Swapping to an old snapshot and editing forks into a new branch.
Sidebar and timeline show < 1/3 > navigators at fork points to
switch between branches. Pruning protects ancestors and fork points.
Deleting a fork point re-parents its children.
Profiles: save/load named sets of workflows as session profiles.
Backend stores profiles as JSON in data/profiles/. Sidebar has a
collapsible Profiles section with save, load, and delete.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
List, prune, and delete operations now use a lightweight in-memory cache
of snapshot metadata (everything except graphData). Only get_full_record()
and update_meta() hit disk after warm-up, keeping sidebar loads and
auto-capture prune cycles fast.
Key changes:
- snapshot_storage.py: cache layer (_cache, _cache_warmed, _extract_meta,
_ensure_cached), new get_full_record() and update_meta() functions,
all existing functions updated to use cache
- snapshot_routes.py: new /get and /update-meta endpoints
- snapshot_manager.js: db_getFullRecord() and db_updateMeta() helpers,
lazy graphData fetch in restore/swap/diff/preview/tooltip, label/notes/
lock use update_meta instead of full put to preserve graphData on disk
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
The sidebar refresh didn't trigger a timeline update, leaving stale
markers visible until the next auto-capture or manual action.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Add white left border for the swapped-to snapshot and green left border
for the auto-saved "you were here" snapshot, matching timeline markers.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Swap note (pencil), lock/unlock (padlock), and preview (eye) buttons
from emoji characters to crisp inline SVGs using currentColor. Fixes
inconsistent emoji rendering across platforms and enables proper color
transitions (e.g. amber highlight for has-note state via CSS color
instead of filter hacks).
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Render workflow graphs as SVG previews so users can visually inspect
snapshots without restoring them. Adds hover tooltips, a full-size
preview modal (eye button), and side-by-side SVG comparison with
color-coded highlights in the diff view.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Compare any snapshot vs the current workflow (one click) or two snapshots
against each other (Shift+click to set base). Modal shows added/removed/modified
nodes, widget value changes, property diffs, and rewired connections with
collapsible sections and colored indicators.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Document the floating centered layout, sidebar layering behavior,
and the skip-when-browsing optimization for swap auto-saves.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Sidebar uses z-index 10; set timeline to 9 so it stays visible on the
canvas but sits underneath the sidebar panel when expanded.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
When activeSnapshotId is set, the current graph state is already a
saved snapshot. Swapping to another one no longer creates a duplicate
"Current" entry — the auto-save only fires on the first swap away
from an unsaved graph state.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Replace full-width bar with centered floating pill that clears both the
left sidebar and right controls. Uses left/right: 10% with border-radius
and a small bottom offset. Icons remain left-aligned inside the track.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Detect whether the sidebar icon strip is in floating mode and on which
side, then add matching padding so timeline markers aren't hidden
behind it. Connected mode (sidebar pushes canvas) needs no offset.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Keep only the timeline z-index: 1000 bump. Setting z-index on the
canvas parent would create a stacking context that paints over the
sidebar panel, blocking interaction.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
ComfyUI's sidebar container uses z-index: 10. The timeline was at the
same level and lost in the stacking order. Bump timeline to z-index
1000 and set z-index 20 on the canvas parent so it forms a stacking
context above the sidebar.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Use node count shortcut, element-wise widget comparison, link length
and boundary checks, and skip-when-flagged guards to eliminate most
serialization work in the common case.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Each snapshot now detects what kind of change it represents (node add,
node remove, connection, parameter, move, mixed) and displays a distinct
colored icon on the timeline. Sidebar meta line shows the change type.
Existing snapshots without change data gracefully fall back to a faded
"unknown" dot.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- Track active (white ring) and current (green dot) snapshots on timeline
- Auto-capture "Current" state before swapping so user can navigate back
- Add "Snapshot" button to timeline bar for quick manual captures
- Register Ctrl+S / Cmd+S shortcut for manual snapshots
- Clear active/current markers on new captures and workflow switches
- Return record.id from captureSnapshot (backward-compatible truthy value)
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Add SaveSnapshot node to features list and architecture diagram,
update storage label from IndexedDB to Server Storage, add
maxNodeSnapshots setting to the table, and document the
node-triggered capture flow.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Introduce a SaveSnapshot custom node that triggers snapshot captures
via WebSocket. Node-triggered snapshots are visually distinct in the
sidebar (purple left border + "Node" badge) and managed with their
own independent rolling limit (maxNodeSnapshots setting), separate
from auto/manual snapshot pruning. Node snapshots skip hash-dedup
so repeated queue runs always capture.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Missed one occurrence of the old API in swapSnapshot() — the workflow
passed to loadGraphData was always undefined, making Swap behave
like Restore (new tab instead of in-place replacement).
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
app.workflowManager doesn't exist in the modern Vue-based frontend.
The active workflow is accessed via the Pinia store at
app.extensionManager.workflow.activeWorkflow. Also replaces the
non-existent addEventListener("changeWorkflow") with Pinia's
$onAction watching for "openWorkflow" actions.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Snapshots are now stored as individual JSON files on the server under
data/snapshots/, making them persistent across browsers and resilient
to browser data loss. Existing IndexedDB data is auto-migrated on
first load.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
The ComfyUI activeWorkflow object doesn't have a .name property. It uses
.key (path minus workflows/ prefix) and .filename (no extension). The old
code always fell through to "default", making all snapshots share one key.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Adds a workflow selector to the sidebar so users can browse and recover
snapshots from any workflow in the database, including renamed or deleted
ones. Includes amber viewing banner, take-snapshot guard, and lazy-loaded
workflow picker with counts.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Locked snapshots survive auto-pruning and "Clear All". Each snapshot
gets a padlock toggle; deleting a locked snapshot requires confirmation.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Auto-capture workflow snapshots with per-workflow hash map, promise-based
restore lock, custom naming, search/filter, theme-aware CSS, toast
notifications, and native confirm/prompt dialogs. Includes README with
SVG/PNG assets, MIT license, and ComfyUI registry publish action.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>