# Release v1.50.0

Released: 2026-05-05

## Added

- **FLUX.2-klein image generation on macOS (Apple Silicon).** Three quantized variants ship: 4B SDNQ-4bit (~8 GB @ 512px, recommended), 9B SDNQ-4bit (~12 GB, needs 32+ GB RAM), and 4B Int8 (~16 GB). The setup script bootstraps a dedicated virtual environment automatically — existing mflux installs are unaffected. Live step-by-step previews, the metadata sidecar, gallery, and Remix all work unchanged. Models are gated on HuggingFace — accept the license at https://huggingface.co/black-forest-labs/FLUX.2-klein-4B and set your HF token; the Image Gen page surfaces a yellow banner when setup is incomplete or the token isn't set. Any existing FLUX.2-klein model entries auto-upgrade in place, preserving customizations like a custom name or step count.
- **Unified media job queue for image and video generation.** Image and video render requests are now accepted immediately and placed in a FIFO queue instead of returning a "busy" error when the GPU is occupied. GPU renders (video + local image) drain one at a time since they share the same hardware runtime; Codex image jobs run in a parallel lane so a long video render never blocks a storyboard generation. Jobs interrupted by a server restart are automatically reclassified as failed on next boot. A new media jobs panel lets you inspect and cancel queued or running renders.
- **Editable media model registry** — video and image model definitions are now stored in a single editable file rather than being hardcoded. Edit the registry and restart the server to swap models without touching source code. Three new text-encoder quality tiers ship out of the box: a BF16 full-precision option (new default, best output quality), a QAT 4-bit option (auto-detected when LM Studio has it installed), and a 4-bit option for lower-memory setups. The registry is seeded automatically on first run.
- **Streaming-ready mp4 output** — every video render is lightly post-processed (no re-encoding, ~hundreds of ms) so gallery tiles display their poster frame on page load instead of flashing black until clicked.
- **Sleep prevention during long renders on macOS** — the system display and sleep are held off for the duration of any video render, so a 90-second+ generation on a laptop isn't aborted mid-run by the screen going dark.
- **Full diagnostic output from the video generation process is now logged.** Previously only structured progress markers were captured and the rest was silently dropped, hiding upstream errors like "VAE encoder failed to load" until you ran the generator manually from the command line.
- **Image strength control for video generation** — a new parameter lets you tune how strongly an input image conditions the video. The default preserves the source image; lower values allow the model to diverge more freely. The model's actual behavior is the inverse of its own documentation, which is noted in the UI.
- **1:1 square resolutions** (512×512, 768×768) added to the Video Gen resolution dropdown.
- **Image upload preview + larger reference-image previews** in Video Gen — uploads show a preview immediately so you can confirm what you uploaded before submitting; source image, FFLF last-frame, and extend-mode previews are displayed at a much larger size instead of small thumbnails.

- **Morse code trainer** in POST — Koch-method Copy mode (listen → type, 90% accuracy unlocks the next letter) and a Send mode that decodes spacebar/touch keying into text. Native Web Audio, Farnsworth timing, configurable WPM/tone. Reachable from the POST launcher header, the sidebar, ⌘K, and voice.
- **Morse trainer side widget** with a binary tree visualization that highlights the live keying path (DAH-left, DIT-right), three reference views (Tree / Length / List), a tap-anywhere practice key, and a real-time decoded log. Spacebar keying is intercepted in capture phase so it doesn't trigger the voice FAB push-to-talk hotkey while on the morse page.
- **Video Gen mode switch + batch queue** — a segmented control selects Text / Image / FFLF (first-frame + last-frame) / Extend (continue from a prior render). Mode-specific input panels (start image, end image, prior-video picker) replace the always-on source image upload. A new "Add to queue" button enqueues the current configuration; the batch-queue panel runs jobs serially with per-item status (pending / running / complete / error), inline error messages, and a clear-finished action that removes completed and errored items.
- **Video Gen "Chunks" control (1–8)** chains multiple renders into a single longer clip. Each chunk's last frame seeds the next, and the final output is stitched into one file. Intermediate chunks are hidden in history by default so the gallery shows only the finished result.
- **Two new high-capability video models** ("dgrauet Q4" and "dgrauet Q8") on a more capable runtime that supports true keyframe interpolation (FFLF that respects both start AND end frames), native video extend, and audio-to-video. Install them from the Setup screen — the existing models keep working unchanged; pick the new "dgrauet" entries from the model dropdown to use the new pipeline. On systems with 48 GB of RAM or less, the server automatically clamps FFLF frame counts to a memory-safe budget.
- **"Extend" mode on the new dgrauet models** uses true latent video extension — conditioned on the entire source video's motion and visual content — instead of just continuing from the last frame. The visible motion stall at scene boundaries is gone; extensions continue naturally from the source. Legacy models keep using the previous last-frame method.
- **New "Audio" mode in Video Gen** renders a clip whose motion and on-screen audio sync to an uploaded audio track (WAV / MP3 / M4A). Drop in a 4–8 second clip, write a directive prompt, and the model drives the video to match the audio. Requires one of the new dgrauet models.

## Changed

- Media Gen Models now opens directly on model storage details without the redundant manual refresh control; cached model data still reloads on page load.
- **Image Gen and Video Gen layouts tightened for above-the-fold density.** Form and preview now render side-by-side on wider screens instead of stacking, so more of the page is usable without scrolling. Previews are capped so they no longer dominate the viewport, the prompt and negative-prompt fields sit in two columns on medium+ screens, and section headers are more compact. Status text is hoisted into the Generate button row; video Download moved into the preview header for parity with Image Gen.
- **Worktree policy clarified** in developer documentation: TUI sessions edit the main repo directly; worktrees are reserved for unattended CoS sub-agents.
- Video Gen frame picker now goes up to 481 frames (~20s at 24fps); options past 241 frames (~10s) show a hint recommending Extend mode for reliable long renders at 48 GB.
- Switching to Audio mode now automatically selects the smallest compatible model when the current model doesn't support audio-to-video, instead of landing on a blocked state with a warning. The warning still appears if you manually pick an incompatible model while in Audio mode.
- "Disable audio" and "No music" checkboxes are hidden in Audio mode and their state is reset on entry — both are irrelevant when audio comes from an uploaded file rather than being generated.
- Video Gen FFLF mode now offers the same dual control on both the first-frame and last-frame slots — pick from your image gallery or upload a fresh image — instead of the previous upload-only first frame and gallery-only last frame.
- Release workflow no longer silently skips creating the GitHub Release when something else pushed the version tag before the workflow ran.
- Chief of Staff 3D avatars (Cyber, Sigil, Esoteric, Nexus, Muse) now fill the agent panel as a full-bleed background, with the title, status, and controls overlaying the scene instead of sharing a column with it.
- Autonomy level buttons in the CoS Config tab now use higher-contrast active states so the selected level is obvious at a glance.
- Quick Task form checkboxes (Enhance, Worktree, Open PR, Simplify, Review Loop, JIRA) are tighter — vertical padding around each checkbox is reduced so the form fits more comfortably in the dashboard widget without dead whitespace.

## Fixed

- CoS service initialization now recognizes Vitest runs and skips eager daemon startup during server unit tests, avoiding circular-import side effects.
- **Creative Director stuck projects now self-recover** — the orchestrator re-evaluates project state after every task completes, so projects that were started before the treatment/evaluate workflow split no longer get frozen. Manually accepting or failing a scene also immediately triggers the next scene to start.
- **Creative Director projects auto-resume on server restart.** Previously a server restart mid-render left a project frozen — the scene appeared to be rendering but had no active job behind it, and the orchestrator wouldn't kick off a replacement because of bookkeeping left behind by the dead worker. On boot, any in-progress Creative Director project now detects interrupted scenes, clears the stale bookkeeping, and resumes from exactly where it left off.
- **Creative Director smoke test** — a "Run smoke test" button on the Creative Director list page creates a deterministic 3-scene project (red ball → blue ball continuation → pure continuity) to verify the full pipeline end-to-end without needing a real story or AI evaluation. The smoke test skips audio generation and auto-accepts every scene so it completes in render time only, making it a fast sanity check after setup or after a model swap.
- **Creative Director scene-retry path unblocked.** When the AI evaluator decided a scene needed a re-render with a refined prompt, the retry was silently rejected by a validation rule that shouldn't have been there — leaving the scene stuck in "evaluating" forever. The evaluator can now correctly request a re-render, and the project advances as expected.

- **Image-to-video on macOS now actually preserves the source image as the first frame.** A bug in an older version of the video generation backend caused the VAE encoder to fail silently, producing gray-fog frames instead of conditioning on the uploaded image. The setup script also had a package name collision that caused it to install the wrong library — both packages share the same Python import name, so the wrong install was invisible. Updated to a patched version and fixed the installer. Verified end-to-end: pixel-perfect first-frame preservation with coherent motion across all frames.
- **FFLF (first-frame + last-frame) conditioning silently produced no output.** An incorrect frame index was passed to the generation backend — the model's internal latent frame count is much smaller than the raw video frame count, and passing the raw frame number caused a shape mismatch that caused the render to exit without producing an mp4. Fixed by computing the correct latent index.
- **"Continue" / last-frame extraction produced phantom-success logs but no file**, leaving a broken image preview in Video Gen. Two compounded bugs: the seek window used to grab the last frame was too narrow for videos with audio tracks (where the final keyframe sits earlier than expected), causing the frame extractor to return zero frames while still reporting success; and the success path only checked the process exit code without verifying the output file actually existed. Both are now fixed.
- **Last-frame extraction now caches** — repeated "Continue" clicks reuse the previously extracted frame instead of re-running the extraction every time. Cuts ~1–2s per click.
- **Delete operations now log** for both image and video gallery actions. Previously a delete was silent on the server side, making it impossible to confirm from the logs that the click registered.
- **Media model registry is resilient to partial or malformed edits.** A partially filled registry (missing sections, wrong field types, or an unreadable file) no longer crashes the server on startup — the loader merges user edits over built-in defaults and falls back gracefully. Typos in the configured default video model now fall back to the first available model with a warning instead of showing "Unknown video model" in the UI. Missing or invalid text encoder configuration also surfaces a clear error rather than silently passing bad values into the generation pipeline.
- **Last-frame cache recovers from a prior crashed extraction.** A crashed ffmpeg run could leave a zero-byte placeholder that was served forever as a broken image in Video Gen. The cache now validates that the extracted file has content before trusting it, and falls through to re-extract when it doesn't — so a previously stuck "Continue" preview heals itself on the next click.
- **Streaming-optimized mp4 remux works on Windows without risking the rendered video.** On Windows, an atomic file-replace fails when the destination already exists. The replace strategy now moves the original aside first, installs the optimized file, and restores the backup on any failure — so a transient lock or permissions issue skips the optimization step instead of destroying the rendered video.
- **Sleep prevention during renders is now strictly macOS-only.** The system sleep guard was also firing on Linux, emitting a harmless but noisy error on every render. It now runs only on macOS where the caffeinate utility exists.
- **Setup script cleans up a conflicting package before install.** An unrelated package with the same Python import name as the LTX video backend was shadowing it silently if previously installed. The setup script now removes the conflicting package before installing the correct one, so upgraders aren't left with an ambiguous environment.
- **Form fields stay editable during a video render.** Previously every input was locked while a render was in flight, blocking you from queueing a different configuration. Since the queue captures your settings at submit time, live editing is now safe and the fields are no longer disabled.
- **"Add to collection" popover on media cards no longer gets clipped at the card edge.** The card's rounded-corner styling was creating an invisible clipping boundary that swallowed the popover regardless of its stacking order. The clipping is now scoped only to the image area, so the popover floats freely above the card as intended.
- **Video Gen audio uploads (Audio mode) were rejected with "File type not allowed" even for valid MP3/WAV files.** A missing field in the upload handler's file metadata caused every MIME-type check to silently fail. Fixed.
- **`update.sh` no longer hangs after "PortOS restarted"** — the browser-open step now exits immediately rather than waiting for an internal connection pool to drain.
- **`update.sh` now fully resets the process manager before restarting**, fixing crashes where a stale daemon retained a cached path from a different project that no longer existed.
- Writers-room storyboard renders queued through Codex now wait their turn instead of erroring with "A Codex generation is already in progress" when you fire a second render before the first finishes. Codex jobs run on their own queue lane, so they don't block (and aren't blocked by) local image or video renders.

## Full Changelog

**Full Diff**: https://github.com/atomantic/PortOS/compare/v1.49.0...v1.50.0
