Skip to content

What's New

The latest released version is shown at the top. Each entry below was a release-triggering change (new features and fixes). Tests, refactors, and chores are intentionally omitted because they don’t bump the version.

1.13.3 (2026-05-13)

Bug Fixes

  • Send Feedback now opens your mail app addressed to [email protected] (065702a)

    Help → Send Feedback now opens a new message in your default mail app (rather than the in-app browser trying to handle it), addressed to [email protected] with your app version stamped in the body so the support reply already knows which build you’re on. The old address pointed at a retired mailbox.

  • the Suno style prompt now adapts to the song instead of every track reading the same (a3a90e5)

    The lyric generator was producing nearly identical Suno style prompts for every song in a brand because the prompt was decided from the scene and brand voice settings alone — the actual lyrics never had a say. After a sad ballad and a confrontational anthem from the same brand, you’d get back the same “midtempo, hazy reverb, female vocal, sparse arrangement” descriptors and two near-clones from Suno.

Now the generator does a final styling pass once the lyrics are written. Your brand’s genre and vocal type stay anchored in the first 2–3 terms so every track still reads as the same artist, but tempo, instrumentation, production, and mood follow what the song is actually doing. Different songs from the same brand should read distinctly from here on — the ballad gets a ballad’s arrangement, the anthem gets an anthem’s.

1.13.2 (2026-05-13)

Bug Fixes

  • keep the app awake during long renders, and stop the loading screen from reappearing mid-session (42da0e4)

    Two reliability fixes that came up while leaving the app to run in the background:

  • Renders, lyric generation, and audio jobs no longer get interrupted when the computer tries to sleep. The app now asks the OS to stay awake for as long as there’s work in the queue. The screen can still dim or lock — only the machine’s idle-sleep is held off, and the request is dropped the moment the queue finishes.
  • The loading screen no longer comes back after the app has already started. If the rendering engine briefly drops out, the in-app reconnect banner handles it instead of replacing the whole UI — so any work you have on screen (queued items, draft lyrics, the page you were on) survives the recovery.

1.13.1 (2026-05-13)

Bug Fixes

  • activation: update license-key hint copy (bc98ded)

    Etsy is no longer the purchase channel — keys come from the Stripe thank-you page and follow-up email at ai-mvg.com. Point the activation screen at the current source instead.

  • create-song: remove vestigial Skip to Audio buttons (9d19e15)

    Left over from the unified Create wizard; on the split-out Create Song page they led to an empty Song tab. Drop the buttons and onSkipToAudio prop chain, refresh the SongStep help text to point at Library and update the lyrics walkthrough doc to match the post-split flow.

1.13.0 (2026-05-13)

Bug Fixes

  • cloud: guard webhook signature verification against thrown errors + add coverage tests (fde61cf)* cloud: normalize allowedOrigins via url.origin and add tests (a5b308b)* cloud: reject non-POST on /checkout with 405 before calling Stripe (dce568a)* cloud: validate session_id shape and set Cache-Control: no-store on /session (e11478a)

Features

  • cloud: add /admin/revoke and reject revoked keys in /activate (461b0c0)* cloud: add /checkout route for Stripe session creation (119168b)* cloud: add /session/:id route for success-page key lookup (9ea26bf)* cloud: add /stripe-webhook route with idempotent key issuance (bd8f030)* cloud: add CORS allowlist helper for browser routes (190af08)* cloud: add fetch-based Stripe client (sessions + webhook sig) (617474e)* cloud: add SendGrid client + license-key email body (0676275)* cloud: wire checkout, webhook, session, revoke into router (f7189b8)* landing: add BuyButton component (daff92a)* landing: add LicenseKeyCard component (4757580)* landing: add Logo component (be1d55c)* landing: add typed API wrapper for checkout + session (4283fdc)* landing: branded dark cinematic redesign with audio motion (1692007)* landing: build marketing page (41e7764)* landing: build Thanks success page with poll-on-425 (fa5ed51)* landing: match docs-site brand (iris/cyan/magenta) with multi-layer parallax (22b121b)

1.12.0 (2026-05-06)

Smoother audio generation, friendlier background-model setup, and a few quiet reliability wins.

What’s new

  • Cleaner background-model setup — Background image models now install their support libraries into their own self-contained space, with a clear in-card progress bar while it’s working. Wording is plain English (“Install libraries (~2 GB)”) instead of “GPU runtime”, and removing your last local model cleans the libraries up too.
  • Updatable model catalog — The list of available background models can now refresh itself, so new options can appear without waiting for an app update.

Fixes

  • Audio generation progress no longer “restarts” — The progress bar used to fly up to 100% and then reset to 0% during the final encoding step, making it look like the render was looping. It’s now a single, steadily climbing bar from start to finish.
  • Crashed audio jobs resume after restart — If the app crashed mid-generation, the queued song would sit stuck on “Queued — will start when the GPU is free” forever. It now picks back up automatically when the app reopens.
  • Completed audio shows its real title — Recently Completed used to label finished audio jobs as “audio_gen:173”. They now show the song title you gave them.
  • Cydonia 22B model works again — The upstream model was renamed and our app couldn’t find it (it looked gated). Pointed at the new location.
  • Backgrounds picker no longer looks dead — The picker now refreshes itself the moment libraries finish installing, instead of needing a manual reload.
  • Backgrounds Install button works in production builds — In some installs the button did nothing because the app couldn’t find its own data folder. Fixed.
  • Lyrics transcription works on stricter networks — Whisper’s model download now uses the same certificate handling as the rest of the app, so it won’t fail on machines with custom SSL setups (corporate proxies, older trust stores).

1.11.1 (2026-05-01)

Bug Fixes

  • build: fix header key (5549e56)

1.11.0 (2026-04-30)

Bug Fixes

  • audio-engine: bump uv to 0.9.6 + explicit python install + wipe stale venv on retry (996f2f6)* audio-engine: find system python for venv + in-card install + global progress bar (2e14e68)* audio-engine: heal broken venv, stream install progress, harden Windows path (ec59abb)

    • _create_venv now wipes the venv when pip is missing (fixes the “No module named pip” failure on installs left over from before —seed)
  • _install_deps falls back to ensurepip if pip still isn’t there
  • _set_state flips running=False on cancelled/uninstalled too (the bar used to come back on next page load after a cancel)
  • install() runs import heartlib before declaring “complete” so a half-installed venv re-installs instead of silently breaking generate
  • _download_checkpoints forwards the saved HF token and pins HF_HOME under audio-engine/ (halves Windows disk usage during install + makes uninstall a single rmtree)
  • pip install + HF snapshot_download now stream progress: pip ticks pct per “Collecting” line, HF runs a side watcher that polls dir size against expected bytes (was sitting at 25% for ~15 min during the 16 GB main download)
  • Cancel kills the whole subprocess group (CTRL_BREAK_EVENT on Windows, SIGTERM-to-pgid on posix) so pip’s wheel-build grandchildren exit too
  • _safe_rmtree clears the read-only bit on Windows mid-rmtree errors

Adds 17 unit tests covering the state machine, complete-detection fallthrough, dir-bytes accounting, Popen flag selection, and rmtree recovery.

  • audio-engine: heartlib via git URL + cancel install + simpler user-facing labels (e4ec585)* audio-engine: let heartlib pin its own torch/transformers (avoids resolution conflict) (aa4299f)* audio-engine: require Python 3.11+ for system python (heartlib needs torch ≥ 2.4) (8da9a4b)* audio-engine: use venv pip for install (uv resolver too strict for heartlib’s torch pin) (bcbd496)* audio-engine: uv venv —seed so pip ships in the venv (a042423)* build: update changelog details (395e04f)* models: self-heal stale active_model_id when the file is missing (10f7462)

    Both /lyrics/models and /prompt-models GET handlers now call ensure_active_default() before building the response. If the saved active id points at a model whose file is gone — deleted weights, broken Select-existing symlink, moved data dir — the active id is demoted to another installed entry instead of leaving the picker stuck reporting no active model.

Symptom: Create Lyrics step shows “Install a local LLM to use this step” even though the user has a working model installed, because the previously-active model’s symlink target had been deleted.

  • music-mode: div-chip + real install button + responsive .chip-grid breakpoints (28ce43b)* splash: drop ffmpeg/ffprobe gate; surface in bottom Rendering engine bar (129d5d4)

    The splash now dismisses on server + ws + asset-status + app-data ready, regardless of ffmpeg/ffprobe install state. AssetDownloadBar already shows a “Rendering engine” bar with combined progress and retry, and Create/Queue independently disable render actions until the engine is ready — so users can browse, configure brands, and prep settings while the download runs in the background.

  • splash: hardcode EQ bar centers to match logo art exactly (6becae4)

    Auto-detection couldn’t reliably split the cluster bars that sit on top of the play arrow’s blue background — bright-pixel counts and edge gradients both produce wrong groupings (merged bars or dropped bars). Since the logo is a fixed asset, replace the detection loop with a hand-picked list of 12 x-centers; per-bar height/color is still sampled from the source pixels at each center.

  • splash: overlay splash on app so hydration happens behind it (e64f2e9)

    Mount AppContent under the splash overlay once asset gates pass, and hold the splash until queue/library/config/brands have hydrated. Eliminates the flash of per-page “Loading…” text after the splash dismisses.

  • test: AudioLibraryList mock matches named-export api shape (8220bef)

    Component uses ‘import { api } from’ but the test mock only stubbed the default export, so the component was calling the real api at test time. Wraps the mock in vi.hoisted so the shared reference is available in the hoisted vi.mock factory, and exports both ‘api’ and ‘default’ from the stub for safety.

Features

  • audio-engine: bootstrap uv + uv-managed Python so users don’t need a system install (fe23324)* audio-engine: vendor heartlib source — no git clone at install (55454c3)* audio-gen: live progress on Audio tab + dtype fix for heartlib (b428850)

    heartmula_runner.py:

  • Pass dtype to HeartMuLaGenPipeline.from_pretrained — bfloat16 on mps/cuda, float32 on cpu. The vendored heartlib upstream made dtype a required positional arg, so generation was failing with TypeError.
  • Monkey-patch tqdm.tqdm before heartlib imports it; the audio-frame loop now emits “[heartmula_progress] step total pct” lines on stderr for every percent change.

server/api/audio_gen.py:

  • Replace blocking subprocess.run with Popen + line-streamed stderr. A regex parses progress markers and rebroadcasts them as heartmula_generate_progress WS events (loading/generating/complete/ failed stages, with step/total/pct). 30-min timeout enforced via a watchdog thread.

Frontend:

  • New AudioGenerationProgress component renders the bar, elapsed clock, and frame counter — and an alert variant on failure.
  • SongStep gets an optional onStartLocalGeneration prop. When the parent provides it, “Generate audio (local)” delegates the run upstream so the progress UI can live on the Audio tab where it belongs.
  • Create.tsx owns the audio-gen state, listens for the WS events, switches viewStep to “audio” on kickoff, and on success feeds the rendered WAV through the same handleSelected analyze pipeline a manual drop would use.

Adds 9 tests for the progress regex + status endpoint shape.

  • audio-gen: MPS OOM fix, ETA from history, humanized UI errors (9a11593)

    heartmula_runner.py:

  • Set PYTORCH_MPS_HIGH_WATERMARK_RATIO=0.0 so torch can use all available unified memory. Default 1.7x physical RAM cap was rejecting allocations during the audio-frame loop even though the system had headroom; users hit “MPS backend out of memory” at ~40 GB allocated.

ETA tracking:

  • Pulled the rolling-window helpers (loadReliableAvg, recordDuration, formatEtaMinutes) out of LyricsWizard into a shared lib/durations module so audio-gen + future long-running steps share the math. Keys are namespaced via DURATION_KEYS so histories don’t collide.
  • Audio-gen progress card now shows “Based on your last few runs, roughly N min” once 3 successful runs have been recorded. Drops the Apple-Silicon-specific copy that was wrong on Windows.

UI error humanization:

  • New lib/errors.humanize() maps known patterns (OOM, missing-heartlib, network failures, 503/504/auth/cancelled/disk-full) to friendly copy. Logs the original error to console + returns the technical detail so callers can show a “details” disclosure if needed.
  • Audio-gen path uses it; pattern is documented in the file so other setError sites can migrate when convenient.

23 unit tests cover the durations + errors helpers.

  • audio-gen: queue-driven generation, Library Audio sub-tab, Song/Video split (e802201)

    Audio generation moves from synchronous request to a queue job so the user can batch-author songs while the GPU works through them serially. Library gets an Audio sub-tab listing every generated MP3 with playback, download, “new render” hand-off, and delete. Create splits along the seam this exposes: Song page (lyrics + queue audio gen) and Video page (pick MP3 + render). Generated MP3s now carry embedded ID3v2 metadata (title, artist, genre, creator tag, USLT lyrics) so files are self-describing on disk.

Also: fix the missing torch.no_grad() that was driving repeated MPS OOMs, revert the watermark to default, add an OOM→CPU auto-retry, phase-tag heartmula tqdm progress so the codec step doesn’t look like a regression, and expand the queue schema to support multiple job types.

  • audio-providers: pluggable seam for lyrics→audio handoff + heartmula spike notes (47faf33)* audio: cross-platform heartmula runner + sidecar engine paths (7b6d6c6)* audio: install panel under Music Mode chip with progress + uninstall (483887e)* audio: install pipeline + status/install/uninstall endpoints (c93376f)* audio: wire HeartMuLa local generation end-to-end (provider + endpoint + SongStep) (bf4e2e5)* brand: chip-card MusicModePicker + HeartMuLa coming-soon entry (3dae6ab)* brand: per-brand Music Mode picker driven by audio-provider registry (6bf4df1)* settings: full-width brand panel, logo overlay controls, clearer typography labels (a2b7165)

    UI: brand-settings glass-card now uses the full available width instead of capping at 960px. Inner controls already flex with their container.

Typography: relabel “Font” / “Title Font” / “Title Size” to “Lyric font” / “Title-card font” / “Title-card font size” so it’s clear which surface each one paints, and add hover-info tips with a one-line explanation.

Logo overlay: new Brand → Logo overlay section. Toggle whether the brand logo is composited on the rendered video, and pick which corner it sits in (top-left / top-right / bottom-left / bottom-right). Plumbs through config.get_logo_embed / get_logo_position into render.py and video.py; existing brands keep the historical top-right placement via _fill_defaults.

App settings: drop the “Enable AI Lyric Generator” toggle — the generator is always available now and shows up as the default Lyrics step in Create. The Voice section under Brand is no longer gated either.

  • settings: make form-group fill parent + doc productionization shipped (125c900)* setup: first-run setup screen for brand + base model (c12e8d5)

    Adds a one-screen wizard between splash and the app that collects the minimum needed to get going: a brand name and a base prompt model. Triggers when the brand list is empty or no model is installed; only the missing section is shown.

The model picker recommends a tier based on detected system RAM (now exposed by /backgrounds/hardware via psutil). Continue creates the brand and kicks off the model download in the background — the existing PromptModelDownloadBar surfaces progress while the user explores the rest of the app. Skip falls back to a brand named “default” when none exists, and never auto-downloads a model.

  • splash: loop intro until ready, then play outro (2e169c0)

    The splash animation used to be a fixed 3.5s one-shot that ended on the logo and held a static frame for the rest of startup. Boots over ~10s spent most of the time staring at a frozen image. Now SplashAnimation loops its intro (EQ + swirling streaks) while !ready and only plays the trace + logo reveal once the SplashScreen reports the gates have passed, with a 4s safety timeout so a wedged canvas never traps the user.

  • ui: per-tab progress badges, equalizer affordance, queue subtitle differentiation (fc7c6b6)

    Sidebar badges now reflect tab-owned work rather than “any GPU job”: Song shows lyric gen %, Video shows audio analysis %, Queue shows queued-job % alongside the pending count. Queued audio_gen and render jobs no longer leak onto their source tabs — once they leave the source surface for the queue, the queue is solely responsible for showing them. App.tsx tracks lyric_generate_progress and analysis_progress independently of the queue and threads them through.

When a job is processing but pct is still 0, the badge slot renders a 3-bar equalizer animation instead of “0%” — applies to all four surfaces, including the combined <bars> · <count> Queue case.

Queue infrastructure:

  • audio_gen worker now writes pct to the queue row on every progress tick (matches what render workers already did) so /queue reflects real-time progress instead of stuck at 0.
  • AppStore handles heartmula_generate_progress and merges by queue_id for instant UI updates without waiting for /queue refresh.
  • Render queue cards swap the music-note icon for the filmstrip icon (same path the Video sidebar nav uses) — visually distinguishes audio_gen rows from video renders at a glance.
  • Subtitle reads “1 song and 1 video in queue” when both kinds are present.

CreateSong stays mounted (display:none) like Create does, so an in-flight lyric generation survives nav-away — without this, leaving the tab killed the wizard and the request response was lost.

Cert-resilience for the heartmula install pipeline: replace urllib.request.urlretrieve (the same opaque-cert-error path that broke whisper) with a certifi-backed requests fetch for the uv binary, and add a network preflight that probes github / huggingface / pypi before kicking off ~22 GB of downloads. Humanized error message points users at corp proxy / stale trust store as the likely cause.

1.10.0 (2026-04-29)

Smarter brand setup, richer video looks, and a more reliable Create flow. Define your brand by chatting with a local AI, pick from a set of video styles that govern both how scenes look and how the video moves on the beat, and let your lyrics decide when the visuals should be calm versus kinetic.

What’s new

  • Brand voice AI coach — Set up your brand by chatting with a local AI instead of filling in forms. The coach asks one question at a time, shows you a diff before any field is changed, and never sends your data anywhere.
  • Per-brand video styles — Each brand picks a style (Cinematic, Documentary, Performance, Illustrated, Visualizer). The style drives both the look (how scenes are described to the image model) and the motion (how the video pulses, zooms, and flashes on beat). The Library shows a chip on every render so you can tell at a glance which style it was made with.
  • Emphasis-aware effects — The app reads your lyrics, finds the emphasized lines — hooks, drops, big lyrical beats — and automatically swings the visual intensity: subdued during emphasis, more kinetic between.
  • New Create flow — Lyrics resolve first, then backgrounds queue and generate per section in order. No more wrong-act backgrounds, and you can watch each slot move from queued → generating → ready as it happens.
  • Faster first launch — The multi-step setup wizard is gone. You’re in the app sooner, and brand setup lives in Settings whenever you’re ready.
  • 3-line karaoke — The previous line fades out and the next line fades in alongside the active line, so the lyric flow always has context.
  • Loaded-model indicator — A pulsing chip in the top-right shows which AI model is currently loaded; click it for details.
  • More background image models — Pick between RealVisXL V5 and other generators, with download progress visible from the main screen.
  • Artist photo likeness — Upload artist photos in Settings and the background generator can carry that likeness into renders (Performance + RealVisXL).
  • One-click in-app updates — Install new versions from inside the app, no re-downloading installers.
  • Multi-brand polish — Cleaner sidebar with your brand logo, centered brand switcher, and a heads-up when a render would cross brands.
  • Boot splash screen — Animation while the app loads its models and assets so you know things are happening.
  • What’s New in docs — The docs site now has a What’s New section that auto-updates after each release.

Fixes

  • Beat-synced effects (brightness flashes, zoom bumps) now actually fire on real renders.
  • Background thumbnails refresh immediately after regeneration instead of showing stale art.
  • Library Delete shows a “Deleting…” spinner and the card disappears as soon as the server confirms.
  • The Queue’s Recently Completed rail now matches the active card layout and shows the video-style chip.
  • Out-of-memory background generation surfaces a friendly message instead of a raw crash, and a long render no longer triggers a spurious server restart mid-Create.
  • Boot screen no longer flashes white before the app appears.

1.9.0 (2026-04-27)

Features

  • cloud: add client-secret + master-key auth and admin endpoints (fce94fd)
  • RealVisXL V5 + prompt-builder picker + background flow overhaul (867eb7b)
  • render: write cover.jpg for tiktok/instagram renders (c83ee94)
  • thumbnail: add 1080x1920 vertical cover generator (a56201f)

1.8.0 (2026-04-25)

Bug Fixes

  • assets: treat size_bytes as optional in the manifest validator (35d8f6f)
  • backgrounds: log traceback when runtime_available check fails (2030857)
  • build: bundle .dist-info metadata for diffusers runtime version checks (38ced8a)
  • create: auto-gen backgrounds even when AI Lyrics is disabled (58cda3c)
  • deps: pin transformers<5 and diffusers<0.40 for SDXL loader (0091c68)
  • ffmpeg, splash: symlink unversioned binaries + four-stage gating (e840c4f)
  • lyrics: broadcast brand_changed on /lyrics/brand PUT + DELETE (4e21c91)
  • prompt: stabilize scene-break act counts with low temperature + top-up (9c1ad60)
  • prompt: unify act-target formula across scene-aware and structural paths (a7645be)
  • sdxl: serialize concurrent inferences (FIFO queue at the mutex) (6fa42a1)
  • splash, queue: real ffmpeg probe + retry preserves overrides (6e489d2)

Features

  • analyze: wire scene-aware act detection into the analyze pipeline (24d3463)
  • background: enrich SDXL prompts with camera/medium/composition + negative prompt (5c575a6)
  • backgrounds: auto-generate on Create + ‘None (use custom)’ mode (120d8ea)
  • backgrounds: BackgroundsModelPicker component (905d815)
  • backgrounds: catalog and state module for pluggable background generators (b76187c)
  • background: SDXL-Lightning local strategy with Lanczos upscale (c8f3269)
  • backgrounds: frontend catalog + API client + WS types (ba8fa4c)
  • backgrounds: fuller Pollinations description, Title Case label (ed48fc7)
  • backgrounds: hide ‘Skip download’ link pending cross-catalog UX pass (7f09d33)
  • backgrounds: mount global download bar in App (6873db0)
  • backgrounds: per-act SDXL negative-prompt cache + API plumbing (85461d7)
  • backgrounds: replace inline progress chip with ‘Downloading…’ button (7d13374)
  • backgrounds: REST + hardware endpoints for generator config (5f29d77)
  • backgrounds: reword SDXL-Lightning quality string (6887f26)
  • backgrounds: scaffold global download bar component (72649a6)
  • backgrounds: surface missing local-diffusion runtime in UX & API (6e668a1)
  • background: thread visual_direction kwarg through SDXL dispatch (eeb1f90)
  • brand: one-click ‘Copy brand prompt for ChatGPT’ button (38defdd)
  • create: add view-larger overlay for background slots (8e9acbb)
  • create: always show per-act lyrics inline (045af0a)
  • create: lock per-slot Upload/AI/disable buttons while the auto-gen queue runs (8eed8db)
  • create: per-act SDXL Negative Prompt textarea in regenerate dialog (d7160e9)
  • create: pre-mark all empty slots as generating before auto-gen queue starts (271635b)
  • create: rename Clear cache action to Refresh (amber styling) (a312a0c)
  • create: show active background generator as chip (c51fdfe)
  • create: show LLM-generated song title in Song step (bc01a9a)
  • create: show per-act lyrics on empty/generating slots; hide block when no lyrics (fb2ac3e)
  • lyrics: retire the ‘Enable AI Lyric Generator’ toggle in favour of a ‘No lyrics’ card (51bab1a)
  • prompt: add _parse_visual_direction for three-line VISION output (36a403a)
  • prompt: add Avoid line to VISION_PROMPT and four-key parser (81ae8d1)
  • prompt: add enrich_for_sdxl + SDXL_NEGATIVE_PROMPT (0fdf343)
  • prompt: add mood/palette classifiers for SDXL enrichment (8a71fcd)
  • prompt: anchor scenes in song-level Setting + tighten Avoid (671ea1f)
  • prompt: duration-aware act grouping (target ~45s/act, 2-4 acts) (0fcf9be)
  • prompt: scene-aware act detection via local LLM (63fee6c)
  • prompt: SDXL negative composes technical + auto-avoid + user override (f34a867)
  • render: pass visual_direction through to fetch_background (f9e8673)
  • settings: add Background generator section with BackgroundsModelPicker (d59c6ad)
  • setup-wizard: add Backgrounds step between lyrics and video defaults (362c92e)
  • video: mood-aware crossfade duration between background acts (8e04943)

1.7.4 (2026-04-24)

Bug Fixes

  • assets: treat size_bytes as optional in the manifest validator (07192ab)
  • release: skip Cargo.lock patch when the lockfile doesn’t exist (cef4413)

1.7.3 (2026-04-24)

Bug Fixes

  • release: sync tauri.conf.json + Cargo.toml version from package.json on release (36b6059)
  • windows: suppress subprocess console flash, broaden lyrics tag match, log analyze errors (24b4051)

1.7.2 (2026-04-24)

Bug Fixes

  • render: guard os.sync() with hasattr for Windows (6cff0a9)

1.7.1 (2026-04-24)

Bug Fixes

  • release: use tauri v2 updater format (.msi, not .msi.zip) for Windows (643551f)

1.7.0 (2026-04-24)

Bug Fixes

  • assets: retry .partial rename on Windows file-lock (bfa024e)
  • plans: asset-install resilience — env-warning, free-space preflight, partial rename retry (1caef6c)
  • render: Windows os.killpg crash + LLM-not-installed preflight on Create (d205a32)
  • server: warn when MVG_FFMPEG/MVG_FFPROBE points at missing file (3775361)
  • setup-wizard: surface paused_disk_full in the wizard pill (8a99ed8)
  • specs: asset-install resilience — env-var fallback warning, free-space preflight, partial rename retry (4cdbd2a)
  • ui: dark-theme native dropdowns on Windows via color-scheme (a5e376d)

Features

  • assets: preflight free-space check with paused_disk_full pause/poll (79ad91f)
  • assets: require size_bytes in manifest (5a8f6d7)
  • assets: surface paused_disk_full with a disk-full banner (e27425a)
  • updater: one-click in-app update via plugin-updater with R2 manifest (348944f)

1.6.0 (2026-04-23)

Features

  • brands: inline create/delete on Brand settings, cascade delete, zip-based export/import (48dfa25)
  • brands: multi-brand UX polish — sidebar logo, centered switcher, queue chips, cross-brand render warning (12a2bfd)
  • settings: reorganize around per-brand / output / app, collapsible sections, full-machine backup (fadef3d)

1.5.0 (2026-04-23)

Bug Fixes

  • app-store: extend hydrate retry window to ~60s for slow sidecar boot (9fc905d)
  • app: restore comment context + test disclaimer during wizard (153a389)
  • asset-status: treat missing kinds in /assets/status response as ok (c6b4f0f)
  • assets: centralize ffmpeg/ffprobe resolution across server modules (a2d3dfc)
  • assets: reject truncated lyrics-model downloads; self-heal corrupt model on load (273f0de)
  • assets: stop retrying disk-full/4xx install failures; surface as failed_permanent (2261e80)
  • assets: surface download failures in UI instead of swallowing them (e76cfbe)
  • assets: unblock ffprobe resolution end-to-end in bundled app (53c455f)
  • brands: atomic reassign + existence-check-before-active-check on delete (6673157)
  • brands: atomic writes, log corrupt brand.json, stricter init check (dc5845c)
  • brands: migration keeps pending on DB backfill failure instead of masking it (ce51643)
  • brands: polish multi-brand UX — Create-another button on Brand tab, Library driven by navbar switcher, LyricsWizard refreshes on brand switch (e69008f)
  • brands: retry listBrands with backoff on cold boots so slow sidecar doesn’t leave the store empty (ea86abb)
  • brands: surface refreshBrands errors via context.error instead of swallowing (0d5e1a6)
  • build: hide the Python sidecar’s console window on Windows (e40571b)
  • eq: cast legacy ‘true_mirror’ compare so narrowed eq_style type compiles (64cd743)
  • llm: apply manifest filename/url to the importlib-loaded llm copy (8fd4b4d)
  • queue: show backend error on failed rows; prefer song.error over song.stage (c8a9a80)

Features

  • api: /brands CRUD + activate endpoints with WS brand_changed broadcast (0783767)
  • api: Brand TypeScript type + listBrands/getBrand/createBrand/updateBrand/deleteBrand/activateBrand (3d83393)
  • app: mount SplashScreen above wizard and main content (8a09d48)
  • asset-status: expose wsConnected and assetsChecked on context (3b576d9)
  • assets: gate render/analyze on renderingEngineReady + troubleshooting docs (b5edf7d)
  • brands: BrandProvider context with WS brand_changed refresh (2bdf98c)
  • brands: delete guardrail + reassign songs/renders to another brand (adac145)
  • brands: export/import brand bundles as .mvg-brand (tokens excluded) (8895f67)
  • brands: first-run migration lifts legacy state into brand_0001 (b832fb7)
  • brands: header brand switcher shown only when >1 brand (ff66168)
  • brands: Library brand column + filter when >1 brand (aca77ef)
  • brands: platform panels show active-brand context; upload worker fails clearly when brand not connected (424b45c)
  • brands: Settings Brands tab with list / activate / rename / delete / add (cffefe2)
  • brands: showcase entries become per-brand; active brand’s showcase is what the remote page surfaces (b726a7b)
  • brands: stamp songs + renders with active brand_id; per-render override when >1 brand (bd3c7a3)
  • brands: storage module for multi-brand collection (78d80e5)
  • db: schema v3 adds nullable brand_id to songs + renders (5a8360e)
  • eq+brands: remove True Mirror option, add None; drop Brands tab in favor of inline manage mode on Brand tab (b2032ac)
  • first-launch: background asset downloads; remove unused What’s New (118aa92)
  • liveness: server heartbeat with ping/pong, banner, and bounded auto-restart (f1121ea)
  • onboarding: first-open LocalModelsDisclaimer explaining the local-only pipeline (6ee13a4)
  • splash+install: logo splash, monotonic install bar, live refresh (3ad06d7)
  • splash: 15s timeout with Restart Server / View Logs recovery (5afb838)
  • splash: distinguish slow startup from actual crash (03e3b22)
  • splash: gate app on server/assets/ws readiness (af69930)

1.4.0 (2026-04-22)

Features

  • lyrics: expand Your Sound + explicit-content guidance; improve helper-text contrast (9623335)
  • ui: info-icon toggle for helper text across forms; add duet variants; explicit model cleanup (e881e78)

1.3.0 (2026-04-22)

Bug Fixes

  • lyrics: refresh wizard active-model info on model_changed WS event (487df27)
  • lyrics: wrap scene field text in textareas so long values stay visible (0000a9c)

Features

  • lyrics: model management + HF token support; wire Check for Updates dialog (05ca5f7)

1.2.0 (2026-04-22)

Bug Fixes

  • setup-wizard: expand lyric_mode type to include ‘none’ for video defaults step (b1e76a1)
  • setup-wizard: make migration one-shot so manual relaunch from Settings sticks (f856103)
  • setup-wizard: mark server ready on first asset_progress so Get started enables when WS arrives before HTTP poll (0d805e5)
  • setup-wizard: wrap wizard branch in AppStoreProvider so step components can read config (0f7f088)

Features

  • settings: add Launch setup wizard button to preferences (f9afc13)
  • settings: remove Review Backgrounds global toggle (per-song review still available) (bec66a5)
  • setup-wizard: add lyrics model picker step (auto-skipped when lyrics disabled) (657e1ca)
  • setup-wizard: brand step with channel name and logo upload (6e7ae80)
  • setup-wizard: connections step rendering enabled platforms (2ca5ef3)
  • setup-wizard: done summary step (b1c8120)
  • setup-wizard: gate wizard before SetupScreen with returning-user migration (865e058)
  • setup-wizard: lyrics step with optional voice fields (6c4d549)
  • setup-wizard: match Settings naming, add Back nav, video defaults step, custom genre, logo thumbnail, ToggleSwitch components (3c7d954)
  • setup-wizard: output formats step with at-least-one constraint (6976ab3)
  • setup-wizard: shared step and pill state types (ea4cd94)
  • setup-wizard: showcase step with optional URLs (c1169a2)
  • setup-wizard: top-level wizard with asset download and step machine (ed4d022)
  • setup-wizard: welcome step gated on server ready (969727e)
  • setup-wizard: wizard shell with pill, step dots, setup-later link (0bc244a)

1.1.1 (2026-04-22)

Bug Fixes

  • deploy: fix (252dcf3)

1.1.0 (2026-04-22)

Bug Fixes

  • test: reduce (b49f9ed)
  • test: reduce requirement (455bc6d)

Features

  • api: /system/assets/status and /system/assets/download (5e138ca)
  • assets: backoff schedule and reachability probe (ff27e0f)
  • assets: load manifest on startup and cleanup stale partials (dd3c4f0)
  • assets: manifest schema and loader (78f5c95)
  • assets: resolver helper for installed paths (baeba37)
  • assets: resolver paths and status check (c65a62f)
  • assets: retry loop with offline pause (9811aad)
  • assets: sha256 verification and atomic install (95ffa0d)
  • assets: single-attempt streaming download (24404e0)
  • ffmpeg: download endpoint delegates to asset installer (abeca1f)
  • llm: source model filename and url from manifest (3a5b7b2)
  • ui: SetupScreen driven by asset_progress events (e2b76c9)
  • ui: useApi wrappers for asset status and download (5076053)

1.0.11 (2026-04-21)

Bug Fixes

  • create: surface the server error detail when act-info load fails (34d17cd)

1.0.10 (2026-04-21)

Bug Fixes

  • release: pass —remote to wrangler r2 object put (d3ca080)
  • release: promote latest_version only after build succeeds (1abc36c)

1.0.9 (2026-04-21)

Bug Fixes

  • ci: enable nullglob so empty installer globs don’t fail the upload step (24a94ab)
  • cloud: point updater URLs at the worker’s /download endpoint (e6a83c2)
  • cloud: stream installers directly from R2 instead of redirecting (817e76e)
  • release: drop Intel Mac support (9e70823)

1.0.8 (2026-04-21)

Bug Fixes

  • ci: assert TAURI_SIGNING_PRIVATE_KEY is non-empty before tauri build (7b11152)
  • ci: pass Tauri updater signing secrets into the build step (991764c)
  • ci: write signing key to a tempfile and pass the path to tauri-action (d9acbfc)

1.0.7 (2026-04-21)

Bug Fixes

  • core: fix bug (14cb90b)

1.0.6 (2026-04-21)

Bug Fixes

  • ci: bundle ffmpeg + ffprobe into the Tauri build on every target (bf22bb3)

1.0.5 (2026-04-21)

Bug Fixes

  • ci: create mvg-docs Pages project if it doesn’t exist before deploy (4bd5dca)

1.0.4 (2026-04-21)

Bug Fixes

  • build: resolve site-packages via sysconfig.get_paths()[“purelib”] (48b2b5f)
  • ci: add plain ‘tauri’ npm script for tauri-action (13ad5e6)
  • core: bug fix (d4dd921)

1.0.3 (2026-04-21)

Bug Fixes

  • ci: install llama-cpp-python and run matrix builds independently (23cf7e4)

1.0.2 (2026-04-21)

Bug Fixes

  • core: bug fixes (c29dd6b)

1.0.1 (2026-04-21)

Bug Fixes

  • core: bug fixes (8ddba4b)

1.0.0 (2026-04-21)

Bug Fixes

  • address review issues in collision detection (2069851)
  • address review issues in lyric alignment (131c2ef)
  • anchor-based lyric alignment using Whisper text matching (780ad6d)
  • appstore: mount provider after splash and hydrate via explicit action (41f63b3)
  • auto-start render when songs added to queue, update app identifier (97795d8)
  • backgrounds: explicit invalidate/ensure after accept (belt-and-suspenders with WS) (4b7ffa2)
  • bundled app render pipeline and queue management (ba64846)
  • cancel now reliably kills ffmpeg via pgrep fallback (8301328)
  • center text positioning, cap font size, filter bracketed section headers (6998d99)
  • ci: add missing runtime deps to server/requirements.txt (63a6d15)
  • discovery now checks all configured formats, not just youtube (9128d89)
  • download: derive save-dialog filter from file extension (fe53433)
  • eliminate orphan ffmpeg processes (1ace719)
  • ffmpeg resolution, download dialog, clear cache, and misc fixes (e67c38c)
  • forms: preserve Enter and trailing spaces in list-backed inputs (17c5d8d)
  • interpolate missing lyrics into gaps between matched segments (aefd508)
  • karaoke mode — no line overlap, bottom positioning, scaled word timing (61915b0)
  • keep YouTube descriptions short, no lyrics dump (95d80d2)
  • loop lyrics for songs with repeated choruses/sections (8728657)
  • make render summary log format-aware (044708d)
  • package: fix scope (b54ebc4)
  • pipeline config reads from app data dir in bundled app (d068d3e)
  • production hardening from 5-agent parallel review (578b3bf)
  • prompt LLM to focus on mood/emotion, not literal title interpretation (9425b9b)
  • queue: broadcast queue_changed on render start (bced7f1)
  • register tauri_plugin_opener in main.rs (91b46c2)
  • remove faststart (causes issues), add sync+delay before sanity check, logging (4d14b66)
  • remove film grain noise overlay for cleaner 4K backgrounds (44f5160)
  • remove orphaned anullsrc input from TikTok command (b4a9974)
  • revert to vocal-timeline alignment with word-count weighting (82c4b5d)
  • rewrite alignment to use proportional word mapping with monotonicity enforcement (47cedfb)
  • rewrite render queue orchestration to eliminate race conditions (1257c08)
  • search all lyrics per segment with nearness bonus for better repeat matching (58db056)
  • settings: widen content panel to 800px so it grows with the viewport (6e9e35f)
  • show section lyrics when prompting for custom background (91c6a8e)
  • shutdown: harden sidecar cleanup on app exit and startup (fba9b73)
  • stderr pipe deadlock causing all stuck renders + UI polish (5d8b9c8)
  • store,queue: handle ‘error’ WS event in store, delta-seed Queue by stem (bd66e17)
  • store: queue/mergeSong ignores undefined patch fields (6df9fe9)
  • store: sync bgCachedRef on ensure/invalidate/accept for tight refetch cycles (ed60fb2)
  • tests: fix all tests (323aa00)
  • ui: align style-panel control heights on Create page (e3d9502)
  • use random seed on each background refetch to avoid duplicate images (094d026)
  • widen lyric lookahead to 8, raise match threshold to 0.4, snap to half-beats (b5b6103)
  • wire font into drawtext, escape channel name, remove unused params (3ecf8cf)

Features

  • add /download redirect routes, update to ashworthhub subdomain (3fdd82e)
  • add About, What’s New, and Keyboard Shortcuts dialogs (8ef3f8d)
  • add background palette sampling with HSV correction (688a8dd)
  • add background review system, render queue, and UI improvements (311cc89)
  • add BPM extraction module with librosa and caching (b494d5d)
  • add comprehensive desktop app features (menu bar, tray, notifications, crash recovery, onboarding, export/backup) (9af31c4)
  • add crash recovery UI with reconnect and restart (e1d94b0)
  • add create formats and tiktok_clip_duration config (94380e6)
  • add Create page with song selection and render options (bd14ed3)
  • add Create to sidebar and routing, move Queue to /queue (822b544)
  • add desktop app with Tauri, React frontend, and FastAPI server (360d2f8)
  • add docs site homepage with hero (0f664ef)
  • add docs site logo and favicon (cc737f0)
  • add energy-based clip detection for TikTok promo (8e87ee6)
  • add export/import for settings and library backup (5c09191)
  • add ffmpeg command builder and runner (67fea6c)
  • add file associations for audio files and mvg:// deep link (1f2a488)
  • add filename-to-prompt derivation (c3044aa)
  • add frontend test infrastructure with vitest and testing-library (19a3178)
  • add get_tiktok_config() with defaults (aea0989)
  • add graceful shutdown endpoint and sidecar shutdown sequence (ef481fa)
  • add license activation gate and update banner to app (42c22bf)
  • add menu event handling, quit confirmation, system tray with close-to-tray (d0fd4df)
  • add native menu bar for macOS and Windows (50e4a3d)
  • add notifications, onboarding overlay, help tooltips, and error boundary (5aaa1d6)
  • add Pollinations background fetch with retries (e5113b4)
  • add render.py entry point wiring the pipeline (5976808)
  • add select-only mode to DragDrop component (4b1a1c4)
  • add Showcase community feature for cross-promoting channels (b8b1309)
  • add sidecar health monitoring, crash detection, and restart command (27b0bbb)
  • add structured logging with rotation to Python server (1e2bc2c)
  • add Tauri plugin dependencies and extract Rust modules (d1d4dd9)
  • add Tauri sidecar launch, shell plugin, and build script (ce77cfb)
  • add TikTok upload module with OAuth, upload, and config wrapper (111a5cb)
  • add TikTok upload support with LLM-generated descriptions (708e167)
  • add unprocessed mp3 discovery (52ba8f9)
  • add vertical TikTok FFmpeg filter graph with end card (2be0891)
  • allow license keys to be activated up to 5 times (f3402f8)
  • app: mount AppStoreProvider and derive counts from store (1159b55)
  • beat-synced lyrics, style presets in config, thumbnail generation (d3316ce)
  • bundle ffmpeg, whisper, and torch with the app (7bf603a)
  • clear-cache: also delete the sidecar .lyrics.txt so extraction falls back to ID3 (6f66022)
  • configurable karaoke mode with word-by-word highlighting (4be67e6)
  • Create tab with song analysis, background management, and lyrics support (b98afc9)
  • create: read config/fonts from AppStore (ba52110)
  • cross-platform support for macOS, Windows, and Linux (44b6a2f)
  • custom prompt option when rejecting backgrounds during review (dd6728c)
  • fetch background images at 4K (3840x2160) for sharper detail (a6d181e)
  • ffmpeg progress reporting during render (b419712)
  • forced alignment with stable-ts for bulletproof lyric timing (2585281)
  • instagram: add Instagram as a parallel platform to TikTok (da11b2e)
  • integrate TikTok promo render into pipeline (cd394d2)
  • integrate TikTok upload into render pipeline (1f63c6f)
  • library: per-render cards with Clear Renders / Clear All Data (7e93ab9)
  • library: read songs/archived from AppStore with loading skeleton (954d65d)
  • library: read YT/TT status from AppStore (60144bb)
  • LLM-generated image prompts and multi-image crossfade backgrounds (3d6a975)
  • LLM-generated YouTube descriptions from lyrics (fe204f8)
  • llm: switch local model to Qwen 2.5 3B Instruct (3b808c6)
  • local LLM, Instagram download, OAuth PKCE, UI polish (c6582c4)
  • lyrics: AI-assisted lyric generator with scene-anchored pipeline (ebce93a)
  • output files grouped into per-song folders (5abe1bb)
  • overhaul Settings page UX (116b783)
  • prompt: scene prompt depicts section’s literal subject (dd979f1)
  • prompt: vision prompt identifies song subject and arc (64b7456)
  • queue,backgrounds: use store-backed ensureBackgrounds (6fe2e5f)
  • queue: read songs from AppStore with loading skeleton (6ca53a7)
  • replace in-memory state with SQLite database (22d9c15)
  • responsive Create, AI prompt dialog, persistent nav state, misc fixes (ab9a88a)
  • review_backgrounds config option to pause and review before rendering (6182ec0)
  • scaffold Astro Starlight docs site (fe5cc76)
  • scaffold Cloudflare Worker with /activate and /update routes (7b5852f)
  • settings: read config/fonts/YT-TT from AppStore, debounce via saveConfig (20d3c00)
  • show ‘Checking for updates’ in splash screen (3d74fa9)
  • show app version in sidebar (fe54bd5)
  • show splash screen for at least 1.5 seconds (4032437)
  • store: add AppStore skeleton with typed initial state (9b2b911)
  • store: add config (with setConfig/saveConfig) and fonts slices (6a119ce)
  • store: add library and archived slices with complete/library_changed handling (0cb4f29)
  • store: add queue slice with initial fetch and WS refresh (a6b2aa6)
  • store: add songBackgrounds slice with ensureBackgrounds and invalidation (e306075)
  • store: add YouTube/TikTok connection slices (e52f0db)
  • store: merge stage_change/progress into queue song without refetch (0be8c8e)
  • store: retry initial fetches once on failure (eb3eeab)
  • subtitle collision detection with vertical nudging (868c08a)
  • support wav and flac input files alongside mp3 (7bb0d8b)
  • tempo-aware EQ glow pulse synced to BPM (d4370db)
  • theme docs site to match desktop app (195f363)
  • two-pass prompt generation — visual direction from full lyrics, then per-section scenes (5dc1e12)
  • upgrade Whisper to small model, add title card overlay (ab5d349)
  • upload installers to R2 on release, platform-aware update URLs (325e373)
  • ux: splash-time preloading, pending-queue hygiene, per-act lyrics chip (c23ec23)
  • wire BPM extraction and progress reporting into pipeline (3b95aba)
  • wire up docs site sidebar and placeholder pages (0d59b5d)
  • word-level lyric alignment using Whisper timestamps (c4cf575)
  • YouTube and TikTok OAuth with bundled PKCE credentials (59988ca)
  • YouTube upload with —upload flag, config, and OAuth2 setup (8d0619e)