Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -170,6 +170,6 @@ In the Workflow Library dialog, **This project** lists the project's own workflo
- **Projects belong to one account.** With [multiple users](/configuration/multi-user-mode/user-guide/) enabled, each person sees only their own projects, and there is no project sharing. Export and import a `.invk` file to pass a project to someone else.
- **Undo history is not saved** with the project; it is cleared when you reload or close it.
- **Invoke needs the server to open projects.** If it cannot reach the server, a **Projects are temporarily unavailable** screen offers to retry and to export any unsaved work your browser is holding.
- **Newer projects need a newer Invoke.** A project saved by a newer version of Invoke shows **Requires a newer Invoke** and cannot be opened until you upgrade.
- **Newer projects need a newer Invoke.** A project saved by a newer version of Invoke shows **Requires a newer Invoke** and cannot be opened until you upgrade. Some features raise this requirement for good: once a project has had a Noise adjustment on the canvas, versions of Invoke without Noise adjustments refuse to open it, even after you remove the adjustment.
- **Size limits.** A project file can be up to 2 GB, with up to 20,000 files. Export reports a project that is too large to package.
- **Clear saved data…** under **Data & workspace** in Settings deletes *all* of your projects and settings at once, and cannot be undone.
21 changes: 19 additions & 2 deletions docs/src/content/docs/Users Guide/07.Canvas/03.layers-panel.mdx
Original file line number Diff line number Diff line change
Expand Up @@ -79,14 +79,14 @@ The icons at the top **Arrange** the layer (move it to the front, forward, backw

* **For every layer:**
* **Rename layer** and **Fit to bbox** (scale the layer to fit inside the generation frame).
* **Merge down**.
* **Merge down** — combines the layer with the one below. Each layer's adjustments are baked into the merged pixels; undo restores both layers with their adjustments.
* **Copy to** — including **Copy layer to clipboard**, and copies to other layer types.
* **Crop layer to bbox** and **Save layer to board** (save it to the Gallery as an upload, in Uncategorized or a board you pick from its submenu).
* **Disable layer**, **Lock layer**, **Bookmark for quick switch** and **Color label**. A bookmarked layer is where **Q** switches on the canvas; press **Q** again to return. The bookmark is temporary and is not saved in the project. It can reset when the canvas is released, for example after switching away from its project, and resets on reload.
* **Delete layer**.
* **Raster layers:**
* **Transform**.
* **Add adjustment** — Brightness/Contrast, Exposure, Levels, Curves, Saturation, Hue or Invert. Adjustments are non-destructive and appear as child rows.
* **Add adjustment** — Brightness/Contrast, Exposure, Levels, Curves, Saturation, Hue, Invert or Noise. Adjustments are non-destructive and appear as child rows. Noise adds film grain.
* **Add regenerate region** — treats the layer's own shape as an inpaint mask.
* **Filter**, **Select object** and **Run workflow** — process the layer; see the [Canvas guide](/users-guide/canvas/canvas-guide/#filters-and-object-selection).
* **Boolean operations** — combine the layer with the one below: intersect, cut out, cut away or exclude.
Expand Down Expand Up @@ -120,6 +120,23 @@ The Layer section is dimmed while results are being staged or a canvas generatio

Adjustment child rows each have their own settings, such as **Brightness** and **Contrast**, **Exposure**, **Levels** and **Curves** with a channel selector, **Saturation**, and **Hue**. A regenerate region has a **Fill color** and **Fill style**.

**Noise** adds film grain with these settings:

* **Distribution** — **Gaussian** for natural, film-like grain, or **Uniform** for an even spread. Both have the same strength at the same amount; larger grain sizes look gaussian either way.
* **Grain** — **Mono** changes brightness only; **Color** varies each color channel separately; **Chroma** varies only hue and colorfulness and leaves brightness alone, like the color speckle of a digital sensor.
* **Tonal response** — **Midtones** (the default) gives full grain in the midtones and fades it to none in pure black and white, as film does; **Even** gives the same grain at every tone.
* **Size** — how large each grain is, from 1 px (every pixel varies on its own, the default) to 8 px. Larger grain is softer and clumpier but keeps the same strength.
* **Amount** — the grain's strength. 2–5% gives subtle grain, about 10% (the default) clearly visible grain, and high values very heavy noise.
* **New pattern** (dice button) — picks a different random grain pattern.

Things to know about Noise:

* **The pattern stays put.** Each Noise adjustment keeps its grain pattern until you pick a new one, and reloading the project keeps it. Duplicating a Noise adjustment gives the copy a new pattern.
* **The grain you see is the grain you get.** Generating, exporting, merging and saving to PSD all use the same pattern and strength. One exception: PSD has no group adjustments, so a group's Noise is baked onto each of its layers separately, and where semi-transparent layers in the group overlap, the PSD can look slightly different.
* **Grain follows its layer.** It moves, scales and rotates with the layer; on a group, it stays fixed to the canvas instead. While you drag a selection, the dragged pixels keep their grain; once placed, they take the layer's grain at their new position.
* **Baking.** Rasterizing a text, shape or gradient layer whose Noise adjustment is enabled bakes its whole adjustment stack into the pixels and removes it, so the grain stays where it was. **Merge down** bakes each layer's adjustments the same way.
* **Older versions of Invoke.** Once a project has had a Noise adjustment, it needs a version of Invoke with Noise adjustments, even after you remove the adjustment; older versions refuse to open it.

### Control layer

* **Adapter type** — ControlNet, T2I Adapter, Control LoRA, Z-Image ControlNet or Anima ControlNet-LLLite, depending on the model selected in the Generate panel.
Expand Down
19 changes: 15 additions & 4 deletions docs/src/content/docs/development/Front End/project-files.mdx
Original file line number Diff line number Diff line change
Expand Up @@ -39,10 +39,21 @@ canvas v3 document rides this seam: every save sends the document together with
`minimum_canvas_schema_version` it requires (3 for any v3 canvas), so a client that still declares
a maximum of v2 is refused before it can overwrite that document.

The frontend derives the requested floor from the highest declared version among the live canvas
and every queued canvas snapshot. It also retains the server's monotonic floor in the offline sync
map, so importing, duplicating, conflict recovery, and deletion recovery cannot accidentally create
a copy with weaker compatibility metadata than the document or its source project requires.
A canvas adopts a newer schema only when its content needs one, that is, when an older reader
would drop part of it on load and lose it on the next autosave. Schema 4 marks custom-font
typography (a text source with `fontRef`, `fontStyle` or `fontVariations`). Schema 5 marks a noise
adjustment, enabled or not, on any layer or group at any depth; an older reader would drop the
whole adjustment stack holding it. The live document and each saved canvas snapshot are versioned
this way, and the canvas state takes the newest of them. Adoption is sticky: removing the feature
does not lower the version, as the server floor cannot be lowered either. A canvas with neither
stays at 3, so older builds keep opening it. A build refuses a canvas that declares a schema above
its maximum as an unsupported version before parsing it, and once the floor is raised the server
refuses the project to a client declaring a lower maximum.

The frontend derives the requested floor from the live canvas state's version. It also retains the
server's monotonic floor in the offline sync map, so importing, duplicating, conflict recovery, and
deletion recovery cannot accidentally create a copy with weaker compatibility metadata than the
document or its source project requires.

If another client raises the floor while a project is already open, the next save becomes a
terminal per-project schema refusal instead of a generic network failure. The local document still
Expand Down
19 changes: 10 additions & 9 deletions invokeai/frontend/webv2/performance/architecture-baseline.json
Original file line number Diff line number Diff line change
Expand Up @@ -2,15 +2,15 @@
"build": {
"launchpad": {
"baseline": {
"brotliBytes": 802380,
"brotliBytes": 804953,
"cssRawBytes": 2159,
"fontRawBytes": 219480,
"gzipBytes": 801520,
"gzipBytes": 804296,
"imageRawBytes": 44398,
"initialRawBytes": 2066324,
"initialRawBytes": 2074195,
"largestAssetRawBytes": 752422,
"otherAssetRawBytes": 0,
"ownedRawBytes": 101787,
"ownedRawBytes": 103111,
"requestCount": 35,
"scriptRequestCount": 19,
"sourceOwners": [
Expand Down Expand Up @@ -350,15 +350,15 @@
},
"editor": {
"baseline": {
"brotliBytes": 1201065,
"brotliBytes": 1213758,
"cssRawBytes": 2159,
"fontRawBytes": 219480,
"gzipBytes": 1194189,
"gzipBytes": 1206518,
"imageRawBytes": 44398,
"initialRawBytes": 3306361,
"initialRawBytes": 3341503,
"largestAssetRawBytes": 752422,
"otherAssetRawBytes": 0,
"ownedRawBytes": 155629,
"ownedRawBytes": 156608,
"requestCount": 71,
"scriptRequestCount": 55,
"sourceOwners": [
Expand Down Expand Up @@ -859,6 +859,7 @@
"source:src/workbench/canvas-engine/render/maskFill.ts",
"source:src/workbench/canvas-engine/render/rasterComposite.ts",
"source:src/workbench/canvas-engine/render/rasterizers/textRasterizer.ts",
"source:src/workbench/canvas-engine/render/thumbnail.ts",
"source:src/workbench/canvas-engine/transform/transformMath.ts",
"source:src/workbench/canvasDimsSync.ts",
"source:src/workbench/canvasLayerContent.ts",
Expand Down Expand Up @@ -1111,7 +1112,7 @@
"source": "src/app/WorkbenchApp.tsx"
}
},
"capturedAt": "2026-10-20",
"capturedAt": "2026-10-23",
"developmentInvalidation": {
"platformUiBarrel": {
"specifier": "@platform/ui",
Expand Down
24 changes: 12 additions & 12 deletions invokeai/frontend/webv2/performance/browser-baseline.json
Original file line number Diff line number Diff line change
Expand Up @@ -159,12 +159,12 @@
"cssRawBytes": 0,
"fontRawBytes": 0,
"imageRawBytes": 0,
"largestAssetRawBytes": 305523,
"largestAssetRawBytes": 311154,
"otherRawBytes": 0,
"requestCount": 9,
"scriptRawBytes": 524052,
"scriptRawBytes": 529607,
"scriptRequestCount": 9,
"totalRawBytes": 524052
"totalRawBytes": 529607
},
"domContentLoadedMedianMs": 100.40000009536743,
"id": "editor-canvas",
Expand All @@ -184,9 +184,9 @@
"largestAssetRawBytes": 752422,
"otherRawBytes": 231257,
"requestCount": 96,
"scriptRawBytes": 4775202,
"scriptRawBytes": 4823800,
"scriptRequestCount": 91,
"totalRawBytes": 5076680
"totalRawBytes": 5126937
},
"routeReadyMedianMs": 1095.3000001907349,
"scriptSourceOwnerSet": "editor-canvas-static",
Expand All @@ -197,12 +197,12 @@
"cssRawBytes": 0,
"fontRawBytes": 0,
"imageRawBytes": 0,
"largestAssetRawBytes": 305523,
"largestAssetRawBytes": 311154,
"otherRawBytes": 0,
"requestCount": 9,
"scriptRawBytes": 524052,
"scriptRawBytes": 529607,
"scriptRequestCount": 9,
"totalRawBytes": 524052
"totalRawBytes": 529607
},
"domContentLoadedMedianMs": 97.7000002861023,
"id": "editor-canvas",
Expand All @@ -222,9 +222,9 @@
"largestAssetRawBytes": 752422,
"otherRawBytes": 231257,
"requestCount": 96,
"scriptRawBytes": 4775202,
"scriptRawBytes": 4823800,
"scriptRequestCount": 91,
"totalRawBytes": 5076680
"totalRawBytes": 5126937
},
"routeReadyMedianMs": 1042.5,
"scriptSourceOwnerSet": "editor-canvas-static",
Expand Down Expand Up @@ -260,7 +260,7 @@
"largestAssetRawBytes": 752422,
"otherRawBytes": 231257,
"requestCount": 94,
"scriptRawBytes": 4702888,
"scriptRawBytes": 4750033,
"scriptRequestCount": 88,
"totalRawBytes": 5019779
},
Expand Down Expand Up @@ -298,7 +298,7 @@
"largestAssetRawBytes": 752422,
"otherRawBytes": 231257,
"requestCount": 94,
"scriptRawBytes": 4702888,
"scriptRawBytes": 4750033,
"scriptRequestCount": 88,
"totalRawBytes": 5019779
},
Expand Down
20 changes: 20 additions & 0 deletions invokeai/frontend/webv2/public/locales/en.json
Original file line number Diff line number Diff line change
Expand Up @@ -4249,6 +4249,26 @@
"hue": "Hue",
"invert": "Invert",
"invertHint": "Inverts the layer’s colors. This adjustment has no options.",
"noise": "Noise",
"noiseAmount": "Amount",
"noiseDistribution": "Distribution",
"noiseDistributions": {
"gaussian": "Gaussian",
"uniform": "Uniform"
},
"noiseGrain": "Grain",
"noiseGrains": {
"monochrome": "Mono",
"color": "Color",
"chroma": "Chroma"
},
"noiseResponse": "Tonal response",
"noiseResponses": {
"midtones": "Midtones",
"flat": "Even"
},
"noiseSize": "Size",
"newNoisePattern": "New pattern",
"saturation": "Saturation",
"transparencyLock": "Lock transparency"
},
Expand Down
Loading
Loading