Skip to content

Releases: AbrahamPaulJ/nightmare-mobile

Nightmare Mobile 1.6.064 (experimental) — SD 1.5 Swap: LoRA and ControlNet per render

Choose a tag to compare

@AbrahamPaulJ AbrahamPaulJ released this 29 Sep 18:17

⚠ Experimental pre-release. The new SD 1.5 Swap family below works end to end on an S25 Ultra (8 Elite), but most of it has been verified headless rather than by hand. 1.6.053 stays the stable release.

What's new

  • SD 1.5 Swap: SD 1.5 models whose LoRAs and ControlNet are chosen per render, with no reconversion and no reload. Convert your own checkpoint in npuforge 1.0.6 (Convert as → SD1.5 Swap), or download one of two defaults from Models → SD 1.5 Swap.
  • Several LoRAs at once, each with its own strength.
  • ControlNet: canny, depth and openpose. Give it a photo and the phone makes the hint (edges, a depth map, a pose skeleton), or give it a ready-made depth map or skeleton. The ControlNets download in the app, in the build your chip can load.
  • SD 1.5 Swap Inpaint, with the same LoRAs and ControlNet.

SD 1.5 Swap

A Swap model is an SD 1.5 checkpoint whose UNet takes LoRA and ControlNet as inputs, so switching them costs nothing: the same loaded model renders one picture with a character LoRA and the next with a style LoRA and a pose. Pick SD 1.5 Swap on the Image card.

20 steps, 512×512, S25 Ultra time
plain 3.4–4.1 s
+ a LoRA about the same
+ a ControlNet 5.1–6.6 s

About 15% slower than the same checkpoint converted plainly. 512×512 only.

LoRAs: pick them on the node exactly as on FLUX.2. The first render with a new LoRA mix prepares it (about 10 s for one large LoRA, 25 s for two) and keeps it for next time. The model holds one rank-64 LoRA slot, so several LoRAs are merged into it, and a LoRA above rank 64 is reduced to its best rank-64 version. Only the part of a LoRA that changes the image model applies; its text-encoder part does not.

Two defaults: AbsoluteReality Swap (realistic) and CuteYukiMix Swap (anime), about 1.3 GB each. ⚠ 8 Elite and newer only for now; builds for older chips are planned. A Swap model you convert yourself runs on the phone that converted it.

ControlNet

A ControlNet tile sits beside Crop on every Swap node: choose canny, depth or openpose, set a strength, and choose a picture, or wire one into the node's control input. With nothing chosen, the node's own photo is used, cut by the same crop window, so the hint lines up with the picture. The tile shows exactly what the ControlNet will see.

type from a photo ready-made chips
canny edges found on the phone — 8 Gen 2 and newer; 888 / 8 Gen 1 *
depth Depth Anything V2 Small, about 2 s a depth map (near = white) 8 Gen 2 and newer; 888 / 8 Gen 1 *
openpose MoveNet, about 0.1 s an OpenPose skeleton 8 Gen 2 and newer

* ⚠ New, please report: the 888 / 8 Gen 1 builds are a slower compatibility build and have not been run on one of those phones.

Each ControlNet is about 370 MB, downloaded on first use from our Hugging Face repo; the photo-to-hint models are small extra downloads. A ControlNet adds about 30 ms a step.

⚠ New, please report: depth, the canny build and Swap Inpaint with ControlNet were verified on the phone by script, not yet by hand.

SD 1.5 Swap Inpaint

Paint an area and it is repainted with your LoRAs and ControlNet. It blends the new area into the old picture, so it suits fixes and small changes; a large fill can leave a soft edge. A true inpainting Swap model is planned.

Good to know

  • Pictures are fitted, never cropped: a portrait skeleton or depth map is placed on black in the square, so no head or feet are cut off.
  • Credits: ControlNet 1.1 by lllyasviel (CreativeML OpenRAIL-M), MoveNet by Google (Apache 2.0), Depth Anything V2 Small (Apache 2.0), AbsoluteReality by Lykon, CuteYukiMix by kemiaomiao — see NOTICE.

Nightmare Mobile 1.6.053 — FLUX.2 Klein 9B, Krea 2 Turbo, a user guide (+ RAM hotfix)

Choose a tag to compare

@AbrahamPaulJ AbrahamPaulJ released this 28 Sep 12:25

FLUX.2 Klein 9B

The bigger Klein, beside the 4B: the same family, so the same Text to image, Image edit and
LoRA picker, with an 8B text encoder (Qwen3-8B) reading the prompt. Find it in Models → FLUX.2.

It is 10.7 GB, which is tight on a 12 GB phone, so new nodes start at 768×768. Bigger sizes
are still on the slider. Measured on an S25 Ultra (8 Elite, 12 GB), five pictures in a row with
the phone's usual apps open:

size pictures that finished time each
768×768 5 of 5 64–94 s
1024×1024 3 of 4 (Android closed the app on the 4th) 84–97 s

Run by hand in the app at 1024×1024 too, and quick enough there. If Android closes the app at
1024, close other apps or go back to 768. About a third of each picture is loading: the app
gives its memory back after every render so the phone stays usable, and loads it again for the
next one.

⚠ New, please report: editing with the 9B, and LoRAs on it, have not been tried on a phone
yet. A LoRA has to be made for the 9B; one made for the 4B is a different size.

An imported Klein 9B fine-tune is refused for now, with a message saying so. It needs the
9B's own text encoder, which imports do not use yet. Klein 4B fine-tunes import as before.

Krea 2 Turbo — 16 GB phones

A new family, text to image only, in its own tab under Models: Krea's 2 Turbo, 8 steps,
with a Qwen3-VL-4B text encoder. It is 9.5 GB.

It needs a phone with 16 GB of RAM. On a 12 GB phone its image model (6.5 GB) did not finish
loading before Android closed the app, so on 12 GB phones the row says "needs a phone with 16
GB of RAM"
instead of offering a download.

⚠ New, please report: there is no 16 GB phone here, so Krea 2 has not been run on a phone
at all. If you have one, a report of how it went, good or bad, is the most useful thing you can
send.

Krea 2 is licensed under the Krea 2 Community License Agreement. For more information, visit
https://krea.ai/krea-2-licensing.

A user guide

https://abrahampaulj.github.io/nightmare-mobile/ — every flow step by step, the Models tab,
bringing your own models, LoRAs, settings, and a glossary, written from the app's real labels
and screenshots. It is new, so if a page says something the app does not do, please say so.

Also

  • Both new models run on the same DiT engine as before (no new engine download). Credits and
    licences are in the README and NOTICE.
  • Needs a Snapdragon 8 Elite or newer, like the other DiT models.

Hotfix in 1.6.053: your RAM back when you close the app

"Why do I have to force stop the app after I remove it from recent apps for it to offload the
model?"
— reported the day 1.6.052 shipped, and it was a bug.

  • Close the app — swipe it away from recent apps, or back out of it — and the loaded model
    is let go at once, even in the middle of a render. Measured on an S25 Ultra: 3 ms after
    the swipe, with the full 10 GB back.
  • Step away — Home, another app, the photo picker — and the model stays for a minute so a
    quick trip costs no reload, then goes. The signal this relied on never arrived on our test
    phone (an S25 Ultra), so that minute never ended and only force stop freed the memory; it
    now starts from a signal Android always sends. ⚠ New, please report if a model you
    stepped away from is still loaded a few minutes later.

⚠ Known, not fixed yet: Cancel pressed while a model is still loading can let that render
run to the end in the background. Closing the app does stop it.

Nightmare Mobile 1.6.052 — FLUX.2 Klein 9B, Krea 2 Turbo, a user guide

Choose a tag to compare

@AbrahamPaulJ AbrahamPaulJ released this 28 Sep 11:45

FLUX.2 Klein 9B

The bigger Klein, beside the 4B: the same family, so the same Text to image, Image edit and
LoRA picker, with an 8B text encoder (Qwen3-8B) reading the prompt. Find it in Models → FLUX.2.

It is 10.7 GB, which is tight on a 12 GB phone, so new nodes start at 768×768. Bigger sizes
are still on the slider. Measured on an S25 Ultra (8 Elite, 12 GB), five pictures in a row with
the phone's usual apps open:

size pictures that finished time each
768×768 5 of 5 64–94 s
1024×1024 3 of 4 (Android closed the app on the 4th) 84–97 s

Run by hand in the app at 1024×1024 too, and quick enough there. If Android closes the app at
1024, close other apps or go back to 768. About a third of each picture is loading: the app
gives its memory back after every render so the phone stays usable, and loads it again for the
next one.

⚠ New, please report: editing with the 9B, and LoRAs on it, have not been tried on a phone
yet. A LoRA has to be made for the 9B; one made for the 4B is a different size.

An imported Klein 9B fine-tune is refused for now, with a message saying so. It needs the
9B's own text encoder, which imports do not use yet. Klein 4B fine-tunes import as before.

Krea 2 Turbo — 16 GB phones

A new family, text to image only, in its own tab under Models: Krea's 2 Turbo, 8 steps,
with a Qwen3-VL-4B text encoder. It is 9.5 GB.

It needs a phone with 16 GB of RAM. On a 12 GB phone its image model (6.5 GB) did not finish
loading before Android closed the app, so on 12 GB phones the row says "needs a phone with 16
GB of RAM"
instead of offering a download.

⚠ New, please report: there is no 16 GB phone here, so Krea 2 has not been run on a phone
at all. If you have one, a report of how it went, good or bad, is the most useful thing you can
send.

Krea 2 is licensed under the Krea 2 Community License Agreement. For more information, visit
https://krea.ai/krea-2-licensing.

A user guide

https://abrahampaulj.github.io/nightmare-mobile/ — every flow step by step, the Models tab,
bringing your own models, LoRAs, settings, and a glossary, written from the app's real labels
and screenshots. It is new, so if a page says something the app does not do, please say so.

Also

  • Both new models run on the same DiT engine as before (no new engine download). Credits and
    licences are in the README and NOTICE.
  • Needs a Snapdragon 8 Elite or newer, like the other DiT models.

Hotfix in 1.6.053: your RAM back when you close the app

"Why do I have to force stop the app after I remove it from recent apps for it to offload the
model?"
— reported the day 1.6.052 shipped, and it was a bug.

  • Close the app — swipe it away from recent apps, or back out of it — and the loaded model
    is let go at once, even in the middle of a render. Measured on an S25 Ultra: 3 ms after
    the swipe, with the full 10 GB back.
  • Step away — Home, another app, the photo picker — and the model stays for a minute so a
    quick trip costs no reload, then goes. The signal this relied on never arrived on our test
    phone (an S25 Ultra), so that minute never ended and only force stop freed the memory; it
    now starts from a signal Android always sends. ⚠ New, please report if a model you
    stepped away from is still loaded a few minutes later.

⚠ Known, not fixed yet: Cancel pressed while a model is still loading can let that render
run to the end in the background. Closing the app does stop it.

Nightmare Mobile 1.6.049 — Qwen Image 2.1, low RAM settings like LocalDream

Choose a tag to compare

@AbrahamPaulJ AbrahamPaulJ released this 27 Sep 15:55

Qwen Image 2.1

A third DiT model beside FLUX.2 Klein and Z-Image Turbo: a 7B image model with an 8B
vision-language model (Qwen3-VL) reading the prompt, so it follows long instructions and can
put legible text in a picture.

It generates and it edits. Pick it in Models → Qwen Image, then use Text to image or Image
edit. The edit takes a photo, and optionally a second picture in the reference port — name
them image 1 and image 2 in the prompt. Unlike FLUX.2, Qwen's text encoder sees the photos
through its vision tower, not just their latents.

It is 10.8 GB, so on a 12 GB phone it loads one part at a time and gives each back before the
next — text encoder, then the image model, then the VAE. Measured on an S25 Ultra (8 Elite),
1024×1024:

time
text to image 4 min 19 s — 20 steps at ~12 s
image edit (one photo) 14.5 min — the vision tower reads the photo (2 min 16 s), then 20 steps at ~30 s

It is the slow, careful one; FLUX.2 stays the fast editor. Smaller sizes are much quicker,
since both big costs scale with the picture's area. Needs a Snapdragon 8 Elite or newer.

⚠ New, please report: editing with a reference picture on Qwen has not been tried on a
phone yet. Base-only editing and text to image have.

Low RAM settings, like LocalDream

Settings → General → Memory now has LocalDream's three switches: SDXL low RAM mode,
Anima low RAM mode and Anima DiT sequential loading.

Until now SDXL and Anima were always forced into low RAM mode — which is required on a 12 GB
phone, and needless on a 16 GB one, where it costs speed and the live preview. The switches
now default from your phone's memory: on under 16 GB, off at 16 GB or more. Sequential
loading stays off unless you turn it on, as in LocalDream: it helps only when low RAM mode
alone still cannot run Anima, and it is slower per step.

Your RAM back when you leave the app

"After leaving the app, 10 GB of RAM remains occupied." — a user report, and they were right.
A loaded model (FLUX.2 especially) stays resident between runs so the next Run is instant, and
the app kept it there for as long as you were away.

Now a loaded model is let go a minute after the app leaves the screen — Home, switching to
another app, or backing out — or at once if the phone reports it is short of memory. It is
never released in the middle of a render: leave during one and it finishes first. Coming back
costs one reload of a few seconds on the next Run.

Also

  • Long renders no longer time out. A Qwen edit spends over three minutes before its first
    step, and the app gave up on it after two while it was still working. DiT renders now wait up
    to ten minutes between progress updates; a crashed render still fails at once.
  • The DiT engine is updated (LocalDream 3.0.0-alpha.3's, with this app's LoRA support
    rebased onto it). It downloads by itself the first time you run FLUX.2, Z-Image or Qwen —
    23 MB.

DiT engine — ABI 105 (Qwen Image 2.1 + LoRA)

Choose a tag to compare

@AbrahamPaulJ AbrahamPaulJ released this 27 Sep 14:08

Referenced by DitEngine.URL as of 1.6.046 -- do not delete.

local-dream v3.0.0-alpha.3 (Qwen Image 2.1) + dit/003-lora-on-alpha3-abi105.patch
(our per-generation LoRAs and lora_apply_mode, rebased onto alpha.3's header).

local-dream v3.0.0-alpha.3 (440899f)
stable-diffusion.cpp c3352fb512b2a39737974dabd2100f79e96cddc0
DIT_ENGINE_ABI_VERSION 105
sha256 2a5c78ced4e151a20752a40c945f4692a4841856fffc85c7206405461d583443

Numbered 1xx because our previous LoRA engine and upstream's alpha.3 both called
themselves ABI 5 over different structs.

WARNING: dit_engine_get_api refuses a version it cannot serve. This engine needs
a backend built against the ABI 105 header and is useless to anything earlier.

Nightmare Mobile 1.6.045 — your models in Downloads, npuforge inpainting, Russian and Chinese prompts, Add Objects

Choose a tag to compare

@AbrahamPaulJ AbrahamPaulJ released this 26 Sep 16:52

Fixed in 1.6.045

Everything below is 1.6.042's release, unchanged. 1.6.045 fixes what it broke:

  • Results opens pictures full screen again. Moving Models / Flows / Results into a pull-down
    sheet left the viewer drawn below the list, off screen, so tapping a picture did nothing.
  • Upscale works from Results again. Since the upscale node became a checkbox on the output
    node, Results kept asking for the old node and every upscale failed with unknown node type.
  • A refused upscale says why. On a picture already too big, the output node's upscale button
    opened the chooser, ran, and left the picture as it was with only a line in the run log. It
    now answers with a toast before anything runs, and its chooser dims the scales that would pass
    4096 px, as Results' does. An auto upscale that is skipped or reduced during a run is toasted
    too, and so is a Results upscale started while something else is running.

Your models, in Downloads

Until now every model lived in Android/data, which no file picker can open and which an
uninstall wipes. Settings → Downloads → Models folder now offers a second place:
Download/Nightmare, where any file manager reaches the models and where they survive
uninstalling the app.

It is opt-in. The default stays private app storage, and All files access is asked only
when you pick the Downloads folder
, never on its own.

It costs nothing at load time. Same 1.2 GB SD 1.5 checkpoint, launch to serving, four
alternating runs each on an S25 Ultra (Android 16):

models folder median
app storage ~1.35 s
Download/Nightmare ~1.49 s

That gap is inside the run-to-run spread (1.1–1.9 s on both).

Switching offers to move what you already have, with the size, a progress bar and Cancel.
On the same storage a move is a rename, so on the test phone 1.2 GB went across in about
3 seconds. A notification keeps the move going if you leave the app, and a move the app was
killed in the middle of finishes by itself at the next launch. Run on a half-moved model
says to finish the move; it never offers to download it again.

Imports still copy into whichever folder you chose, so the zip or .safetensors you picked can
be deleted afterwards.

Repair. A built-in model with a file deleted now says which file (incomplete · missing
unet.bin · 1007 MB download
) and offers Repair instead of looking as if it had never been
downloaded. FLUX.2 and Z-Image repair fetches only the missing files. SD 1.5, SDXL and Anima
still fetch the whole zip, because each model is one archive.

npuforge exports, inpainting included

SD 1.5 checkpoints converted on the phone with
npuforge now run for text to image, image to image
and inpainting.

  • An INPAINT marker file beside a 9-channel unet.bin selects the real 9-channel inpaint
    pipeline. Without it, the model was launched as a plain SD 1.5 model and handed a 4-channel
    latent it cannot read.
  • The backend's SD 1.5 VAE now reads and writes float32 when the export is float (backend patch
    012). The built-in quantized models render byte-identical to before, and an inpaint costs
    +0.24 s.

Checked with DreamShaper 8 Inpainting and two converted inpaint models at denoise 1.0.
⚠ npuforge SD 1.5 exports need this release; older builds cannot run them.

Prompts in Russian and Chinese

SD 1.5 and SDXL only read English. A prompt box holding Cyrillic or Chinese text now shows a
文A button on its border. One tap puts the prompt into English, and the same button then
undoes it until you edit the text. The first tap downloads the model, and the prompt is
translated as soon as the download lands, with no second tap.

It runs offline, on the phone: Foxlet
(Bergamot / Marian with ARM int8 kernels), built from source, with Mozilla's Firefox
Translations models. S25 Ultra:

model first tap after that
Russian → English 37 MB 213 ms 15–16 ms
Chinese → English 55 MB 290 ms 15 ms

Weights and tags survive, because only the words are translated:
(длинные волосы:1.2), 8k → (long hair:1.2), 8k. Chinese full-width , and 、 come out
as the commas CLIP reads. ⚠ Chinese misses some culture-specific terms: 汉服 comes back as
"hanbok", and 古风 as "Old Wind". General descriptions are fine.

The models download from the same Hugging Face mirror setting as everything else, and
Settings → Translation lists and deletes them.

Add Objects

Paste a real object from another photo into the one you are repainting, and only its edges
are repainted. It blends in, and the middle of the object stays pixel-exact: a poor man's
virtual try-on.

Tick Add Objects on an inpaint node, pick the source photo and paint over the object.
Done cuts every painted region as its own object and places it. Then:

  • drag it into position; two fingers resize and turn it together, snapping near a right
    angle; turn 90° and flip with a tap;
  • each Add is its own layer above the photo, up to two, with Reset and Delete layer;
  • the object's ring is ordinary mask on the photo's layer, so brush, erase, Invert and Clear
    all work on it, and moving the object draws a fresh ring where it now sits;
  • one Undo / Redo history covers every layer.

At around 0.7 denoise the seam is repainted from the pasted pixels. At 1.0 it is redrawn from
noise.

Auto mask by name, and auto crop

Enable auto mask picks what to repaint by name (Clothes, Face, Hair, Shoes or Bag). The flow
remembers the choice and masks every new photo by itself, so a photo in and Run is the whole
job. It is an ATR human parser (SegFormer-B2, int8), a 29 MB download that runs on the CPU. A
photo with nothing of the chosen kind says so instead of guessing.

Enable auto crop does the same for framing: the whole photo, fitted, with no crop window.

Outpainting with a green screen

An inpaint frame could already zoom out past the photo, up to twice its area, with the padding
generated. The Pad choice for that padding now includes green: pure #00FF00, for
outpaint LoRAs trained on a green screen. It sits beside black and the photo's own edges
blurred.

FLUX.2 image edit gets the same: tick Allow padding in its crop window and the frame
zooms out the same way, with the padding filled by your Pad choice. Untick it and the frame
snaps back over the whole photo.

Also in this release

  • Settings has pill tabs: General · Add-ons · Translation · Downloads.
  • Sheets close with a pull downward, with no close buttons: Models, Flows, Results, Settings
    and the crop / mask window.
  • Run is pinned under every page of the node sheet.
  • The seed lock is a toggle that stays visible while there is a seed.
  • The Models tab no longer freezes the app when it opens: it blocked for 240–360 ms per
    open and now blocks for about 20–60 ms, and it draws in about 100 ms.
  • The Russian and Chinese interfaces are complete, level with English.
  • The video node's crop lock is gone.
  • Fixed: an inpaint crop window showed black padding while the render used the blurred
    default.

Nightmare Mobile 1.6.042 — your models in Downloads, npuforge inpainting, Russian and Chinese prompts, Add Objects

Choose a tag to compare

@AbrahamPaulJ AbrahamPaulJ released this 26 Sep 15:31

⚠ Use 1.6.045 instead. In this build, Results does not open pictures full screen, and Upscale from Results fails with unknown node type. 1.6.045 is this release with both fixed.

Your models, in Downloads

Until now every model lived in Android/data, which no file picker can open and which an
uninstall wipes. Settings → Downloads → Models folder now offers a second place:
Download/Nightmare, where any file manager reaches the models and where they survive
uninstalling the app.

It is opt-in. The default stays private app storage, and All files access is asked only
when you pick the Downloads folder
, never on its own.

It costs nothing at load time. Same 1.2 GB SD 1.5 checkpoint, launch to serving, four
alternating runs each on an S25 Ultra (Android 16):

models folder median
app storage ~1.35 s
Download/Nightmare ~1.49 s

That gap is inside the run-to-run spread (1.1–1.9 s on both).

Switching offers to move what you already have, with the size, a progress bar and Cancel.
On the same storage a move is a rename, so on the test phone 1.2 GB went across in about
3 seconds. A notification keeps the move going if you leave the app, and a move the app was
killed in the middle of finishes by itself at the next launch. Run on a half-moved model
says to finish the move; it never offers to download it again.

Imports still copy into whichever folder you chose, so the zip or .safetensors you picked can
be deleted afterwards.

Repair. A built-in model with a file deleted now says which file (incomplete · missing
unet.bin · 1007 MB download
) and offers Repair instead of looking as if it had never been
downloaded. FLUX.2 and Z-Image repair fetches only the missing files. SD 1.5, SDXL and Anima
still fetch the whole zip, because each model is one archive.

npuforge exports, inpainting included

SD 1.5 checkpoints converted on the phone with
npuforge now run for text to image, image to image
and inpainting.

  • An INPAINT marker file beside a 9-channel unet.bin selects the real 9-channel inpaint
    pipeline. Without it, the model was launched as a plain SD 1.5 model and handed a 4-channel
    latent it cannot read.
  • The backend's SD 1.5 VAE now reads and writes float32 when the export is float (backend patch
    012). The built-in quantized models render byte-identical to before, and an inpaint costs
    +0.24 s.

Checked with DreamShaper 8 Inpainting and two converted inpaint models at denoise 1.0.
⚠ npuforge SD 1.5 exports need this release; older builds cannot run them.

Prompts in Russian and Chinese

SD 1.5 and SDXL only read English. A prompt box holding Cyrillic or Chinese text now shows a
文A button on its border. One tap puts the prompt into English, and the same button then
undoes it until you edit the text. The first tap downloads the model, and the prompt is
translated as soon as the download lands, with no second tap.

It runs offline, on the phone: Foxlet
(Bergamot / Marian with ARM int8 kernels), built from source, with Mozilla's Firefox
Translations models. S25 Ultra:

model first tap after that
Russian → English 37 MB 213 ms 15–16 ms
Chinese → English 55 MB 290 ms 15 ms

Weights and tags survive, because only the words are translated:
(длинные волосы:1.2), 8k → (long hair:1.2), 8k. Chinese full-width , and 、 come out
as the commas CLIP reads. ⚠ Chinese misses some culture-specific terms: 汉服 comes back as
"hanbok", and 古风 as "Old Wind". General descriptions are fine.

The models download from the same Hugging Face mirror setting as everything else, and
Settings → Translation lists and deletes them.

Add Objects

Paste a real object from another photo into the one you are repainting, and only its edges
are repainted. It blends in, and the middle of the object stays pixel-exact: a poor man's
virtual try-on.

Tick Add Objects on an inpaint node, pick the source photo and paint over the object.
Done cuts every painted region as its own object and places it. Then:

  • drag it into position; two fingers resize and turn it together, snapping near a right
    angle; turn 90° and flip with a tap;
  • each Add is its own layer above the photo, up to two, with Reset and Delete layer;
  • the object's ring is ordinary mask on the photo's layer, so brush, erase, Invert and Clear
    all work on it, and moving the object draws a fresh ring where it now sits;
  • one Undo / Redo history covers every layer.

At around 0.7 denoise the seam is repainted from the pasted pixels. At 1.0 it is redrawn from
noise.

Auto mask by name, and auto crop

Enable auto mask picks what to repaint by name (Clothes, Face, Hair, Shoes or Bag). The flow
remembers the choice and masks every new photo by itself, so a photo in and Run is the whole
job. It is an ATR human parser (SegFormer-B2, int8), a 29 MB download that runs on the CPU. A
photo with nothing of the chosen kind says so instead of guessing.

Enable auto crop does the same for framing: the whole photo, fitted, with no crop window.

Outpainting with a green screen

An inpaint frame could already zoom out past the photo, up to twice its area, with the padding
generated. The Pad choice for that padding now includes green: pure #00FF00, for
outpaint LoRAs trained on a green screen. It sits beside black and the photo's own edges
blurred.

FLUX.2 image edit gets the same: tick Allow padding in its crop window and the frame
zooms out the same way, with the padding filled by your Pad choice. Untick it and the frame
snaps back over the whole photo.

Also in this release

  • Settings has pill tabs: General · Add-ons · Translation · Downloads.
  • Sheets close with a pull downward, with no close buttons: Models, Flows, Results, Settings
    and the crop / mask window.
  • Run is pinned under every page of the node sheet.
  • The seed lock is a toggle that stays visible while there is a seed.
  • The Models tab no longer freezes the app when it opens: it blocked for 240–360 ms per
    open and now blocks for about 20–60 ms, and it draws in about 100 ms.
  • The Russian and Chinese interfaces are complete, level with English.
  • The video node's crop lock is gone.
  • Fixed: an inpaint crop window showed black padding while the render used the blurred
    default.

Nightmare Mobile 1.6.013 — Z-Image LoRAs, and a model folder that just works

Choose a tag to compare

@AbrahamPaulJ AbrahamPaulJ released this 22 Sep 13:34

Z-Image LoRAs, unlocked

1.6.0 said a Z-Image adapter binds no tensors, greyed the knob on the family, and shipped a
name-mapping patch built on that reading. All of it was wrong
, and the evidence for it was a
logcat that had been pruned — the engine prints loading N/M tensors at verbose level, verbose
was on, and the same capture was also missing the 453-tensor line for the checkpoint itself.

They bind. The assertion is the adapter's own multiplier, which nothing but bound tensors
can answer — scale_value *= multiplier sits inside the branch that runs only once lora_up
and lora_down were found. Same seed, neutral prompt, 512², a 480-tensor rank-32 adapter:

render mean abs Δ vs no LoRA pixels >40
no LoRA 29.6 s — —
x0.25 44.0 s 11.5 6.4%
x1.00 42.3 s 30.5 21.2%

Monotonic in the strength, and the LoRA-less leg is byte-identical across two separate runs.
⚠ The cost is +43%, against 6% for a 160-tensor FLUX adapter — 480 tensors, and runtime
mode pays two extra matmuls per patched linear on every step.

⚠ A byte difference on its own would not have settled it: registering a LoRA changes the
compute path, so "the output changed" is true even for an adapter that binds nothing. The
ladder is what separates the two, and it is the check to use for any future family.

Bring your own model folder — markers and all

A model directory assembled for LocalDream now drops straight in. The marker file is read in
upstream's own precedence — ZIMAGE, KLEIN, ANIMA, SDXL, finished, npucustom — and a
marker outranks the file-based guess, so a folder is whatever its owner says it is.

Reported by someone keeping two zips of the same checkpoint to import it into two apps:

for most users they have to unzip, create the proper dummy file and zip it, and or keep two
zip files just to import a flux/z-image model. That's a huge hassle and storage being used up.

No unzipping to swap a dummy file, no second copy of 4 GB. With no marker at all the family is
still read off the checkpoint's own tensor names.

Enlarging moved onto the output node

The upscale node is gone. core.output carries an auto upscale checkbox and draws what it
received above what it made, each with the full row of buttons — save, share, send to a
flow, keep, star, ⓘ, and a bin that drops just that picture. Tap either one for full screen,
and swipe between them while zoomed out.

The upscale button on an output pins the upstream sampler's rolled seed before it runs, so
"enlarge this picture" enlarges the picture you were looking at rather than a fresh roll.

Tap to select, where the tapping happens

Segment Anything 2.1 is a checkbox in the mask editor, under the brush size, with the
model's download and delete beside it — the same card the Models tab draws, with the size, a
progress bar and Cancel. The segmenter node is retired.

⚠ Running an inpaint no longer demands the 87 MB download. It asks only when the mask actually
holds tapped regions, which are re-resolved at render.

Around the app

  • The canvas has the brand row and the version. Run is centred and wider, + Node on the
    left, zoom and the locks on the right.
  • LoRAs sit under the Checkpoint picker, with import on the node — no trip to Settings.
  • ⓘ on the output node and in both viewers, carrying the run time per sampler, for the node
    itself, and for the whole flow. A cached sampler reads cached rather than 0 ms.
  • Results has a filter — per-model checkboxes and a search — with a clear button beside it
    while it is active.
  • Clone a node from multi-select, and reset one to its defaults behind a confirm.
  • A backend that dies mid-render says so, instead of naming a socket.

Fixed

  • Deleting one picture that belonged to a sweep deleted the whole sweep. The grouping it was
    written for is no longer on screen, so a selection now means exactly the pictures in it.
  • The selection ring in Results was painted under the thumbnail that covered it.
  • Star and download swapped places between the Results row and its full-screen viewer.
  • The open-flow button in the full-screen viewer was a filled button at the end of eight 48dp
    icons on a 360dp screen — what reached the phone was a sliver of purple with the icon clipped
    off. It is a normal icon in the row now.
  • A pinch-zoom in either viewer drew over the action row and the seed. Padding alone could not
    hold it; the picture is clipped to its band.

What moved, if you have saved flows

All three are rewritten on load — nothing fails to open — but the graph you saved will look
different:

  • image.upscale is dropped and auto upscale is turned on at the output it fed.
  • mask.segment_model is gone; the checkbox in the mask editor replaces it.
  • The photo node is called image.

Five node types now, down from seven.

Nightmare Mobile 1.6.0 — swappable LoRAs

Choose a tag to compare

@AbrahamPaulJ AbrahamPaulJ released this 21 Sep 16:21

Swappable LoRAs, on the NPU

Import an adapter .safetensors on Settings, then tick it on any FLUX.2 generate node and
set a strength. It binds while the render starts, so changing one or moving a slider reloads
nothing
— no relaunch, no checkpoint reload. Stack as many as you like.

Measured on device: 160 of 160 tensors bound, 22.7 s → 24.0 s at 512² on FLUX.2 Klein 4B — about
6%, and 88 MB of NPU memory. The alternative was merging a LoRA into a checkpoint on a PC, which
costs the full 4 GB per variant instead of 88 MB.

Models → Tools lists what is installed. The knob itself is a picker: every adapter on the
phone with a checkbox and a 0–2 strength slider, and a LoRA that a shared workflow names but this
phone does not have is shown in red rather than silently dropped — a graph that refuses at Run
naming a file the picker swore was not in it is the worse failure.

⚠ FLUX.2 only. A Z-Image adapter is registered by the engine and binds no tensors at all, so
the knob is greyed on a Z-Image sampler with the reason on it. The cause is not the tensor naming —
that is already handled upstream — and it is still open.

Crash reports

If the app died last time, the next launch says so, and names what it was doing — the checkpoint
and its size when a render was running. Only after a real crash: an ordinary force-stop or a
system update never raises it, because a false one is worse than none.

Any size, on DiT models

FLUX.2 and Z-Image take two sliders and render what you ask for, anywhere from 512 to 2048 in
64-pixel steps, the same grid upstream uses. The old shape dropdown could not reach 1280×960 at
all; picking 3:4 gave 1024×1792. Drop a photo on a node and it still sizes itself to that photo.

Fixes

  • An import notification that never ended. Seven paths raised a progress notification and five
    cleared it; the two that did not were both imports, so a finished import left a spinner in the
    shade until the app was killed.
  • "The backend would not start — see Settings → Diagnostics" pointed at a screen deleted three
    days earlier. The chip now names the first error the backend actually printed.
  • A LoRA is cached by name. Re-importing an adapter under a name already used served the old
    picture back on a locked seed, with nothing saying so.
  • Importing a FLUX.2 or Z-Image checkpoint no longer needs the built-in of that family installed
    first — the shared parts are fetched as needed.

Requirements

Z-Image and FLUX.2 need a Snapdragon 8 Elite. SD 1.5 runs on an 888 or newer, SDXL and Anima on an
8 Gen 3 or newer. Sideload the APK below; models are downloaded in the app.

SHA-256  afb6d51594a7b6797b9c633d13bfa698144b29717882400d5742140b5ab3aa06

DiT engine — ABI 5 (LoRA + apply mode)

Choose a tag to compare

@AbrahamPaulJ AbrahamPaulJ released this 21 Sep 13:43

Referenced by DitEngine.URL as of 1.5.553 -- do not delete.

dit/001-lora-abi4.patch + dit/002-lora-apply-mode-abi5.patch. Adds per-generation
LoRAs and a lora_apply_mode on the context so the choice can be forced.

stable-diffusion.cpp 6fe523faafcdb550acf8dd194c1b4d53a092fdba
DIT_ENGINE_ABI_VERSION 5

WARNING: dit_engine_get_api refuses a version it cannot serve. This engine needs
a backend built against the ABI 5 header and is useless to anything earlier.