Commit Graph

  • add024a68d HANDOFF: session state, event-button task queued, no-push rule gramps 2026-08-24 15:37:03 -07:00
  • 100980087e Fix Run-crash for real (type-guard before VisualTreeHelper); avatar via HttpClient decode gramps 2026-08-24 14:57:34 -07:00
  • d9e352f996 Text tab toggles the drawer; click-away collapses it gramps 2026-08-24 14:49:15 -07:00
  • e6baa55867 Fix logo-click crash (Run is not a Visual); Text tab always visible; avatar initial fallback gramps 2026-08-24 14:44:16 -07:00
  • b988e6d72e Broadcast Text pull-out (Live screen) + launch geometry 1920x1040/1366x768 with restore gramps 2026-08-24 11:04:41 -07:00
  • d5b611d8d5 ON-AIR label matches REC: shared StatusSignText style, dots carry state gramps 2026-08-24 10:30:18 -07:00
  • 7357836f9b ON-AIR sign right of REC: gray offline, red public, green private gramps 2026-08-24 10:22:18 -07:00
  • b0bace7432 TASK 20 step 1: global hotkeys F1-F9 (scenes, stream, mutes, TRAX) gramps 2026-08-24 09:32:54 -07:00
  • b899ff053f No feature branches pre-1.0: all work on main gramps 2026-08-24 09:15:56 -07:00
  • 708b336da7 YouTube Chat layer: one-per-layout gate + legacy label heal (TASK 27) gramps 2026-08-24 09:08:03 -07:00
  • ef710c5537 Webcam menu gates on the app-wide identity (TASK 26) gramps 2026-08-24 08:56:17 -07:00
  • d774799138 HANDOFF: TASK 25 committed and pushed gramps 2026-08-23 13:34:49 -07:00
  • 7dd140a4c0 Backgrounds: one locked Background per screen + mini rule (TASK 25) gramps 2026-08-23 13:33:33 -07:00
  • b400ab59c5 Toasts: non-blocking notifications replace MessageBoxes + log-only failures (TASK 24) gramps 2026-08-23 12:25:04 -07:00
  • 809c066184 Fix: derive IsBackground from Type on layout load (legacy rows healed) gramps 2026-08-23 07:25:54 -07:00
  • 46da9954ad HANDOFF: session state, open IsBackground-on-load bug, audit verdict gramps 2026-08-23 06:26:29 -07:00
  • d2114c7e1c the ai is an overthinking fucking moron who needs it's plug pulled until such time it can repeat a similar action with its head and ass gramps 2026-08-23 06:25:38 -07:00
  • b74f15ff14 Fix: IsBackground derived from SourceType + per-scene background property tests gramps 2026-08-22 18:16:11 -07:00
  • bb7f99a747 HANDOFF: reflect committed state gramps 2026-08-22 18:11:24 -07:00
  • 4b9a8e515f Control Surface UX: pill toggle, background rename, per-scene properties gramps 2026-08-22 18:10:59 -07:00
  • e06bfa42a8 Fix: TRAX meter reflection — remove double attenuation from slider+loopback gramps 2026-08-21 08:32:20 -07:00
  • 75ee6978d3 HANDOFF: reflect pushed state gramps 2026-08-21 08:19:22 -07:00
  • 8951141c65 TASK 10: Polar billing + Velopack auto-updates (steps 1-7) gramps 2026-08-21 08:18:52 -07:00
  • 2f135687cd fix: countdown timer panel showing under webcam properties gramps 2026-08-20 18:13:31 -07:00
  • 7e01c4564e fix: chatbox properties panel showing when webcam is selected gramps 2026-08-20 18:07:53 -07:00
  • 0bd17ab428 feat(ui): Show Desktop toggle, avatar login, chat preview, backdrop seeding, border animations gramps 2026-08-20 18:02:41 -07:00
  • a76a3d2acd fix: BRB backdrop seed replaces existing instead of skipping gramps 2026-08-19 15:02:47 -07:00
  • f40ec83e69 feat: BRB backdrop seed + docs refresh + Polar org ID gramps 2026-08-19 15:01:23 -07:00
  • 26828ccdd7 feat(ui): rename panels Screens → Layers → Properties gramps 2026-08-19 13:52:42 -07:00
  • e292f0e037 fix: seed starting backdrop on every load, not just first launch gramps 2026-08-19 13:13:00 -07:00
  • 6a74147611 feat(chat-overlay): selection highlight + default size + starting backdrop gramps 2026-08-19 13:01:35 -07:00
  • 70be14e957 docs: mark TASK 3.18 shipped in TASKS.md gramps 2026-08-19 12:44:17 -07:00
  • 65641d84e5 feat(chat-overlay): add ChatBox config UI + schema persistence gramps 2026-08-19 12:42:32 -07:00
  • 93987506a7 Remove old logo references, fix duplicate resource gramps 2026-08-19 12:30:46 -07:00
  • 48e8d28169 Remove old tyllive/ytLlive assets (replaced by llamacasty assets) gramps 2026-08-19 12:28:04 -07:00
  • 3e465c3e4d Replace app icon with LlamaCasty brand figure gramps 2026-08-19 12:21:08 -07:00
  • 6edce86d9d Add LlamaCasty logo asset gramps 2026-08-19 12:08:37 -07:00
  • 1613acadc3 TASK 9.4: live chat wiring — right panel with Super Chat + membership badges gramps 2026-08-19 11:59:29 -07:00
  • e97406d649 v1 task queue: add TASK 19-23 (transitions, hotkeys, media source, audio sync, studio mode) gramps 2026-08-19 11:51:32 -07:00
  • f9ad7c2cb1 fix: asymmetric meter decay for faster desktop level response gramps 2026-08-18 12:15:44 -07:00
  • 5ad58542fb Monetization: Polar chosen as billing provider gramps 2026-08-18 10:13:53 -07:00
  • 2e8629c5c2 Fix: volume slider click-to-position restored gramps 2026-08-18 08:49:32 -07:00
  • 30a193b2c9 TRAX: error display, retain track on failure, gray idle dot gramps 2026-08-18 08:44:21 -07:00
  • 02cb4bc219 Fix: desktop audio slider now controls system volume (WYSIWYG audio) gramps 2026-08-18 08:27:31 -07:00
  • 6e3ba0a7a0 Fix: consistent check/revert order + enable accept buttons gramps 2026-08-18 07:53:15 -07:00
  • 6e446cb7ad Fix: URI text box no longer shows under webcam source gramps 2026-08-18 07:42:29 -07:00
  • f51f6a0a1a Docs: verify web source URI correctly hidden for webcam (no code change) gramps 2026-08-18 07:06:39 -07:00
  • bdf1429f89 Fix: Web source URI + check/revert buttons now inline in single row gramps 2026-08-18 07:03:47 -07:00
  • b101d336d0 Fix: Elements scrollbar click no longer deselects the selected element gramps 2026-08-18 07:00:51 -07:00
  • c7d4b3b6d9 Revert "Fix UI polish: scrollbar deselect, web source inline buttons, countdown in Sources, volume click-to-position, meter decay" gramps 2026-08-17 17:59:43 -07:00
  • b7b015b12b Revert "Fix startup crash: remove missing CompactSlider resource reference from inline countdown slider" gramps 2026-08-17 17:59:43 -07:00
  • 1faba4770d Fix startup crash: remove missing CompactSlider resource reference from inline countdown slider gramps 2026-08-17 17:52:49 -07:00
  • dc91c855ef Fix UI polish: scrollbar deselect, web source inline buttons, countdown in Sources, volume click-to-position, meter decay gramps 2026-08-17 17:36:00 -07:00
  • 28054da70a elements: inline check/revert icons with controls + IconButton style on all gramps 2026-08-17 17:08:36 -07:00
  • 19de1553b3 elements: match IconButton style for revert (red X Path) and check (green Path) gramps 2026-08-17 17:04:28 -07:00
  • b9173f53af layout: cap side panel max widths (360/400px) gramps 2026-08-17 16:58:45 -07:00
  • 32f8923c8c layout: proportional column sizing — side panels grow at 50% of preview rate gramps 2026-08-17 16:55:01 -07:00
  • 28765a0dbf creator feedback batch: 9 fixes from initial review gramps 2026-08-17 10:16:55 -07:00
  • 2d5d2e9c7a branding: replace llama logo assets with new ytLlive branded icons gramps 2026-08-17 08:14:22 -07:00
  • 16f905c8d7 feat: Elements panel, Countdown/Web sources, webcam border config (TASK 14 Branch 2) gramps 2026-08-17 07:53:03 -07:00
  • a3dd0791db fix: creator feedback batch Branch 1 — TRAX volume, tooltip, meter boost, slider click, backdrop gramps 2026-08-17 07:45:29 -07:00
  • 13ce867bf3 docs: renumber tasks sequentially 1-13, close gaps, fix all cross-references gramps 2026-08-16 19:28:41 -07:00
  • 3904b626b9 dokunfuk gramps 2026-08-16 18:16:10 -07:00
  • 0fac1e6a5a TASK 5 items 1-3: reusable stream, health banner, docs refresh gramps 2026-08-16 17:48:37 -07:00
  • 92f1471ab4 TASK 25: master limiter on the live mix (2026-08-15, queued from the TRAX discussion) — the review confirmed two of the creator's three instincts were already satisfied (MediaFoundationReader streams from disk so file size needs no guard; the MusicPlayer 0.20 bed rides the same loopback gain as the game, so music is always exactly 20% of the desktop volume by construction) and found one real gap: AudioMixer.FillAndMix summed mic + loopback with no output ceiling, so hot gains could pass 0 dBFS and clip the AAC encode. New pure Services/Audio/MasterLimiter.cs: -1 dBFS ceiling (Ceiling = 0.891), instant attack per frame (a hot frame is scaled exactly to the ceiling — no overshoot), smoothed release toward unity so loud passages don't pump, gain never exceeds 1. Applied at the end of FillAndMix right before the pipe write. 3 unit tests (trim-to-ceiling, never-boost, recovery) + ONE integration test (MasterLimiter_CapsTheLiveMix_OnThePipe: a 0.95 loopback bed capped to exactly 0.891 on the wire while staying audible). Docs in the same commit: ai.md go-live audio section, Services/index.md new row, TASKS.md TASK 25 record, HANDOFF.md shipped state. Build 0 warnings, 193 tests passing (189 + 4 new) gramps 2026-08-15 16:10:16 -07:00
  • 24f16b2cd9 Game audio bar is now ALWAYS visible (TASK 4 gating removed, 2026-08-15): the show/hide machinery kept hiding the desktop/game meter whenever no full-screen game with sound was up or no TRAX music played, which the creator read as the meter being lost. Deleted IGameAudioDetector/GameAudioDetector/GameAudioHysteresis (Services/), the VM's 250ms DispatcherTimer poll + OnGameAudioActiveChanged/OnGameAudioPollTick + IsGameAudioBarVisible + _gameAudioBarActive/_gameAudioTimer/_gameAudioDetector, and the two detector test files (GameAudioDetectorTests, GameAudioHysteresisTests); MainWindow.xaml drops the Visibility binding so the bar renders unconditionally. Desktop audio is just automatic WASAPI loopback now. Docs in the same commit: ai.md (audio section + Services inventory), Services/index.md, ViewModels/index.md, TASKS.md TASK 9 item 7 follow-up, HANDOFF.md shipped state + stale poll-timer landmine removed. Build 0 warnings, 189 tests passing (8 detector tests removed) gramps 2026-08-15 15:53:51 -07:00
  • cc71ed5066 TASK 24 follow-up: TRAX button moved into the game audio bar, left of the 'Desktop Audio' label in the preview overlay (the creator's follow-up pick — the music control sits with the desktop audio controls it rides); removed from the footer's left cluster next to Socials. TraxToolTip now teaches the clicks ('left-click plays/pauses, right-click chooses a track'). Docs in the same commit: TASKS.md TASK 24 item 6, ai.md audio section, ViewModels/index.md. Build 0 warnings, 197 tests passing (no test changes — UI relocation only) gramps 2026-08-15 15:42:24 -07:00
  • a0a8331569 TASK 24 post-pause polish batch (creator's 8 review issues, 2026-08-15): (1) desktop/game audio volume slider + (2) mute were no-ops — the AudioMixer's gain Func seams defaulted to unity because the VM never passed them; new AudioGainProvider (Services/Audio/) wires MicMuted/MicVolume/GameMuted/GameAudioVolume into the mixer at construction, read live each mix tick, so sliders and mutes are stream-honest; the game bar also scales TRAX locally via new MusicPlayer.LocalGain (UpdateTraxLocalGain on every game volume/mute change + on load) so the creator HEARS the controls work on the music in the headphones. (3) TRAX played once then stopped — OnPlaybackStopped only looped on Position>=Length (unreliable for MediaFoundationReader); now any clean stop rewinds + replays, errors/explicit stops surface via PlaybackEnded; unused using dropped. (4+6) TRAX moved right of Socials in the footer's left cluster (centered under scenes/sources); the mic cluster is now MIC + meter + mute + volume. (5) mic source persists — LayoutStore gains a Settings key/value table (SaveMicSourceName/LoadMicSourceName); the VM saves on pick and restores before the mixer's first Start, so a restart reconnects the same vetted device (green) or reports it missing (yellow). (7) Backdrop's missing trashcan shifted the edit/eye icons right — new HiddenBoolToVisibilityConverter keeps the trash column reserved (Hidden, not Collapsed) so every source row's icons stay in fixed columns. (8) a 1px hairline with top/bottom padding separates scenes from sources in the left panel. Docs in the same commit: ai.md (gains honest + drive TRAX locally, TRAX loops, mic persistence, footer layout), TASKS.md TASK 24, HANDOFF.md shipped state, ViewModels/index.md. ONE integration test: AudioPipelineTests.Mix_HonorsProviderGains_AndGameMute_KillsTheLoopback (real mixer + provider gains through the pipe harness: scaled loopback audible, silence after mute). Build 0 warnings, 197 tests passing gramps 2026-08-15 10:23:49 -07:00
  • 86fcd868a8 Monetization policy locked + dev pause recorded (docs changeset, 2026-08-14): the one paid line becomes an annual subscription — early access $49.99/yr → $99/yr list at GA, grandfather-while-subscribed with lapse → list on renewal (no escalation matrix); free tier unchanged (branding flash is the free tier's billboard + no Alerts, which is the one paid feature); billing NOT locked to itch.io (hunted fact: itch.io has no native subscription billing — candidates Gumroad, whose native affiliate program is the tiebreaker, and Lemon Squeezy); support = in-app bug-report → git issues with a when-I-get-around-to-it cadence + emergency patches. ai.md Monetization section rewritten + stale paid-unlock seams fixed (L115 subscription-entitlement wording, the About hub's tabled billing PremiumUrl seam); TASKS.md gains TASK 23 (Monetization — billing provider decision, unlock mechanism with lapse→flash-returns enforcement, in-app bug-report loop, Unlock Premium seam lighting, Alerts gating, and line-item pointers for the early-access strategy, affiliate/ads phase 2, and the channel revival); HANDOFF.md records the decisions + the development pause (resume streaming = pair-programming dev streams via OBS + The Division 2 under the gramps/GOAT persona, 67 and gaming since 1981, 3D-printing content retired; dogfood switch to ytLlive once TASK 5 lands; resume point = TASK 5). Stale itch.io assertions corrected across comments and indexes (MainViewModel.cs PremiumUrl/IsPremium seams, MainWindow.xaml tooltip, AboutHubTests comment, ViewModels/index.md, TASK 9 out-of-scope note). Build 0 warnings, 196 tests passing gramps 2026-08-14 18:48:42 -07:00
  • f2f6401fef clean secrets out of HANDOFF.md — the DO API token, gramps/root passwords and DO password-reset email password are removed from the file (and no new secrets belong in the repo or in chat); file locations for OAuth creds/token stay; the values remain in git history and in chat, so they are treated as compromised — rotate/revoke what hasn't already been gramps 2026-08-14 18:10:32 -07:00
  • 6d71acef8c TASK 9 audio milestone: real stream audio + voice filters + auto-duck + free TRAX music — the mixer now feeds the encoder real audio (ffmpeg reads a Windows named pipe, -f f32le -ar 48000 -ac 2 -i \.\pipe\ytllive_audio, replacing anullsrc silence; explicit -map 0:v -map 1:a via EncoderOptions.AudioPipeName), with honest gains reaching the stream (MicVolume scales mic, GameAudioVolume + mute scale loopback, Func<double> seams on AudioMixer), an always-on pure-C# voice chain on the mic BEFORE the meter and mix (LowShelfFilter 120Hz +4dB → HighShelfFilter 8kHz +3dB → NoiseGate 0.005/hysteresis 0.5 → Compressor 0.5 4:1, all TDF2), AutoDucker (mic RMS>0.02 → loopback ×0.25, attack 0.05/release 0.005), and TRAX free background music (MusicPlayer = MediaFoundationReader → VolumeWaveProvider16 at fixed 0.20 → WaveOutEvent via the new sibling NAudio.WinMM 2.2.1 package; plays to the default device so the existing loopback carries it, ducked with game; footer TRAX button with red/yellow/green status dot, left-click toggles/picks, right-click opens the OpenFileDialog picker, tooltip shows the track name; persisted via schema v9 single-row Music). Build-time deviations from the plan (recorded in ai.md + TASKS.md): WasapiCapture in NAudio 2.2.1 exposes no overridable GetDefaultMixFormat so sources run device mix format and the mixer's TinyResampler normalizes any rate to 48kHz (resampler IS the design); FfmpegEncoder.cs untouched — MainViewModel.StopStream calls _audioMixer.StopLive() (pipe EOF) before the frame pump stops; sound-bar relabelled 'Desktop Audio', IsGameAudioBarVisible = game sound OR music playing. Tests: new AudioPipelineTests (DSP/ring-buffer/ducker/resampler units + the ONE integration test Mix_WithFiltersDuckAndGain_Lands_On_AudioPipe reading real pipe bytes; ring-buffer overwrite bug found + fixed), FfmpegEncoderTests/LayoutStorePersistenceTests updated — 196 tests passing, 0 warnings gramps 2026-08-14 18:09:26 -07:00
  • 3d92bd0225 TASK 21: real logo + creator-hub About overlay — the About overlay is now the in-app creator hub: real logo (the creator's 'llama fortnite superman logo' copied to Assets/llama-logo.png, creator-owned art), hub links — llama chile shop on YouTube (MainViewModel.ChannelUrl, now public), Mastodon (https://mastodon.llamachile.tube/@gramps), Buy me a coffee (https://buymeacoffee.com/llamachiley, live), Unlock Premium (greyed 'coming soon'; IsPremiumAvailable flips on once the tabled itch.io PremiumUrl lands); a Licenses & legal sub-panel loads the full shipped THIRD-PARTY-NOTICES.txt in-app (ShowLicenses reads from the executable dir on first open, 'not found' fallback — never the OS viewer) with '← Back to About' (BackToAbout_Click) — the AboutHubTests integration test drives the real window + VM asserting the hub opens, link URLs are real, licensing loads the shipped notices text, and back returns to the hub — 174 tests passing, 0 warnings gramps 2026-08-14 12:39:05 -07:00
  • 801219ec46 TASK 4 ship step 7: one-click go live + private-only enforcement (req 8) — the Go Live dialog is locked to Private (GoLiveViewModel.Visibility is a get-only string, no dropdown; settings' dead Default Visibility dropdown + Visibilities/DefaultStreamVisibility removed); YouTubeStreamService.CreateBroadcast always sends privacyStatus='private' and gained an injectable HttpClient? http = null seam; BeginGoLive fires CreateBroadcastAsync which stashes _currentBroadcastId for TASK 5's bind/transition (failure → StreamStatus.Error via AppLog, never a crash) alongside the frame pump, and StopStream clears it; the REC sign shows a dark-red PRIVATE badge next to REC whenever the live stream is private (IsLivePrivate) — the broadcast-insert integration test asserts the request body carries privacyStatus private (RecordingHandler seam) + a no-session guard test — 173 tests passing, 0 warnings gramps 2026-08-14 09:20:03 -07:00
  • 0b71b030e4 TASK 8 meter scaling: +10 dB input amplification in AudioLevelMeter.ToDisplay so the meters use the full bar — speech peaks (~0.2 RMS, -14 dBFS) read ~0.93 (red zone) and normal speech (~0.05, -26 dBFS) ~0.73 (yellow) at maxed volume, instead of hovering at the red edge; ≤0.001 linear still reads zero so the meter never idles on background noise; one knob shared by the mic bar and the game bar (× MicVolume gain-on-noise untouched); tests updated + new ToDisplay_Pushes_Speech_Peaks_Into_Red_At_Maxed_Volume — 171 tests passing, 0 warnings gramps 2026-08-14 08:43:06 -07:00
  • d90b5ded0d TASK 7 UI polish batch: scene/source row cleanup, dedup naming, full social handles — scenes are now pure selection rows (edit/trash/visibility icons and inline rename removed with EditSceneCommand/RemoveSceneCommand/ToggleSceneVisibilityCommand + Scene.IsEditing); source rows gained the trio (new EditElementCommand → inline rename via SceneElement.IsEditing, ToggleElementVisibilityCommand → eye flips IsVisible, open/slashed style rebound, hidden rows dim to 45%); duplicate resource names get a no-space incrementing suffix via shared NextSourceName (Image, Image2, Image3…) derived from actual names so deletions never collide (AddSource + AddReusedImage); social bar renders the full validated handle (MaxWidth=200 + TextTrimming removed from SocialBarRenderer and the preview template); side panels stay fixed 220/300; focus-loss capture lag documented in ai.md as a known OS limit (deferred) — the two real-App tests now share RealAppHost, a dedicated STA thread owning the single WPF App, instead of each calling new App(); new SourceNamingTests integration test (Text/Text2/Text3, delete-middle re-add no-collision) — 170 tests passing, 0 warnings gramps 2026-08-13 18:50:56 -07:00
  • 8292663791 TASK 4 ship step 6: health stats land in the bottom bar — FramePump.HealthUpdated is now wired to the VM (OnFramePumpHealthUpdated marshals onto the UI thread — the encoder's stderr loop raises on a background thread — and copies the parsed bitrate/FPS/dropped/duration into CurrentHealth, the bottom bar's existing binding); ResetHealth zeroes dropped frames + elapsed duration on go-live and on End so stats never linger from a previous session (bitrate/FPS stay on the tier's targets); the bar shows real encoder values once TASK 5 fills _rtmpUrlProvider (until then the pump skips the encoder) — 169 tests passing, 0 warnings gramps 2026-08-13 15:56:29 -07:00
  • dc29adf9bb TASK 4 audio round 3: mic mute icon + top-center REC sign + voice-filter to-do — the mic bar gained a second 16px clickable glyph (microphone, red + slash when muted) between the meter and the speaker so both mute toggles sit adjacent with spacing, reusing the same ToggleMicMuteCommand handler (no VM/code-behind change); the top-center LIVE badge became an always-visible REC sign driven by new VM props (RecDotBrush/RecTextBrush/RecDotOpacity/IsLivePrivate): dark gray dot + dim REC offline, bright red + REC + elapsed while live, darker red when live with a private stream (driven by the dialog's chosen StreamVisibility; the stream service still forces public — ship step 7), pulsing while live; LiveIndicatorVisible/LivePulseOpacity removed; task 22 queued (bass boost, treble, noise suppression, compressor on the mic channel, KISS, always on); HANDOFF documents the mic status contract (red until a mic resource actually connects) — 169 tests passing, 0 warnings gramps 2026-08-13 12:13:00 -07:00
  • 18abe4210f TASK 4 audio fixes round 2: dB-scaled meters, game bar moved into the preview, Notepad About button replaced by the logo → in-app About — AudioLevelMeter.ToDisplay maps -60..0 dBFS onto 0..1 (real speech/game RMS ~0.01..0.1 linear left the flat scale dead; both meters now scale through it before volume); the game audio bar moved OUT of the footer (back to two rows) and is now a bottom-center dark chip overlaid on the preview window — monitoring UI only, never on the live output; the top-bar About button (opened THIRD-PARTY-NOTICES.txt in the OS viewer) removed, the ytLlive wordmark now opens the in-app About overlay, and task 21 queued (real logo + creator-hub About with premium/coffee/socials links + in-app scrolling licensing panel) — 169 tests passing, 0 warnings gramps 2026-08-13 11:56:22 -07:00
  • 9f9ed34627 TASK 4 audio follow-up: game audio bar + mic status dot + always-on capture — the footer's second audio control (desktop/game, a mirror of the mic bar: meter + mute + volume) appears only while a full-screen game is producing sound (IGameAudioDetector seam + GameAudioHysteresis: show ~500ms of fullscreen+sound, hide ~1s after leaving fullscreen, silence never hides an active bar; VM polls on a 250ms timer); capture now runs for the app's lifetime so both meters preview live (started at startup via StartMicCaptureAsync, disposed in Shutdown — no longer go-live driven); MIC label is a button with a status dot (Models/MicStatus: green via the source Started event, yellow = mic problem, red = no device); PickMicrophone swaps the live device immediately via AudioMixer.RestartMic; fixed a latent ?.Invoke(meter.Push(...)) short-circuit that skipped the meter update when nothing subscribed — 167 tests passing, 0 warnings gramps 2026-08-13 11:29:44 -07:00
  • ea250c02a6 Social bar position is a click-toggle, not a drag — the drag-snap misbehaved for shaky hands (snapped up but wouldn't come back down; jitter around the deadzone). Clicking the bar now flips it top/bottom via ToggleSocialBarPosition; SocialBarSnap and its units removed — 153 tests passing, 0 warnings gramps 2026-08-13 11:04:32 -07:00
  • ac60a26d82 TASK 4 ship step 5.5: social bar bug fixes + bar on the live output — direction-snap drag (SocialBarSnap.Decide + ClearValue, local Canvas.Top was overriding the binding), fediverse nodeinfo subdomain probing + load-time heal (settable FediverseSoftware), SocialBarRenderer strip blitted above the flash via a re-read FramePump socialBar seam — 155 tests passing, 0 warnings gramps 2026-08-13 09:29:58 -07:00
  • e72ba71165 TASK 4 ship step 5: live frame pipeline — FramePump paces the active scene's composite into the encoder, ScreenCaptureManager.GetLatestFrame, MainViewModel resolver/option-builder/pump wiring, FramePumpTests (7) + GetLatestFrame test — 147 tests passing, 0 warnings gramps 2026-08-13 08:57:56 -07:00
  • 58c0f8e8c4 TASK 4 ship step 4: WASAPI audio capture — NAudio loopback + mic behind an IAudioSource seam, AudioMixer driving AudioLevel while live, pure level meter + WaveToFloat, NAudio.Wasapi 2.2.1 (MIT, notices item 9) — 139 tests passing, 0 warnings gramps 2026-08-12 21:18:07 -07:00
  • ba427e85e1 TASK 4 ship step 3: encoder + RTMP push — FFmpeg subprocess with probed H.264 picker, BGRA stdin feed, stderr health parsing, graceful stop — 122 tests passing, 0 warnings gramps 2026-08-12 20:32:24 -07:00
  • e494dce311 HANDOFF: next step is TASK 4 ship step 3 — encoder + RTMP push gramps 2026-08-12 18:43:36 -07:00
  • b094755e08 Rule: memory update ships in the SAME commit as the feature — follow-up docs backfill commits are a broken rule gramps 2026-08-12 18:40:18 -07:00
  • 7c456042a6 Docs backfill for social bar v2 (9873eed): schema v6->v8 in TASKS.md/ai.md, social bar architecture section + Simple Icons CC0 notice, README structure rows, HANDOFF rewritten (committed+pushed) gramps 2026-08-12 18:39:08 -07:00
  • 9873eeda7d Social bar v2: fediverse icons resolved via nodeinfo (with redirect-following), persisted software column, icon colors — 112 tests passing, 0 warnings gramps 2026-08-12 18:28:59 -07:00
  • db5fc06174 HANDOFF: social bar UX is wrong — user's correction lost to ctrl+enter, waiting for re-statement gramps 2026-08-12 07:45:22 -07:00
  • 8868f98392 Social bar UX: YT auto-add from connected account, two-box dialog (YT handle + URL/handle for other services), service auto-detection from URL domain, fediverse @user@domain support, footer repositioned (Social controls left under scenes/sources, meter centered under preview), validation with add-anyway fallback gramps 2026-08-12 07:40:42 -07:00
  • 5437c776fe Merge social-bar: global social bar resource with per-scene presence, validated lookups, schema v7 gramps 2026-08-12 07:33:08 -07:00
  • 5e8b8e5835 Social bar (Branch B): global resource with per-scene presence — Models/Socials.cs (19 services, icons, canonical URLs), Services/SocialValidator.cs (HTTP lookup validation seam), LayoutStore schema v7 (Socials + SocialEntry tables + Scene.HasSocialBar), MainViewModel (socials collection, AddSocial/RemoveSocial/ToggleSceneSocialBar commands, freemium cap YT+1, premium seam), MainWindow.xaml (footer Social button + [+/-] toggle on meter line, preview bar rendering top/bottom + LCR), 4 integration tests (roundtrip, empty-not-persisted, canonical URLs, icons), 85 tests passing, 0 warnings gramps 2026-08-12 07:33:03 -07:00
  • e1d9e1388d Merge webcam-validation: resource validation + first-frame proof + CameraConflictProbe gramps 2026-08-12 07:21:20 -07:00
  • 3f7f1880c5 Webcam resource validation + first-frame proof + CameraConflictProbe: MediaCaptureFrameSource validates post-init (VideoDeviceId match, stream properties, reader StartAsync status), subscribes Failed/CameraStreamStateChanged → SourceFailed; CameraManager.AcquireAsync requires first-frame proof (4s timeout) — silent empty box impossible; MainViewModel surfaces WebcamError chip + MessageBox with suspect-app names; fallback ladder VideoPreview → VideoRecord; 19041 SDK projection gaps documented; AGENTS.md + schema.md + HANDOFF.md memory-map rules added; 81 tests passing, 0 warnings gramps 2026-08-12 07:21:15 -07:00
  • 60259c08c2 Fix CameraStreamState.Failed compile error (19041 projection omits enum member names — compare by int); fix first-frame proof test (no dispatcher = no bitmap, assert LatestFrame instead) gramps 2026-08-12 07:11:54 -07:00
  • cc3b1c9234 TASKS.md reformat: task-list statuses under every task + all lists numbered gramps 2026-08-10 11:18:37 -07:00
  • 8c7938aca0 FFmpeg locator (TASK 4 ship step 2) + licensing: notices, About, LGPL-shared pin gramps 2026-08-10 11:02:26 -07:00
  • 18a21010bb Scene compositor (TASK 4 ship step 1): encoder master-frame scaffolding gramps 2026-08-10 10:15:58 -07:00
  • b00a4cbd5e Mic audio UX: realtime read-only meter + mic picker gramps 2026-08-07 17:44:16 -07:00
  • 4b3fb04322 Audio UX (UI) + bottom bar rework: two-line footer (dropped/duration under bitrate/fps), centered sound meter (blank→green→yellow→red, zone markers at 60%/80%) + MIC chip (MicVolume slider, ToggleMicMuteCommand) — the mic is the creator's only audio control, desktop/game audio is automatic (KISS rule); scenes list is content-height (no dead space before SOURCES); top bar shows the connected YT account avatar/name via SyncConnectedAccount; docs updated (65 tests passing) gramps 2026-08-07 15:20:48 -07:00