Get it free
Changelog / 104 releases

What's new.
On your Mac.

Free AI video with sound on your Mac. Offline once the models download. Your work stays private. 104 releases since May 23, 2026, pulled from GitHub on every site build.

Latest release: v4.19.6 · Oct 19, 2026 · All GitHub releases · RSS

104 releases

  1. October 2026
  2. v4.19.6 fixengine

    FLUX.2 and Qwen-Edit work again on new installs

    Press Update in Pinokio, then restart.

    Fixed

    • FLUX.2 and Qwen-Edit images work again on new installs. A new release of Pillow, the image library the image engine uses, came out on October 16. It does not load on the Python version Phosphene runs on, so every install made after that day failed FLUX.2 and Qwen-Edit images at the start with “cannot import name ‘_IntegralLike’”. Videos were not affected. Phosphene now keeps Pillow on the tested version, and this Update puts it back on installs that got the new one (part of the normal Update, every model kept). If an image engine ever finds the wrong Pillow again, it stops in a second and says to press Update instead of failing with a Python error. Thanks to everyone whose anonymous error reports showed this within a day.
    • Fewer renders lost to graphics-chip errors while reading the prompt. Most GPU crashes in the last two weeks happened while a render was reading its prompt, often right after another render had finished. A setting that macOS has stopped there before now starts in a fresh engine process (about 10-15 seconds, same video). A render that a graphics-chip error (not the watchdog) stops at that point now waits 45 seconds and tries once more in a fresh process, instead of failing at once while the next job in the queue fails the same way. Stop still works during the wait.
    • Stop no longer fails in a rare moment right after a background step (the audio mux, H3 or training) has just finished: macOS answered the stop signal with “Operation not permitted” and the error escaped Stop.

    Under the hood

    • The CivitAI client, the usage log and stats reports, and the Train helpers moved out of the main panel file into their own modules (civitai_client.py, usage_stats.py, train_support.py). Nothing changes in how they behave. Thanks @blackest (#110, #111, #112).
    • An H3 install test no longer fails on Macs whose uv says “the network was disabled” instead of “offline” (@blackest, #109).

    For the maintainer

    • scripts/pinokio/engine_constraints.txt now holds pillow>=12.1.1,<13 (mflux 0.18.0 asks only for >=12.1.1). Every install into the engine venv passes the file with -c; post_update.sh step 2c asks for the range, which moves an installed 13.x back. image_engine.mflux_env_fault() judges the bundled venv’s Pillow against that line before an mflux job (fails open; custom mflux binaries are not judged).
    • Root cause: Pillow 13.0.0’s PIL/_typing.py imports from numbers import _IntegralLike at module level and relies on Python 3.15’s lazy imports never to run it; on Python 3.11 it runs and raises. mflux 0.18.0 imports PIL._typing (mflux/utils/image_util.py). huggingface-hub is not involved.
    • WarmHelper counts the runs its live process has finished (_jobs_in_proc). A setting stopped in prompt encoding before retires a warm helper; a gpu_internal / gpu_victim / gpu_other abort in encoding is re-run once after METAL_ABORT_COOLDOWN_SEC (45 s, LTX_METAL_ABORT_COOLDOWN_SEC), nothing recorded against the setting. New closed analytics fields gpu_abort_retry and helper_warm (docs/ANALYTICS.md).
    • The strict-utf8 and py_compile gates now cover the three new modules; test_split_modules_4196.py pins their wiring to the running panel, and test_prompt_enhance_endpoint restores their P after its second panel load (without it a whole-suite run failed 18 stats/CivitAI/Train tests).
    • stop_current_job treats PermissionError from os.killpg like ProcessLookupError (all five calls).
  3. v4.19.5 fixengine

    Hailuo H3 stays on the versions it was tested with

    Press Update in Pinokio, then restart.

    Fixed

    • Hailuo H3 can no longer be broken by a library update. H3 runs in its own Python environment, and until now that environment took the newest version of every library it uses on the day you installed it. Last week a library update broke video renders for some Macs (fixed in 4.19.4), and nothing stopped the same thing from happening to every new H3 install. H3 now installs a tested set of versions, every time, and this Update puts an existing H3 install on that set (about a minute, no weights downloaded). The same H3 job and seed give the same video as on 4.19.4.
    • A mismatched H3 install is caught before the render, not minutes into it. If H3’s libraries are ever not the tested versions (a manual install, an interrupted Update), H3 stops in a second, before it uses the GPU, and the card offers Repair Hailuo H3: one click, about a minute, every weight kept. LTX renders are not affected.

    For the maintainer

    • scripts/pinokio/h3_constraints.txt is the H3 venv’s known-good set, every package exact (mlx 0.32.4, mlx-vlm 0.7.8, transformers 5.19.0, tokenizers 0.23.3, huggingface-hub 2.2.0, …), captured from a from-zero 4.19.4 install. scripts/pinokio/h3_deps.sh is the one install into minimax-h3-mlx/.venv and always passes it with -c: Install / Repair Hailuo H3 / Update Hailuo H3 runner (install_h3.js), every Update (post_update.sh 8b, which now repairs a drifted H3 venv) and the new POST /h3/repair. h3_checkout.sh no longer installs anything.
    • Not the LTX venv’s set on purpose: H3 needs mlx 0.32+, the LTX engine holds 0.31.1. numpy, pillow and safetensors match across the two.
    • The panel checks the H3 venv before every H3 render (h3_env_fault: old MLX, transformers refusing its own dependencies, or a venv off the set) and reports it on /status.h3_env. LTX_H3_ENV_CHECK=0 turns the set check off for a dev box whose H3 checkout you manage yourself; an LTX_H3_PYTHON interpreter and Linux are not judged.
    • One install at a time: h3_deps.sh holds a lock in the venv, the panel holds queued H3 renders during a repair and refuses a repair under an H3 render or the Q8 build.
    • scripts/check_post_update.js fails the build on an install into the H3 venv outside h3_deps.sh, a loose line in the set, or an eager --upgrade.
  4. v4.19.4 fix

    renders work again where a library update broke them

    Press Update in Pinokio, then restart.

    Fixed

    • Video renders work again on Macs where an Update broke them. On October 9, tokenizers (a library the render engine loads on every render) put out a new version that Phosphene’s engine refuses to load. One step of Update could install it. On most Macs a later step put the old version back, but if the Update stopped in between (a dropped connection, a closed window), every render stopped at its first step with “tokenizers>=0.22.0,<=0.23.0 is required … but found tokenizers==0.23.3”. Phosphene now keeps its engine on a tested set of package versions: no install or update step can move them. If your Mac already has the new version, this Update puts the right one back.
    • A broken engine is caught before the render, not 30 seconds into it. If the engine’s packages ever stop fitting together again, the panel says so as soon as you press Generate, and the bar at the top offers Repair engine, which fixes it in a few minutes and keeps all your models.
    • A failed FLUX.2 image says why. The message used to stop at “mflux-generate-flux2 failed (exit 1)”. Now its first line carries the reason the image engine gave.

    Also

    • Contributor docs: the agent manual (CLAUDE.md) is less than half its old size. Reference material moved into docs/ files it links to. Thanks @blackest (#107).

    For the maintainer

    • scripts/pinokio/engine_constraints.txt is the engine venv’s known-good set: transformers <5.13, tokenizers <0.23, huggingface-hub 1.x, and the mlx trio. Every install into ltx-2-mlx/env passes it with -c (post_update.sh, ltx_engine_env.sh, mflux_pack.sh, a2v_stems_deps.sh, install_qwen.js, install_sharp.js). scripts/check_post_update.js fails on a bare install, and on an eager --upgrade of litellm, smolagents, huggingface-hub, transformers or mflux.
    • Update’s import gate now imports transformers and mlx_lm.tokenizer_utils, so an Update can no longer pass while renders can’t load the text encoder.
    • Analytics: install_step.cause gains mismatch. render_failed.crash_line splits gpu_other into gpu_internal, gpu_submissions_ignored, gpu_invalid_resource, gpu_not_permitted and gpu_device_removed. Traceback frames no longer decide error_class: every FLUX.2 traceback used to be filed as venv_broken because its frames name the engine venv (docs/ANALYTICS.md).
  5. v4.19.3 fix

    your GitHub login stays yours, and bug reports say what happened

    Press Update in Pinokio, then restart.

    Fixed

    • Phosphene no longer touches your GitHub login. A statistics job meant only for the maintainer (it reads Phosphene’s own download and visitor numbers from GitHub) ran on every install. If you had GitHub’s command-line tool (gh) signed in, it asked that tool for your login token once a day and used it to read those numbers from GitHub. The token went to GitHub’s own servers and nowhere else, but the job had no business on your Mac. Now it runs only on the maintainer’s Mac, which has to turn it on itself. On yours it never starts, never reads a token, never runs gh, and never writes the “stats: no GitHub token” line in your log. Thanks to the person who filed #106.
    • Report a bug asks what happened. A report could go out with nothing in it but the environment block. There is now a What happened? box at the top that needs at least a sentence. If it’s empty, the dialog says so right under the box and sends nothing. Whatever you write goes into the issue for you, and if you leave the title as “[bug]”, the issue takes the first line of what you wrote.
    • The log attached to a bug report keeps the errors. It used to be the last 50 lines. An error from a few minutes earlier could already have scrolled out, while unrelated lines took up the space. Now the report keeps the latest lines plus earlier error lines with a line of context around each, marks the gaps, and leaves out lines that have nothing to do with you. Home-folder paths are still removed.
    • Report a bug works twice in a row. After you sent one report, the button in the next one just closed the dialog.
    • Songs never wait for a lock file meant for the maintainer’s own machine. Music checked two GPU “busy” markers from the maintainer’s setup before it started. On any other Mac a stray file at the shared /tmp path could hold a song for an hour.

    Also

    • The Train tab’s time hint no longer mentions an internal tool: “Estimates assume about 30 s per step on an M4 Max; slower Macs take longer.”

    For the maintainer

    • The panel’s repo-stats fetch is opt-in only. Start the panel with PHOSPHENE_STATS_FETCH=1 to turn it on (scripts/STATS_DASHBOARD.md). The daily archive comes from the launchd job com.mrbizarro.phosphene-stats-fetch, and /stats reads it the same way either way. Without the opt-in, POST /stats/refresh answers 409.
    • Music waits on the lab GPU locks only on a Mac with ~/.phosphene-test-rig, or with PHOSPHENE_MUSIC_WAITS_GPU_LOCK=1 or PHOSPHENE_MUSIC_TAKES_GPU_LOCK=1. PHOSPHENE_MUSIC_WAITS_GPU_LOCK=0 turns it off.
    • POST /panel/bug-report refuses a body whose “What happened” section is shorter than 10 characters, with a 400 and field: what_happened.
  6. v4.19.2 fix

    Ingredients works again, High 720p renders High, and fewer renders fail

    Press Update in Pinokio, then restart.

    Fixed

    • Ingredients puts your reference pictures in the video again. On LTX-2.3 the reference adapter was squeezed into the 4-bit model and most of it was lost, and the reference sheet was then left out of the render, so the clip came back without your people, props or places. The adapter is now applied exactly, and the sheet is held the way the official recipe holds it. Thanks @Techy2023 for the report (#101).
    • Switch the LTX generation (2.3 or 2.5) from the panel. When both are installed, a switch sits beside the Remix tools and in the engine menu, and the Ingredients chip switches to 2.3 for you. The panel restarts once. LTX-2.5 stays the default; nothing changes until you switch. Thanks @blackest (#102).
    • “High - 720p” in Video > Text renders High - 720p. The chip queued a Standard render instead.
    • Upscale x2 refuses a result bigger than QHD (2560x1440, either way up) before it starts, instead of running out of memory after a long render. Thanks @blackest (#103).
    • Stop early shows up on a One Shot, as it does on a single render. Thanks @blackest (#99).
    • One Shot’s “Split my prompt into beats” keeps a spoken line whole - a line ends inside its closing quote and is never cut in two - and says how many sentences did not fit. Thanks @blackest (#97).
    • One Shot only checks lip-sync on a part that has a spoken line of its own, instead of retaking a silent part twice. Thanks @blackest (#98).
    • A missing picture, keyframe or LoRA is caught when you press Generate, not when its turn comes - including a Batch of image prompts, and Keyframes with no start or end frame.

    Room tone

    • Room tone now sits at -38 LUFS by default, about 20 dB under the dialogue: a bed you stop hearing that still fills every gap a cut would drop to silence. -27 put a hum under every line. The slider still goes from -45 to -18, and edits you already made keep their level. Thanks @blackest (#100).

    When macOS’s GPU watchdog stops a render

    • On M1/M2 Macs most of these stops happen while the prompt is being read, and that costs the same at every size. The message no longer tells you to try smaller; it says to quit apps that use the graphics chip and press Retry, and that setting pauses for 15 minutes instead of a day.
    • A crash that is not the watchdog is no longer reported as one, and the panel now reads the engine’s last line even when it ends without a line break.

    Installing

    • Vocal separation (“Listen to the voice only”) rides out a slow or flaky connection: the model download keeps going while it makes progress, the package step waits longer and retries more, and a voice-only render can try the install again 10 minutes after a network failure.

    Linux on Apple Silicon - community-maintained, best effort

    • Phosphene can now run on Linux on M1/M2 Macs (Omarchy, MLX through the omarchy-mlx Vulkan build, pinned by sha256). Pinokio still installs the Mac version; Linux is installed with bash scripts/linux/install.sh and is not covered by our release tests. Details in docs/LINUX.md. Thanks @joshuaswarren (#94).

    For the maintainer

    • render_failed gains two closed fields for an engine that died from a signal: crash_line (the class of its last native error line) and crash_phase (start, encode, load, denoise, decode) - docs/ANALYTICS.md. An unexplained SIGABRT is now native_crash, not metal_watchdog.
    • The fleet timings table is rebuilt (129,641 renders, 75 days).
    • The owner-only stats dashboard (/stats) counts the whole archive, keeps recovered traffic days and says when its data is stale.
  7. v4.19.1 fix

    voices train correctly again, and a failed training says why

    Press Update in Pinokio, then restart.

    Training

    • Voices you train with a character save correctly again. 4.19.0 fixed the scrambled save for characters (#62), but the voice half still went to disk in the old scrambled order: the file loaded and changed the sound, but did not carry the voice you trained. New voice trainings save correctly now.
    • Update repairs voices trained on 4.19.0, the same way it repaired characters: only files trained in Phosphene, the original kept next to it as <name>.safetensors.scrambled.bak. Restart after updating so the repaired files are loaded.
    • When a training run stops, the Logs say why - out of memory, a missing file, a full disk, a missing package - in the trainer’s own words, instead of only “training exited with code 1”.
    • Starting a training run before its weights are downloaded now stops at once and says so. Start was never blocked by the “Get ready to train” download card: without the LTX-2.3 base pack the run died after a few seconds with a cryptic error, and without the ~21 GB dev transformer it died only after several minutes of preparing your photos. Now it checks first and tells you to click Download all.
    • A run whose loss turns into NaN now stops after 10 steps instead of training for hours and saving a file that does nothing.
    • Training gets the memory the render engine was holding. If you rendered before starting a training run, the LTX engine stayed loaded for up to 30 minutes and competed with the trainer for memory. It is now released when training starts and loads again on your next render.

    Fixed

    • The Stop early button no longer covers the time left. On the live preview it stretched across the whole bar and hid “~N min left”. Thanks @blackest (#95).

    For people running the tests

    • The music engine’s --help check finds the engine where the installer puts it ($LTX_MUSIC_ROOT, default yue2-mlx in the app folder), so it runs on every install that has music instead of skipping. Thanks @blackest (#96).

    For the maintainer

    • Failed trainings now send one extra closed field on render_failed: train_error = oom / missing_file / caption_check / disk_full / import_error / nan_loss / other (docs/ANALYTICS.md). The error sentence and its error_class are unchanged, so the old series continues.
  8. v4.19.0 featurefixengine

    Hailuo H3 learns keyframes, extend, lip-sync and sound; trained characters work again

    Press Update in Pinokio, then restart. The Hailuo H3 engine updates with it.

    Trained characters and voices work again (#62)

    • Characters you trained in Phosphene since June now look like the person you trained. Training itself worked; the very last step, writing the LoRA to disk, put its numbers in the wrong order (a change in a library every install picked up after 9 June). The file still loaded and changed the video, so nothing flagged it - it just carried no likeness, at about half the strength a real one has. Voice LoRAs were saved the same way.
    • New trainings save correctly.
    • Update repairs the ones you already have, on its own. It checks every character and voice trained in Phosphene, repairs only the ones saved in the wrong order (exactly - no numbers are lost), and keeps the original next to it as <name>.safetensors.scrambled.bak. LoRAs you downloaded are never touched. Restart after updating so the repaired files are loaded.
    • The WEAK badge on a repaired character goes away (it was measured on the scrambled file).
    • Found, fixed and proven by @tanis2000 - thank you.
    • Also from @tanis2000: a training run whose existing captions use a different trigger word than the one you typed is stopped before it starts (it used to train the old word silently), and the loss shown during training is an average you can actually read.

    Hailuo H3: four new things it can do

    • Keyframes on H3. Give it the frame the clip should end on, a start and an end frame, or stills at exact moments in between. Each still lands on its frame. (Start frame optional.)
    • Extend with H3. Continue any clip in your gallery (H3 or LTX) by up to 15 seconds. The player’s Extend button switches to H3 for H3 clips.
    • Lip-sync on H3. Lip-sync has an engine choice now: LTX or Hailuo H3. On H3 your audio is kept exactly and only the picture is made to match it - you get your own audio file back. For songs, keep Listen to the voice only on, so the face follows the singing and not the drums.
    • Add sound to a silent clip. New Add sound mode (H3) and an Add sound button on the player: your video is kept exactly as it is and only the sound is made.

    Hailuo H3: longer shots that hold together

    • 10 and 15 second H3 shots join more smoothly. Each 5 s piece now sees the end of the one before it, picture and sound, instead of a single still - the jump in sound level at the join is mostly gone, and the colour is eased across it. It costs about 12% more time.
    • Fast HD (new H3 quality, opt-in): renders the shot at a small size quickly, then LTX’s x2 Upscale & Face Fix takes it to 1280x768. About a third quicker than High, with a slightly softer face - good for previews.

    Extend no longer wears your clip down (#48)

    • Extending a clip again and again used to make it worse each time - the picture turned grainy, “made of particles”, and the sound got mushy, because every round re-made the whole clip, including the part you already had. Now the part you already had is delivered untouched, and only the new part is encoded. Applies to LTX and H3 Extend. Thanks @pulgarax for sticking with this one.

    Fixed

    • Hailuo H3 no longer leaves a loose .wav beside every clip. The engine wrote each render’s sound to a separate .wav next to the video and never removed it, so your Audio gallery and the Editor’s sound list filled up with copies. New renders clean up after themselves; .wav files from earlier renders are left where they are.

    Updates and installs

    • New installs get the right MLX again. Since late August a fresh install ended up on MLX 0.31.2 - the version Phosphene deliberately avoids - because a library it uses started asking for a newer MLX and the installer let it move. Updating already put the right one back; now a fresh install does too. If you installed after late August and never pressed Update, press it once.
    • The Hailuo H3 engine now moves only with a Phosphene release. Before, a change to the engine’s own repository reached every install at its next Update, with no Phosphene release behind it. Now each Phosphene version runs the exact engine version it was tested with.

    For people running the tests

    • The release gates now pass on other Macs, not only mine: thanks @blackest (#91: a Node fix that also matters on Node 22; #92: six tests that read the machine they ran on) and @mrapolo2020 (#90, a very careful report). Every test now runs in its own empty folders, the tests that need a real install skip with the reason, and 17 test files that had been reporting PASS without running anything now really run.

    For the maintainer

    • H3 runner flags used: --last-frame, --keyframe PATH@WHEN, --chain-context-frames, --seam-colour-frames, --extend-from/--extend-frames, --audio-drive/--audio-mux, --video-to-audio. The engine pin is H3_PIN_SHA / H3_PIN_REF in scripts/pinokio/h3_checkout.sh (phosphene/v4.19.0 = 3f6c75c).
    • python -m lora_lab.repair_scrambled_lora FILE ... (report only) / --in-place / --auto MODELS_DIR repairs by hand.
    • Time estimates refreshed from the newest renders (116,945 events).
  9. v4.18.0 feature

    your gallery plays itself, and your audio goes where it is needed

    Press Update in Pinokio, then restart.

    Play all

    • Watch everything you made, full size, hands off. A Play all button sits in the Outputs header (and in the expanded player). Each clip plays once and the next one starts; each photo stays on screen for as long as you choose (Photos stay 1-10 s); a song plays to its end. It follows the gallery’s own order, so the Videos / Photos / Audio filters and the search decide what plays.
    • The controls get out of the way. While it plays and the mouse rests, the bar, the name and the close button fade out; move the mouse (or tap) and they come back.
    • The bar under an expanded output: previous, Play all / Pause, next, “4 of 37”, Photos stay, and full screen. P pauses and resumes, the arrow keys step, Esc closes. On a touch screen, swipe left or right to step and swipe up for the next one.
    • Fixed on the way: pressing an arrow key in the expanded player also started the same clip in the player behind it, so you heard it twice.

    Use this audio for…

    • Any audio in Outputs goes straight to where it is needed - no trip to Finder. Hover an audio card and press Use…, or press Use this audio for… under the player:
      • Lip-sync - the Lip-sync form opens with the file in its Audio slot and Duration set to its length; add a picture of the face and Generate.
      • Music video - your pictures, planned and cut to it.
      • Soundtrack for a video - image-to-video with this file as the clip’s sound (switches to LTX if Hailuo H3 was selected, and says so).
      • Cover it - the Music Studio reads the tune and sings it fresh (opens the music engine’s install card if it is not installed yet).
    • A song’s menu in the Audio tab offers the same.
    • Nothing renders until you press Generate.

    Enhance knows your LoRAs

    • Enhance reads the LoRAs you have switched on. It reads each one’s guide (the one Write a guide makes) or, if there is none, the creator’s description from CivitAI or Hugging Face, and uses it to phrase your scene the way that LoRA expects. The notes are treated as reference only: they never add a subject, place or style you did not ask for.
    • A trigger word is never lost. If the rewritten prompt leaves out a LoRA’s trigger word, Enhance puts it back at the front. The line under the result says which notes it read and which trigger word it added.
    • Lip-sync’s Enhance does the same, and keeps the trigger words of the LoRAs that ride along from the Video tab. It no longer stops the page with a pop-up: the new prompt is applied with an Undo in the message.

    Downloads

    • A CivitAI LoRA download shows how far it is (“Downloading 41% - 120 of 290 MB”) and has a Cancel button. Cancel stops it straight away and keeps nothing half-downloaded. (Hugging Face downloads cannot be stopped part-way yet.)

    Fixed

    • Messages show their words again. Since 4.17.0 the small messages at the bottom of the screen (“Moved to Trash”, “Hidden”, an error from Enhance, …) showed only an icon and an x, because the close button had grown to the full width of the message. They read normally again.

    For the maintainer

    • /prompt/enhance takes loras (JSON list of installed LoRA paths) and returns lora_notes_used / lora_triggers_added. /civitai/download takes an optional token; new GET /civitai/download/state and POST /civitai/download/cancel (docs/API.md).
    • Time estimates refreshed from the newest renders (112,495 events).
  10. v4.17.5 fix

    renders that recover when macOS stops the GPU

    A bug-fix release. Press Update in Pinokio, then restart.

    M1 and M2 Macs: the “GPU watchdog” loop is over

    • macOS stopping a render no longer means the same failure again and again. On M1 and M2 Macs, macOS sometimes stops a render because one piece of GPU work ran too long (“the macOS GPU watchdog killed a Metal command buffer”). One Mac hit it 48 times in a day on the same size. Now:
      • on M1 and M2 Macs the GPU work is sent in smaller pieces from the start (the picture is exactly the same);
      • if macOS stops a render anyway, Phosphene renders it again straight away in short GPU steps (smaller still, a little slower), and the log says so;
      • that size then starts in short steps on this Mac every time, and the Queue row says so;
      • if even short steps are stopped, that size is paused on this Mac for 24 hours (or until the next update) and the card offers Retry smaller, instead of failing again.
    • The other name macOS uses for the same stop (“Impacting Interactivity”) is now recognised as the GPU watchdog.

    Jobs that could only fail are refused up front

    • Upscale & Face Fix with no clip, Control with no clip, Image mode with no picture, Lip-sync with no song - and an unknown mode sent through the API - are refused before they are queued, in the form’s own words, instead of waiting their turn and failing as a red card. Retry does the same for a job whose file is gone.
    • A video LoRA picked for a song is named and refused before the music engine starts (”… is a video LoRA (LTX / Hailuo H3), not a music voice”), and the music LoRA list marks it.

    Installs and updates

    • A failed install says why. If the render engine’s packages do not install, the message (and the Repair engine bar) now says whether the network, a timeout, the disk or the package installer was the problem. An install that was still running when the panel opened is no longer reported as broken.
    • The voice separator survives a bad connection. Its 80 MB model download now resumes where it stopped, with a timeout and four attempts, and a dropped connection during its package install is retried. When it still fails, the Lip-sync card says why, next to Try again.
    • “Update now” on the version you already have now says “Already up to date - nothing to restart” instead of asking for a restart that changes nothing. A version you already run is no longer offered as an update.
    • “Update now” finishes the update the way Pinokio’s Update does (it runs the same install step), and waits for Prompt Enhance or an image render to finish before it starts.
    • Exports find ffprobe. “ffprobe not found on PATH” when Phosphene had found ffprobe in a different folder from ffmpeg is fixed.

    For the maintainer

    • New anonymous fields (docs/ANALYTICS.md): gpu_steps, watchdog_retry, watchdog_phase on render events; cause on install_step (engine_env) and separator_install. Closed words, no paths.
    • Time estimates refreshed from the newest renders (106,665 events).
  11. v4.17.4 fix

    fewer renders that fail before they start

    A bug-fix release. Press Update in Pinokio, then restart.

    Renders that used to fail at once

    • A stray step count no longer fails the render. “steps=9 is above the 8-step distilled schedule” (and the “below 8” twin) came from a hidden number the fast model cannot use: Hailuo H3’s step count was left behind when you switched back to LTX, or a Params restore / Retry carried it over. Quick, Balanced and Standard now always run their 8 steps, with one note on the job, and switching back from H3 resets the count.
    • A missing picture, audio or LoRA file now offers Open in the form to pick it again, instead of a Retry that fails the same way.

    Lip-sync

    • The voice separator installs itself. If “Listen to the voice only” has no separator (the panel’s own Update button pulls new code but does not run the install step that adds it), Phosphene now installs it in the background when it starts, once, about 95 MB. Lip-sync clips that were queued wait for it (“Installing vocal separation…”) and then render, instead of being refused one after another.
    • A refused render no longer counts toward the “paused the queue after 3 failures” safety stop, so one refusal cannot hold up renders that would work.

    Install and repair

    • Install retries the engine step and checks it worked. A dropped connection while the render engine’s Python packages install is retried up to 3 times, and Install now stops with a clear message if they still did not land, instead of carrying on to a 37 GB download into an engine that cannot render.
    • One-click Repair engine. If the render engine did not finish installing, a bar at the top of the panel says so and offers Repair engine: it re-installs only the engine’s Python packages, in a few minutes, with every model kept and no need to stop Phosphene. While Pinokio is still installing, the bar says that instead. A render that fails this way offers Repair engine, not Retry.

    For the maintainer

    • New anonymous event separator_install (outcome, which path ran it, a closed error class; no paths) - see docs/ANALYTICS.md.
    • Time estimates refreshed from the newest renders (103,692 events).
  12. v4.17.3 fix

    lip-sync that follows the voice, and errors that say what to do

    A bug-fix release. Press Update in Pinokio, then restart.

    Lip-sync

    • Lip-sync listens to the voice, not the whole song. “Listen to the voice only” has been on by default, but nothing installed the voice separator, so every lip-sync clip was driven by the full mix (drums and bass included) and the mouth hedged. Install and Update now set it up (about 95 MB, once). If it is missing, the Lip-sync form says so and offers Install.
    • A character LoRA no longer stops the mouth moving. On the High lip-sync lane the LoRA now shapes the face detail only, not the performance, so you keep the likeness and the singing.
    • A Lip-sync clip that is too long for a smaller Mac now offers Open in Lip-sync to split (render the song as a sequence of clips) instead of a Retry that is refused again.

    Honest times

    • Estimates no longer borrow a much bigger Mac’s numbers (a 64 GB Mac was shown the time a 128 GB Mac takes), and where several groups of Macs are combined the range now covers all of them.
    • Estimates are refreshed from the newest real renders across the fleet.

    Errors that say what to do

    • A seed pasted from another app (a negative number, or more than 19 digits) no longer fails the render. Text in the Seed box means random.
    • A damaged model file (an empty or cut-off config or tokenizer, usually an interrupted download) is caught when the panel starts and offered a one-click Repair. If a render hits one, the card says “A model file on this Mac is damaged” and points at Repair instead of Retry.
    • When the render engine crashes, the message now names the cause (the macOS GPU timeout, or out of memory) and offers Retry smaller, instead of “helper pipe closed without an event”.
    • A render this Mac’s hardware cannot run no longer offers a Retry that is refused the same way.

    Also

    • The maintainer stats page has a time-range control.
  13. September 2026
  14. v4.17.2 fix

    v4.17.2

    Housekeeping: internal notes and example paths removed from the public repo.

    No behavior change — this release cleans development notes and machine-specific example paths out of the public tree. Press Update in Pinokio, then restart.

  15. v4.17.1 fix

    the clip toolbar fits the player

    Read release notes

    How to get it: press Update in Pinokio, then restart Phosphene.

    • The clip toolbar fits the player again. 4.17.0 added New take, Retake a moment, To film and Finish to the player’s toolbar, and at a laptop-sized window (1280-1440 px) their labels wrapped over two or three lines and covered the clip’s name. The toolbar now fits the player: when space is short it drops the secondary labels first (the icons keep their tooltips), and the clip name stops where the toolbar starts.

    Everything else is in the 4.17.0 notes: estimates for your Mac, faces kept in portrait and phone photos, Undo on Stop / Clear / Hide, Lip-sync as a Video mode, and an Editor with Sync to song, Match colour, slip and roll edits, Replace and versioned renders.

  16. v4.17.0 featurefix

    honest times, faces that survive, and films you can fix

    Read release notes

    How to get it: press Update in Pinokio, then restart Phosphene. Nothing new to download.

    We sat down and used Phosphene the way you do - every flow, on small and big Macs, at laptop and desktop window sizes - and wrote down every place it lied, lost work or made you hunt. That was 222 things. This release fixes almost all of them.

    Times and sizes you can trust

    • Estimates are for your Mac now. Before, every LTX estimate was the time on our fastest Mac, so a 16 GB Air saw “~3 min” for a 15-minute render. Each quality now shows a range for your chip and memory, taken from real renders on Macs like yours, and it corrects itself from your own finished renders.
    • Start & end frame, Extend, Lip-sync and One Shot show real prices before you press Generate (they used to show the Balanced price while running a much heavier render). Queue rows and the queue total use the same numbers.
    • After you press Generate, the progress card says which speed and quality it is really running, and the time left counts every window still to come.
    • No silent downgrades. On Macs under 48 GB, 16:9 stays 16:9 (it used to turn into a 2:1 strip). Every size chip shows the size you will actually get. Extend and Start & end frame say when your Mac caps the size.
    • New shapes: 4:5 and other social formats, sized for your Mac.

    Faces survive

    • Phone photos come in the right way up (EXIF rotation), and HEIC photos are converted instead of failing later.
    • Portrait photos stay portrait. Image to video, Hailuo H3 and Lip-sync pick the shape from your photo, and a crop preview lets you drag the framing so the face is not cut off.
    • The clip keeps your original photo and the crop you chose, so Load Params brings back exactly that.

    Nothing destroyed by one click

    • Stop is greyed out when nothing is running, asks before stopping a long render, and can stop after this window / part so finished work is kept.
    • Clear queue and Hide clip have Undo. Clear queue shows how many jobs it will clear.
    • One Shot keeps finished parts when it is stopped or fails: Resume, or Join what’s done.
    • Your Video form (prompt, pictures, audio, settings) comes back after a reload.
    • Deleting a storyboard row is behind a menu and asks first.

    Do it again, or fix one bit

    • New take on every clip: same recipe, new seed, one click. Also on storyboard shots.
    • Retry smaller on an out-of-memory failure really renders smaller. The Metal watchdog crash now tells you what to change instead of “send a crash log”.
    • Retake a moment: re-render a stretch of a clip (from / to seconds) and keep the rest.
    • Draft to Finish for LTX: render a quick draft, then finish the one you like at higher quality with the same seed.
    • Edit a queued job before it starts; move jobs up and down the queue.

    Lip-sync is a Video mode now

    • A Lip-sync chip sits next to Text, Image, Start & end frame and Extend. Drop a voice or song and a face.
    • The clip length follows your audio, a 3 s draft checks the mouth before you commit, and every lip-sync clip gets a sync verdict (mouth follows the voice / borderline / weak).
    • Continue the song starts the next clip where this one’s song leaves off, anchored on a closed-mouth frame.
    • On smaller Macs, Split into clips renders a long song as a chain of clips instead of refusing.
    • A long Windows clip that fails partway keeps the windows it finished, with Continue to pick up from there.

    Films: Storyboard and Editor

    • Sync to song: clips that were rendered for a song can be lined up with it automatically, and the Editor shows how many frames each singing clip is off.
    • Match colour across the film, plus per-clip exposure, temperature and tint, and a film look that also reaches Premiere / Resolve / After Effects exports.
    • Slip and roll edits, frame timecode, Replace clip, and a take history: when a shot is re-rendered, the Editor offers the new take for the clip on the timeline.
    • Renders are versions, never overwritten, listed under Films, and you can cancel one. Optional -14 LUFS loudness for the final mix.
    • A missing clip blocks the render and is named, instead of silently dropping out. Gaps stay black.
    • “Rewrite N shots” rewrites all of them, not just the first. Reordering shots no longer puts clips on the wrong shot. Opening a film from another tab opens that film.
    • Re-planning a music video keeps your old Editor cut as its own draft. Stills first no longer waits forever on your own photo.
    • A queued film render uses the film’s aspect, and Cancel really stops it.
    • The Editor’s save is safer: a reload, a slow save or a second window no longer loses edits.

    Hailuo H3

    • A prompt helper (structure, a dialogue line, a word budget), and per-window prompts that add to the main prompt instead of replacing it.
    • Clearer tier and speed labels, LoRA strength totals, keyboard control of the engine menu.
    • Install and build check disk space first and say what is missing.

    Easier to find, easier to read

    • A Make your first clip card on a new install, with starter prompts and the time on your Mac.
    • Error messages say what to do next and point to real places (there was no “Settings > Models”; now there is a Models section in Settings).
    • The form fits at 1280-1440 px windows. Hidden controls stay hidden. Gallery cards show a poster frame, a prompt snippet and the real size, and work with the keyboard.
    • Japanese, Chinese and other non-Latin file names are kept; 「」 quotes count as dialogue; a hint offers to translate a non-English prompt.
    • Toasts stay until you close them when they matter.

    Privacy

    • Bug reports no longer include your home folder path (which is often your name), and crash reports are only attached when they come from Phosphene.

    Thank you to everyone who sent reports from the field.

  17. v4.16.3 fix

    three fixes from the field

    Read release notes

    Three fixes from the field.

    • Hailuo H3 progress says how long is left. The Now card read “27m 23s / ~18m 21s” in the middle of a 15 s clip, which looked like an 18-minute total. It now reads “27m 23s in · ~18m 21s left”, and the estimate counts the model load of every window still to come. Thanks @abandonedmuse.
    • A LoRA with a cut-short download is named, not a crash. An interrupted download keeps the start of the file, so the LoRA looked fine until the render died with “cannot reshape array of size … into shape …”. Now the LoRA list marks it unavailable and the render is refused before it starts: “style.safetensors is incomplete: the file is X MB but it should be Y MB, so its download was cut short. Delete it and download it again.”
    • An ffmpeg that can’t make H.264 is skipped. Some ffmpeg builds have no libx264 encoder; if that was the first one Phosphene found, every render failed at the very end with “Unknown encoder ‘libx264’”. Phosphene now checks each ffmpeg it finds and uses the first one that can encode H.264, and says at start-up which one it skipped.

    Press Update in Pinokio, then restart. No new downloads.

  18. v4.16.2 fixengine

    the outputs list stays on screen; honest H3 times on 36-59 GB Macs

    Read release notes

    Two fixes reported by Pinokio users on the 4.15 post.

    The outputs list stays on screen. On a 1080p screen, a square or wide clip made the preview so tall that the Outputs pane went off the bottom of the window: no way to select a clip or reach its delete button except by making Pinokio’s window narrower. The preview now scales down to leave the Outputs header (filters, search) and one full row of clips always visible, and keeps the clip’s own shape. When a clip had to shrink well inside its column, its action buttons move beside it, the way they already did for portrait clips. On a big screen a 16:9 clip still fills the column, as before. Songs keep their cover and Play button at full size. Thanks @fuschichou.

    Honest Hailuo H3 times on 36-59 GB Macs. Every H3 estimate was measured on a 64 GB Mac. Below 60 GB, H3 runs its reduced-memory engine, and anonymous usage data from 60 days of renders shows 10 s and 15 s clips there take about 1.3x as long as the same chip on a bigger Mac (single 3-5 s clips about 1.07x). The estimates now include that: a 15 s Draft on Fast on an M4 Pro 48 GB reads about 22 min (it said 17), on Best about 42. Under a 10 s or 15 s length on those Macs the panel also says why, and to quit other apps: if macOS runs out of memory and swaps, a render can take far longer than any estimate. Also worth checking: Fast is a one-click 180 MB install; until it is installed, a render runs the full steps, about twice as long. Thanks @abandonedmuse.

    Also: a still or clip that finished loading after you had already clicked another one could leave the preview in the wrong shape; fixed.

    How to get it: press Update in Pinokio, then restart Phosphene. No downloads.

  19. v4.16.1 fix

    720p and 1080p exports fill the frame instead of adding black bars

    Read release notes

    No more black bars on a 720p or 1080p export.

    Hailuo H3’s Draft (640x384) and Standard (768x448) canvases are close to 16:9 but not exactly. The 720p/1080p export used to pad the difference with black: 40 px down each side of a Draft clip, 23 px on Standard. LTX’s Standard (1280x704) got thin bars top and bottom the same way.

    • Now the picture fills the frame. A canvas within 8% of 16:9 is scaled to cover 1280x720 (or 1920x1080) and a few pixels are trimmed at the edges instead: 24 px top and bottom on H3 Draft, 13 px on Standard, 14 px left and right on LTX Standard. Nothing is stretched.
    • Canvases far from 16:9 are unchanged. Square and 4:3 still get bars, because cropping them would cut too much of the picture.
    • H3 High (1024x576) is exact 16:9, so it scales with nothing trimmed, as before.
    • The Sharp (PiperSR) export follows the same rule, and the note under the Export row says what will happen (“12:7 fills 1280x720 - 13 px trimmed top and bottom, no bars”).

    Thanks to @ownercasablanca on X for the report, and for the H3 numbers from a 48 GB M5 Pro.

    Press Update in Pinokio, then restart. No new downloads. Clips you already exported keep their bars; render again to get the new framing.

  20. v4.16.0 featurefixengine

    the Music Studio, and more than 70 fixes

    Read release notes

    Phosphene 4.16.0 - the Music Studio, and more than 70 fixes

    How to get it: press Update in Pinokio, then restart Phosphene. The Music Studio’s optional voice and style pack (~210 MB) downloads only when you ask for it.

    New: the Music Studio

    Music used to be a form that dropped a WAV into the gallery and forgot it. Now a song is something you keep working on.

    • Every song keeps what made it. From a finished song you can make a New take (same words, a new performance), Re-roll the sound (same performance, a new recording, about a quarter of the song’s length in time), put a New style on the same score, Cover it, or Edit the score and render your edit.
    • The Song card under the player shows the title, the style, the sheet music, key, meter and tempo, the lyrics, and a link back to the song it came from.
    • A song list, not a grid. The Audio view lists songs with cover art, style chips, length and one menu with every action. Takes sit under the song they came from. A player bar at the bottom plays through the list, with a waveform you can click to seek.
    • Write, Cover a song, Get the score. The composer has three tasks. Write lyrics drafts tagged lyrics from a concept, lyrics are edited section by section (rewrite one section, reorder, add, remove), and Simple mode turns one description into a title, a style and lyrics you can edit before anything renders. Takes makes several songs from one form.
    • A Voice & style LoRA picker loads LoRAs for the music engine: an optional ~210 MB pack, or your own files. With the pack, Instrumental uses a dedicated adapter and leaves the vocals out more reliably.
    • Music video from a song. Give it the song and your pictures; it plans a storyboard with singing shots on the vocal sections and B-roll cut on the beat, and renders the film with the song as its soundtrack.

    Fixes

    Editor and storyboard films

    • Saving in the Editor no longer drops transitions.
    • A slow save no longer marks newer changes as saved, and Render waits for a save in progress instead of exporting the old cut.
    • Switching films can no longer load one film’s cut, draft or soundtrack into another.
    • Two boards no longer overwrite each other’s exported film, and a failed re-render keeps the last good film.
    • Storyboard shots that fail stop retrying forever; Stop Film also stops its stills; a shot you cut stays cut.
    • Still-image fades reach the final video.

    Render queue and Stop

    • Stop works on image jobs that have not started yet, on a helper that is still starting, and on the final join of a One Shot take. A stopped job no longer ends as “done”.
    • Upscaled exports no longer replace another clip with the same name.
    • A full disk while saving a clip’s details is reported as a failure, not a finished render.
    • The saved queue can no longer be rolled back to an older copy when two things save it at once.
    • Enhance Prompt waits while Hailuo H3 or music is using the GPU.

    LTX video

    • Extend, first/last-frame (FFLF) and Audio to Video on Q4 now apply the LoRAs you picked. Before, they rendered without them and the clip’s details still listed them.
    • Load Params brings back Audio to Video clips as Audio to Video (not Text), sliding-window clips with their per-window prompts, and the take’s own settings for One Shot.
    • Every sliding window renders its own prompt line, including the first.
    • A folder name with an apostrophe no longer breaks the final join of a long clip.
    • Size limits for your Mac keep the shape you asked for, stay on the model’s grid, and the clip’s details say what actually rendered.
    • On Macs under 48 GB, Audio to Video refuses lengths that would stall the GPU, with a message, instead of crashing.
    • One Shot’s live preview follows the part that is rendering.

    Hailuo H3

    • Video decode runs in FP16 by default: the same picture, about 14% faster decode and about 1 GB less memory at the end of a render. Turn it off with PHOSPHENE_H3_VAE_FP16=0 in Pinokio’s ENVIRONMENT if you ever need to.
    • A LoRA installed from the browser gets the same strength correction as one added by file, and Load Params / Finish no longer re-apply an old strength correction twice.
    • A half-downloaded compact engine no longer shows H3 as ready; the Build step is offered instead.
    • Building the compact engine reserves the memory it needs: a render started during the build waits.
    • LoRA files with Japanese-only names are accepted.
    • Internal reference crops no longer push your images out of Recent uploads.
    • A half-installed engine is no longer reported as “the reference image can’t be read”; it says to repair the engine.

    Install and Update

    • Update rebuilds an engine environment that has Python but no packages (it now installs everything the engine imports).
    • A broken engine no longer auto-starts; the sidebar shows Repair first, and while the panel runs it says to stop it and repair.
    • Updating from inside the panel and from the sidebar both stop safely when local changes are in the way, and never delete files you did not commit. A music-engine change now asks for the full update it needs.
    • Cancel really cancels a model download. Repair no longer deletes files before it knows it can download them. A corrupted partial download is discarded instead of blocking Resume forever.
    • The LTX-2.3 Q8 sidebar download uses the right source.
    • H3 install and repair use your relocated engine and weights folders (LTX_H3_ROOT / LTX_H3_MODELS), paths with spaces or Japanese included, and say what is missing from an incomplete folder.
    • An interrupted copy of the cover models is no longer treated as complete.
    • The manual install steps in the README work as written.

    Images, gallery and settings

    • Reference Edit’s Fast preset runs at the guidance it was made for, so it no longer burns in.
    • Deleted or hidden outputs no longer come back in Show all; gallery search finds Image Studio prompts, seeds and sizes.
    • Two images deleted with the same name in the same second both reach the Trash.
    • Two panels saving settings at once no longer lose a key.
    • Escape and keyboard focus work in every dialog.
    • Failed image jobs no longer send reference file names in anonymous usage data.

    Music (fixes to the new studio found before release)

    • Restyles and score edits use the length on screen; actions act on the song you clicked; an edited score keeps the song’s voice and instrumental choice; two edits in the same second no longer overwrite each other; Cover without a recording says so instead of composing something else; a comma in a LoRA file name no longer drops the LoRA; download progress and errors stay visible; room tone from a film uses the panel’s ffmpeg.

    Also in this line

    • 4.15.4 closed a security hole in the image endpoint (update if you have not).
    • 4.15.3 told 36-59 GB Macs the truth about Hailuo H3: it runs from 36 GB on its compact engine.

    Found by a review of seven user flows, each fix with a test. Press Update, then restart.

  21. v4.15.4 fix

    security fix: the image endpoint serves images only

    Read release notes

    Security fix: the image endpoint now serves images only

    Please update.

    Phosphene’s panel uses a local address to show images (/image). It checked that a requested file was inside Phosphene’s own folders, but not that it was an image. One of those folders holds the settings file with your saved Hugging Face token, CivitAI key and PostHog keys, so anything that could reach the panel could read that file through the image address.

    Who could reach it. The panel listens on this Mac only (127.0.0.1). Reading the file needed another program running on your Mac, another user account on it, or a panel you had exposed to your network (a tunnel, a proxy, or Pinokio’s share option). A web page you visited could not read the answer.

    What changed. /image now serves image files only (png, jpg, jpeg, jpe, jfif, webp, gif, bmp, tif, tiff, avif, heic, heif). Every other file is refused before it is opened, thumbnails included. Galleries, previews and reference images work as before.

    What to do.

    • Press Update in Pinokio, then restart Phosphene.
    • If you ever exposed the panel beyond your own Mac, rotate the keys you saved in Settings: create a new Hugging Face token and a new CivitAI key, then paste them into Settings again.

    Found by a code review of the panel’s routes.

  22. v4.15.3 fixengine

    Hailuo H3 on a 36-59 GB Mac, said plainly

    Read release notes

    Hailuo H3 on a 36-59 GB Mac, said plainly.

    If Phosphene told you Hailuo H3 needs 64 GB: it does not. From 36 GB, H3 runs on its compact Q8 engine, which the H3 install builds by itself at the end.

    • The install card said “needs 64 GB unified memory”. No part of Phosphene ever required 64. The card now states the real floors (36 GB+; 60 GB+ also unlocks the full bf16 engine), and on a 36-59 GB Mac it says “This Mac runs it.”
    • The install button is where the card says it is. “Install Hailuo H3 (second video engine, ~75 GB)” is now in the Pinokio sidebar while Phosphene is running. It used to appear only with the panel stopped.
    • Already have the H3 weights but not the compact engine? The sidebar offers “Build Hailuo H3 compact engine (weights kept - no re-download)”. About 5 minutes, nothing to download. The panel’s message names that entry (or Repair, if the engine itself is broken) instead of one that is not there.
    • The Settings card is an offer, not a warning, when H3 was never installed.
    • Installing while you render: the compact-engine build now waits for a running render to finish before loading the engine (~20 GB), so the two do not fight for memory.
    • Pinokio metadata: pinokio.js said “Phosphene BETA” by mistake since 4.8.2. It is back to “Phosphene”.

    Thanks to @ownercasablanca on X for the report.

    Press Update in Pinokio, then restart. No new downloads.

  23. v4.15.2 fixengine

    lip-sync on LTX audio-to-video now actually follows the audio

    Read release notes

    If you have made a clip in the Audio tab on a Mac that runs the Q8 pipeline and the mouth moved without following the song, this release fixes that.

    Press Update in Pinokio, then restart. No new downloads.

    Fixed

    • Lip-sync on LTX audio-to-video follows the audio again. Since 4.8.1, Audio conditioning strength started at 1.0. The two audio-to-video pipelines read that number differently. On Q4, 1.0 means “audio fully on”. On Q8 (48 GB or more, with the Q8 download), the slider sets the audio-guidance term, which is (value − 1) × …, so 1.0 switched audio guidance off. The mouth moved, but the song had no say in how. The slider now starts on Auto, which is the engine’s own setting for the pipeline your Mac runs: 3.0 on Q8 (what Q8 used before 4.8.1) and 1.0 on Q4. A value you drag the slider to is kept exactly.
    • Clips queued before the update get Auto too. A job saved by 4.15.1, or a Retry of one, used to carry the old 1.0 and would have stayed off on Q8.
    • You can see what ran. The render log says scale=3.0 (Q8 default), and the clip’s sidecar records audio_conditioning_scale_used.
    • “Repair Phosphene engine (models kept)” really appears now when the engine’s Python is present but its package never finished installing (No module named 'ltx_pipelines_mlx'). 4.15.1 announced this, but that change never made it into the release.

    Worth knowing

    • Q8 audio-to-video takes about a quarter longer. The audio pass that 1.0 skipped now runs again. A 10 s clip at 1024×576 on an M4 Max went from 18.7 to 23.5 min.
    • Set the slider to 1.0 by hand on Q8 and you get the old behaviour back. The hint under the slider says so.

    Validated from zero: a fresh 4.15.1 install updated to 4.15.2 through the normal Update, started the way Pinokio starts it, and rendered a real audio-to-video clip at the new default.

  24. v4.15.1 fix

    the install fixes

    Read release notes

    Five faults, every one of them found in the fleet’s own data rather than reported by anyone. If a render of yours has ever finished and then failed to export, or died half a minute in with a Python error, this is that.

    Press Update in Pinokio, then restart.

    Fixed

    • ffmpeg is found where Pinokio actually puts it. Five installs across 4.5.0 → 4.15.0 finished a render and then failed the export with ffmpeg not found on PATH — while a working ffmpeg sat two directories away the whole time. Pinokio’s bootstrap installs it into its conda prefix (bin/miniforge/bin) and unpacks a private Homebrew beside it; the panel only knew about bin/ffmpeg-env. All three are searched now, plus MacPorts, and a boot warning names every folder it looked in. ffprobe resolves on its own instead of assuming it sits next to ffmpeg (the bare ffprobe failed: some of you saw).
    • A half-built engine environment is caught at boot, with a repair. ModuleNotFoundError: No module named 'ltx_pipelines_mlx' — one install hit it 28 renders in a row. The panel and the Pinokio menu both only ever checked whether the engine’s Python existed, which in this shape it does; what is missing is the package that gets installed into it. Now: the panel says so in one second with the fix in the sentence, and “Repair Phosphene engine (models kept)” appears in the Pinokio sidebar for this shape too.
    • Hailuo H3 checks its MLX before it starts. On the wrong version H3 used to die about eight minutes into a render with seed(): incompatible function arguments, which names neither MLX nor a remedy. It now refuses in a second, before the LTX helper is stopped and before any GPU time is spent, and points at “Repair Hailuo H3”.
    • Captioning tells you which Gemma folder is wrong. Pointing it at LTX-2.5’s text encoder gave you Model type gemma4_unified not supported and named neither the folder it was handed nor the one that works.
    • Error reports stop eating ~. “needs ~32 GB free RAM” was being redacted into “needs <path>32 GB” — in the panel’s own sentences.

    Anonymous counts

    Two new counters, both closed-vocabulary, both written up in docs/ANALYTICS.md:

    • install_step — which step of getting started succeeded or failed: the panel came up, its environment can render, its weights are on disk, someone pressed Render. Fewer than half of new installs ever render a clip, and nothing in the data said why. At most four events per install, for all time.
    • update_outcome — whether pressing Update actually produced a new version. A failed update currently reports nothing at all.

    No paths, no file names, no URLs, no host names, no error text — the failure class only. As always: Settings → Anonymous usage analytics → Turn off, or PHOSPHENE_ANALYTICS_DISABLED=1.

    Also in this release

    The telemetry work from 2026-09-19: GPU out-of-memory is its own failure class instead of hiding in other, a cancel needle that matched the bare word “cancel” no longer outranks real crashes, and the Location section of docs/ANALYTICS.md now states plainly that country and city are derived from the address your computer connects from and kept.

    45 new tests. Full notes in docs/STATE.md.

  25. v4.15.0 featureengine

    Hailuo H3 goes Fast

    Read release notes

    Hailuo H3 has a Speed switch. Fast runs a 3-step adapter, Best runs the full schedule. Measured on an M4 Max, 5-second clip, character LoRA on:

    pathrenderUpscale & Face Fixfinished clip
    Draft + Fast2.8 min2.5 min5.2 min, 1280×768
    High + Fast7.9 min8.6 min16.5 min, 2048×1152

    The adapter installs from the Speed switch itself — one click, ~180 MB, no sidebar hunting.

    Room tone

    One generated ambience bed under a whole film, so cuts stop clicking. On our own edit the jump at a cut went from 13.0 dB to 2.7 dB. It is a track you can fade, not a prompt line.

    The Editor stops rearranging itself

    • Sound mode is a mode you choose — the lanes no longer resize themselves under your hands.
    • Panels open when you ask for them, the Source monitor is a drop target again, and the picture is bigger.
    • Tooltips answer in 0.16 s instead of a second.

    The render form is four sections, all closed

    Shot setup, LoRAs, After the render, Advanced. Each one prints what it is hiding before you open it — Draft · 3s · Fast · ~2 min.

    Batch is a section, not a modal behind a small button: paste many prompts, or ask for N takes of the one you have, each with its own seed. It counts the jobs and prices them before you commit.

    Fixed

    • A film with music over it no longer comes out with silent shots — the mix defaulted to replacing every clip’s sound with the bed, and now it plays under.
    • A crashed engine names the line of code, not just the exception.
    • The LoRA trainers no longer inherit the shell’s environment (the class of bug that broke music in 4.14.0).
    • One control scale across the panel: every small button the same height, radius and type, one filled primary per row.

    How to get it: press Update in Pinokio, then restart Phosphene.

  26. v4.14.3 fix

    songs that start, paths that paste

    Read release notes

    Four things real installs hit this week, found by reading the fleet’s own failures rather than waiting for reports.

    Songs start now

    The music engine refused to start under the environment Pinokio hands every app it launches, so on most Macs the very first song failed within seconds — and the only people who ever heard one were those who had changed that environment themselves. Compose now starts YuE2 with the environment it actually needs, in every mode (full score, melody, no score, draft, final, instrumental).

    A path you pasted is a path

    Copy a clip in Finder with “Copy as pathname” and you get quotes and your disk’s name in front of it; drag one into Terminal and every space comes back escaped; drag one from a browser and it arrives as file://…. All of those are now understood wherever you can paste a path — Control video, reference images, audio, extend source, keyframes — instead of “control video not found”.

    A render no longer dies on a stray character

    One odd byte in the output of ffmpeg, the trainer or the Hailuo H3 runner used to end the render that produced it. And if your clips or models live on an external drive, the hidden ._ files macOS keeps there no longer break a render — click Update Hailuo H3 runner for that half of the fix.

    When something breaks, the message says what broke

    “helper failed to start” now names the line the helper died on and what to do about it (Update, or reinstall, rebuilds its Python environment), instead of printing an internal event. An H3 crash reports the error itself rather than the argument list printed underneath it.

    Also

    The LIVE · return to render pill no longer sits on top of the clip’s own buttons while a take is forming, so Params, Extend and Upscale & Face Fix stay usable.

    Update from Pinokio. No new downloads, and nothing you have made changes.

  27. v4.14.2 fix

    an Audio filter in Outputs and Recent

    Read release notes

    One small addition, asked for on the 4.14 post.

    An Audio filter in Outputs and Recent

    • Outputs and Recent now have an Audio filter next to Videos and Photos. Click it to see only your songs.
    • Audio → Compose opens on Audio, and so does a song you just queued, so a new song shows up right where you’re looking.

    Thanks to @cocktailpeanut for asking.

  28. v4.14.1 fixengine

    Compose is always in Audio; H3 black renders fixed

    Read release notes

    Two fixes from the field.

    Compose is always in Audio. Install YuE2 from right there

    • Audio → Compose is always there now, even before the music engine is installed. The form shows greyed, with one button: Install music engine (YuE2, ~11 GB).
    • Click it (or just press Compose) and the install runs inside Phosphene. You see the step, a progress bar and a Stop button. If you stop it or lose the connection, click again and it picks up where it left off. When it finishes, Compose unlocks. No restart.
    • The header engine picker (YuE2 · 11 GB) and Settings → Models open the same install card. The Pinokio sidebar entry still works too.
    • Needs a 24 GB+ Mac and 14 GB of free disk. Thanks to @cocktailpeanut for the report.

    H3 renders with some community LoRAs came out black and were marked done: fixed

    • Some community LoRAs (F16 files from Civitai / ai-toolkit) made Hailuo H3 renders come out black, and the job still said done. This is fixed in the H3 engine. Click Update Hailuo H3 runner in Pinokio to get the fix.
    • If a render ever breaks, the job now fails with a clear message naming the LoRA, instead of saving a black clip.

    Also: the Face Fix checkbox under H3 Customize had lost its styling. It’s back.

    YuE2 by Multimodal Art Projection (CC BY-NC 4.0 + individual-creator permission) · MLX port by vanch007.

  29. v4.14.0 feature

    songs, faces and sound

    Read release notes

    Phosphene 4.14 — songs, faces and sound

    Audio → Compose: write a song

    • Type your lyrics (verse, chorus, bridge tags) and describe the style in plain words. Phosphene writes the whole song, vocals and arrangement, as a 48 kHz stereo WAV in your gallery.
    • Draft for a quick listen, Final for the keeper. On an M4 Max a 3-minute song takes about 3 minutes at Final, and a 2-minute Draft about 1 minute. It peaks at about 11 GB of memory, so it runs on 24 GB Macs and up.
    • Instrumental for no vocals, a score mode (full, melody or off), a maximum length and a seed so you can repeat a song you like.
    • Drive video loads a song into the video workflow without starting a render.
    • Install it from the Pinokio sidebar: Install the music engine (YuE2, ~11 GB). Until you do, the Audio tab looks the same as before.
    • Credit: YuE2 by Multimodal Art Projection (M-A-P), MLX port by vanch007 (mlx-Yue). Weights download straight from their public repos. YuE2 weights are CC BY-NC 4.0 with an individual-creator permission: creators may monetize their songs; companies need a license from M-A-P. See LICENSES/YuE2-MODEL_LICENSE.txt.

    Upscale & Face Fix (was Upscale ×2)

    • The pass that doubles a clip’s size and cleans up faces has a name that says what it does, and it is one click on any finished clip: the player, an Outputs card, the queue history, or the Editor’s clip bar (right-click works too).
    • In the Editor, when the fixed clip is ready, Swap it in replaces the shot on your timeline and keeps its trims, speed and fades. It is one undo. Your original clip is never overwritten.
    • The new Face Fix setting is the default (one refine step). Faithful is still there.
    • After an H3 draft, “Also run Upscale & Face Fix after the draft” is now an optional checkbox, off unless you tick it.
    • Roughly 8 minutes for a 5 s High clip and 2.5 minutes for a Draft on an M4 Max.

    Editor: sound

    • Audio tracks A3, A4 and more under the music. Drag sounds in, move them between tracks, trim, split, fade, set level points. They play in the preview, mix into the render, and export to Premiere/Final Cut as their own tracks.
    • Sound pool: every sound in your film and your outputs, one click away. Add sound file… brings in anything else.
    • Duplicate works on sound, including a clip’s sound and the music bed.
    • Clip sound on two lanes (A and B), alternated by default, so neighbouring shots can overlap and crossfade. Drag a sound up or down to switch lanes.
    • The sound lanes get small when you aren’t working on sound, so the picture gets the room. The chevron or Shift+A pins them open or small.

    Also in 4.13.1 and 4.13.2 (shipped quietly, never announced)

    • Hailuo H3 High runs 15 steps: sharper faces and motion (a 5 s High clip takes about 34 min instead of about 19).
    • H3 clips keep their last frame. Turbo uses its whole adapter again.
    • Upscale no longer flashes white at the end, and keeps every frame and the full soundtrack.
    • Stop really stops, including a Turbo job that is still getting ready.
    • H3 LoRAs imported before 4.13.1 are back at their trained strength.
    • The CivitAI search field is usable again (#82, thanks @Viktorminator).

    Update from the panel or Pinokio as usual, then restart. Compose appears after you install the music engine.

  30. v4.13.2 fix

    Stop means stop

    Read release notes

    Phosphene 4.13.2 — Stop means stop

    Five fixes found by an independent review of 4.13.1. If you use Hailuo H3 Turbo, H3 LoRAs or Upscale ×2, update.

    Stop

    • Stop now really stops a Turbo job that is still getting ready. The first Turbo render after 4.13.1 downloads a small (~60 MB) companion file. If you pressed Stop during that download, the render could still start afterwards and run on your GPU for minutes. Now Stop ends the download and the job, and nothing renders. The same goes for the preparation and finishing steps of Upscale ×2, and for any job you stop in the instant it starts.

    H3 LoRAs

    • LoRAs you imported before 4.13.1 are back at their trained strength. Some LoRA files carry a different strength per layer. 4.13.1 started building those strengths into the file, but the strength slider still suggested the old value (for example 0.5), so the LoRA was applied twice as weak. The slider now suggests 1.0 for these files, and a job you queued before updating is rendered at 1.0. A strength you set yourself is never changed.

    Turbo

    • A failed companion download no longer slows down every job. If the ~60 MB companion could not be downloaded (no network, blocked), every following Turbo job tried again and could wait up to 5 minutes. Now it is tried once; the next automatic try is 6 hours later, and Install Turbo retries right away. Turbo still renders meanwhile, and the log says what is missing.

    Upscale ×2

    • A silent clip stays silent. Upscaling a clip with no sound could add sound the upscaler made up, depending on the clip’s length. The result now always has the source clip’s sound, or none.
    • Very large upscales are decoded safely. 4.13.1 fixed the white frames at the end of a 2048×1152 upscale, but a much larger canvas (for example 4096×4096) could still come out corrupted. Large decodes are now split into pieces that are checked to fit, blended across their seams. A canvas too large to split safely is refused before rendering instead of wasting the time.

    How to get it: press Update in Pinokio, then restart Phosphene. Nothing to reinstall, no new downloads.

  31. v4.13.1 fixengine

    Hailuo H3 that looks right

    Read release notes

    Phosphene 4.13.1 — Hailuo H3 that looks right

    Hailuo H3

    • High clips are sharper. High (1024×576) now runs 15 sampler steps per window instead of 8. Faces and motion come out clean where they used to blur. It costs time: a 5 s High clip now takes about 34 min instead of about 19 on an M4 Max, and Storyboard films rendered at High take about 1.8× longer. Draft, HQ and the long tiers are unchanged. A job you already queued keeps the steps it was queued with.
    • The last frame is no longer dropped. Every H3 clip used to lose its final frame when picture and sound were joined. The picture now sets the length and the sound is fitted to it. The clip info reports the frame count of the file you actually got.
    • Turbo applies the whole adapter. Turbo was silently skipping 51 of its 259 adapter pieces (the ones that steer timing). They are applied again. If a ~60 MB companion file is missing, the panel fetches it once in the background; if it can’t, the render log says so plainly.
    • Clip info names the model that actually ran (compact Q8 or full bf16), plus its precision and how the Turbo adapter was applied.

    Upscale ×2

    • No more white flash at the end. Upscaling a 5 s 1024×576 clip blew its last frames (and sometimes a stretch near the start) to white. The cause was a number overflow in the video decoder at that size. Large decodes are now split into safe pieces.
    • Every frame is kept. The ×2 used to round a clip down (124 frames became 121) and cut the sound to match. It now delivers exactly as many frames as the source, with the full soundtrack.

    Twelve more H3 fixes

    • Sending an H3 draft to ×2 keeps its prompt and seed.
    • Finish brings back the draft’s LoRAs, orientation and adapter.
    • A render that exits with an error is only rescued when the file really has all its frames.
    • Imported kohya LoRAs are no longer applied at half strength; older imports are corrected when listed.
    • LoRA files with mixed per-layer strengths are applied correctly.
    • No Music now reaches every window of a long clip.
    • The clip info keeps your own reference image (the cropped frame is stored next to it).
    • A step count you pinned (4–30) survives Load Params and Finish.
    • Time estimates account for this Mac’s speed, including pinned steps.
    • Turbo time estimates update when the adapter changes.
    • H3 clips are encoded at high quality (CRF 18 or better), and the clip info says which encoder made the file.
    • Stop early disappears once the last window is decoding.

    Also fixed

    • A broken reference image now stops an H3 job with a clear message instead of a crash deep in the engine.
    • Opening the panel never starts playing a clip with sound. Only a click plays.

    How to get it: press Update in Pinokio. If Hailuo H3 is installed, Update also moves its engine to the fixed version, so there is nothing to reinstall. Restart the panel after updating.

  32. v4.13.0 feature

    the editor you already know

    Read release notes

    Phosphene 4.13 — the editor you already know

    Editor

    • A clip bar above the tracks with the actions you use all day: Split, Lift, Ripple delete, Duplicate, Unlink or link sound, Resync sound, Mute, Delete sound, Clear points, Lock. A button that can’t act goes grey and its tooltip says why. The side panel keeps the advanced properties.
    • Select several clips and move them together. Shift-click for a range, Cmd-click to add or drop one, Cmd+A for all. Drag any selected shot and the group moves with its spacing and its sound. Delete, duplicate, lock, mute and unlink act on the whole selection as one undo.
    • Right-click a shot for the same actions, or right-click a gap to close it.
    • Keys from Premiere and Final Cut: Cmd+K splits, up and down jump between cuts, Option with the arrows nudges a frame, N toggles snapping, Shift+Z fits the timeline, Cmd+E renders, and a trackpad pinch zooms.
    • Fixed: Cmd+S split a shot instead of saving. Cmd+R, the browser’s reload, started a render. Escape could close your whole film, including the Escape that closed the Docs. A finished retake could not be placed on the timeline.

    Docs inside the app

    • A Docs button next to the settings gear, or press ? anywhere. Every tool explained, the Editor button by button, step-by-step guides for common jobs, all keyboard shortcuts, and troubleshooting. Search finds any button by the word written on it.

    Everywhere

    • Shift+1 to Shift+7 switch tabs, Cmd+F jumps to the search box on screen, Cmd+Return generates from a prompt. In Outputs, Space plays and Cmd+Delete moves the selected clip to the Trash after asking.

    One Shot is its own tab now, with its own composer.

    Storyboard

    • Spoken shots are scored for lip-sync and retaken when the mouth doesn’t match, like One Shot parts.
    • A board’s still now anchors its Hailuo H3 shot as the first frame.

    Fixes

    • Images: the Quality chip no longer asks for an engine this Mac doesn’t have.
    • Export: the Sharp pass handles the 1080p canvas.
    • Settings: saving one setting no longer overwrites a setting another window changed.

    Update from the panel or Pinokio as usual.

  33. v4.12.4 fix

    ten fixes from the field

    Read release notes

    Ten fixes from the field

    Queue

    • “Worker paused” survived a restart (#80). The queue now resumes when Phosphene restarts, and the paused card carries its own Resume button.

    Prompts

    • The Avoid box made things more likely, not less (#81). On Quick, Balanced and Standard the Avoid words were being added to the prompt itself. They no longer are. High, Extend, Keyframes and Audio-to-video still use them as intended.

    Hailuo H3

    • 48 GB Macs ran out of memory on every H3 render when Settings said Full, even with the compact engine built. Below the full engine’s memory floor the compact engine renders, the log says why, and Settings greys Full out.
    • Long H3 renders with per-window prompts failed with “The prompt cache belongs to a different prompt”, on every retry. Fixed, and an old broken cache entry is cleared by itself.

    Audio-to-video

    • A track a fraction of a second shorter than the clip crashed the render (“broadcast_shapes”). The track is now padded with silence to the clip’s length.

    Images

    • FLUX.2 klein said “stuck at 4.6 GB” about a model that had finished downloading. Leftovers of a finished download are cleared. A download that really stalled is still reported, and nothing is deleted.

    Training (#61, #62)

    • On some Macs the macOS GPU watchdog kept killing the caption step. The automatic retry now relaxes that watchdog for the trainer only. The screen may feel less smooth while it trains.
    • Every trainer line is saved to train.log in the job’s folder, so a run can be inspected afterwards.

    Older installs

    • The first render after a restart could crash with “Model type gemma4_unified not supported” when the engine is out of date. It is now refused up front with the remedy: click Update, and once more if the first click only updated the panel.

    LTX Upscale

    • Generate with no clip picked no longer queues a job that can only fail.

    Update from the panel or Pinokio as usual.

  34. v4.12.3 fix

    one-shot takes stay in sync

    Read release notes

    One-shot takes stay in sync

    Who it hits: anyone rendering a One-shot take of more than one part. Over a long take the voice drifted behind the lips, about a tenth of a second late by the end of a 50-second take.

    What happened: every rendered part’s sound comes out a few hundredths of a second longer than its picture, and the join added those up.

    What changed: each part’s sound is trimmed to exactly its own frames before the parts are joined, so the picture and the voice stay locked from the first line to the last.

    Nothing else changed. Update from the panel or Pinokio as usual.

  35. v4.12.2 fix

    the morning's field reports

    Read release notes

    One Shot: a prompt is the whole shot. Since 4.12.1 an empty beats box means the prompt carries every five seconds. Until now the box also filled itself with the first sentence of the prompt the moment you picked a length, which left one written beat and five holds in front of anyone who had only typed a prompt. It no longer fills itself. Write beats when you want the shot to go somewhere; “Split my prompt into beats” is the deliberate way to start from your sentences. The hint under the box says which case you are in.

    H3 compact engine build on 36 GB Macs (#78). The Q8 quantizer wrote a valid pack, then macOS killed it during its own final load while it still held the source model — and because the completion marker was already written, a retry said “already built” over a pack that never reported success. The build now validates the pack in a fresh process, writes the marker only after that passes, checks that every shard the index names is on disk before trusting a pack, and rebuilds one that fails.

    Three things the fleet showed this week.

    • Asking the distilled Q4 model for more than 8 steps died minutes in with “cannot thin a 9-point schedule”. It is refused at once, and the message says where more steps live (High).
    • An H3 render on a Mac with no ffmpeg where Phosphene looks for it failed after the whole denoise. It is refused before the render, with the path and the fix.
    • A LoRA whose file had moved was reported as a Hugging Face “repo id” validation error. It is now “LoRA file not found”, with the path.

    Stats page. Top errors are ranked by how many installs hit them, not by how many times one install retried; each row shows the installs behind it. A new tile shows failed renders per version for the last 7 days, as a share of that version’s renders, with the installs that hit one.

    Includes 4.12.1 and 4.12.0.

  36. v4.12.1 fix

    a One Shot with no beats is a One Shot of the prompt

    Read release notes

    The bug. In One Shot, the beats box is one line per five seconds. If you typed a prompt and left the beats empty, every window of the take rendered the hold sentence instead of your prompt: a 30-second clip about “nothing new”. A first-day report from the field, with the video to prove it, on both engines.

    The fix. No beats written means the prompt is every beat: the shot is your prompt, sustained for the whole take. Write beats when you want the shot to go somewhere: each line directs its own five seconds, a blank line holds the moment before it. The hold sentence itself now says what continues (the same subject, the same motion, the same light) instead of what does not, because the model rendered “nothing new begins” literally.

    What a beat is. One line = five seconds = one thing that happens. Six lines make a 30 s take. The “Split my prompt into beats” button breaks your prompt into sentences as a starting point. The hint under the box now says plainly when no beats are written and the prompt carries the shot.

    Includes 4.12.0 (the talking one shot) and 4.11.x.

  37. v4.12.0 feature

    the talking one shot

    Read release notes

    A One Shot with a character who talks now keeps the voice on the mouth across the joins. Since 4.11.0 an LTX One Shot renders as 10-second parts that continue from the last frame. When the character speaks, that last frame was a closed, silent mouth, and the next part would play its line as a voiceover. Measured on the mouth-vs-voice meter, a part anchored on a closed mouth scores −0.15 to −0.01; a part anchored on a frame where the character is still mid-word scores +0.54.

    • The handoff is now a J-cut. With take_handoff=speech, the picture of every part but the last is cut 0.2 s before the line ends, on a talking frame, and the sound runs to the end of the line and is mixed over the next part’s opening pause. The last word is heard whole and the next part starts from a mouth that is speaking. The last part keeps its written silence.
    • Every spoken part is measured and retaken. The lip-sync gate scores each part (mouth opening inside the face box against the voice) and retakes it up to twice with fresh seeds when the score is under 0.20, keeping the best clip and recording its score in the sidecar. The gate only judges parts that are meant to speak: a character job, or a beat with a quoted line. An aerial flight is never retaken for lip-sync.
    • The joined clip no longer drifts. The seam smoother crossfaded the sound at every join while keeping every frame of picture, so the voice ran 0.12 s early per join and was 0.6 s ahead of the mouth by the sixth part. Parts are now butt-joined with 15 ms fades: no click, no time lost.
    • Two characters can talk. The planner frames only the speaker in a shot that carries a line, names in a beat only who belongs in the picture, and keeps the listener’s mouth out of frame. docs/LTX_DIALOGUE.md is the write-up: what the model does with two faces, why a face model paints every face, and the multi-shot recipe that holds.

    What to expect. Lip-sync is still a roll per part: identical settings gave +0.41 on one line and −0.27 on the next. The gate and the retakes turn a one-in-three chance into a good chance, at the cost of time. Write one short line per 10-second part and let the silence after it be silence.

    Includes 4.11.x (One Shot as its own mode, LTX one shots by last-frame handoff, the planner placing a One Shot inside a film, estimates that follow your chip, the fleet guards).

  38. v4.11.1 fix

    the estimates know your Mac

    Read release notes

    Time estimates follow your chip. Every estimate in the panel was measured on an M4 Max and shown to everyone. Thirty days of anonymous fleet timings say the same render takes two to four times longer on an M4 Pro or an M1 Max, three times longer on an M1 Pro or a base M3, and less than half the time on an M5 Max or an M3 Ultra. The quality chips, the length chips, the One Shot estimate and the Storyboard price now scale by your chip family. If the table misjudges your machine, PHOSPHENE_SPEED_FACTOR overrides it.

    Four guards the fleet asked for.

    • Control tells you it needs a clip before it queues, instead of failing as a red card.
    • A saved HiDream engine pick falls back to Auto on Macs that never installed that lab, and says so.
    • Training refuses on Macs under 24 GB with the reason, before spending minutes on a run that cannot finish.
    • The image pre-flight releases the idle video helper and measures again before refusing a 32 GB Mac for memory.

    If a 30-second LTX one shot showed “~30 s left” for a long time on 4.10.x: that was the old Extend chain (about 27 minutes per 5-second window, with an estimate meant for a single clip). Since 4.11.0 an LTX One Shot renders as 10-second parts that continue from the last frame, a few minutes each, with a real estimate before you start. Update and try it from the One Shot tab.

    Includes 4.11.0 (One Shot as its own mode, LTX one shots that hold together, the planner placing a One Shot inside a film).

  39. v4.11.0 feature

    One Shot

    Read release notes

    One Shot is its own way of making video. A continuous shot of 30 seconds to 2 minutes that never cuts, next to Text, Character and Image in the mode bar. Pick a length, write one line per 5 seconds (or split your prompt into lines with one click), optionally give it a start frame, and keep the two continuity guards on: Lock the light keeps the time of day and weather the same in every line; Redo a part that drifts re-renders a part once if its light moves. The panel shows the real time for your Mac before you start.

    LTX one shots work now. An LTX one shot used to be built by extending the previous window, and the picture turned to fog at the first extension. It is now built the way Hailuo H3’s is: parts that each start from the last frame of the part before (10-second parts on LTX, 15-second on H3), so the people, the room and the light carry through. Measured tonight: a 40-second LTX bar conversation held its two characters and its circling camera across four parts.

    The Storyboard plans with it. The planner knows One Shot as a cinematic tool: a walk-and-talk, a chase or a POV ride, a monologue, a reveal or an arrival can be planned as one unbroken take inside an ordinary film, at most one or two per film, and it renders as one job.

    Also: “One take” is now called One Shot everywhere; the first window of a forming shot no longer appears in the gallery as a stray clip.

    Includes 4.10.8 (LTX Upscale), 4.10.7 (Extend fixed), 4.10.6 and 4.10.5.

  40. v4.10.8 fixengine

    LTX Upscale

    Read release notes

    Any clip, twice the size, with real detail. LTX Upscale hands a finished clip to the LTX-2.5 Pixel Spatial Upscaler and renders it again at 2× — generated detail, not a filter — and keeps the clip’s own sound. It was built for Hailuo H3 drafts (“H3 mind, LTX pixels”), and it works on any clip in your gallery.

    Three ways in:

    • the LTX Upscale button on every video card,
    • Remix → LTX Upscale for any clip, with a source picker,
    • LTX ×2 in the H3 form’s Upscale row, which queues the upscale right behind the draft — one Generate click, two jobs.

    Three presets instead of a slider: Faithful (the face and lips stay as drafted — three refine steps from the clip’s own latent), Quick (one step fewer), Re-imagine (the adapter’s own four-step re-render from noise: sharpest, faces may drift). Times on the presets are shown for your Mac in the form; on an M4 Max a 5-second 640×384 draft upscales in about 5½ minutes on Faithful.

    Length and, if you leave it empty, the prompt come from the source. Up to 0.3 s may be trimmed at the tail to fit LTX’s frame grid, and output is capped at your Mac’s Image-to-Video canvas.

    What Update fetches. The engine moves to v0.14.19+ltx25.7 and the upscaler adapter (0.33 GB, Lightricks’ official IC-LoRA) downloads with it. Until both are in place the mode says so by name instead of failing mid-render.

    Also in this line: 4.10.7 (Extend renders again — broken since 4.10.2 — One take sits under Quality and Length, stats totals and growth), 4.10.6 (Browse CivitAI search works again) and 4.10.5 (LoRAs stack on Hailuo H3).

  41. v4.10.7 fix

    Extend renders again, One take in plain sight

    Read release notes

    Extend renders again. Since 4.10.2, every Extend render stopped before it started: the low-memory streaming change handed a new option to every pipeline, and the Extend pipeline does not take it. Each pipeline is now built with only the options it accepts, so Extend behaves as it did before 4.10.2. If you have been getting an error the moment an Extend job starts, this is the fix.

    One take is where the lengths are. The control for anything longer than one clip (30 s, 45 s, 1 min, 1½ min, 2 min) used to sit inside the Customize fold. It is now a third strip directly under Quality and Length, for both engines, in the same chip style: each choice shows its beat count and how many 15-second parts it renders. Picking a take opens the beats box right under the strip and shows the real time for your Mac.

    Stats page (yours only). Two new headline tiles, Total renders and Total installs, both all-time, and a Growth chart: cumulative installs against renders per day, with weekly active installs in the caption.

    Includes 4.10.6 (Browse CivitAI search works again) and 4.10.5 (LoRAs stack on Hailuo H3).

  42. v4.10.6 fix

    Browse CivitAI search works again

    Read release notes

    Browse CivitAI: search works again

    Who it hits: anyone who typed a word into Browse CivitAI. Every search came back empty, on every engine, and now and then the panel showed “HTTP error 503”.

    What happened: CivitAI’s text search ignores the engine filter the panel sends with it and answers an empty page. So “turbo” found nothing while the Turbo LoRAs sat on page one of the un-searched list.

    What changed

    • Typed searches now ask CivitAI without the engine filter, nudge the search with the engine’s own word, and keep only the LoRAs for your engine — paging until the page is full. “All” searches each engine and merges.
    • CivitAI’s occasional 502/503/504 is retried a few times with a short pause; if it still fails, the message says what to do instead of showing a status code.
    • The search bar reads as one: a magnifier, “Search CivitAI — a name, a style, a creator… then Enter”, and a Search button. The empty-result hint says what to try.

    Nothing else changed. Update from the panel or Pinokio as usual.

  43. v4.10.5 fixengine

    LoRAs stack on Hailuo H3

    Read release notes

    Combine LoRAs on H3. Until now the H3 engine took one adapter per render, so a character LoRA meant turning Turbo off, and two LoRAs meant choosing. The engine now takes any number of adapters, each with its own strength, and Turbo rides along. Pick up to four in the LoRA picker. The community rule the panel repeats: keep the strengths’ total near 1.5 or under, and don’t stack two LoRAs that pull the same thing (two faces, two styles). Clicking Update brings the engine change with it; an older engine keeps the previous one-adapter behaviour and its Turbo-or-LoRA switch.

    kohya-format LoRAs render now. Most character LoRAs trained for H3 come out of kohya-style trainers, which the panel used to refuse. They are converted on install (and on first use): keys mapped onto the engine’s modules, the trainer’s alpha folded in so strength 1.0 means “as trained”, and the trigger phrase stored in the file goes into the picker.

    LoRA browser. One compact toolbar: source, engine, and a Characters · Styles · Motion · Speed · Other filter with counts. Hugging Face searches go deeper (the character LoRAs with a handful of likes were falling off the end), base models and quant packs are no longer listed as LoRAs, and the CivitAI key prompt no longer appears on the Hugging Face source.

    Fixes. The panel no longer opens with the last clip already playing.

    Engine

    minimax-h3-mlx codex/h3-engine-v2 now includes the 2026-08-15 fix that stopped an unconditional row permutation on every LoRA (measured orthogonal to the adapter). If a LoRA looks subtly different after this update, that is the adapter finally being applied as trained.

  44. v4.10.4 fix

    LoRAs from Hugging Face, browsed like CivitAI

    Read release notes

    LoRAs from Hugging Face, browsed like CivitAI. Open the LoRA browser and pick Hugging Face next to CivitAI. Search by name, by author (author:someone), or paste an owner/repo; the panel shows the repos that carry a LoRA for your engine (Hailuo H3 or LTX), each card plays the repo’s own example clip when it has one, and Install puts the file where your other LoRAs live with the same notes. No API key. Phosphene names no source and vouches for none: it lists what matches, and the card links to the repo so you can read it before you install.

    Also recent: 4.10.2 — Macs with 24 GB of memory or less stream the video model from disk during a render; 4.10.1 — continuity for one-takes.

    Update from the Pinokio sidebar; nothing to re-download.

  45. v4.10.3 fix

    superseded by v4.10.4

    Read release notes

    Superseded by v4.10.4 within the hour: the Hugging Face LoRA source shipped here as a fixed catalog; 4.10.4 makes it a search, like the CivitAI browser, with no source named by Phosphene. Please update to 4.10.4.

    Also recent: 4.10.2 — Macs with 24 GB of memory or less stream the video model from disk during a render; 4.10.1 — continuity for one-takes.

  46. v4.10.2 fix

    small Macs stream the model from disk

    Read release notes

    One change, for Macs with 24 GB of memory or less. Update from the Pinokio sidebar — no new downloads.

    The video model is streamed from disk during a render instead of being held whole in memory. On a heavy Image render (1024×576, 121 frames) the peak memory the GPU needs drops from 16.1 GB to 13.8 GB, and between phases only 1 GB stays resident instead of 10.6 GB. It costs about 7% more time, and the frames are bit-for-bit identical — verified at two sizes with the same seed. That margin is what separates a 16 GB Mac finishing a clip from being killed mid-render, which is what the fleet data shows happening on 16 GB installs.

    Renders that carry a LoRA or a trained character keep exactly the previous path (streaming can’t carry per-clip adapters, and we won’t silently trade quality for it). Bigger Macs are untouched. LTX_LOW_RAM_STREAM=1 or =0 in the environment forces it on or off for testing.

    Includes v4.10.1 (continuity for one-takes) and v4.10.0 (One take, Turbo v4, the NLE timeline, anchor stills).

  47. v4.10.1 fix

    continuity for one-takes

    Read release notes

    One fix, for one-takes. Update from the Pinokio sidebar; nothing to re-download.

    The light no longer drifts between beats. In The Commuter, part 2 went from night to grey daylight and back at a window boundary: the engine only carries the last frame between windows, and a beat that said “neon flickering to life” read as dusk. Now:

    • The panel reads the time of day and the weather from your own prompt and appends one continuity sentence to every beat, on both engines (“it is still night and still rain; the sky, the light, the shadows and the palette stay exactly as they were”).
    • Each part is measured when it lands: the brightness of its first frame against its last.
    • A part whose light drifts is retaken once, automatically, with the lock said twice and a fresh seed; the steadier clip is kept, the other hidden, and the measurement is recorded on the job.
    • The Storyboard planner states the light once and never writes a beat that implies another hour.

    Also fixed: a take submitted without an H3 quality fell back to the 3-second tier, so each part was one window instead of three.

  48. v4.10.0 feature

    One take, and The Commuter

    Read release notes

    The Commuter — a 75-second one take, made overnight on one Mac. A gentleman cockroach in a homburg runs home through 1934 Broadway: marquee neon, a subway grate, the newsstand, steam, a taxi’s chrome, rain, the tenement street, and the family waiting at the table. Rendered at native 1344×768 with Hailuo H3 and the new One take control, from one designed still, with a Suno score under it. The full film is attached below (the_commuter.mp4); the GIF is the first six seconds.

    This release carries everything since v4.9.5. Update from the Pinokio sidebar; nothing needs re-downloading.

    One take — a clip longer than one pass

    • Video tab → One take: 30 s, 45 s, 1 min, 1½ min or 2 min. Write one beat per five seconds (prefilled from your prompt, one sentence each). The panel says how long it will take on your Mac before you press Generate.
    • On Hailuo H3 the take renders as 15-second parts that each continue from the last frame of the one before, then joins them. On LTX it uses the chained-passes path, which is labelled experimental: the picture drifts across passes, so use H3 for a take you’ll keep.
    • Storyboard → Shots → “1 · one take”: the planner writes the beats for you, by the rules below, and the film renders as the same take.
    • Start each shot from a still (Storyboard brief): an image of the first frame is made first, from the character’s sheet when the shot has one, and the clip starts from it. New still on the card remakes it.
    • Long shots (Storyboard brief): a shot over 5 s renders as chained passes instead of being shortened. Needs the Q8 pack.

    Turbo is the community’s adapter now

    • Turbo uses larryvrh’s v4-600 EMA adapter at six passes — the setting its author recommends. In a same-seed test it held faces and fine detail better than exact, in 23% less time on a 5-second clip. The older adapters remain as fallbacks; the managed download fetches v4 directly with a verified digest; the time estimates were re-priced honestly.

    The Editor grows up

    • Trim and move behave like Premiere and After Effects. Pulling an edge changes only that clip (a hole opens or closes); dragging a clip moves only that clip, between its neighbours. Hold ⌘ to ripple everything after it; Shift still reorders. Edges are easier to catch.
    • Transitions on the cut (dissolve, fade to black), speed per clip (0.25–4×, audio pitched right), titles on the overlay lane, framing (zoom and reframe per clip), retake a clip in place, duplicate, deliver as H.264 / HEVC / ProRes at as-cut, 1080p or 4K with an optional grain finish.
    • The Director: drop a soundtrack on the Storyboard brief and the planner cuts on the beat, with sections (intro, chorus, verse) read from the music itself. Auto plans, renders, cuts and assembles in one press.
    • Search the gallery by anything the sidecars know: prompt words, engine, size, seed, LoRA, character.

    Quality of life

    • Completion alerts: a chime when a render lands, a browser alert when the tab is in the background, and an “alert me even when the tab is closed” option (Settings → Completion alerts).
    • Light theme (Settings → Appearance: Dark / Light / System).
    • LoRA guides: “Write a guide” in the picker has the planner write what a LoRA does, how to prompt it and a strength to start from. Check for updates finds newer versions of your CivitAI LoRAs and installs them in one click.
    • Writing for Phosphene: a short prompting guide at /docs/prompting (linked from One take and the Storyboard) with a button that copies it for your own assistant. The Storyboard planner already follows it.
    • H3 native renders are no longer shrunk to 720p on export by default.

    Fixes

    • The chained-passes path costs the same per window now; it used to grow with the clip (window 4 took three times window 2).
    • Working files from long renders never appear in the gallery.
    • Deleting an H3 clip takes its audio and stage cache with it (#77). H3 install/update works again after the upstream decoder repo vanished (pinned, hash-verified source). Fleet telemetry blind spots filled.

    Known limits

    • A one-take carries only its last frame between parts, so a scene change (through a door, into a room) needs a beat of its own with the approach in the beat before; the planner does this for you. Per-part anchors and “retake part N” are next.
    • Native H3 at Turbo costs about 31 minutes per 5 seconds on an M4 Max 64 GB; a minute is an evening. Test the first beat at High before committing the night.
  49. v4.9.8 fixengine

    H3 install/update works again (deleted upstream repo)

    Read release notes

    One urgent fix. Update from the Pinokio sidebar, then re-run Install Hailuo H3 if your last H3 install or update failed.

    Installing or updating Hailuo H3 failed at the “TAE draft decoder” step with “Repository Not Found”. The Hugging Face repo that 22 MB file came from (madebyollin/taeh3) was deleted, so every H3 install and every “Update Hailuo H3” died there — nothing on your side. The file is now fetched from a pinned commit of the author’s GitHub repo, verified by size and hash against the copy that has shipped for months, placed atomically, and left alone once it’s correct. Hugging Face stays as a fallback. Reported on Pinokio by @macstephen, who also found the file.

    The LTX live-preview decoder was never affected — it already ships from Phosphene’s own release mirror.

    Includes v4.9.7 (better fleet telemetry) and v4.9.6 (H3 clips take their sidecars to Trash).

  50. v4.9.7 fix

    better fleet telemetry, stats page counts packs

    Read release notes

    No new behaviour in the app — this release fills the blind spots in the anonymous fleet telemetry so bugs get found faster, and fixes one misleading number on the stats page. Update from the Pinokio sidebar — no new downloads.

    What the panel now reports (same install id, same Settings toggle to turn it off, all closed vocabularies, no free text — full spec in docs/ANALYTICS.md):

    • which surface queued each render: the form, a Batch, Storyboard, Characters, the Image Studio, a Retry;
    • a handful of feature-use counts: Storyboard planning and export, opening and exporting the Editor, CivitAI downloads, the sample character, a training start;
    • whether the update pop-up and banner were answered (shown / later / update now), and when an update actually landed;
    • when the queue paused itself after repeated identical failures.

    Stats page: a weights release showed 84K “downloads” — that was ~90 files × ~1,000 installs. It now shows complete pack downloads (≈1.2K) with the per-pack breakdown on hover.

    Includes v4.9.6 (deleting an H3 clip takes its audio and stage cache with it, #77).

  51. v4.9.6 fixengine

    H3 clips take their sidecars to Trash

    Read release notes

    One fix. Update from the Pinokio sidebar — no new downloads.

    Deleting a Hailuo H3 clip now removes everything it left behind (#77). The × on an Outputs card trashed the clip and its JSON sidecar but left the audio track (<name>.wav), the pre-mix source audio (<name>_source.wav) and a draft’s stage-A cache (<name>.stage_a.npz) piling up in mlx_outputs. All of them go to Trash with the clip now. LTX clips behave exactly as before. Reported with the exact function and fix by @PhantombrainM.

  52. v4.9.5 fixengine

    character training actually re-trains; H3 clips survive a shutdown crash

    Read release notes

    Two bug fixes. Update from the Pinokio sidebar — no new downloads.

    Character training re-trains for real (#62). The trainer’s preprocessing cache was keyed by position, not content. Re-training from the same folder with a new trigger word silently reused the old encoded captions — the new trigger never reached the model — and dropping a photo paired every later photo with the wrong caption. If you ever trained, changed something, and trained again from the same folder, that second run was not what you asked for. The cache now tracks what produced it (photo names/sizes, caption text, canvas) and re-encodes exactly what changed; an older cache it cannot vouch for is rebuilt. Verified with the real encoder: one changed caption → one file re-encoded, the rest reused.

    A finished Hailuo H3 clip is no longer thrown away (#76). The engine could write a perfect MP4 and then crash while shutting down (an MLX cleanup change), and the panel marked the render as failed. The engine fix (register MLX stream cleanup at exit — diagnosed and verified by @PhantombrainM) is on the H3 branch Update installs, and the panel now keeps a complete clip even if the engine dies after writing it, while a crash before the clip exists still fails as before.

  53. v4.9.4 fix

    four fleet-driven fixes

    Read release notes

    Small fixes from the first day of fleet data on 4.9.3. Update from the Pinokio sidebar — no new downloads.

    What you’ll notice

    • A queue stops digging. If three renders in a row fail with the same problem while more are waiting, the queue pauses itself and says what to fix (“Paused the queue: 3 renders in a row failed with the same problem, and N more are waiting…”). Your queued jobs stay put; press Resume when the cause is fixed. One install had burned through 227 jobs in ten minutes on a single broken model download.
    • H3 failures say why. Instead of “exited with code 1 — see the log above”, the red card now carries the engine’s last line.
    • Step counts can’t crash a render. Asking for more steps than the model’s schedule holds used to load everything and then fail; the count is now capped at what exists and the log says so.
    • A stale HiDream setting in Image Studio falls back to an installed engine instead of failing every image.
  54. v4.9.3 fix

    the full-review fixes

    Read release notes

    Just bug fixes, from a full review of the fast 4.9.x releases. Update from the Pinokio sidebar — no new downloads.

    What you’ll notice

    • Storyboard works on Macs that cap at 768 (24 GB). A new film was being planned at 1024×576 — a size those Macs can’t deliver — so Render was disabled from the first click, and the “Use 1024×576” button offered the same illegal size. Films are now planned at the size your Mac delivers, the button offers the real one, the Quality section is visible at Pinokio’s window width, and dropdowns no longer flicker shut. (#71 — thanks @Sebartus)
    • Renaming a character works again. It failed every time since 4.9.0.
    • A freshly trained character clicked “Use in video” actually rides on the render. The chip appeared but the LoRA was never sent.
    • Image Studio on 8 GB and 24 GB Macs: engines that can’t fit are listed with “needs a 32 GB Mac” and the Studio picks one that fits, instead of refusing at the last second with a developer flag.
    • High quality / Keyframes / Extend without the Q8 pack now point you to Settings → Models instead of showing a terminal command.
    • Image mode with no image is stopped at the button instead of failing after queueing.
    • Header: the memory readout no longer gets clipped at narrower windows.
    • Update builds the half-memory H3 engine on older installs. The H3 code checkout is moved to its pinned branch first; before, the build step failed with “quantize_stream.py missing” on installs made before the v2 engine. (#74 — diagnosed by @blackest)
    • Update path: the in-app “Update now” no longer skips the dependency script when only that script changed, its self-repair covers all three render packages, and a running panel keeps serving the files it booted with until you restart.
    • Analytics: failures caused by missing weights or a full disk stop being filed under “helper exited”; a stuck partial download stops retrying on every render.

    Also in: a build check that fails on any button whose function no longer exists (the other half of the 4.9.0 dead-button bug).

  55. v4.9.2 fix

    three issue fixes

    Read release notes

    Three bug fixes, each from an open issue. Update from the Pinokio sidebar — no new downloads.

    An interrupted image-model download now resumes instead of crashing every generation (#73, thanks @Townesvz). If the Qwen-Image-Edit download stopped partway (a closed lid, a lost connection), the panel used to report the engine as ready and every image generation died inside the model loader with an error cut off before the actual message. The panel now notices the interrupted download, the Image Studio pill reads “resume · 38 of ~54 GB”, and Generate resumes it — nothing already on disk is downloaded twice. Error messages now show the end of the traceback, where the real exception is.

    Character training survives the GPU watchdog killing caption encoding (#61, thanks @blackest). On some chips macOS kills the trainer’s GPU work partway through encoding the captions, and the run died with code -6. The trainer is now relaunched once with a shorter text encode — the same recovery the render side has used for months — keeping the image work already done. The log says exactly what happened.

    Trigger words are letters-only now (#62). The trigger the panel suggested (mrz07) is half digit tokens through the text encoder’s tokenizer, and every trigger that has ever carried a face here is letters-only (bizarrotrn). The panel now suggests mrztrn-style names, warns (never blocks) when you type digits, and the trainer logs the same note. Whether digits are the cause of the “trained fine, no identity” reports is being tested with the reporters — the shape known to work costs nothing either way.

    If you updated to 4.9.0 and buttons did nothing, 4.9.1 (also today) is the fix for that; this release includes it.

  56. v4.9.1 fix

    the buttons that 4.9.0 broke

    Read release notes

    v4.9.1 — the buttons that 4.9.0 broke

    v4.9.0 reorganized the panel’s code into separate files, and that reorganization had one blind spot: buttons inside generated parts of the page — the Quality / Animate / delete row on a gallery card, the LoRA list’s toggles and strengths, the character-training controls, timeline editing actions, CivitAI downloads, storyboard board actions — were wired the old way, by name, and those names stopped being reachable. The buttons looked fine and did nothing. 38 of them.

    Credit where it’s due: @blackest hit it, diagnosed the exact cause and sent a fix (PR #69) within a day of the release. What ships here is that fix plus an independent scan that caught one more; the PR is credited in the commit.

    So it cannot happen again: the build now fails if any button in generated markup points at a function that isn’t reachable — the same check turns red on the 4.9.0 code and green on this one.

    Also new, from a Pinokio request by @le_wib: hover any thumbnail in the Recent uploads strip and an × appears to delete that imported image (and its thumbnails) — no more hunting for hidden folders.

    Also in this release (landed on the dev line alongside the fix):

    • Editor: Delete now lifts, Shift+Delete ripples. Deleting a shot used to slide every later cut earlier; now Delete/Backspace remove the shot and leave its hole in place (a black slug you can fill, trim, or close up later), and Shift+Delete does the old ripple. Standard NLE convention.
    • Mute is remembered. Muting the theater once now keeps every later auto-preview silent — across clips and restarts — so overnight queues stop waking people up. Unmuting is remembered the same way. (Reported on Pinokio by fuschichou.)
    • Update can no longer report success on an install that can’t render. The second-commonest error in the fleet was “No module named ltx_pipelines_mlx” on installs that looked fine. Update now proves the render packages actually import; if they don’t, it reinstalls them once by itself before declaring anything.

    Updating: click Update in Pinokio as usual — no new downloads. If you updated to 4.9.0 and found dead buttons, this is the fix; sorry for the day of it.

  57. v4.9.0 feature

    the restructuring release

    Read release notes

    v4.9.0 — the restructuring release

    Nothing on your screen changes. Everything under it does.

    Phosphene’s entire panel used to live in one 72,000-line file — screens, styles, web routes and server all tangled together. That shape had already caused real shipped bugs (the same feature once got built twice, in the same file, and nobody noticed). This release takes it apart:

    • The screens now live as twelve plain files under webapp/js/ — the timeline editor, the render queue, Characters, Storyboard, each in a file named after it — plus one stylesheet and one page file.
    • Every web address the panel answers (all 101 of them) is handled in panel/routes_*.py, registered in a table that refuses to let the same address be claimed twice.
    • The server core (mlx_ltx_panel.py) is now pure Python — queue, engines, hardware tiers — at about a third of its old size.

    Why you should trust an update this big: every step was verified as it went. The served page was proven byte-identical before and after each extraction; the full test battery (54 checks, including a render-level file inspection) is green with zero skips; and real renders — text-to-video, image-to-video with a reference, spoken dialogue with healthy audio levels, Hailuo H3, still images, a storyboard plan, and a timeline-editor save/reload — all went through the reorganized code end to end. docs/ARCHITECTURE.md is the new map of what lives where, and automated checks now fail the build if anyone tries to put code back in the wrong place.

    Also in this release:

    • Removed a dead 356-line integration (scenema_client.py) that shipped with no callers, and several stale internal notes.
    • CONTRIBUTING.md now points patches at the map, and the whole pre-PR check is one command: bash scripts/release_gates.sh.
    • For anyone hacking on the panel: style and screen edits no longer need a panel restart — save the file and hard-refresh the browser.

    Updating: click Update in Pinokio as usual. This release adds no new model downloads. If anything looks off after updating, restart the panel once (the update pop-up will offer this), and please report anything odd on the issues page — this is a large internal change and reports are how the long tail gets found.

  58. v4.8.2 fix

    bug fixes

    Read release notes

    Bug fixes only. What changes for you:

    • Out-of-memory renders say so. A render killed by memory pressure used to end with a log that just stopped, or a meaningless code. It now names the cause and suggests the fix (shorter clip or smaller canvas).
    • No more forever-hangs. A render that makes no progress stops itself after 20 minutes with an honest message, instead of sitting on “running” until you restart.
    • H3 repair tells the truth (#68). The repair card now names the actual missing piece and lists everything it checked. Models on an external drive are recognized by the Pinokio sidebar too — no more phantom 75 GB re-download offers.
    • One memory floor for H3. Macs with 36–45 GB were told to install H3 by one screen and refused by another. It’s 36 GB everywhere now.
    • Update repairs itself. A broken Python environment used to make Update fail with a red banner; Update now rebuilds it automatically.
    • The header status chip is solid. It had accidentally been built twice and only worked by luck.
    • Load Params can’t crash renders anymore by resurrecting a speed control that was removed months ago.
    • You can copy from the Logs tab again — it was deselecting your text every 1.5 seconds, exactly while you tried to copy an error into a bug report.
    • Character training honesty (#62): the training info file now records what it actually trained on, widescreen trainings actually train widescreen, and the strength check no longer ranks working character files below broken ones.
    • Very old installs get a clear “click Update twice” message up front instead of a cryptic failure on every render.

    No new models to download. Update from the Pinokio sidebar.

  59. August 2026
  60. v4.8.1 fix

    the update that actually delivers the memory fix

    Read release notes

    v4.8.0 promised H3 at half the memory. If you installed H3 before that release, the promise silently could not be kept: the compact Q8 engine was never built on 64 GB+ Macs, and updating ships code, not weights — so H3 kept rendering with the full bf16 engine at ~40–48 GB, and nothing told you why.

    This release closes the loop. Just click Update.

    • Updating now builds the compact H3 engine automatically when H3 is installed — one time, ~5 minutes, ~22 GB of disk, safe to repeat. Measured on the exact field scenario (64 GB Mac, same job before and after): DiT load 38.56 → 20.22 GiB, denoise peak 21.26 GiB, no wall-clock cost.
    • No more silent fallbacks. If H3 ever runs the full engine without you choosing it, the render log says so in plain words and names the fix, and /status reports the reason as data.
    • The a2v Audio conditioning strength slider is now connected to a control that actually exists — it had been dropped silently on the Q8 path since the feature shipped.
    • Storyboard: sung shots are first-class. Write the lyric in the dialogue form and mark it sung; the planner budgets it at a measured singing tempo and the character’s trained voice comes along. A wordless “she sings” is now caught exactly like a wordless “he explains”.

    If you prefer maximum quality over memory, nothing is taken away: Settings → Hailuo H3 model → Full.

  61. v4.8.0 featureengine

    Hailuo H3 uses half the memory

    Read release notes

    H3 was handing the bf16 master to any Mac with 60 GB or more, on the reasoning that its peak fits. It fits, and it also leaves nothing behind it.

    Half the memory, same shot

    Measured on one prompt and one seed, 640×432 / 73 frames:

    modelresidentpeakwall
    bf16 (old default)38.56 GiB38.89 GiB196.9 s
    Q8 (new default)20.22 GiB21.38 GiB200.1 s

    45% less memory for 1.6% more time. An older note priced Q8 at “~12% slower”, which is seven times worse than it measures, and that number is why the heavy default went unquestioned for months. h3_dit: bf16 still forces the master if you want it.

    The control that chose between them did not exist

    h3_dit had been honoured by the engine and validated by the settings handler for months, and its own docstring said “h3_dit in Settings” — but no control was ever built, so the only way to reach it was to hand-write an HTTP request. It is now a row in Settings, with the measured numbers on it rather than an adjective. It was also write-only: the panel never returned the saved value, so any control would have opened on “Automatic” no matter what you had chosen.

    H3 was leaving you one gigabyte of your own Mac

    The runner defaults to --memory-gb 58, clamped by memsize − 1 GiB. Below 59 GB the 58 never binds and the clamp does:

    Macold limitleft for you
    32 GB31.0 GB1.0 GB
    48 GB47.0 GB1.0 GB
    64 GB58.0 GB6.0 GB

    64 GB is the machine those defaults were written on, which is why nobody saw it. Every size now keeps at least 6 GB, and more on a big machine. It costs nothing: H3’s peak is 25.63 GiB, so the limit was standing in front of your headroom without ever being the binding constraint.

    H3 now runs on 36 GB Macs

    The Q8 floor drops from 46 GB to 36. 46 was a guard band under a marketing number, picked when the only figure available was a single “27.3 GiB peak”. With the real profile — a 25.63 GiB run peak — and a budget that leaves you 6 GB, a 36 GB Mac clears it. Verified by rendering at a simulated 36 GB budget: byte-identical output to an unconstrained run.

    32 GB is deliberately still excluded. 27.5 GB of peak there leaves about 4.5 GB for the rest of the Mac, and a machine you cannot use while it renders is not a machine that runs H3.

    Prompt embeddings are cached

    H3 re-encoded every prompt through a 26.28 GB text encoder on every render — a seven-second phase that was, on the Q8 path, the run peak. Repeat prompts now skip it: 25.63 → 21.37 GiB and 11 seconds back, with sha256-identical frames.

    Also

    • LTX renders print a per-phase memory profile — weights, denoise, decode, and the run peak. H3’s runner has had this since its port; LTX had nothing, which is why its memory questions took measurement campaigns to answer.
    • The panel stops telling people to buy 64 GB for features that work at 48. Four refusals — High, Extend, first-last-frame, and the quality chip — said “bump to 64+ GB” for capabilities the tier table grants at 48, while the tier panel three clicks away said “48–79 GB · Every video mode works”. The number is now derived from the gate that produced the refusal.

    2,882 tests, 23 skipped.

  62. v4.7.0 feature

    the render that did not fit, fits

    Read release notes

    A third of every render’s peak memory was the allocator’s cache, and Phosphene never capped it. Now it does. Nothing about the picture changes — the output is byte-for-byte the same file — there is just far less memory between you and it.

    Memory

    • Peak memory down ~35%. A Q4 768×432 121-frame render went from 25.53 GB to 16.50 GB on a 64 GB machine, and got slightly faster while doing it (71.45 s → 68.84 s).
    • On a 16 GB Mac the same render sat at 101% of RAM and now sits at 96% — the difference between swapping and running.
    • The frames are sha256-identical to the uncapped render. This is not a quality trade; it is memory that was never doing any work.
    • The cap sizes itself from your machine (1/8 of physical RAM, floor 2 GiB, ceiling 8 GiB) and can be overridden with LTX_MLX_CACHE_GIB.

    Motion Control

    The Remix engine that turns your own footage into a new video was called “Control”, and in eight months two separate people asked us to build the feature it already was. It is now called Motion Control, and the words people actually search — motion control, pose, depth, reference — are on the card you can see without clicking anything.

    H3 custom LoRAs

    • Import an H3 LoRA from a file, including ComfyUI repacks, from the panel. Contributed by @sahilkashyap64 (#65, closing #64).
    • The import reads a converter’s own alpha metadata instead of assuming 1.0 — an adapter trained at alpha 8 / rank 128 no longer loads 16× hot.
    • Importing a 780 MB adapter now costs +2.7 MB of RAM instead of +9.5 GB, and takes under two seconds.

    Fixes

    • Training: the preset recommended by default could not carry a face. It no longer is (#62).
    • Image-to-video: the panel could substitute a reference image you never chose, and never checked whether the one you gave it survived.
    • Updates land on time. Pinokio reads update.js into memory and then runs it, so an update that fixes the updater always arrived one click late. The script is now thin and delegates to a file read after the pull.
    • Quality: a Compact Mac is told why High is unavailable, not just that it is.
    • Analytics: a refusal is no longer counted as a failure, and an H3 install that has fallen behind the panel is reported as exactly that.

    2,830 tests, 23 skipped.

  63. v4.6.0 feature

    the Editor

    Read release notes

    The timeline stopped being a strip at the bottom of the storyboard and became an editor.

    The Editor

    • Its own tab, for every engine. Drag anything you have generated onto a timeline: trim it, move it, split it, watch it back, render one file.
    • A media pool — this sequence, other sequences, generations, images, and your own uploads.
    • Sound is a lane. Every clip’s audio sits under it as a waveform. Unlink it, slide it under the previous shot, link it back: the character is heard before they are seen, and the preview now plays that instead of pretending.
    • Fades on picture and on sound — drag the top corner of any block, or type the seconds in the inspector.
    • Levels with keyframes. Hover a sound strip’s level line, click, drag. Fades and points are one curve, so “fade in to a quiet bed” is one thing.
    • An overlay track above the picture for transparent PNGs — end cards, logos, lower thirds. Alpha is kept in the preview, the render and the export. A card that arrives on a baked black plate is keyed automatically.
    • Mute a clip’s own sound, honoured in all three outputs.
    • Export for Premiere / Resolve / After Effects — a real project folder, media relinked, dialogue and music as separate stems, muted tracks disabled rather than deleted.
    • The timeline grows: drag its top edge and the height goes to the sound.

    Saving

    Manual saves are the only truth. Autosnapshots live beside them in Versions, never interrupt, and can no longer be switched off by anything — including a second tab merely looking at the film. A control that has stopped protecting you now says so, loudly, and keeps trying.

    The storyboard

    Describe the film, get the shots — now with a floor plan first, so a reverse angle flips the light instead of moving the actor to a different house. Lines are measured for how long they take to say, so dialogue stops being cut off mid-sentence.

    Speed

    Hailuo H3 with a 4-step turbo distill: a 10-second shot, with generated dialogue and sound, in about 11 minutes on Apple Silicon. Quality × Length replaces the fixed tier menu, and RAM picks the model — 48 GB Macs included.

    And the unglamorous half

    • A black frame flashed between some cuts. They were gaps a fraction of a frame wide — invisible, unclickable, impossible to fix by hand.
    • Transparent PNGs were flattened onto black on the way to the screen, because the thumbnailer saved JPEG.
    • The renderer applied a mix the preview never played: the music bed was attenuated and ducked under dialogue by numbers nobody could see. The mix is in the document now, and the preview and the render agree.
    • A J-cut could be saved and then never recovered — the writers allowed overlapping sound, the readers refused it.
    • Two tabs saving at once could both succeed, and one arrangement vanished.
    • The Save button occasionally became 1554 pixels wide.

    Weights and install are unchanged from v4.5.0. Update in Pinokio.

  64. v4.5.0 featurefix

    one status chip, and two outside fixes

    Read release notes

    One status chip instead of six pills

    The six status pills across the header truncated on a 14-inch window and couldn’t have taken a seventh. They’re now a single chip: colour follows the worst of them, memory stays on the face because it’s the number that decides whether your next render fits, and the full detail — tier, memory, helper, models, ComfyUI, queue, render — is one click away.

    Two fixes that came from outside

    The 48 GB resolution clamp now respects your tier override. A user on a 48 GB Mac Studio found that asking for 1088×1472 silently gave them 768×1024 while memory sat at 9.4 GB of 48 — and that forcing the tier changed the info modal without changing anything real. They patched it themselves and measured it: 12.79 s/it unclamped vs 13.4 s/it clamped, 284 s, no swap, no crash.

    Forcing a high or pro tier now lifts the cap, and LTX_GENERATION_PROFILE=full lifts it on its own. The 64 GB default stays — it was put there by a real swap failure — but it’s no longer the only voice.

    Model files now load on the fast path. The vpipe project measured that a checkpoint whose data section starts at the wrong offset makes every tensor quietly take a slow copy instead of a zero-copy view — 39.1 GB of it on a single file, with no error anywhere. Ours had the same weakness. Fixed, with a test that reads the rule out of the shipped source so it can’t silently drift back.

    No engine re-pin, no weights change, no render path touched. Update from the Pinokio sidebar.

  65. v4.4.0 feature

    updates have been silently keeping the old code

    Read release notes

    If you have ever updated Phosphene and seen no difference, you were right

    Pulling an update replaces the code on disk. It does not replace the code the running panel already loaded — that needs a restart. Phosphene has shipped a “Restart to finish update” prompt for exactly this since v4.0.5.

    It has never once been able to appear.

    The check compared the SHA on disk against a field it called the boot snapshot. That field is not a boot snapshot: the background version check re-reads it on every poll — deliberately, so a checkout that was dirty at startup and is clean now stops being treated as a local variant. But refreshing it also made it agree with disk within half an hour, so the question “has the code changed under this running process?” was answered no, permanently.

    The failure was silent in the worst way. The update succeeded. The panel kept serving the old build. Nothing anywhere said so. It was found on an install running a seven-hour-old process against a current checkout, reporting itself perfectly up to date the entire time.

    The process now records its own HEAD once at startup and compares against that, so a promote landing under a running panel is reported the moment it happens.

    If your Phosphene has ever looked unchanged after an update, Stop and Start it once after installing this. That is the last time you should need to think about it.

    Also

    • Updating takes one click. The Update button no longer asks whether you meant to press the button that says Update, and the “now restart” instruction appears in the banner you are already looking at instead of in a second dialog.
    • The star link has a permanent home in the header. It previously appeared only while an update was pending — so anyone who kept Phosphene current could never find it.

    No engine re-pin, no weights change, no render path touched.

  66. v4.3.0 featureengine

    engine dropdown, and contributing has an address

    Read release notes

    The engine picker is a dropdown

    The two-segment switcher was already crowding the header on a 14-inch window, and a third engine couldn’t have fitted at any width.

    It’s a dropdown now. The trigger shows the engine you’re on; the menu lists every engine with what it’s actually for — LTX with every mode and LoRAs, Hailuo H3 with joint video and dialogue and its install size, and anything announced-but-unreleased sitting there greyed as “soon”. Adding a fourth engine costs no header room at all.

    More room, continued. The memory badge reads 21/64 GB · 33% instead of spelling the same thing out in twice the words — the full reading moved to its tooltip. And the duplicate version badge is gone; the version pill beside it was already showing the version in every state it can be in.

    Contributing has an address

    New: CONTRIBUTING.md, which exists mainly to say one thing.

    A PR marked CONFLICTING here is not a rejected PR. Public main is published as a curated snapshot commit, so nothing can fast-forward onto it and every incoming PR conflicts, no matter how clean the patch is. Patches still get read, applied, shipped and credited by name — two recent contributor fixes did exactly that — but nothing said so, and two well-argued PRs sat in draft looking ignored. That’s on me.

    Fixes, features and new engines are all welcome, and none of them need asking about first. The engine table is data-driven on purpose: adding one is a table row, a mark, and a probe.

    No engine re-pin, no weights change, no render path touched. Update from the Pinokio sidebar.

  67. v4.2.0 feature

    updates announce themselves

    Read release notes

    Updates announce themselves now

    Finding out a new version existed meant clicking the version pill in the header — a check nobody performs. Phosphene already knew: it polls in the background and always has. It just said so quietly.

    It now says so once, clearly, in a banner across the top — the version available, the one you’re on, Update now, and Later. A banner and not a modal on purpose: an update isn’t an emergency, and a dialog thrown over a running render is worse than being out of date. “Later” is remembered per version, so dismissing this release won’t silence the next one.

    While the update runs there’s also, at most once ever, a quiet line asking for a star on GitHub. Click it — or say you already did — and it never comes back, including on every future update.

    That’s a local flag, not a lookup. GitHub can only tell an app whether a signed-in user starred a repo, and asking anyone to log into GitHub inside a local video panel just to suppress a prompt isn’t a trade worth making.

    Also in this release: the README’s “Current release” line had been sitting at v4.0.4 for five releases, the repo description never mentioned Hailuo or H3, and the topics were missing most of what anyone would actually search for. All fixed.

    No engine re-pin, no weights change, no render path touched. Update from the Pinokio sidebar.

  68. v4.1.1 fix

    the SIGABRT render crash

    Read release notes

    The Metal-watchdog retry now arms on the machines that needed it

    If every render died with helper exited from SIGABRT while the status stayed at starting, this is your fix.

    Phosphene has always carried a mitigation for the macOS GPU watchdog killing a long prompt-encode: shorten the encode and retry once, automatically. The retry was correct. Its trigger was not.

    macOS names a watchdog kill by how it decided to kill you. The classic long-command-buffer kill is reported as Timeout — which is all we matched. An M2 Max on macOS 26.5.2 reports the same kill as ImpactingInteractivity. So on exactly the machines the mitigation was written for, it sat armed and unreachable, the render aborted at [Encoding prompt], and the error text invited you to open an issue about a retry that could not fire.

    Both spellings now arm it. OutOfMemory and InnocentVictim deliberately still do not — those are different failures, and a shorter prompt is not their fix.

    Fixes #59 and #44.

    Credit where it belongs: @ybekocak root-caused this. They ran the helper’s job by hand to capture the crash line, demonstrated the engine CLI succeeded on the same machine, weights and venv, identified the matcher as the gap, and confirmed the fix on their hardware before a line of it was written here.

    No engine re-pin, no weights change, no render path touched. Update from the Pinokio sidebar.

  69. v4.1.0 feature

    the forming take loops

    Read release notes

    The forming take loops

    The live preview decodes a window of frames every time it publishes — 17 on LTX, 14 on H3 — and used to keep only one of them. It keeps them all now and publishes an animated WebP that the browser loops, so the forming take moves instead of standing still.

    • Nothing gets slower: the frames were already decoded and discarded. The extra encode is ~30 ms and ~16 KB per publish.
    • The still is still published and still served, so anything reading the old contract is unaffected. A runner that publishes no loop shows exactly what it showed before.
    • LTX rides the vendored pin, which moves to v0.14.19+ltx25.6. H3’s half arrives by re-running “Install Hailuo H3” from the sidebar — weights stay, it re-uses the clone.

    Known issue: while a finished clip is playing on the main stage, the forming take appears in the Now card instead of taking the stage. Fix to follow.

    Update from the Pinokio sidebar. No model re-download.

  70. v4.0.9 fixengine

    the Hailuo H3 live preview is published (and a correction)

    Read release notes

    release(v4.0.9): the Hailuo H3 live preview is published — and a correction

    4.0.7 said no published H3 runner could publish preview frames and that “the runner half is still to come”. That was wrong. The runner half had been written and validated — live_preview.py, its tests, a benchmark and eleven CLI options — on a branch that was simply never pushed. Saying “I could not find it” as “it does not exist” is the mistake, and it reached a release note, the panel’s own copy and a public post.

    It is published now. codex/h3-engine-v2 — the branch the H3 installer pins — was fast-forwarded onto that work, so re-running “Install Hailuo H3” from the Phosphene sidebar gives you the live preview on H3 renders: the forming take on the main stage, step count, ETA and Stop early, exactly as LTX has had. Your weights stay; it re-uses the clone.

    The panel’s note for an older H3 pack now says that, instead of announcing a gap that no longer exists.

    Nothing else changed: same engine pin, same weights, no render path touched.

  71. v4.0.8 fix

    the preview note stops squeezing the prompt

    Read release notes

    release(v4.0.8): the preview-absence note stops squeezing the prompt

    Hotfix for a layout regression visible in 4.0.7. On the Now card, the “why there is no preview” note was inserted into the same non-wrapping flex row as the prompt, so it competed for width and collapsed the prompt into a one-word-per-line ribbon. It now takes its own line under the card, which is also its reading order.

    The defect is older than 4.0.7 — the LTX missing-decoder and stale-engine notes shared the row — but those states are rare enough that nobody hit it. Giving Hailuo H3 an honest “this runner cannot publish preview frames yet” message made it common.

    Nothing else changed: same engine pin, same weights, no render path touched.

  72. v4.0.7 fix

    your reference image is honoured on every tier

    Read release notes

    release(v4.0.7): your reference image is honoured on every tier — and “Inspire” becomes a mode

    Four field reports and the analytics work, in one release.

    Image mode anchors on High and High·720p again. Give those tiers a reference image and you could get a beautiful clip of something else: the second-order sampler they run re-noised the conditioning tokens on every step, so the model composed the shot without ever really seeing your image, and only the delivered first frame matched. v4.0.2 fixed this class on the fast lanes and left the High lane as a deliberate open decision. It is closed now, resolved per model generation, so LTX-2.3 renders are unchanged byte for byte.

    Inspire. The old behaviour was accidentally useful — a reference that guides subject, style and palette while the shot re-composes itself — so it ships as an explicit choice instead of a defect. Image mode on LTX-2.5 now offers Anchor (animate this image) and Inspire (new shot from it), and the control says plainly that Inspire will not show your picture as frame one. It round-trips through Load Params like everything else.

    Ingredients now tells you the truth on LTX-2.5. Its reference adapter is LTX-2.3-trained and no 2.5 version has been published, so on 2.5 your references were quietly ignored and you paid the full two-stage render for an unrelated clip. The tab now says so and refuses, instead of spending your GPU. LTX-2.3 installs are unaffected, and the day a 2.5 adapter lands it is a one-line change. For reference-guided work on 2.5, use Image mode with Inspire.

    Hailuo H3 renders vertical. Every H3 canvas shipped landscape, which put social formats out of reach on that engine. Portrait is the same canvas rotated — the same pixel budget, so the same wall clock and the same tier estimate — and it is a per-render switch, so every clip you have already rendered still replays exactly.

    H3’s live preview says why it is absent. The panel side is finished, but no published H3 runner can publish preview frames yet, so the stage stayed empty without explanation. It now explains. Renders are unaffected.

    Anonymous usage stats got useful, without getting personal. Render events now carry the same coarse machine class the boot event always sent (chip family, RAM, OS, version), a log-spaced wall-time bucket, and a closed 16-value error class computed on your own machine — only the class is sent, never the text. That is what makes “which failures happen on which hardware” and “did this release get slower on 48 GB Macs” answerable at all. No prompts, no media, no filenames, no LoRA names — only counts and classes, and docs/ANALYTICS.md documents every single field. The off switches are unchanged: the Settings toggle and PHOSPHENE_ANALYTICS_DISABLED=1.

    Engine pin moves to v0.14.19+ltx25.5. No weights change, no registry change.

  73. v4.0.6 fix

    a vertical render previews in its own shape

    Read release notes

    release(v4.0.6): a vertical render previews in its own shape

    Hotfix. The main-stage live preview (the 4.0.4 feature) hardcoded a 16:9 stage for every forming take, so a vertical render previewed as a small pillarboxed strip and then snapped to its true portrait shape only when the finished clip arrived. The stage now takes the render’s own geometry from the first poll — a vertical take gets the tall portrait stage from the warming state on, exactly the shape the finished clip will claim. Landscape and dimension-less jobs are unchanged (16:9 fallback). Stage contract gate grew from 16 to 18 tests covering all three shapes.

    Nothing else changed: same engine pin, same weights, no registry change.

  74. v4.0.5 fix

    Turbo installs again, and the speed control that's real

    Read release notes

    release(v4.0.5): Turbo installs again, the dead speed control is gone, and a real one takes its place

    Two full audits of the panel ran overnight — every Customize control traced to the engine call it claims to make, and every Load Params journey walked end to end. This release is their punch-list.

    H3 Turbo installs again. The LightX2V v1.0 768p runner-layout adapter is now a digest-pinned release asset, and both install paths fetch and verify it: the one-click button on the Turbo pill, and the H3 installer itself. If your Turbo stopped working on 4.0.4 (“adapter missing”), this release fixes you — and the retired ckpt500-EMA adapter is accepted again as a last-resort fallback, so installs that were rendering fine on it get Turbo back immediately.

    The HQ Speed control was dead, and now it’s gone. Fast vs Exact wrote values the engine boundary silently discarded — both pills ran identical settings while the UI claimed “~12% faster”. Removed rather than left lying.

    A real speed control replaces it. On LTX-2.5’s distilled lanes, a new Speed row offers the engine’s own fast draft schedule: about 13% faster, and it renders a DIFFERENT take — same prompt and seed land on a different shot, which the control, the summary and the info modal all say out loud. The tier chips re-price while it’s armed.

    The canvas stops lying. Every LTX lane is two-stage and floors the canvas to multiples of 64 and frames to the 8k+1 grid. The job record, the warnings and the inputs now all say what will actually render, instead of a sidecar claiming 1000 pixels for a 960-pixel clip.

    Load Params restores the cast. Loading a character clip now waits for the character library, restores the selection through the real cascade (avatar ring, quality chip, both strengths, the voice toggle), and tells you plainly when the saved character no longer exists instead of flashing “Loaded” over a castless form. Extend clips restore their duration, direction, steps and CFG; the detail-guidance slider and the Length chip restore honestly too. And a hidden “No voice” left over from character mode can no longer quietly rewrite a plain render’s prompt.

    The header earns its space. The six status pills live in one health cluster that shrinks to colored dots on narrow windows — nothing important gets clipped any more. And a new pill catches a whole failure class: when the code on disk is newer than the code your running panel loaded (an update landing under a long-running panel), the header says “Restart to finish update” instead of serving yesterday’s UI in silence.

    Also: keyframe clips’ metadata now records the model that actually rendered them, and the character High chips carry the honest warning about strong vs weak character files on the two-stage pipeline.

    Engine pin unchanged at v0.14.19+ltx25.4. No weights change. Gates at the promote tree: pinokio scripts, engine pin, post-update, registry 169, schedules 45, character round-trip 35, LoRA compat, stage live preview, spicy contract, Turbo adapter 11, schedule preset 8, geometry 6, storyboard suites, compile sweep, page parse, output-codec render gate — all green.

  75. v4.0.4 fix

    the live preview plays on the main stage

    Read release notes

    THE LIVE PREVIEW PLAYS ON THE MAIN STAGE

    The live preview has existed since v3.7. It lived in a postage stamp next to the queue — which is not where anyone looks while they wait for a render. It now takes the big player.

    Start a render and it owns the stage immediately. While the model warms you get a calm Finding the shot… — nothing is drawn that the engine has not actually reached. Once the lane hits its own meaningful gate, the forming take plays full-size, with a LIVE badge, forming take · step n/m, the ETA you already had, and the Stop early button you already had. Watch the shot arrive instead of watching a progress bar.

    The thresholds stay server-owned and per-lane — 6 on the distilled lanes, 2 published estimates on res_2s, and H3’s own adapter marks its proven first forward as meaningful. The UI cannot invent a moment the engine has not produced.

    A clip you are watching is never stolen. If a video is playing — or you touched its controls in the last 12 seconds — it keeps the stage, and a small LIVE · return to render chip is the explicit way back. Picking an output from the list while a take is forming is a choice, and it is honoured.

    Completion cross-fades. The last preview frame stays mounted until the new mp4 is really listed, then the finished video fades over it. The deliberate two-second listing cutoff used to show an empty player for exactly that gap. It can’t now.

    One /status poll feeds both the full stage and the compact Now thumbnail — no second request, no second timer, no new render path. On H3 the wiring is capability-probed: a runner that has --live-preview gets the fast TAE checkpoint and a per-job live directory, an older runner gets an unchanged command line and behaves exactly as before.

    16 tests run the panel’s real client functions — the warming lane, full-stage ownership, both do-not-steal cases, both halves of the completion handoff.

    SPICY IS ONE SWITCH, AND IT IS THE SETTINGS SWITCH

    The per-render NSFW option was gated inconsistently between the two engines, so the answer to “is Spicy on?” depended on which engine you had selected. There is now one client predicate and one server predicate.

    With the Settings switch off, the CivitAI Show NSFW control is hidden — fail-closed in the page markup itself, not hidden after load — neither the first search nor Load more can submit nsfw=true, and the server forces the upstream query to nsfw=false and filters flagged cards anyway. With it on, the option appears on both engines. Engine selection now changes only the LoRA family, which is the only thing it should ever have changed. The picker also waits for /settings before its first search, which closes a stale-checkbox race.

    H3 TURBO MOVES TO THE LIGHTX2V v1.0 768p ADAPTER — AND ITS AUTO-INSTALL IS PAUSED

    Turbo’s draft adapter selection is now an exact, ordered allowlist: lightx2v_v1.0_768p_ourlayout.safetensors first, the alpha-folded v0.1 only as a fallback. The raw upstream v0.1 file is refused by name — its alpha/rank factor lives outside the checkpoint, so handing it to --lora …:1.0 applies a 16× oversized delta and renders coloured noise rather than a slightly-off clip. Never a glob; a convenient wildcard is exactly how that file gets picked up by accident.

    Credit for the selection goes to core_tan’s public LoRA testing, plus the owner’s own visual review.

    The honest part. The runner-layout repack is not published yet as a digest-pinned release asset, so:

    • automatic Turbo install fails closed with the exact publication requirement instead of downloading something that renders noise, and
    • the retired ckpt500-EMA adapter is no longer accepted.

    If Turbo was working for you on 4.0.3, it will report its adapter missing on 4.0.4 until that asset ships. Full-quality H3 renders and every LTX lane are unaffected — this is the draft lane only. docs/H3_ENGINE.md also stops quoting the retired adapter’s measured wall clock for v1.0 and marks those estimates as derived, because v1.0 has not had an end-to-end timing run yet.

    ALSO IN THIS RELEASE

    Everything from v4.0.3 and v4.0.2 rides along: the picker-LoRA crash fix (stacking a style or character file chosen by hand died with a missing import), image-to-video that actually animates the picture you gave it, the High · 720p tier, characters on the engine’s native runtime-LoRA route, and Enhance.

    No engine re-pin — still v0.14.19+ltx25.4. No weight change. No registry change.

    Gates: the three Pinokio script gates PASS · live-preview 16 · spicy contract 4 · H3 turbo adapter 5 · character round-trip 27 · LoRA compat 9 · storyboard 164 · page parse clean, version badge reads 4.0.4.

  76. v4.0.3 fix

    the picker-LoRA crash that 4.0.2 shipped

    Read release notes

    Stacking a LoRA from the library picker crashed the render on v4.0.2 — that release put every attachment behind a guard that verifies the adapter actually landed, the guard calls mx.eval(), and mlx_warm_helper.py imports mlx.core lazily per function, so the guard’s own closure never got its import and raised NameError: name 'mx' is not defined before it could check anything.

    It hit anyone who picked a style or character file by hand on 4.0.2; cast characters were unaffected, because they take a different branch that never reaches that line — which is precisely why the release’s own validation came back green and the defect still reached you.

    This release is that fix and nothing else — four lines, the same engine pin v0.14.19+ltx25.4, the same weights, no other render path touched — and v4.0.4, with features, follows shortly.

  77. v4.0.2 fix

    the image you gave i2v was thrown away after the first step

    Read release notes

    Two things that were reported as “it renders, it’s just wrong” turned out to be routing bugs — one of them deep enough to move the vendored engine tag. Everything else here is the known-remaining list v4.0.1 shipped with, closed.

    I2V ACTUALLY ANIMATES YOUR IMAGE NOW

    Image mode kept the character and the style of the picture you gave it, then rendered a different shot. The first frame always matched, which is why this read as “close enough” rather than as a bug.

    The image was being pinned into the model’s estimate every step, and Euler let that work by accident — at a pinned token the step’s velocity is exactly zero, so it comes back untouched. The euler-ancestral step LTX-2.5 selects has no such property: it rescales every token and adds fresh noise, unmasked. Measured on the real schedule, your image is halved and buried under noise 0.86× its own scale after the first step. From step 2 on the model was composing the clip without ever seeing it; the final step stamped the image back in, which is why frame 0 looked right on a clip that was decided blind.

    Frame-vs-input correlation, same image and seed: 0.09 → 0.79 at frame 36, 0.09 → 0.72 at frame 72, with frame 0 holding at ~0.975.

    The fix is in the engine, so the pin moved to v0.14.19+ltx25.4. Text-to-video at a fixed seed is sha256-identical across the change, and every other lane — 2.3 image-to-video, keyframe/first-last-frame, audio-to-video, extend, restore — never reaches the code that changed. The HQ tier’s first stage has the same defect in a milder form and is deliberately not fixed here: it is shared with LTX-2.3, so touching it would change 2.3 output.

    HIGH · 720p

    The 1280×704 canvas ships as its own tier, measured at about 8 minutes. High keeps the 1024×576 canvas it has always had. Redefining a shipped tier would have doubled its cost under everyone already using it and re-pointed every clip’s saved parameters at a canvas it was never rendered on.

    Every LTX estimate is repriced from real renders through the panel, not from a recipe the render lane never ran. If a number is measured it says so; if it is modelled it says that too.

    CHARACTERS RIDE THE ENGINE’S NATIVE LORA ROUTE

    The panel still installed an old shim that intercepted the pipeline load and fused adapters into the quantized weights before the engine’s native unfused path could be chosen. That erases part of a trained delta while still returning a perfectly plausible clip — the worst shape a bug can take.

    Every attachment is now verified against the file’s own module list, and a zero or anomalously partial fuse refuses with the filename instead of rendering a stranger. Incompatible files are filtered out of every picker and re-checked when the job is queued.

    Your trained characters may look slightly different from this release on — closer to their training, because the delta is no longer being partly quantized away.

    The trigger warning also stops crying wolf: casting a character covers its own trigger words, and a duplicate entry in your library no longer flags the copy you did not toggle.

    ENHANCE WORKS AGAIN

    The enhancer was resolving to LTX-2.5’s render text tower, which has no language-model head. The doomed load ate the request deadline, and by the time the error was written the browser had already given up — an empty response instead of a message. Rendering and enhancement now resolve independently, the enhancer’s deadline beats the UI’s, and a malformed reply becomes a real error you can read.

    SMALLER

    • Live preview says when it can’t run. An install whose engine predates the feature showed an empty frame forever. The reachable cause: v3.8.1’s own updater hardcodes an old engine checkout, so one click could move the panel forward and the engine backward. A second Update self-heals it — nothing used to say so.
    • Downloads get real filenames. Saving a clip gives you 01_bizarro_closeup.mp4 instead of a file literally named file. Byte-range playback is unaffected.
    • The Update refuses obstructions loudly and preserves untracked files. The guard checked only whether a path existed, so an untracked directory refused the update outright — which would have blocked the whole fleet on any release adding a file under logs/, cache/ or mlx_models/.
    • Every Q8 offer resolves the generation you actually have installed.
    • The codec check stopped failing on a healthy install — a clip whose sidecar recorded no codec request is skipped, not asserted.
    • The sample character downloads again, and the local-dev launcher looks for the virtualenv the installer actually creates.

    KNOWN REMAINING

    The HQ tier’s first stage carries the same noise-injection defect as the i2v anchor, in a milder form. It is shared with LTX-2.3, so fixing it is not a byte-identical change there — that is a deliberate decision rather than an oversight, and it is next.

  78. v4.0.1 fix

    the Update that reported success on stale code

    Read release notes

    A point release. An external review went four rounds over the v4.0.0 tree, probing the code rather than reading it. Nothing here is a new feature — every line is something v4.0.0 got wrong.

    THE UPDATE BUTTON

    It could report success without updating anything. The fetch result was ignored and every pull failure went to git reset --hard $UPSTREAM. $UPSTREAM is the LOCAL tracking ref, so when the fetch was the thing that failed, the reset landed on the stale commit already checked out, exited 0, and the post-update script then ran against the old tree. Offline, or behind an auth failure, you got a green Update and the code you already had.

    It could also delete your files. A dirty worktree and genuine divergent history were indistinguishable to it, so it answered “you have local edits” by destroying them. And git diff --quiet ignores untracked files, so a file you had dropped beside the app, at a path upstream had newly started tracking, was cleared away as an obstruction.

    Now a failed fetch is fatal and nothing touches the tree before one succeeds. Divergence is proven — git rev-list --count $U..HEAD — not inferred from whatever made the merge fail. A dirty worktree stops the run. An untracked file that upstream tracks is named and refused. Measured on real repositories: offline exits 1 with HEAD unmoved, a fast-forward converges, a dirty tracked file keeps its edit, an untracked collision is named and the file survives.

    The Update also keeps a promise the installer had been making for a month. install.js said “uv downgrades an already-installed 5.13.0 on the next Update”; nothing in the update path ever constrained transformers. An install stuck on transformers 5.13.0 could click Update, watch it succeed, and still not render a frame. It is a fatal step now, on the same resolve as the mlx pins.

    THE HQ TIER GETS ITS LIVE PREVIEW

    high.preview_every=2 promised a lane the HQ branch never wired, on either side — and the builder raised into its own never-fatal except and returned None, so the one component whose job is to stop things silently not happening was itself silently not happening. HQ renders publish frames every 2 steps now. Preview on and preview off still produce the same file, byte for byte.

    THE STORYBOARD PLANNER OBEYS ITS OWN LAWS

    Three defects, one class: the passes were not composable.

    A repair could hand back a shot with the premise restored and an unwritten speech act attached, under a warning saying the premise was back. A repair that breaks a law is rejected now, and the final invariant scan runs after the last mutation, whichever pass made it.

    Re-rolling shot 2 spliced its fix into the original plan, throwing away shot 1’s fix — three model calls to change nothing.

    And the appearance law, which keeps a cast character looking like the one you trained, had generalised itself into never naming a species at all. A film whose premise was “the main characters are humanoid animals” came back as twelve shots of ordinary humans. Every term the brief names is required on screen now, capped by a presence budget, because a five-species brief cannot fill a two-shot film. A plan that could not be repaired says so instead of reporting itself clean.

    CHARACTERS: WHAT YOU SEE IS WHAT YOU SEND IS WHAT COMES BACK

    The two surfaces generated different jobs for the same character — face 0.8 on one, 1.0 on the other, and the voice strength never submitted at all. Load Params knew only the retired 736x416, so every Draft render reopened as Pro, silently changing the shot’s geometry. The voice was never restored at all.

    One contract now, and the gate executes the panel’s own JavaScript against a DOM shim rather than grepping the source for calls it hopes are there. Its first version passed all twelve tests while the live loader was broken.

    EVERY OFFER FOLLOWS THE GENERATION YOU ACTUALLY HAVE

    An install pinned to LTX-2.3 was offered the 30 GB LTX-2.5 Q8 pack it cannot load. A split H3 model layout the panel called ready made Pinokio offer a 75 GB install for weights already on disk. The missing-decoder notice fired over H3 renders, image jobs and training runs, with an Install link for a decoder they never use. All three resolve the active version, read from the ENVIRONMENT file the launcher sources.

    Readiness is declared per capability now, not per file label. kind: "base" had come to mean both “fetched on a fresh install” and “the panel cannot render without it”. Gemma 3 is the first and not the second, so a half-downloaded planner model hid Start on an install that renders perfectly.

    SMALLER

    • The preview player can be hidden in Storyboard — it is a guest on the shot list, and it can leave. Thanks @cocktailpeanut.
    • The Pinokio store listing still said LTX 2.3, three weeks after 2.5 shipped. Reported via X by a user who went looking for an explanation and found the listing agreeing with the bug.
    • Both engines are presented as peers everywhere — switcher, installer copy, README. A missing engine is an offer with its size on it, not a lesser tier.
    • docs/H3_ENGINE.md now says to put persistent overrides in ENVIRONMENT. A shell export reaches only a panel launched from that same terminal, which is exactly how a working H3 install “loses” its engine on the next restart.

    KNOWN REMAINING

    The review’s last round named three narrow corners this release does not close. Fixes are already in progress for v4.0.2.

    • The updater’s obstruction set matches exact untracked leaf paths, so a parent-directory collision or a gitignored file (ENVIRONMENT) can still be cleared by a legitimate reset after genuine divergence.
    • The Character gate duplicates the submit expressions rather than executing that half, so a mutation there does not fail it. The shipped behaviour is correct; the coverage is not.
    • An LTX-2.3 Q8 click receives the 2.5 pack’s size and name in its notification text. The download itself fetches the right pack.
  79. v4.0.0 featureengine

    LTX-2.5, the generation Phosphene renders with

    Read release notes

    This is the release where the engine changes. LTX-2.5 is not an option in a menu here — it is what a fresh install downloads, what the panel boots into, and what every tier, estimate and character recipe is written against. As far as we can tell it is the first native Mac build of 2.5, and it runs on Apple Silicon with no PyTorch, no CUDA and no cloud, the same as everything else in this app.

    WHAT YOU INSTALL, AND WHERE IT COMES FROM

    A fresh install is about 37 GB and it is 2.5 only. LTX-2.3 is no longer part of a new install; if you already have it, it stays, it still renders, and Settings will tell you what it costs you in disk.

    The weights come from this repository’s own GitHub release, weights-ltx25-v1 — not from Hugging Face. There is no gate, no licence click and no token. We quantised these packs ourselves, so nobody publishes them but us, and a release asset caps at 2 GiB while the transformer is 11.3 GB — so anything over the cap goes up as ordered shards and comes back down one shard at a time. Publishing a 21 GB pack costs 1.9 GB of scratch space rather than a second copy of the pack, which matters on the machines we quantised the model for in the first place.

    Every shard is checked against its own SHA-256 as it lands, the reassembled file against the file’s hash, and a file is only renamed into place after that second check. A killed download never leaves something the loader would pick up, and it resumes rather than restarting. The LTX-2.x Community License and a NOTICE stating exactly what we changed are fetched onto your disk next to the weights.

    Proven from an empty directory: 12 install steps, RC=0, 34 minutes, 32 files verified against the published manifest, no retries and no warnings.

    WHAT THE PANEL DOES NOW

    A live preview, and a Stop early that means it. While a clip renders you see a rough decode of the frame the model has decided on so far — the framing, the light, roughly where everything is. If the shot is wrong you stop it, and the card tells you what stopping saves. It is deliberately soft and it says so: judge the shot from it, never the face. The preview costs you nothing you can measure — a clip rendered with it on is byte-for-byte the clip you would have got with it off, and that is asserted by SHA-256 rather than assumed.

    Tiers that are measured, or admit they are not. Quality × length, priced off real renders on real hardware, with the estimate on the chip you are about to click. The cost model is fitted to measured anchors and cross-validated: ask it to price a combination neither anchor is and it comes back 2.4 % off what that combination actually took. Three subtitle writers that were printing 2.3-era minutes at 2.5 renders are gone.

    Characters, in about the time it takes to read this. A trained character on the Q8 distilled path renders a 5-second 1024×576 clip in roughly 140 seconds. The quality chips pick a canvas size, which is all they were ever for; which pipeline runs is the server’s decision and it is derived from the generation on disk, so the tab and the composer cannot disagree about what you are getting.

    The face and the voice are two numbers. A character is two trained files, and the face file’s marks on the audio side are noise that is louder than the voice file’s signal at equal strength — so running the voice hotter than the face is what makes it win. There is now a split control that lets you, and a help note that explains why. Both default to 1.0, the pair every clip we have graded was rendered at.

    Storyboard gives a shot its voice only when it has a line to say. Voices are gated on the planner’s own dialogue tags rather than on a global switch, so silent shots are silent.

    Settings → Storage. What is on your disk, measured by walking the real directories rather than trusting a number in a table, with what each thing costs and what can go. Files that cannot be removed are shown as kept, not as a problem. The section hides itself entirely when there is nothing to reclaim, which on a fresh install is the normal case. Removal refuses the model you are rendering with, refuses a download in flight, and never takes a path from the browser.

    FIVE MODES THAT HAVE BEEN BROKEN THE WHOLE TIME

    Colorize, Restore, Ingredients, Control and HDR asked the sampler for more denoising steps than their checkpoint’s schedule contains. The sampler refuses to pad a schedule — correctly — so each of these loaded its models, worked for about 218 seconds, and then died on a message about thinning a 9-point schedule up to 10.

    It was reported as an LTX-2.5 break. It is not. Measured on both generations, 2.3 refuses the identical request in the identical way: these five modes were broken on every version of Phosphene that has shipped them, and “it works on the old generation” would have sent the next person hunting in the wrong port.

    The cause was one unconditional line writing a step count onto every job from a form field that does not exist, so five lanes’ own correct defaults were dead code behind it. Now the counts ride only when you actually send them, every lane keeps its own default, and the resolved value is clamped against the pack being loaded by asking the library how long its table is instead of restating it here. A new gate, scripts/assert_schedules.py, builds the job dict through the real code path for every mode against every registered generation and hands the result to the engine’s own scheduler — 42 checks, about a second, no GPU. It was mutation-tested: put the old line back and it goes red naming the line.

    THE UPDATER FIXES ITSELF ON THE FIRST CLICK

    Pinokio reads update.js from disk into memory and then runs it, and step 1 is what pulls the repo — so the file deciding how to update you is always the one you had, not the one you just downloaded. Any fix shipped in that file lands one click late, forever.

    So update.js is now thin and stable: pull, then delegate. Everything that can break — the vendored engine checkout, the pins, the patches, the weight fetches — lives in scripts/post_update.sh and scripts/pinokio/ltx_checkout.sh, which are read after the pull and therefore always ship with the version they belong to.

    The engine pin is now a tag, not a commit SHA. v3.8.0 through v3.8.3 pinned a bare SHA reachable only from a branch head that had already moved past it; a single force-push upstream would have stranded every existing install with an un-fetchable pin and a dead Update button. scripts/check_ltx_pin.js is the gate that keeps it honest.

    ALSO

    • The Pinokio menu offered “Download Q8 (~37 GB)” forever, because it decided whether you had the pack by looking at LTX-2.3’s directory while the button installed LTX-2.5’s. Correct pack, correct size (~30 GB), correct promise: trained characters and voices.
    • The anti-mosaic preflight had been switched off in the field since 2.5 became the default — it compared the model id against the wrong generation’s path. Fixed, and re-proven with the original bug’s own reproduction. It now refuses before Gemma loads instead of failing thirty seconds into a render.
    • A duration you typed could be silently rounded away while the menu kept showing what you asked for. Every menu now reads its engine’s own table and says so when it snaps.
    • assert_registry is 113 passed, 0 failed, 0 defects pinned — the first honestly green run since those markers went in.

    WHAT TO DO

    If you are already installed, click Update. If you are on LTX-2.3 you stay on LTX-2.3 until you fetch the 2.5 packs, and Settings → Models is where you do that. A fresh install goes straight to 2.5 and needs no Hugging Face account for any of it.

  80. v3.8.3 fix

    the install hang, actually fixed this time

    Read release notes

    If Pinokio froze on you during a fresh install and you had to force-quit it, this is the release that fixes it. Nothing else in the app changes.

    WHAT WENT WRONG

    On Pinokio 8.0.x, installing Phosphene could freeze Pinokio at 100% CPU immediately after git rev-parse --short HEAD. No child process ever started, nothing was logged, and clicking Install again did exactly the same thing.

    v3.6.2 already tried to fix this. @Morac2 bisected the ceiling in #50 — a 764-character command hangs, about 373 passes — and the rule we adopted was “no generated shell line over 350”. The rule was right. The measurement was wrong.

    What Pinokio writes to its shell is not a line of our source. Its kernel sends an array of commands one shell at a time, but a single joined string in ONE write. Every long payload in this repo is deliberately a joined string, because that is how an if/else runs in one shell — and those were exactly the ones nobody was counting. The LTX venv step’s individual lines were all under 110 characters, and it handed Pinokio 1,417 characters in one go.

    @davidaircloud measured that 1,417 himself on a clean 3.8.0 install and fixed his own machine by moving the payload into a shell script. @itrejomx hit the same stall in #56 and fixed his by splitting the payload. Both are the same lever, and this release pulls it properly.

    WHAT CHANGED

    Four oversized payloads moved into scripts/pinokio/, and each step now dispatches one short line:

    install.js LTX venv check 1417 chars mflux image-engine pack 529 install_h3.js H3 memory preflight 845 Q8 engine build 595

    The largest thing Phosphene now hands Pinokio is 498 characters. Every script is a verbatim lift of what was there — same commands, same order, same exit behaviour — and a new gate, scripts/check_pinokio_scripts.js, loads each launcher and measures what is really dispatched so this cannot come back unnoticed. The vendored engine pin is untouched.

    Proven by running every old payload and its new script side by side in identical sandboxes across every branch — healthy venv, broken venv, the macOS 13 refusal, mflux, the H3 preflight at 32 / 48 / 64 GB, and the Q8 build already-done / build / skip. Ten for ten identical on output and exit code.

    ALSO IN THIS RELEASE

    Installing Hailuo H3 used to finish by telling you “the Video tab now has an Engine row”. It doesn’t, and hasn’t for some time — the engine switcher is in the top right of the header, next to the memory and models pills. That sentence is what #58 went looking for. Fixed in the notification and in the docs, along with the one condition that genuinely hides the switcher: it only appears when this Mac can render with more than one engine, which on a 48 GB-class Mac means the reduced-RAM Q8 pack has to be on disk.

    WHAT TO DO

    Nothing re-downloads. No model weights, no engine change, no settings touched. If you are already installed and running, this release changes only how the installer talks to Pinokio — update at your leisure. If you have been unable to install at all, this is the one that unsticks you.

  81. v3.8.2 fix

    the update that finishes: encoder patch restored

    Read release notes

    release(v3.8.2): the codec patch never ran, and nothing noticed

    If you updated to v3.8.1, update once more. There was no visible symptom, which is what made this one dangerous.

    WHAT WENT WRONG

    After a v3.8.1 update the app reported a finished update, the engine pin had moved, the version handshake was green — and the one file Phosphene patches in the video engine was still upstream. Every render was being encoded 4:2:0 yuv420p instead of lossless yuv444p. No error, no warning; just blocky compression on faces and skin, which is the exact artifact that patch exists to prevent.

    Three things had to line up, and they did:

    1. THE RUN ENDED EARLY. Pinokio’s own session log for a real v3.1.1 -> v3.8.1 update records steps 0-7 of 18 and then nothing. The last step executed was certifi, a plain pip install --upgrade, and its output carried pip’s “ERROR: pip’s dependency resolver does not currently take into account all the packages that are installed” block — a permanent side effect of mlx-vlm being installed —no-deps. pip still exits 0 (measured); the run ended anyway, and everything after it was skipped in silence. Corroborated on that install: no smolagents, no mflux, no mlx-teacache either.

    2. THE PATCH SAT TOO LATE. It was eleven steps down, behind litellm, smolagents, mflux and the IC-LoRA fetches — all optional, all able to end the run before the one step that is not optional.

    3. THE PATCH SCRIPT GUESSED WHERE TO LOOK. It walked a hardcoded list of relative paths resolved against the working directory, so running it by hand from anywhere but the app root reported “MISSING - target file not found” on an install whose file was right there.

    WHAT CHANGED

    • The codec patch now runs immediately after the engine reinstall that replaces site-packages, before any optional package step exists to truncate the run. A gate enforces the ordering so it cannot drift back down the file.
    • Every remaining plain-pip step in update.js is now a uv step. Same installs, same broken metadata, zero resolver-ERROR output — measured side by side. install.js was already all-uv, which is why fresh installs patched fine.
    • patch_ltx_codec.py resolves its target through the running interpreter’s own import machinery — the file the panel will actually import — instead of guessing at directory names. The path list survives as a fallback, anchored on the script’s own directory rather than the working directory.
    • After patching, it re-reads the resolved file, asserts the patch is really there, and exits non-zero behind a banner if it is not. Reporting success while the runtime stays unpatched is exactly what shipped in 3.8.1; it cannot happen quietly again.

    No re-download, no weight change, no pin change — the vendored engine is still 871694d / 0.14.19+ltx25.1.

    Updating takes two clicks, the same as always: the first pulls this release, the second runs it. If you rendered anything on v3.8.1, those clips are 4:2:0 — re-render them once you are on 3.8.2.

  82. v3.8.1 fixengine

    Update works again (engine pin-move fix)

    Read release notes

    release(v3.8.1): the Update that could not be retried

    Update and Install could abort at the video-engine pin with

    error: Your local changes to the following files would be overwritten by checkout:
        packages/ltx-core-mlx/src/ltx_core_mlx/model/video_vae/video_vae.py
    Please commit your changes or stash them before you switch branches.
    Aborting

    and no number of retries cleared it, because nothing in the flow ever un-dirtied the file. “Click Install again” — the recovery we tell people to use — died on the same line.

    WHY EVERY INSTALL IS DIRTY

    ltx-2-mlx is a uv workspace, and install.js installs its members with deps and without —reinstall, so uv links them EDITABLE: site-packages gets _editable_impl_ltx_core_mlx.pth, not a copy. patch_ltx_codec.py resolves its target through VENV_ROOTS — site-packages first, packages/ltx-core-mlx/src as a fallback — finds no ltx_core_mlx directory in site-packages, and patches the GIT-TRACKED SOURCE. So a perfectly successful install ends with a modified tracked file, every time. An install that died at the package step lands in the same place for a different reason: nothing in site-packages at all.

    The v0.14.8 -> 871694d pin move rewrites the very ffmpeg lines that patch edits, so git refused to move the pin.

    THE FIX

    install.js and update.js now discard local edits in the vendored checkout (git reset —hard HEAD, behind a guard that the shell really landed in that tree) before moving the pin. That checkout is app-managed end to end: models live in ../mlx_models, the build constraints in ../pip-build-constraints.txt, and the only non-tracked thing inside it on a real install is the ignored env/ venv — which reset —hard does not touch.

    Update’s own uv pip install --reinstall --no-deps step then replaces the editable .pth links with real copies in site-packages, and the codec patch re-applies there — so the runtime imports a patched video_vae.py (yuv444p crf 0

    • faststart, verified) and the vendored tree is left clean for the next pin move.

    General, not SHA-specific: any modified tracked file that differs across a pin move is now cleared, so the next pin bump cannot hit the same wall.

    No model re-download, no weight change, no pin change — the vendored engine is still 871694d / 0.14.19+ltx25.1.

    Updating takes two clicks, the same as always: the first pulls this release, the second runs it.

  83. v3.8.0 featurefix

    Storyboard, and the install fix everyone new was waiting for

    Read release notes

    READ THIS FIRST IF YOUR INSTALL OR UPDATE FAILED

    If Phosphene has refused to install or update recently and the log ended in metadata-generation-failed, that was not your machine. hatchling 1.32.0 — a build tool three dependencies deep — started rejecting a line that all three vendored ltx-* packages have always declared, and from the day it shipped every fresh install and every Update click died at the same step, on every pinned version. Nothing you could do locally fixed it.

    It is fixed here. Both installer paths now pin the build backend (hatchling<1.32, in pip-build-constraints.txt). Click Install again — or Update, if you already have Phosphene. Every step is resumable and nothing already downloaded is downloaded twice.

    STORYBOARD — describe a film, get a shot list you can argue with

    The new Storyboard tab turns a sentence into a plan before it spends your afternoon. You write the concept; a planner drafts the shots — each with its own prompt, mode, duration and camera; you read them, rewrite the ones that are wrong, re-plan individual shots, drop shots in, and only then hit render.

    • It costs no new download. The planner runs on the gemma-3-12b-it-4bit weights the panel already fetches for prompt enhancement.
    • Shots render grouped by pipeline, not in story order, because the warm helper holds one pipeline at a time and switching costs minutes. Clips are re-sorted back into story order at assembly.
    • The face law. A planner left alone writes silhouettes, backs of heads and faces cropped out of frame — it feels cinematic and it wastes renders. The face is now a structural field rather than a polite request: it is a closed set of values, the sentence is written by the code and not the model, and a hidden face is refused unless your brief asked for one in so many words. Across a 56-shot test corpus, person-silhouettes went 5 → 0.
    • Draft the whole film cheap, then deliver it. Two passes with their own settings: a fast low-res draft pass to see whether the film works, then a delivery pass that re-renders on each shot’s own seed at full quality. Each pass tracks its own outputs, so asking for delivery after a draft does exactly what it says.
    • Plans are durable on disk, re-openable, and export as a readable storyboard.md alongside the JSON.
    • It picks its engine (Auto / Hailuo H3 / LTX-2.3), and it estimates before it commits.
    • Ask for 4 shots and you get 4. The chips are what the UI offers, not the only counts the API accepts — any number from 1 to 48 is honoured, and anything outside is refused by name rather than silently turned into something else.

    FIXES

    • #52 — the update pill was dead for everyone who installed the H3 pack (@Morac2). The panel decided the tree was modified by asking git for a status that counts untracked files — and installing H3 creates an untracked folder by design. So the update check switched itself off permanently and quietly. Both probes now ignore untracked files, and minimax-h3-mlx/, cache/ and logs/ are ignored properly. If your pill has been stuck on “Update check is paused”, this is why, and it is over.
    • #46 — the audio start offset did nothing (@blackest). Both audio-to-video pipelines had accepted a start time all along; the panel never put one on the job. There is now an Audio start field, it survives Load Params, and junk input can’t 500 the submit. The duration slider also stops being silent past 241 frames — it names the frame count and the wall people keep hitting. It warns rather than capping, because the number in the field reports is not one we have measured ourselves.
    • #53 — a first keyframe came back stretched (@Morac2). Upstream hard-fits keyframe 0 to the canvas, discarding its aspect, and the panel only ever sends keyframe 0 — so no setting on your side could avoid it. The reference is now cover-cropped to the exact canvas first, which makes upstream skip its own resize entirely. No extra cost, and if the fit ever fails you get today’s behaviour rather than a dead render.
    • The Hailuo H3 menu entry now appears on 48 GB Macs. v3.7.0 brought H3’s peak down to ~27 GiB and opened the engine to 48 GB machines, but the Pinokio menu was still gated at 60 GB — so the people it was built for couldn’t see it.

    UNDER THE HOOD

    • A model-version registry. Which LTX generation the panel drives — its packs, its text encoder, its HQ weight filenames, which feature tiers it can serve — is now one declarative table that every consumer reads, instead of constants and string literals scattered across a dozen call sites. That scattering is what produced the “mosaic” bug in June: one file dropped out of one download list, and two weeks went into three wrong theories.
    • The vendored MLX port is re-pinned to the fork build 871694d (0.14.19+ltx25.1), which carries the LTX-2.5 port. LTX-2.3 remains the only generation this release ships and renders; every 2.5 flag defaults to its 2.3 value, so an unversioned checkpoint builds exactly what it built before.
    • Analytics: a truth pass. The transparency page and the README were still saying “no telemetry” and “a fresh clone sends nothing” after the build began shipping a working PostHog key. That was wrong on eleven surfaces and it is corrected on all of them. A second wrong claim was caught before it shipped: clearing the key in Settings is not an off switch — an empty field is no override, not off. The toggle and PHOSPHENE_ANALYTICS_DISABLED=1 are the two off switches, and every surface now says so.
    • Every event now tells the receiver not to locate it. Nothing was removed, because no location code ever existed here — what changed is that PostHog’s default of deriving country, city and coordinates from the connecting IP is now suppressed on every event instead of merely unmentioned. docs/ANALYTICS.md has a Location section that states the limit of that promise plainly: the request still arrives from a real address, and no flag inside a body changes that.

    Thanks to @Morac2 and @blackest, who reported three of the four fixes above.

  84. vweights-ltx25-v1 featureengine

    LTX-2.5 weight packs (q4 + Gemma 4 text encoder)

    Read release notes

    Weights, not code. This release carries Phosphene’s LTX-2.5 model packs so a fresh install has weights for the default generation. There is no app update here — the tag exists only to host these assets.

    You do not download these by hand. Phosphene fetches, reassembles and verifies them for you during install (scripts/fetch_pack_release.py), and the Models page has a Download button for the optional tiers.

    What’s here

    PackRegistry keySizeRole
    ltx-2.5-mlx-q4q4_2520.7 GBLTX-2.5 diffusion transformer, 4-bit — the default lane
    gemma4-12b-ltx25-q4gemma4_256.7 GBLTX-2.5’s Gemma 4 text encoder, 4-bit — not interchangeable with the Gemma 3 encoder LTX-2.3 uses

    Why the files look chopped up

    A GitHub release asset is capped at 2 GiB and the transformer is 11.32 GB, so anything over the cap is published as ordered shards of at most 1.9 GB (…​.part000, …​.part001, …). Each pack’s <key>__phosphene_release_manifest.json carries the sha256 and byte count of every shard and every reassembled file; the installer checks both, and only renames a file into place once its whole-file hash matches. A truncated or corrupted transfer cannot survive that, and a re-run resumes instead of starting over.

    Those manifests are the in-pack phosphene_quant_manifest.json that scripts/quantize_ltx.py emits, extended with the shard lists — one format, so the panel’s deep-verify reads either.

    Provenance

    Quantised by us with scripts/quantize_ltx.py from the official Lightricks LTX-2.5 bf16 release: 4-bit, group size 64, block linears only (AdaLN, patch embedding and output projections stay bf16 — the same recipe the community 2.3 packs use). The quantiser runs on the CPU stream and is byte-deterministic, which is what makes a published sha256 mean anything.

    Licence

    These weights are a Derivative of LTX-2.x and are distributed exclusively under the LTX-2.x Community License Agreement. The complete Agreement, including Attachment A, is published here as LICENSE-LTX-2.x-Community-License.md, and NOTICE.md states exactly what we changed. Both are installed into the pack directory alongside the weights.

    If your organisation has annual revenue of $10M or more, you are a Commercial Entity under that Agreement and you need a paid licence from Lightricks before any use that is not purely non-commercial: ltxv-licensing@lightricks.com. Read NOTICE.md before you use or redistribute these files.

    Model © Lightricks Ltd. MLX inference port by dgrauet.

  85. v3.7.0 featureengine

    drafts in a minute, a real 10 seconds, H3 LoRAs, low-RAM engine

    Read release notes

    The headline: iterate in drafts, commit when it’s right

    Draft mode. Draft tiers now decode through a tiny fast decoder instead of H3’s 36-layer ViT — the single biggest fixed cost in a render. A 640×384 5-second draft lands in about a minute; a full 10-second single-pass draft measured at 5:05. Delivery tiers are untouched — nothing you ship is affected.

    A real 10 seconds. ”10s single pass” now sits beside the chained 10s on every canvas up to Native 1344×768. One window: no seam, no repeated action, no drift between halves. (Requested by @Wizard_1981 — echte 10 und 15 Sekunden Videos. This is that.) It was hidden behind an unmeasured memory assumption; seven measured renders retired it.

    Hailuo H3 LoRAs from CivitAI. Browse and install in the same picker LTX uses. H3 has one adapter slot, so a LoRA and Turbo can’t both run — the panel says so and lets you pick instead of silently dropping one. ComfyUI-namespace files are converted losslessly on the way in; diffusers/PEFT files are refused with the reason (their scale factor isn’t in the file — guessing renders noise). Validated end-to-end with a community character LoRA: 208/208 modules applied.

    Low-RAM engine — H3 now runs on 48 GB Macs. A quantized (Q8) DiT renders at 27.3 GiB peak instead of 42.8, +5% wall time, faces held in a reviewed A/B. RAM picks the engine automatically: 60 GB+ keeps full bf16, below that the Q8 pack is used — and 48 GB-class Macs, previously told H3 was impossible, now build the pack locally at install (~5 min, bounded memory). h3_dit in Settings overrides either way — including forcing Q8 on a 64 GB Mac to keep ~15 GiB free for the rest of your work while rendering.

    Fixes

    • Generate button silently dead after Load Params / Finish — a clip’s fractional duration (5.13s) restored into an integer-only field made the form invalid, and an invalid form refuses to submit with no error at all. Fixed.
    • LoRA on the quantized engine applied zero modules (shape check read packed storage) — caught by validation, fixed, re-proven.
    • Gallery cards now read ”10s clip · rendered 5 m” — the length first, the render time labeled.

    Also

    • H3 runner updated: pin moved to codex/h3-engine-v2 (new branch, no history rewrite — existing installs update via Repair Hailuo H3).
    • Phosphene now sends anonymous usage counts (version, hardware class, render outcomes — never prompts, never media). It tells you on first run; Settings has the switch. Full schema in docs/ANALYTICS.md.

    Thanks: @Wizard_1981 (the 10s report and the wish list), @Morac2 (#50 root-cause), @edserra, Kijai, larryvrh, LightX2V/ModelTC, madebyollin (taeh3), Tr1dae, and antirez’s h3.c for the technique recon.

  86. v3.6.2 fix

    install-hang fix

    Read release notes

    Fixes the install hang on Pinokio 8.0.40 / macOS Tahoe.

    If your install got stuck on a blank white window (with the log looking like it was repeating a git clone), this is the fix. Pinokio 8’s shell stalls on very long single lines; our installer had one, in the macOS version check. Every install shell line is now split short — installs that froze now complete.

    Thanks to @Morac2 for root-causing it by bisection (#50) and @edserra for the report.

    Update via Pinokio → Phosphene → Update, or reinstall from Discover.

  87. v3.6.1 fix

    chained 10s and 15s clips stop repeating

    Read release notes

    Two users reported that 10-second and 15-second clips repeat every 5 seconds. Here’s what was happening and what changed.

    The cause

    A 10s render is two chained 5-second windows; 15s is three. The frames were always unique — the background genuinely progresses. But every window was asked for the same prompt, so a one-off action (“he raises his arm”, a line of dialogue) got performed again in each window and read as a loop. A continuous action (“he walks down the corridor”) carried on fine, which is why some scenes looked right and others didn’t.

    Per-window prompts

    On any chained length there’s now a Per-window prompts control. Expand it and each window gets its own beat — window 1 sets it up, window 2 pays it off. A real two- or three-beat shot instead of one instruction repeated.

    • Follows the Length strip live: 10s → 2 boxes, 15s → 3, labelled with their time ranges.
    • Prefilled with your main prompt when you expand it, so you edit rather than start blank.
    • Leave a box empty and that window falls back to the main prompt — direct only the window you care about.
    • Leave the control off and behaviour is byte-for-byte identical to before.
    • A ? explains the mechanic in the panel, so nobody has to work it out from a release note.

    Also restored by Load Params and Draft → Finish, recorded in the sidecar, and shown in the ⓘ modal. On an H3 pack older than the engine flag the control hides itself and renders behave as they do today, rather than failing.

    Meanwhile, a prompting tip that helps immediately

    For chained lengths, phrase the shot as one continuous action rather than a discrete beat. “He walks the length of the corridor and stops at the door” chains cleanly; “he raises his arm” will happen once per window unless you use the new control.

    Thanks to @natxou and @Wizard_1981 for the reports — both landed within hours of each other and made this an easy call.

    Update via Pinokio.

  88. v3.6.0 featureengine

    Quality × Length, the Native tier, and a UI that only shows what your engine can do

    Read release notes

    Pick quality and length separately

    Hailuo H3 renders used to come from a fixed menu of six presets, which quietly made most combinations impossible — the best canvas could only ever produce 5-second clips. Now there are two axes:

    Quality — Draft 640×384 · Standard 768×448 · High 1024×576 (true 16:9) · Native 1344×768 Length — 3s · 5s · 10s · 15s

    Every cell is renderable. High at 10s and Native at any length were previously inexpressible.

    The estimates are computed, not looked up. A cost model fitted to real renders on an M4 Max prices each combination, and the two top canvases carry measured end-to-end Turbo numbers. Sample, with the Turbo adapter installed:

    5s10s
    High 1024×576 (16:9)~8-9 min~17 min
    Native 1344×768~20 min~38 min

    The engine picker is where it belongs

    It moved out of the middle of the Video form into the top right, as a segmented control with its own mark per engine, separated from the status pills by a hairline — choice on one side, state on the other. It renders from an engine registry, so adding a third engine is one table entry rather than a UI rewrite.

    Every control now belongs to an engine

    The H3 surface was advertising things H3 cannot do. Gone when H3 is active: Character, FFLF, Keyframes, Extend, Remix, the character strips, Enhance (it rewrites prompts in LTX’s style and destroys H3’s dialogue tags) and Avoid (H3 is guidance-distilled — there is no negative prompt, so the field did nothing). In its place, a line explaining the in-prompt approach that does work.

    Also fixed:

    • Load Params restores the engine and its settings, not just geometry — loading an LTX clip while H3 was open used to leave LTX dimensions under an H3 tier strip. It now confirms visibly instead of succeeding in silence.
    • Speed prints two comparable absolute times (Standard 8 min / Turbo 4 min) instead of a sampler description next to a tilde that read as a minus sign.
    • Export is called Upscale, Steps is back on the surface where you can find it, and Turbo is the default when the adapter is installed.
    • A true 16:9 canvas exports to 720p and 1080p as a pure scale — no letterbox bars — and every tier states its aspect out loud.

    Install no longer loops forever

    If an install failed, Phosphene retried it automatically, forever, showing shell restarts instead of the error. It now stops after a failed attempt, says what broke, and offers Reset. This has been present in every release since v2.0.0 — thanks to @natxou for the screenshot that made it findable.

    Also: the header badge has claimed “3.0” on every release since 3.0. It reads the actual version now.

    Update via Pinokio.

  89. v3.5.0 feature

    Turbo: half the wall clock, better faces

    Read release notes

    Turbo for Hailuo H3

    A 4-step distillation LoRA renders in 3 forwards instead of 6 — roughly 0.6× the wall clock of the 9-step default at every tier. In matched face crops it comes out sharper at the mouth and less glossy than the full-step render it replaces, so this is not the usual speed-for-quality trade.

    • One toggle in the new Speed row on the H3 strip. Off by default; the non-Turbo path is byte-identical to before (verified: --lora …:0 renders sha256-identical to no adapter at all).
    • The toggle only appears when the adapter is actually installed and your H3 pack supports it — one click downloads ~0.8 GB.
    • Adapter by @larryvrh (Apache-2.0). Weights are never bundled; they’re fetched from Hugging Face on demand.

    Draft → Finish

    Render the ~3-minute Draft tier to check your shot, then one click re-queues the identical job — same seed, same prompt, same first frame — at a delivery tier. The draft tier now also says what it’s for: composition, motion and dialogue timing. Faces and fine detail resolve at the higher tiers.

    Notes

    • Turbo is an early distill from an in-progress training run upstream. It’s a speed mode, not a replacement for the full-step path.
    • VERSION had drifted at 3.4.1 through the v3.4.2 release; corrected.

    Update via Pinokio. Existing H3 installs need one re-clone of the H3 pack to pick up the runner’s adapter support.

    Thanks to drbaph for the pointer that led to the better EMA checkpoint, and @ivanfioravanti for the ongoing H3 testing.

  90. v3.4.2 fixengine

    pick your H3 steps + community fix wave

    Read release notes

    Same-day follow-up to v3.4.1.

    New

    • H3 Steps control — pills on the H3 tier strip: Auto / 12 / 16 / 20. Auto keeps each tier’s tuned 9-step point; 20 is the official reference recipe (~2.4× render time). Requested by @ivanfioravanti.

    Fixed (all from user reports — thank you)

    • LoRA strength value clipped behind the number spinner (#45)
    • M1/M2: Metal-watchdog kill during Gemma prompt encoding now auto-retries once with a 256-token window instead of failing the render (#44)
    • Extend consumed the 720p export instead of the native render, and the downscaler squashed aspect by up to 3.85% (#48)
    • Model integrity is now placement-aware: right-content-wrong-place weights that shadow the real file are reported with both paths (#36)
    • Train preflight downloaded the quantized dev transformer and green-lit it — the exact file that trains a dead LoRA. Now fetches the full-precision Q8 copy and size-gates the check (#35)
    • LTX + H3 venvs self-heal when Pinokio’s shared uv Python gets pruned (the “installed another pack and H3 vanished” class)

    Update via Pinokio — installs pick this up from main automatically.

  91. July 2026
  92. vsample-character-bizarro feature

    Sample character: Bizarro — test Remix without training your own

    Read release notes

    A ready-to-use trained character so you can try Remix / Character mode without spending hours training your own first.

    This is a LoRA of my own face (@bizarro) — the same character in the Remix demo, dressed catastrophically wrong for three climates. I trained it in Phosphene’s Character tab; I’m shipping it so you can see the feature actually work before deciding whether to train one of your own.

    Use it

    • Trigger word: bizarrotrn
    • In-app (easiest): Character tab → Get a sample character → it downloads here and shows up in your character picker.
    • Manual: download bizarrotrn_v2.safetensors below, drop it into mlx_models/loras/ inside your Phosphene folder, restart the panel — it appears in the Character picker as “Bizarro (sample)”.
    • Recommended identity strength: ~1.3 (higher tightens the face, lower keeps motion natural).
    • Works on its own for Character mode, and as the Character inside Remix → Ingredients to drop this face into any scene you build.

    Notes

    • Visual character LoRA only (no voice). ~817 MB, LTX-2.3, Apple-Silicon MLX.
    • sha256: a52e648a4e3edccd279363acdc85337d1d9813ca5dab30f8948f79393a4ba615
    • It’s my own likeness, shipped on purpose for testing the feature. Make fun things; don’t be a jerk with it.
  93. v3.2.6 fix

    transformers pin (fixes crash on every generation)

    Read release notes

    Fixes the crash on every generation

    Fresh installs after transformers 5.13.0 released (~Jul 9) failed on every generation with 'str' object has no attribute '__module__' (or the downstream Model not loaded. Call load() first.). Root cause: mlx-lm 0.31.1 requires transformers>=5.0.0 with no upper bound, so the installer pulled 5.13.0 — which breaks mlx_lm.tokenizer_utils, so the Gemma text-encoder silently no-ops.

    The fix: install.js now pins transformers>=5.0.0,<5.13.0.

    If you’re hit by this: just click Update in Pinokio — it re-runs the installer and downgrades transformers to a working version. No manual steps.

    Fixes #40, #38, #37, #33. Thanks to @saved-j and @xandreau for the diagnosis.

  94. June 2026
  95. v3.2.5 fix

    image-to-image + robust first-run downloads

    Read release notes

    New

    • Image-to-image, made obvious. Qwen-Image-Edit and FLUX.2 Edit (now labeled “Reference Edit”) take a reference image for real, pixel-faithful img2img — drop a photo and transform it.
    • Ideogram reference bridge. Ideogram 4 is text-only, but you can now drop a reference and have it redraw the look (vision-captioned into the prompt) while keeping Ideogram’s typography. A re-interpretation, not a pixel copy.

    Fixes

    • Fast mode (Q4) works again — it was silently falling back to Q6 on the panel queue path in v3.2.4.
    • First-run download progress — shows “Downloading model · first run · X.X GB” with a live bar instead of a frozen “Loading pipeline.”
    • First-run download can’t time out on a slow connection — a watchdog keeps a slow-but-progressing download alive (proven on a real 41-minute pull) instead of failing with a partial model.
    • Ideogram safety-filter blocks are clear now — if Ideogram’s own model blocks a (often benign) prompt, you get a clear message instead of a silent gray placeholder.

    Update from Pinokio. Apple Silicon only. Free and open source.

  96. v3.2.4 fixengine

    Ideogram runs on slower Apple GPUs

    Read release notes

    Ideogram 4 now runs on M1 / M2 Macs

    Big thanks to @cocktailpeanut, who tracked down exactly what it took to get Ideogram 4 running on an M1 Max and sent the fix.

    Fixes

    • No more crash on slower Apple GPUs. Ideogram was tripping the macOS Metal command-buffer watchdog (kIOGPUCommandBufferCallbackErrorImpactingInteractivity, SIGABRT). The Ideogram subprocess now runs with MLX_DISABLE_COMPILE + MLX_METAL_FAST_SYNCH, so MLX submits shorter Metal command buffers that stay under the watchdog.
    • Much faster by default. Default quantize is now -q 6 instead of raw fp8 (which was extremely slow). Fast mode (-q 4) is still there for low-RAM Macs.
    • Sane default candidate count. Generates 1 image by default instead of 4 (~4x the time and RAM). Raise it whenever you want.
    • Real progress. Image generation shows live denoise steps instead of sitting on “Loading pipeline”.
    • Reveal-in-Finder works. The outputs-folder button now opens the actual folder with your latest render selected.
    • Smaller image sizes. New 768×432 / 512×512 / 432×768 options for weaker machines.

    Also bundled (since v3.2.1)

    • Ideogram works out of the box — un-gated mirror, no token, mflux included.
    • Quieter installer (uv — no scary pip dependency-resolver block).
    • Completed the Q4 video “mosaic” fix.

    Update from Pinokio to get it.

  97. v3.2.1 fixengine

    Ideogram 4 out of the box (no token, mflux bundled)

    Read release notes

    Ideogram 4 now works out of the box — no Hugging Face token, no license click, and the image engine ships by default.

    Two things were stopping people from generating with Ideogram 4 even after they added a token and laid out their text:

    No more token / gating

    The official ideogram-ai/ideogram-4-fp8 repo is license-gated, so everyone had to make a Read token and click “Agree and access” — and a fine-grained token or the wrong account still returned a 403. Phosphene now pulls @cocktailpeanut’s un-gated mirror (cocktailpeanut/ideogram-4-fp8, identical fp8 weights): no token, no license step, no 403. If you already downloaded the official weights, they’re reused — no 28 GB re-download.

    The image engine ships by default

    The real reason Generate stayed greyed out was that mflux wasn’t installed — it was an opt-in add-on hidden behind a menu item confusingly named “Install Qwen-Image-Edit”. Image generation is a core feature now, so the mflux pack (Ideogram 4 + Qwen-Edit) is installed automatically on new installs and on update. It’s best-effort, so it can never fail your video install/update. The recovery menu item is renamed “Reinstall image engines (Ideogram 4 + Qwen-Edit)”.

    Existing users: just hit Update. Your update now installs the image engine and Ideogram 4 will generate with no token.

    Thanks to @cocktailpeanut for publishing the un-gated mirror and reporting the friction.

  98. v3.2.0 featureengine

    Ideogram Layout editor + agent API

    Read release notes

    The Ideogram 4 integration grows from a placement widget into a real design tool — and gets an API built for AI agents.

    The Layout canvas, rebuilt

    Pick Ideogram 4 → Layout and the right side of the panel becomes an artboard:

    • Type directly on the frame — click a box and type, or paste. Double-click any box to edit it.
    • Floating toolbar on the selected box — color swatches, alignment, text style (headline / subhead / body / caps / script / serif), delete. No more round-trips to a side panel.
    • Object regions describe what the model should draw in a rectangle, typed inline the same way.
    • Stage toolbar on the canvas: + Text, + Object, Snap, Undo, Examples, and an Edit canvas / Result toggle. Generate flips to Result automatically so you watch the render land.
    • The canvas is scoped to the Images tab — switching to Video / Audio / Train suspends it cleanly and coming back restores your boxes exactly.

    Agent API — compose images with one JSON POST

    POST /image/agent takes a plain spec — scene text plus boxes as fractions of the frame — builds the strict caption Ideogram was trained on, and renders:

    {"scene": "A retro synthwave concert poster background ...",
     "aspect": "16:9", "quality": "turbo",
     "boxes": [{"type": "text", "text": "PHOSPHENE", "x": 0.1, "y": 0.1, "w": 0.8, "h": 0.24,
                "style": "headline", "align": "center", "color": "#FFFFFF"}]}

    GET /image/agent/schema is self-documenting (an agent can read that one URL and start composing), validate_only previews the caption without GPU time, and jobs queue behind UI renders instead of failing when busy. Docs: docs/AGENT_API.md.

    Fixed

    • Switching engines no longer overwrites Ideogram’s prompt placeholder.
    • Output-card auto-select can no longer yank you out of mid-edit; only a real click (or Generate) flips the stage to Result.

    Ideogram 4 setup is unchanged (one-time HF Read token + license acceptance, ~27 GB download, free for personal/research use). Update via Pinokio.

  99. v3.1.1 fixengine

    Ideogram output-card buttons hotfix

    Read release notes

    A polish hotfix on top of v3.1.0.

    On images generated by Ideogram 4, the output-card action buttons didn’t work and the titles/labels showed raw caption JSON. Ideogram stores its prompt as a structured caption (it has to, for the model), and the gallery surfaces weren’t handling that shape.

    Fixed

    • The Animate button on Ideogram images now works — it was silently broken whenever the caption contained an apostrophe (the ' terminated the inline onclick) — and it now pre-fills the readable description instead of a wall of JSON.
    • Recent-list titles and the engine label now read the description and “Ideogram 4” instead of raw JSON / mflux/ideogram.
    • Load params on an Ideogram image now restores it into Image Studio’s visual text-placement canvas instead of dumping JSON into the video prompt box.

    Regular (non-Ideogram) image outputs are unchanged. Update via Pinokio.

  100. v3.1.0 featureengine

    Ideogram 4 (local text-rendering image model)

    Read release notes

    Ideogram 4 — text that lands where you put it

    Phosphene now runs Ideogram 4 locally on Apple Silicon — an open-weight 9.3B image model that’s exceptional at rendering real, legible text — with a visual text-placement canvas: position each line of text with a box and the model renders it there.

    Ideogram 4 sample — a field-guide poster with precisely placed text

    Generated locally in Phosphene. Every text element — title, subtitle, the four specimen labels, the footer — was placed by its caption bounding box.

    Using it

    • Pick Ideogram 4 in Image Studio.
    • One-time setup: add a Hugging Face Read token in Settings → API tokens, and accept the (free, non-commercial research) license on the model page. Your first render downloads the ~26 GB weights.
    • Place text with the Simple or Layout canvas, or paste a raw caption.
    • Speed presets: Fast (12 steps) and Quality (20 steps).

    Under the hood

    • mflux 0.18 (mflux-generate-ideogram4), gated ideogram-ai/ideogram-4-fp8 (9.3B DiT + Qwen3-VL text encoder + FLUX.2 VAE).
    • Fixed a gated-download auth bug so your configured token is always used for the download — it previously fell back to a stale cached hf auth login and failed with a 401 for anyone whose cache held a different account.

    Update via Pinokio. Personal/research use is free; commercial use needs a license from Ideogram.

  101. v3.0.13 fix

    character LoRA fixes

    Read release notes

    Two bug fixes in the character / LoRA path — both reported by @claude3d in #5 and validated end-to-end before shipping.

    Fixed

    • Character LoRA with a space in its filename (e.g. Annie Phosphene_v2.safetensors) was misclassified as a style-only LoRA, and the Character tab showed “No trained characters yet” — even when the sidecar was correct. The id-validation regex rejected spaces and gated the character scan before the sidecar was read. Spaces are now allowed end-to-end — classification, selection, and the /characters/<id>/… routes — so multi-word character names work with no renaming.
    • Character tab silently rendering plain text-to-video. Switching away from the Character tab and back left the avatar’s selection ring lit while the underlying selection had been cleared — so Generate shipped no character and you got a plain T2V clip with the trigger doing nothing. The selection indicator now stays in lockstep with the actual selection, so a character that looks selected really is. (For reference: the Params panel showing “Text” is by design — the character_id drives the LoRA stack, not the mode label.)

    Also

    • The prompt Enhance feature now correctly preserves the active character trigger token.

    Update via Pinokio. (Ideogram 4 support is still cooking on a separate branch.)

  102. May 2026
  103. v3.0.7 fix

    GPU-race fix + version visibility

    Read release notes

    Follow-up patch closing items found in an external code review of the v3.0.6 hardening batch.

    Fixes

    • No more image-vs-video GPU collision. The previous guard only stopped you starting an image during a video render — not the reverse. Now a single process-wide GPU gate covers both directions: if a video, image, or training render is running, a new image request waits politely instead of starting a second heavy job that could OOM a memory-constrained Mac.
    • The panel now reports its LTX engine version. /status carries the installed ltx-2-mlx version, so a bug report always says what’s actually running (and a version mismatch is surfaced, not just buried in a log).
    • Internal correctness: the canonical contributor guide now matches the real ltx-2-mlx pin; the (dormant) Scenema reference server URL-encodes filenames; the VERSION stamp is corrected to 3.0.7 (the v3.0.6 tag had carried 3.0.0).

    Update

    Update once from the Phosphene tile. If you’re on anything older than v3.0.1, Update twice.

  104. v3.0.6 fix

    security + stability hardening

    Read release notes

    A hardening release from a full code-review pass. Every fix was adversarially verified and validated against live T2V + character-HQ renders before shipping.

    Security

    • CivitAI token leak fixed. The LoRA-download host check (endswith("civitai.com")) also matched lookalike domains, and your CivitAI API token rode through HTTP redirects to any host. Now an exact-host allowlist plus a redirect handler that strips the auth header the moment a redirect leaves civitai.com. If you’ve used the CivitAI browser, this one matters.

    Fixes

    • HDR / IC-LoRA mode revived. It referenced an undefined variable and crashed at startup on every run — it had never actually worked. One-line fix.
    • Image-during-video OOM guard. Generating an image while a video render was in flight could run two heavy GPU jobs at once and kill the video on a memory-constrained Mac. The image request now waits politely until the render finishes.
    • HiDream renders can no longer hang the queue forever (watchdog deadline), and HiDream is now covered by the RAM pre-flight so a too-small Mac gets a clear message instead of an OOM.
    • Stats history is now crash-safe (atomic write — a crash mid-save no longer wipes accumulated data).
    • Smaller: orphaned temp-file cleanup at boot, tighter crash-report file permissions, a Qwen-LoRA family guard, and a CivitAI cert-bundle pin so HTTPS can’t break after an update.

    Under the hood

    • The helper now reports the exact ltx-2-mlx version it loaded, and warns loudly on a version mismatch — the root cause behind several recent hard-to-diagnose render failures.

    Update

    Update once from the Phosphene tile. If you’re on anything older than v3.0.1, Update twice.

  105. v3.0.5 fix

    A2V kwarg signature shim

    Read release notes

    Targeted fix for the M5 user (#5).

    Fixed

    • `combined_image_conditionings() got an unexpected keyword argument ‘frame_rate’` on installs whose upstream `ltx-2-mlx` is past v0.14.0. Some v0.14.x point release dropped the `frame_rate` kwarg; our 2026-05-13 patch was still forwarding it, so any I2V / A2V job crashed at the conditioning step.

    The wrapper now probes the live signature once and routes accordingly — forwards `frame_rate` iff the upstream function accepts it, strips otherwise. Works for both pre- and post-removal upstreams.

    Update

    Update once from the Phosphene tile. If you’re on anything older than v3.0.1, Update twice.

  106. v3.0.4 fix

    CivitAI SSL fix

    Read release notes

    Small patch.

    Fixed

    • CivitAI search in the Image LoRA panel was failing with `SSL: CERTIFICATE_VERIFY_FAILED` on every fresh macOS install (#16). Pinokio installs Python via uv, which doesn’t inherit macOS system certs. Added `SSL_CERT_FILE` and `REQUESTS_CA_BUNDLE` env vars to start.js pointing at certifi’s bundle. Diagnosed and patch-recommended by @PiotrAstroCamp — thanks.

    Update

    In Pinokio: Stop the Phosphene app, then Start again. A regular Update won’t be enough — Pinokio reads start.js at process spawn, not at panel boot.

    Carry-over

    • v3.0.3: HiDream options hidden pending lab repo (#15)
    • v3.0.2: Boost/Turbo accel speed restored
    • v3.0.1: FFLF crash fix
  107. v3.0.3 fixengine

    HiDream hidden + speed fix

    Read release notes

    Small follow-up to v3.0.2.

    Fixed

    • HiDream-O1 Image Studio engines hidden from the dropdown (#15). The engines expected a standalone clone of the HiDream-O1-MLX-LAB repo at `~/HIDREAM-O1-MLX-LAB-active/`, which hasn’t been published yet — so selecting any of them crashed for everyone outside the dev machine. Hidden until the lab repo is public.

    Carry-over from v3.0.2

    • Boost/Turbo accel speed restored. Standard T2V at turbo: 503s → ~302s (−40%).
    • FFLF crash fix from v3.0.1.

    Update

    Update once from the Phosphene tile. If you’re on anything older than v3.0.1, Update twice.

    What still works for image generation

    • Qwen-Image-Edit (Fast / Standard / Quality) — full Image Studio coverage. Fast (Lightning 4-step) is the default.
  108. v3.0.2 fix

    speed restored

    Read release notes

    For the past two months Boost and Turbo have been silently doing nothing — or doing the wrong thing. Two unrelated bugs landed within hours of each other on May 9 and cancelled each other out, so the symptom was just “renders feel slow.” This release fixes both.

    What was broken

    • The acceleration monkey-patch in mlx_warm_helper.py targeted only TextToVideoPipeline.denoise_loop. After ltx-2-mlx renamed that to DistilledPipeline (~May 9), the patch hit 3 of 9 import sites. The active Standard T2V path through _base.BasePipeline.generate was never patched — every Boost/Turbo run since May 9 silently went full denoise.
    • Same evening, commit 3e4bfd8 bumped protected_tail from ceil(N/3) → ceil(N/2) to fix Turbo eye/skin artifacts. On the 8-step schedule this dropped cacheable slots from 3 to 2 — meaning Turbo became identical to Boost.

    What you’ll see

    Standard T2V, accel=turbo: 503s → ~310s (~38% faster). Boost: 503s → 364s. Compound env+turbo: ~251s (~50% faster). All v3.0.1 fixes (FFLF crash, update auto-detect) carry forward.

    Update

    Update once from the Phosphene tile. If you’re on anything older than v3.0.1, Update twice.


    Issue #9 reply (oo2music)

    hi @oo2music — v3.0.2 just shipped. The FFLF crash fix from v3.0.1 is in there (the decode_and_stream kwarg shim into get_kf_pipe), plus a separate pair of fixes that restore Boost/Turbo speed — both had been silently no-op’ing since May 9.

    You’re already on v3.0, so one Update from the Phosphene tile should get you to v3.0.2. If FFLF works for you now, feel free to close this — and if anything’s still off, paste a fresh trace and I’ll reopen.


    Issue #14 reply (ronyeoh)

    hi @ronyeoh — the Update-twice path from the earlier reply should have walked you from 2.0.0 through 3.0.1; v3.0.2 just shipped on top of that.

    Worth flagging: v3.0.2 also fixes two speed bugs that had been cancelling each other out since May 9 — Boost and Turbo were silently running at full denoise (or worse, doing the same thing as each other). Standard T2V at turbo goes from ~503s → ~310s after the fix. If renders felt slow on your end, that’s likely why.

    Update from the Phosphene tile — twice if you’re still on 2.0.0, once if you made it to 3.x. Paste a fresh trace if it still won’t move and I’ll dig in.

  109. v3.0.1 fix

    FFLF crash fix

    Read release notes

    Patch release. Two small fixes on top of v3.0.0.

    Fixes

    • FFLF (First Frame / Last Frame keyframe interpolation) crashed with VideoDecoder.decode_and_stream() got an unexpected keyword argument 'frame_rate' on machines that pulled a post-rename upstream ltx-2-mlx. The runtime kwarg shim was being installed by every render path EXCEPT FFLF — fixed. Reported by @oo2music in #9.

    • Update flow now auto-detects the configured upstream so the same update.js works for both stable and internal dev clones. No user-facing change for normal Pinokio installs.

    How to update

    Click Update in Pinokio. If you’re still on v2.x, click Update twice — first click runs the old v2 script, second click runs v3.

  110. v3.0.0 feature

    characters, voice, Image Studio, A2V

    Read release notes

    ⚠️ Updating from v2.x? Click Update TWICE.

    Pinokio runs your existing v2 update.js on the first click — it pulls the new code but doesn’t install 3.0’s new Python deps (ltx-trainer, mlx-vlm for Gemma auto-caption, mflux 0.17.5, plus a handful of transitive packages). The panel will boot to errors after the first click. Click Update again and Pinokio runs the new 3.0 script, installs everything, and the panel boots clean. Fresh installs are unaffected.

    What’s in 3.0

    This is the biggest release since the project started. 341 commits since v2.0.5.

    Character training (in-panel)

    • Drop 30 to 80 photos, click Train, get a face LoRA back
    • Add a voice clip and get a voice LoRA stacked with it
    • Gemma 3 12B auto-captions the dataset locally
    • Letterbox crop preserves wide and portrait sources
    • ~3 hours per character on M4 Max 64 GB
    • Validated recipe: rank 32, alpha 32, 100 epochs, lr 1e-4, 512² square

    Image Studio

    • Three native-MLX engines: Qwen-Image-Edit-2511, our own MLX port of HiDream-O1, and the FLUX.1 family via mflux
    • Multi-reference composition up to 3 subjects
    • HiDream-O1 ported in 5 days after upstream release. ~67 s per 1024² on 64 GB
    • Family-install gate at the panel level — refuses to submit if the engine binary isn’t installed

    Audio-to-Video

    • New A2V mode drives video motion from an audio reference
    • Works with character LoRAs

    Joint audio+video stays the differentiator

    • LTX-2 emits a synced audio track alongside the frames in the same model pass
    • Most local video models (Wan, Hunyuan, Mochi, CogVideoX) are silent
    • Ambient/diegetic audio is where it shines; dialogue is hit-or-miss

    Full panel redesign

    • Three top-level tabs: Video, Images, Train Character
    • Capability tier auto-detection. Low-RAM Macs see a clean limited surface; 64 GB+ sees everything
    • Character is a first-class mode pill on the Video tab, not a buried chip
    • Round avatars, click-to-switch, voice badge, rename/delete in one click
    • Vertical-player chrome moved outside the right edge so 9:16 clips aren’t occluded

    Performance

    • Q8 HQ default for character renders. ~6 min for a 7-second clip at 1024×576 on M4 Max 64 GB (was ~15 min in 2.x)
    • Codex skip-step optimization on Q8 HQ (~12% faster)
    • Adaptive wall-time estimates that learn from your machine after two renders
    • TeaCache wired through both Extend and A2V stage 1
    • Server-side panel watchdog rescues stuck MLX deallocators (was a 10+ min freeze post-decode on Balanced)

    Stability + UX

    • Eleven UX contradictions audited and fixed (Codex C+ pass)
    • Load Params on any clip restores the actual seed used and reopens in the right mode (Character / Video / Image)
    • Mac memory pressure shown as actual pressure %, not sticky swap
    • 50+ small fixes across the panel, helper, and installer

    Engineering

    • 341 commits since v2.0.5
    • ltx-2-mlx pinned to v0.14.0 (dgrauet’s request — upstream breaking changes deferred)
    • Server-side enforcement that Q4 + character_id is rejected (was producing identity-degraded output)
    • New post-decode SIGKILL rescue in the panel for stuck helper processes

    Hardware

    Apple Silicon only. No Intel Mac, no Linux, no Windows.

    • 16 / 24 GB: 512 px video, image gen works
    • 32 GB: 768 px
    • 64 GB+: 1024×576 video, full HD image, character training
    • 96 / 128 GB: same caps. Model is the bottleneck, not RAM.

    Install

    One-click via Pinokio (search Phosphene). Or clone the repo and follow the README.

    Credits

    • Lightricks for LTX-Video 2.3 (their license applies to the weights)
    • dgrauet/ltx-2-mlx for the MLX port that makes this possible
    • HiDream AI for HiDream-O1
    • Qwen team + mflux for Qwen-Image-Edit
    • Apple for MLX
    • Phosphene the panel is MIT