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.