v0.1.83
Latest2026-06-21Top-up queue model + YouTube field validation
Two related changes: the queue is now a 100-beat top-up bucket per project (the wizard fills it, sync tops it back up as uploads publish, no more drip-feed cap math); and tags/titles are validated against YouTube's actual rejection rules so silent "invalid video keywords" failures stop happening. Auto-sync gets a Settings toggle. Manual sync still works regardless.
- NewPer-project queue cap of 100 active uploads. Sync (auto or manual) tops up to exactly 100, never more — uploads publish, slots free up, next sync refills. Folder size is irrelevant: 50 beats or 50,000, the queue stays at 100.
- NewSource folder is now read alphabetically by filename, so producers can control sequence with prefixes (01_, 02_, 2026-06-01_). Stable across machines and re-syncs.
- NewSettings → Sync section with an Auto-sync toggle. Default on. Turn it off and only manual Sync Beats touches the queue.
- FixTag total length uses YouTube's real formula (multi-word tags count as length + 2 for quote overhead). The previous comma-join undercount let borderline tag sets through that YouTube rejected at upload time — exact cause of "invalid video keywords" on a 501/500-char set.
- FixWizard rejects URL-shaped tags ("getrollout.app", "site.io"), angle brackets in any field, empty tags, and oversized individual tags. Per-tag rejection toast tells the user why.
- FixSync auto-strips invalid project tags and trims to fit; an info toast surfaces what was dropped so the user can fix the project source.
- Polish"Invalid video keywords" and "invalid character" YouTube errors humanized to point at the actual cause (URL-shaped tag, "<" / ">" in title/description).
- BreakingRemoved: the 150-per-run wizard cap, the 150-per-sync cap, the chunked-queue drip-feed banner, the "deferred for next auto-sync" copy. The cap = the queue, and there's only one number to remember.
v0.1.82
2026-06-21Scheduled rows actually drain — the v0.1.81 fix uncovered a deeper bug
A row scheduled hours out would survive every gate v0.1.81 fixed, hit the drain loop, and then get silently skipped by a per-row "still queued?" check that was misdesigned for the auto-trigger path. The check now only runs for user-triggered (Schedule Batch / Upload Now) rows where Cancel actually has something to cancel. Plain scheduled rows flow through. Also: server-side per-upload creation buffer (10 min) now respects the same 8h slot-bypass — re-creating a project minutes before its slot no longer strands the row.
- FixBackgroundProcessor drain loop no longer skips plain scheduled rows. The "user cancelled while waiting" check is now gated on userTriggered=true; rows that were never user-triggered have nothing to cancel and process normally.
- FixServer-side creation buffer (10 min hold after row creation) now skips when the row's publish slot is within 8 hours — matches the renderer's slot-bypass so re-creating a project just before its slot doesn't strand the first row in the buffer.
v0.1.81
2026-06-20Scheduled rows no longer get stranded by the CPU gate
A scheduled row could sit "Pending" all day on a machine that was technically below idle but above the 75% gate (browser + IDE + chat apps). The CPU threshold is now 85%, and rows within 8 hours of their publish slot brute-force through the gate so the slot is never missed. The main-process timer is now just a heartbeat — the renderer makes the slot-aware decision. Tick decisions are logged to main.log for diagnosability.
- PolishCPU "low load" threshold raised from 75% → 85%. Normal workstation noise (IDE, browser, chat apps) no longer keeps the processor deferred.
- NewSlot-bypass: a row within 8 hours of its scheduled publish time brute-forces through the CPU gate. YouTube holds the video private until the slot anyway, so rendering early is free — and the slot is never missed because the machine stayed busy.
- FixStale-row escape: any pending row >2 hours old bypasses the CPU gate. Covers "now" uploads that have been waiting too long.
- FixMain-process tick no longer drops the signal when CPU is high — it forwards every tick to the renderer, which has full row data and applies the slot-bypass logic. Previously main’s gate could starve the renderer of every chance to apply its own escape clauses.
- PolishBackground processor logs each tick to main.log (CPU load, skip reason, signal sent) so a stall is diagnosable without DevTools.
v0.1.80
2026-06-20No more "Server Error" — readable failures and auto-trimmed titles
Sync Beats and Schedule Batch now surface the real reason a call failed instead of "Server Error Called by client". The Create wizard validates the worst-case title length across the whole folder, not just the first 3 files. Titles that still squeak past at sync time get auto-trimmed to 100 characters instead of failing the whole batch.
- FixConvex length-cap errors (title too long, tag total too long, etc.) now come through with the real message and field name instead of being masked as "Server Error".
- PolishCreate wizard checks the longest filename in the folder when validating template length, so the 100-char title warning fires before queueing instead of after.
- PolishA title that still exceeds 100 chars at sync time is auto-trimmed to fit, with a follow-up toast telling you how many were shortened.
- PolishAdmin-set Premium tier on an alpha user now propagates to the subscription-status query (chip and entitlements line up with the override).
v0.1.79
2026-06-20Real key stripping + clearer Sync errors
Key tags like "d#sharpm" now actually strip from real filenames — the previous fix only worked when the extension was stripped first. Sync Beats failures now show the real error instead of a generic "Failed" toast, with a friendlier message when sync is rate-limited.
- FixTitle cleanup strips key tags adjacent to the file extension ("d#sharpm.mp3"). The v0.1.78 fix only handled space/underscore boundaries; the regex now also accepts dot and bracket boundaries.
- PolishSync Beats errors show the actual reason via humanizeError, with a dedicated "rate-limited — try again in a few minutes" message replacing the unhelpful generic toast.
v0.1.78
2026-06-19Create-step polish + better key stripping
The Create wizard is wider with a full-pane scroll area so the mouse doesn’t have to be centered. Long custom exclusions stay visible while typing. Mixed-form key tags like "d#sharpm" now strip from titles. The queue Edit dialog’s Save button is always reachable.
- PolishCreate wizard columns widened and scroll wheel now works anywhere across the pane, not just over the centered column.
- FixLong custom exclusion and tag strings stay fully visible while typing, instead of disappearing off the right edge.
- FixTitle cleanup strips mixed-form keys like "d#sharpm", "Dsharpminor", and "D#sharp minor" — previously only "d#min" / "dminor" forms were caught.
- FixEdit dialog on a queued upload now scrolls and keeps Save Changes visible on smaller windows; previously the button was cut off below the fold.
- PolishOver-limit banner copy tightened ("auto-sync daily" instead of "every few days") to match the actual cadence.
v0.1.77
2026-06-19Large folders, silent updates, smarter tag input
Big folders no longer fail silently in the wizard. The first 150 beats queue immediately and the rest drip-feed automatically every day as the queue drains. Updates install themselves without a click. Tag pasting handles comma-separated lists.
- FixWizard with 150+ beats now actually queues them — previously the server cap was hit silently and zero rows landed in the queue.
- NewAuto-sync drips folder leftovers into the queue once per day per project, so a 1000-beat folder clears over time without any manual Sync clicks.
- PolishWorkflow step shows an inline hint when a folder exceeds the per-run cap, explaining the auto-sync drip.
- PolishUpdates install themselves with a 60-second countdown — Postpone is one click, no need to remember to hit Restart.
- NewPasting a comma-separated list into the tag field splits it into individual tags automatically.
v0.1.70
2026-06-18Schedule Batch unified with background processor
Schedule Batch and the background processor used to render in parallel against the same uploads, spawning two ffmpegs at once and making Cancel unreliable. Schedule Batch now hands its work to the background processor — one render at a time, one cancel path, one CPU gate.
- FixSchedule Batch no longer spawns parallel ffmpeg renders alongside the background processor.
- FixCancel on a queued Schedule Batch row now actually stops it from rendering when its turn comes.
- FixQueued Schedule Batch rows show "Queued — N ahead" instead of a misleading "Processing…" label.
- FixUpload Now cancel on a row still waiting for its turn now removes it from the queue instead of letting it run later.
v0.1.56
2026-06-03Phase 3 batch fix
A wide pass on the issues surfaced during the Phase 3 manual test run: upload-phase visibility, YouTube push status, calendar coverage, and a handful of small UI papercuts.
- FixYouTube upload phase now surfaces a progress bar and Cancel control while the upload is in flight.
- FixSidebar YouTube status updates instantly on connect/disconnect (was polling every ~30s).
- FixQueue → Calendar shows pending (blue), published (green), and failed (red) states across the visible window.
- FixPricing modal no longer clips its X button behind the Electron titlebar on laptop-height screens.
- Fixdrawtext font + centering corrected on overlay renders.
- PolishFocus the existing window when a second app instance is launched.
- PolishCustom slim scrollbar across the app.
v0.1.55
2026-05-30Queue flicker + image picker fix
Two production papercuts: the queue would briefly flicker "Stuck processing" on background-processor rows, and the single-file image picker was broken on Windows.
- FixQueue no longer flickers "Stuck processing" on rows owned by the background processor.
- FixRemoved the broken single-file image picker; image source is now folder-only.