diff --git a/.claude/agents/WFL.md b/.claude/agents/WFL.md index 619601d..c9fc329 100644 --- a/.claude/agents/WFL.md +++ b/.claude/agents/WFL.md @@ -27,7 +27,7 @@ Read `docs/ORCHESTRATION.md` first, every time. It is the durable source of trut Judge everything against these. A suggestion that ignores them wastes the developer's time. **Hardware ceiling.** The only verified machine is an **RTX 4070 Ti, 12 GB VRAM**, 31.7 GB system -RAM, Windows 11. ComfyUI 0.27.1, Python 3.10.11, PyTorch 2.6.0+cu124. Anything you recommend must run +RAM, Windows 11. ComfyUI 0.30.0, Python 3.10.11, PyTorch 2.6.0+cu124. Anything you recommend must run in 12 GB, and you must say how — fp8, GGUF quant, tiled VAE, sequential offload — with a measured or sourced figure, not a guess. For reference, Krea-2 Turbo at 1024² 8 steps takes ~38-48 s on this card with offloading; SD 1.5 + LCM at 512² 5 steps is ~0.5-0.7 s. If a model cannot beat those on quality diff --git a/CHANGELOG.md b/CHANGELOG.md index e9bf790..aadf1e1 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,47 @@ # Changelog +## v0.13.0-alpha - 2026-08-07 + +LoRAs, at last: every preset that loads a model and a text encoder — eleven of them, across Text to Image, Image to Image and Sketch to Image — now takes an optional LoRA. The panel has been able to list the LoRAs on your disk since long before it could use one. + +Two presets that were quietly broken are fixed. Sketch to Image fed ControlNet a blank control image for light-on-dark art, so the sketch was ignored with no error at all. The Flux.2 dev (GGUF) preset that headlined v0.12.0 could not actually be run: its model dropdown never listed a `.gguf` file, and choosing it and pressing Generate failed outright. Both were reported by a tester using the release, which is what the alpha is for. + +### Added + +- **An optional LoRA on eleven presets.** One dropdown and one strength control per tool. Choosing nothing leaves the workflow byte-identical to the one that ships, because a LoRA cannot be a permanently wired node whose value is merely set: ComfyUI's `LoraLoader` has no "none" entry, so a wired-in loader would force everyone to own and load a LoRA they may not want. The loader is spliced into the graph only when a LoRA is actually chosen, and the model and text-encode inputs downstream are rewired to it. This is the first time building a workflow changes its shape rather than its values, so each preset declares its own wiring rather than having it guessed — three genuinely different shapes turned up among the eleven, including one where the LoRA must be applied before a sampling-mode wrapper rather than at the sampler. +- **A Depth ControlNet Sketch to Image preset.** LineArt and Scribble both hold the drawn stroke; neither carries depth. This one conditions on estimated scene depth, so it holds perspective and the relative distance of forms — the preset to reach for when a generated element has to sit inside an existing composite at the right camera angle. It works from any shaded image, not only a line drawing, and needs one new ControlNet model. No new custom node package: the depth estimator comes from `comfyui_controlnet_aux`, which the sketch presets already required. +- **A Scribble Sketch to Image preset**, on the PiDiNet edge detector and the Scribble ControlNet, for loose gestural strokes where LineArt holds the drawn line too tightly. Its ControlNet model was already installed for most users and it needs no new node package. + +### Fixed + +- **Sketch to Image ignored the sketch entirely for a whole class of drawing.** `LineartStandardPreprocessor` assumes dark strokes on white paper, so light-on-dark art and solid filled shapes produced a pure-black control image — measured at 0% ink on a 1024px filled silhouette. ControlNet had no signal, the preset degraded to plain text-to-image, and nothing anywhere reported a problem. It now uses a learned, polarity-robust detector (`AnyLineArtPreprocessor_aux`, 1.14% ink on the same source). Both sketch preprocessors also run at 1024 rather than a hardcoded 512, which had been discarding line detail before ControlNet ever saw it. +- **The Flux.2 dev (GGUF) preset could not be selected or run.** Its Model dropdown asked ComfyUI's core `UNETLoader` for the file list, and that loader does not enumerate `.gguf` files at all — so a correctly installed quantised model was invisible no matter where it was placed. Pressing Generate then failed regardless, because the builder required a negative-prompt target on a preset that deliberately has none, Flux.2 being guidance-distilled with no negative conditioning node in its reference graph. + +### Changed + +- The Flux.2 GGUF workflow is now bundled with the panel like every other preset's, instead of being fetched at runtime — it was the only runnable preset left out of that map. + +### Known limitations + +- **The LoRA list cannot be filtered by which model a LoRA suits, and a mismatched one fails silently.** ComfyUI reports only a LoRA's name, size and timestamps; nothing reachable over the wire says what it was trained against. The metadata that would say is not served, and is not reliable even when read directly — two LoRAs on the reference machine declare `ss_base_model_version: sd_1.5` while their tensor keys are plainly Flux. So the panel lists every LoRA, labels the entries whose *filenames* suggest a match or a mismatch, sorts likely matches first, and warns. Picking a LoRA meant for another model loads without any error and then does nothing: an unchanged image is the symptom to expect. +- **A LoRA roughly doubles Flux.2's inference time**, which is already minutes per image on a 12 GB card. +- **Whether a Krea-2 LoRA trained on Raw behaves correctly on the Turbo checkpoint is unverified.** Krea's own guidance is to train on Raw and marks Turbo as not recommended for training, but no source addresses applying the result at Turbo's 8 steps. +- **The Depth preset downloads its depth estimator on first use.** The ControlNet weight is a normal setup download, but `DepthAnythingV2Preprocessor` fetches its own estimator the first time it runs, so the first generation is much slower than later ones. Depth estimation also needs tonal variation — a flat line drawing gives it little to read. +- Batch generation is designed but not built; the design note is in `docs/BATCH_GENERATION.md`. Image to Image cannot batch at all without further work, because it builds its latent from the captured layer. +- **Assisted install remains withheld, and the Setup screen still only reports and copies.** ComfyUI-Manager's `install_model` endpoint only accepts entries from its own curated catalogue, which holds 7 of the 16 model files this project pins, and for several of those its download URL is not the one the registry pins. Unchanged from v0.12.0. +- **The Flux.2 GGUF preset is slow on a 12 GB card, by a wide margin** — an 18.7 GB quantised model plus a 16.8 GB text encoder means ComfyUI streams most of it from system RAM. It also needs `mistral_3_small_flux2_fp8.safetensors`, which is licence-gated: accept the licence in a browser and download it by hand. +- **Live Painting is experimental.** The live tier needs an SD 1.5 LCM LoRA in `models/loras/`; the Refine tier additionally needs the three Krea-2 Turbo files. +- Setup and Workflow Health overlap on purpose for now. Setup answers "what do I need and where does it go"; Health answers "can I run this preset right now". +- "What will run well" reads the VRAM ComfyUI reports for its primary device. With ComfyUI stopped, every preset falls back to "Not known". +- The panel still cannot open a browser, which is why rows offer Copy Link rather than a button that opens the page. +- **The `.ccx` one-click install is verified on one configuration only** — Windows 11, Photoshop 2025 (26.1.0). macOS and every other Photoshop version remain untested. +- The Layer Tools card on Home does not dim when ComfyUI is unreachable, unlike the generation tools. +- Layer, canvas, selection, and mask capture is limited to 16 megapixels (4096 x 4096) until a downscale option is added. +- The Preview panel offers each tool's primary import only. +- The setup pack contains no model weights — it ships the list and the downloader instead, so an internet connection is required. +- Inpaint and Outpaint remain experimental and should be tested on duplicate layers or disposable documents. +- CI covers pure TypeScript behavior but does not run Photoshop, UXP Developer Tool, or ComfyUI integration tests. + ## v0.12.0-alpha - 2026-08-01 Two things for people running Flux: a Text to Image preset for the GGUF-quantised FLUX.2-dev, and the end of a long-standing embarrassment — every preset the panel lists is now one you can actually run, because the two that never could have been are gone rather than still promising a workflow that was never coming. diff --git a/README.md b/README.md index 05094f9..f42f37f 100644 --- a/README.md +++ b/README.md @@ -10,13 +10,14 @@ OpenLayer is an open-source Adobe Photoshop UXP plugin that connects Photoshop t ## Alpha Release -`v0.12.0-alpha` is the current public alpha checkpoint. It is intended for testing the core local workflows in Photoshop UXP, not for production work yet. +`v0.13.0-alpha` is the current public alpha checkpoint. It is intended for testing the core local workflows in Photoshop UXP, not for production work yet. -New in `v0.12.0-alpha`: +New in `v0.13.0-alpha`: -- **A Flux.2 dev (GGUF) Text to Image preset**, built on ComfyUI's own shipped Flux.2 template and the advanced sampler chain. Experimental, and honestly slow on a 12 GB card: an 18.7 GB model plus a 16.8 GB text encoder means minutes per image, not seconds. -- **Every preset the panel lists is now one you can actually run.** The two Flux1-dev presets that had been advertising themselves as awaiting a workflow JSON since v0.2.2 are removed rather than finished — the full-precision weight has no 12 GB story and `txt2img-flux1-dev-fp8` already covers Flux Text to Image. -- **Assisted install is withheld from this release.** It was built on the belief that ComfyUI-Manager's install endpoint would fetch a given URL on request; it will not, and only accepts models from its own curated catalogue on its own terms. The Setup screen therefore still reports and copies, as in v0.11.0. See the CHANGELOG for the full reasoning — including why mapping the fields across would not have fixed it. +- **An optional LoRA on eleven presets**, across Text to Image, Image to Image and Sketch to Image. One dropdown and one strength control per tool. Choosing nothing leaves the shipped workflow untouched — the loader is spliced into the graph only when you actually pick a LoRA. +- **A Depth ControlNet Sketch to Image preset.** LineArt and Scribble hold the drawn stroke; this one holds the scene's perspective, which is what you want when a generated element has to sit in an existing composite at the right camera angle. Needs one new ControlNet model, no new node package. +- **Sketch to Image no longer ignores your sketch.** Light-on-dark art and solid filled shapes produced a blank control image, so ControlNet had no signal and the preset quietly became plain text-to-image. Fixed, and both sketch preprocessors now run at 1024 instead of 512. +- **The Flux.2 dev (GGUF) preset actually runs now.** In v0.12.0 its model dropdown never listed a `.gguf` file and pressing Generate failed outright. Both were reported by a tester on the release. Also new in `v0.11.0-alpha`: @@ -111,13 +112,15 @@ The earlier card-based dashboard established OpenLayer's honest available/experi -v0.12.0-alpha tester focus: +v0.13.0-alpha tester focus: -- Open **Setup** with ComfyUI running and confirm **no row anywhere offers an Install button**, including missing rows, with ComfyUI-Manager installed. Every row should offer only Copy Link, Copy Folder Path and Copy Page, exactly as in v0.11.0. This is the check that matters most in this release: an Install button appearing is a button that errors. -- To make a missing row that is *not* licence-gated, temporarily rename a model you already have — `models/upscale_models/4x-UltraSharp.pth` is the smallest at 64 MB — then click **Check Again**. Confirm that row reports Missing, still offers no Install button, and names the folder and size correctly. Rename it back afterwards. -- Open **Check Workflow Health** and confirm the **Flux.2 dev (GGUF)** preset appears, is marked experimental, and reports only the Mistral-3 encoder as missing if that is the only file you lack — not the 18.7 GB GGUF model you already have. -- Confirm the two Flux1-dev presets are **gone** from every preset list, and that no remaining preset says it needs a workflow JSON. -- Confirm the panel footer reads `v0.12.0`. +- Open **Text to Image**, pick `txt2img-krea2-turbo`, and confirm a **LoRA (optional)** row appears with `None` selected and no strength field. Generate once with `None` — it must succeed — then pick a LoRA and generate again at the same seed. The two images must differ. +- Switch the Workflow dropdown across every preset in Text to Image, Image to Image and Sketch to Image and confirm the LoRA row appears for all of them. Confirm it does **not** appear on Inpaint, Outpaint or Upscale. +- Set a different LoRA in each of the three tools and generate in each. None should leak into another tool. +- Pick a LoRA whose name mentions a different model family than the preset. It should still be selectable, marked `(name suggests another model)`, and generating should **succeed with a visibly unchanged image** — that is the silent failure the warning describes, not a bug. +- Open **Sketch to Image**, pick the new **Depth ControlNet** preset, and generate from a *shaded* layer rather than flat line art. The first run downloads the depth estimator and is much slower than later ones. +- Draw light strokes on a dark layer and run **LineArt**. The result must follow the drawing rather than ignoring it. +- Confirm the panel footer reads `v0.13.0`. Also worth rechecking from v0.11.0-alpha: @@ -152,7 +155,7 @@ Also worth rechecking from v0.9.0-alpha: - Run `npm run setup-pack` and confirm it reports no source/API mismatches at all. - Recheck the existing local generation, cancel, preview, import, History, and Workflow Health paths for regressions. -Known v0.12.0-alpha boundaries: +Known v0.13.0-alpha boundaries: - **The Setup screen reports and copies. It does not download or install anything.** Assisted install was built for this release and withheld: ComfyUI-Manager's install endpoint only accepts models from its own curated catalogue, matched exactly on `save_path`, `base` and `filename`, so every request OpenLayer could build was rejected. Only 7 of the 16 models this project pins are in that catalogue, and for several of those the catalogue's URL is not the one the registry verified — so the fix is a download path that honours our own URLs, not a field mapping. Full reasoning in the CHANGELOG. - The **Flux.2 GGUF preset is slow on a 12 GB card**: minutes per image, not seconds, and its text encoder is licence-gated, so accept the licence in a browser and download it by hand. @@ -326,10 +329,10 @@ npm run package This creates a zip package from `dist` in the `packages` folder. For the current alpha, the expected package name is: ```text -packages/openlayer-v0.12.0-alpha.zip +packages/openlayer-v0.13.0-alpha.zip ``` -`npm run package` also writes `packages/openlayer-v0.12.0-alpha.ccx` beside it, from the same files. +`npm run package` also writes `packages/openlayer-v0.13.0-alpha.ccx` beside it, from the same files. ## One-click install (verified 2026-08-03) @@ -339,7 +342,7 @@ other installed plugin. This was an open question across three releases and is now answered. What was checked, on Windows 11 with Photoshop 2025 (26.1.0): the package installs, Adobe's Unified Plugin Installer Agent reports it -as `Enabled OpenLayer 0.12.0` under *Photoshop 2025 64*, it unpacks to +as `Enabled OpenLayer 0.13.0` under *Photoshop 2025 64*, it unpacks to `%APPDATA%\Adobe\UXP\Plugins\External\com.openlayer.photoshop_\` with no `debug.json` — a packaged install rather than a developer load — and the panel opens and works in Photoshop. @@ -494,7 +497,7 @@ Inpaint output quality, mask interpretation, and Photoshop alignment are still b ## Pre-release Tester Checklist -Use this quick pass before reporting a v0.12.0-alpha test result: +Use this quick pass before reporting a v0.13.0-alpha test result: 1. Start ComfyUI on `http://127.0.0.1:8190`. 2. Build OpenLayer and load `dist/manifest.json` in Adobe UXP Developer Tool. diff --git a/docs/BATCH_GENERATION.md b/docs/BATCH_GENERATION.md new file mode 100644 index 0000000..6b4192c --- /dev/null +++ b/docs/BATCH_GENERATION.md @@ -0,0 +1,171 @@ +# Batch / multi-variation generation — design + +Status: **draft for review**. No code written. Written 2026-08-07. + +Generate several variations from one prompt in a single run, look at them, and +import the one that works. Today every generation is one image, so exploring +means clicking Generate repeatedly and losing each previous result. + +--- + +## What is actually true today + +Verified against the current tree rather than assumed. + +**ComfyUI already batches.** `batch_size` is a plain input on the empty-latent +node, and it is already present in **8 of the shipped workflows**: + +| Preset | Latent node with `batch_size` | +| --- | --- | +| `txt2img-basic`, `txt2img-krea2-turbo` | `EmptyLatentImage` | +| `txt2img-flux1-dev-fp8`, `txt2img-z-image-turbo` | `EmptySD3LatentImage` | +| `txt2img-flux2-dev-gguf` | `EmptyFlux2LatentImage` | +| `sketch2img-linecn-basic`, `-scribble-basic`, `-depth-basic` | `EmptyLatentImage` | + +The three **img2img** presets do not have one: they build their latent with +`VAEEncode` from the captured layer, so there is no `batch_size` to set. Batching +those needs a `RepeatLatentBatch` node spliced in — the same kind of topology +change the LoRA work introduced, and a separate piece of work from this one. + +Inpaint, outpaint, upscale and prompt-from-layer are out of scope: their output +is a patch or a caption tied to one region, and "four variations" is not a +meaningful thing to import. + +**Nothing currently reads more than one image back.** `findImageOutput` +(`src/comfy/comfyClient.ts:954`) takes `output.images?.[0]` and returns the +first match; `retrieveFirstOutputImage` wraps it. ComfyUI's history already +contains every image of the batch — the client simply discards them. + +**There is no `batchSize` injection name** in `WorkflowInjectionName` +(`src/comfy/types.ts`). + +--- + +## Correcting an assumption + +The earlier concern — that batch breaks the generation controller's +one-run-at-a-time invariant (A4) — **does not hold**, and it changed the shape of +this design. + +`createGenerationController` (`src/ui/generationController.ts:110`) gates on +*which run is current*: `publish`, `assertCanCommit` and `finish` all compare a +run id. A batch is still **one prompt, one prompt id, one run**. The controller +never inspects the result's shape; `runPipeline` is generic in `TImage` and +simply hands whatever it retrieved to `commit`. + +So A4 is untouched. What breaks is narrower and real: + +1. **The result type.** `retrieveFirstOutputImage` returns one + `GeneratedImageResult`; `commit` takes one. +2. **Preview URL ownership (A5).** `createResultPreviewPanel` + (`src/ui/previewState.ts:99`) owns exactly two URL slots — one result, one + live frame. N results need N owned slots, all revoked together. +3. **Import.** One result means "Import" is unambiguous. N results is a + product question, not a plumbing one — see the decisions below. + +That reframing means the risky part is the **preview panel and import UX**, not +the run controller. + +--- + +## Proposed design + +### Getting N images back + +Add `findImageOutputs` alongside `findImageOutput` (keeping the single-image +path untouched for every tool that is not batching), and a +`retrieveOutputImages` that returns `GeneratedImageResult[]`. + +`runPipeline` needs no change: `TImage` becomes `GeneratedImageResult[]` for the +batching tools, and `commit` receives the array. The run-integrity gates are +shape-agnostic and stay exactly as they are. + +### Setting the batch size + +A new `batchSize` injection name, targeting each preset's existing empty-latent +node. **No graph surgery** — this is an ordinary value injection, unlike the +LoRA work. Eight presets get it by adding one line each to their injection map. + +### Preview + +The result panel gains a **thumbnail strip** under the main image. The main +image shows the selected variation; clicking a thumbnail selects it. With a +batch of 1 the strip is hidden and the panel behaves exactly as it does today — +that fallback is what keeps the change safe for every existing flow. + +Ownership: one `OwnedObjectUrl` per variation, released as a set whenever a new +run commits or the panel clears. The existing single `resultUrl` slot becomes +the *selected* one, which keeps `showResult(blob)` working unchanged for +non-batch tools. + +### Live preview during the run + +Unchanged. ComfyUI streams preview frames for the batch as a single image strip +or the first member depending on the sampler; either way the existing +`showProgress` path handles it, and the thumbnail strip only appears once the +run completes. + +--- + +## Decisions needed before implementation + +These change what gets built, so they are yours rather than mine. + +### D1 — What does Import do with N images? + +| Option | Behaviour | +| --- | --- | +| **A (recommended)** | "Import to Layers" imports **only the selected** variation. One extra button, "Import All", adds every variation as its own layer. | +| B | Import always brings in all N as layers; the artist deletes the ones they do not want. | +| C | Import only ever brings in the selected one; no bulk option. | + +A keeps today's one-click behaviour identical for a batch of 1, and makes the +bulk case explicit rather than surprising. B risks dumping four full-size layers +into a document on a single click. + +### D2 — Default and maximum batch size + +Cost is linear: on the reference machine Krea-2 Turbo is ~38–48 s per image, so +a batch of 4 is roughly 3 minutes. `txt2img-flux2-dev-gguf` measured **207 s for +one image**, so a batch of 4 is ~14 minutes. + +Recommendation: **default 1** (today's behaviour, so nothing changes until +asked), **maximum 4**, and a visible time-estimate note once the batch size is +above 1. A different, lower cap specifically for Flux.2 is worth considering. + +### D3 — One history entry per run, or per image? + +Recommendation: **one entry per imported image**, created at import time rather +than at generation time — history exists to get a result back, and a variation +that was never imported has no layer to return to. This needs confirming against +how `addHistoryEntry` is used today. + +### D4 — Does the sketch tool get batching in the first pass? + +The three sketch presets can batch with the same one-line injection as txt2img, +since their latent is empty and only the ControlNet reads the captured image. It +is nearly free. The question is whether the thumbnail strip is worth the panel +space on that card in the first pass, or whether pass 1 should be txt2img only. + +--- + +## Staging + +1. **Retrieval + injection** — `findImageOutputs`, `retrieveOutputImages`, + `batchSize` injection on the 8 eligible presets, plus tests. No UI. Nothing + user-visible changes because the panel still asks for 1. +2. **Preview strip + selection + import** — the real UI work, gated on D1–D4. +3. **img2img batching** — `RepeatLatentBatch` splice, reusing the insertion + machinery the LoRA work established. Separate piece. + +Stage 1 is safe to build before the decisions land; stage 2 is not. + +--- + +## What this design does not do + +- No parallel runs. One prompt, one run, one cancel — unchanged. +- No change to how cancellation works: cancelling a batch cancels the whole + prompt, as it does now. +- No re-roll-one-variation feature. That needs per-image seeds and is a + different design. diff --git a/docs/index.html b/docs/index.html index f94f703..00ccac5 100644 --- a/docs/index.html +++ b/docs/index.html @@ -33,10 +33,10 @@ "operatingSystem": "Windows, macOS", "applicationCategory": "DesignApplication", "applicationSubCategory": "Adobe Photoshop plugin", - "softwareVersion": "0.12.0-alpha", + "softwareVersion": "0.13.0-alpha", "description": "Open-source Photoshop UXP plugin that connects to a local ComfyUI server for AI image generation: text to image, image to image, sketch to image, inpaint, outpaint, and upscale with Stable Diffusion, SDXL, and Flux models.", "url": "https://mehran-ahmadi.com/OpenLayer/", - "downloadUrl": "https://github.com/MehranMarxian/OpenLayer/releases/tag/v0.12.0-alpha", + "downloadUrl": "https://github.com/MehranMarxian/OpenLayer/releases/tag/v0.13.0-alpha", "offers": { "@type": "Offer", "price": "0", "priceCurrency": "USD" }, "author": { "@type": "Person", "name": "Mehran Ahmadi", "url": "https://github.com/MehranMarxian" } } @@ -65,7 +65,7 @@
-

Alpha v0.12.0 · free & open source

+

Alpha v0.13.0 · free & open source

Local AI layers,
inside Photoshop.

OpenLayer connects Photoshop to your own ComfyUI server. @@ -74,7 +74,7 @@

Local AI layers,
inside Photoshop.No cloud. No credits. No subscription.

    @@ -285,7 +285,7 @@

    Run it locally in minutes

    1

    Download and double-click

    -

    Grab openlayer-v0.12.0-alpha.ccx from the latest release and double-click it. Creative Cloud installs the panel — no developer tools, nothing to build.

    +

    Grab openlayer-v0.13.0-alpha.ccx from the latest release and double-click it. Creative Cloud installs the panel — no developer tools, nothing to build.

    2 @@ -322,11 +322,11 @@

    Separated preview panel is ready to test

    Testing alpha

    -

    OpenLayer v0.12.0-alpha is for local testing and feedback. It is not production-ready yet.

    +

    OpenLayer v0.13.0-alpha is for local testing and feedback. It is not production-ready yet.

    Inpaint is experimental

    -

    v0.12.0 retains the upload and alignment fixes while output quality across checkpoints continues to be validated by testers.

    +

    v0.13.0 retains the upload and alignment fixes while output quality across checkpoints continues to be validated by testers.

    Flux Fill is experimental

    @@ -342,14 +342,15 @@

    Custom workflows are future work

    Honest alpha boundaries
    • txt2img-basic, img2img-basic, and sketch2img-linecn-basic are starter workflows, not final production presets.
    • -
    • Sketch to Image currently targets SD 1.x LINECN with epicrealism_naturalSinRC1VAE.safetensors and control_v11p_sd15_lineart_fp16.safetensors.
    • +
    • Sketch to Image targets SD 1.x with epicrealism_naturalSinRC1VAE.safetensors and offers LineArt, Scribble and Depth ControlNet presets, each needing its own ControlNet model.
    • Custom ComfyUI workflows may need node ID updates in the preset registry.
    • GPU-aware recommendations are advisory only. OpenLayer does not auto-switch models or workflows yet.
    • Layer, canvas, and mask capture is limited to 16 megapixels until a downscale option is added.
    • Inpaint and Outpaint should be tested on duplicate layers first.
    • Prompt from Layer requires the local Florence-2 PromptGen model and the comfyui-florence2 nodes. The custom-scripts pack is no longer needed.
    • Upscale uses pixel/model upscale only. Generative upscale, tiled diffusion, and creative enhancement are future work.
    • -
    • Custom workflow import, LoRA browser, batch variants, and true persistent Photoshop AI layer metadata are future work. v0.12.0 keeps the shared metadata foundation and session-history wiring.
    • +
    • Custom workflow import, batch variants, and true persistent Photoshop AI layer metadata are future work. v0.13.0 keeps the shared metadata foundation and session-history wiring.
    • +
    • The LoRA list cannot be filtered by which model a LoRA suits: ComfyUI reports only a name and size. Entries are labelled from their filenames and likely matches sorted first, but a mismatched LoRA loads without error and quietly does nothing.
    • CI does not run Photoshop, UXP, or ComfyUI integration tests.
    • Live sampler previews require ComfyUI to be started with --preview-method auto.
    • Progress is shown in the generation status panel rather than pinned to the screen header, so it scrolls with the form.
    • @@ -431,7 +432,7 @@

      Build local AI layers, one careful step at a time.