Skip to content

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

Draft
Pfannkuchensack wants to merge 1 commit intoinvoke-ai:mainfrom
Pfannkuchensack:feat/canvas-project-save-load
Draft

feat(ui): add canvas project save/load (.invk format)#8917
Pfannkuchensack wants to merge 1 commit intoinvoke-ai:mainfrom
Pfannkuchensack:feat/canvas-project-save-load

Conversation

@Pfannkuchensack
Copy link
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
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

Development

Successfully merging this pull request may close these issues.

3 participants