Skip to content

feat(ui): add canvas project save/load (.invk format)#8917

Merged
lstein merged 11 commits intoinvoke-ai:mainfrom
Pfannkuchensack:feat/canvas-project-save-load
Apr 14, 2026
Merged

feat(ui): add canvas project save/load (.invk format)#8917
lstein merged 11 commits intoinvoke-ai:mainfrom
Pfannkuchensack:feat/canvas-project-save-load

Conversation

@Pfannkuchensack
Copy link
Copy Markdown
Collaborator

@Pfannkuchensack Pfannkuchensack commented Feb 26, 2026

Summary

Add ZIP-based .invk file format to save and restore the entire canvas state including all layers, masks, reference images, generation parameters, LoRAs, and embedded image files. Images are deduplicated on load — only missing images are re-uploaded from the project file.

  • Always clear LoRAs on project load, even when project has none
  • Fix jszip dependency ordering in package.json
  • Add useAssertSingleton to SaveCanvasProjectDialog for consistency
  • Add concurrency limit (max 5) for image fetch/upload requests
  • Remove redundant deep-clone in remapCroppableImage (mutate in-place)
  • Default project name to "Canvas Project" instead of empty string

Related Issues

#6984 #8466

QA Instructions

  1. Open the canvas
  2. Add layers, masks, reference images, set generation parameters and LoRAs
  3. Save as .invk file via File → Save Canvas Project
  4. Clear the canvas or restart the application
  5. Load the .invk file via File → Load Canvas Project
  6. Verify all layers, masks, reference images, parameters, and LoRAs are restored correctly
  7. Load the same project again — verify already-existing images are not re-uploaded (deduplication)

Checklist

  • The PR has a short but descriptive title, suitable for a changelog
  • Tests added / updated (if applicable)
  • ❗Changes to a redux slice have a corresponding migration
  • Documentation added / updated (if applicable)
  • Updated What's New copy (if doing a release after this PR)

Add ZIP-based .invk file format to save and restore the entire canvas
state including all layers, masks, reference images, generation
parameters, LoRAs, and embedded image files. Images are deduplicated
on load - only missing images are re-uploaded from the project file.
- Always clear LoRAs on project load, even when project has none
- Fix jszip dependency ordering in package.json
- Add useAssertSingleton to SaveCanvasProjectDialog for consistency
- Add concurrency limit (max 5) for image fetch/upload requests
- Remove redundant deep-clone in remapCroppableImage (mutate in-place)
- Default project name to "Canvas Project" instead of empty string
@github-actions github-actions bot added frontend-deps PRs that change frontend dependencies frontend PRs that change frontend files docs PRs that change docs labels Feb 26, 2026
@lstein lstein added the v6.13.x label Feb 27, 2026
@Pfannkuchensack Pfannkuchensack marked this pull request as ready for review April 6, 2026 15:00
Copy link
Copy Markdown
Collaborator

@dunkeroni dunkeroni left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Works and is pretty robust to my testing.

We should also look at intercepting ctrl+s when interacting with a canvas to bring up the save window. That can be down the road when we decide what is going on with UI tabs though.

@lstein lstein enabled auto-merge (squash) April 14, 2026 00:42
@lstein lstein merged commit acd4157 into invoke-ai:main Apr 14, 2026
13 checks passed
@Pfannkuchensack Pfannkuchensack deleted the feat/canvas-project-save-load branch April 14, 2026 01:03
GGSSKK added a commit to GGSSKK/InvokeAI that referenced this pull request Apr 15, 2026
…le utility

Remove the local collectImageNames from useCanvasSnapshots and reuse
the shared, more comprehensive version from canvasProjectFile.ts that
was introduced by the canvas project save/load feature (invoke-ai#8917).

Snapshots don't include global ref images, so an empty array is passed
for that parameter.

Co-Authored-By: Claude Opus 4.6 (1M context) <[email protected]>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

docs PRs that change docs frontend PRs that change frontend files frontend-deps PRs that change frontend dependencies v6.13.x

Projects

Status: 6.13.x Theme: MODELS

Development

Successfully merging this pull request may close these issues.

3 participants