Files
LlamaCasty/HANDOFF.md
T
gramps 0bd17ab428 feat(ui): Show Desktop toggle, avatar login, chat preview, backdrop seeding, border animations
- Source.ShowDesktop bool persisted in DB (schema migration + LayoutStore)
- ClearBackdropCaptureAsync clears CaptureKey + VideoImageSource for static fallback
- Top bar: red/green/pulsing status light, avatar via BitmapImage, Log In button
- ShowStartStream now requires IsConnected
- RunMockChatPreviewAsync: simple async loop, ChatPreviewEnabled property on Source
- EnsureDefaultBackdrop called on every scene switch, seeds all 5 scenes
- SeedEndingBackdrop replaces existing, SeedChatBackdrop added
- SceneCatalog: Chat scene display name corrected (layer = 'YouTube Chat')
- Left panel spacing consistency, context menu reordered
- Border animation rendering via code-behind Storyboard approach
- 3 new backdrop assets (ending-backdrop.jpg, chat-backdrop.jpg, live-backdrop.jpg)
- Build 0 warnings, 178 tests passing
2026-08-20 18:02:41 -07:00

4.7 KiB

HANDOFF — Session State

Branch

main — dirty (all changes uncommitted, builds clean)

What shipped this session

  1. Show Desktop toggle on Live backdrop — Source.ShowDesktop bool persisted in DB (schema migration + read/write in LayoutStore). When checked, the primary monitor captures regardless of fullscreen game state. Toggling off falls back to the running game or releases to the static placeholder. ClearBackdropCaptureAsync clears CaptureKey + VideoImageSource so the static fallback actually renders.

  2. Top bar — status light + avatar + Log In button — red/green/pulsing ellipse (disconnected/connected/live). Avatar border visible only when connected, loads via BitmapImage in code-behind (not XAML binding). "Log In" button visible when disconnected, calls StartStreamCommand which opens GoLiveWindow with the sign-in flow. ShowStartStream now requires IsConnected too.

  3. Chat preview — one-at-a-time mock messages — RunMockChatPreviewAsync: simple async loop, displays MockChatMessages[n] via UpdateChatBoxPreview(chatBox, Take(n+1)), 1000ms between messages, wraps at end. ChatPreviewEnabled property on Source (default true). Stops when real messages arrive, restarts on fade timer clear.

  4. Default backdrop seeds for all scenes — SeedEndingBackdrop replaces existing (not skip-if-exists). SeedChatBackdrop added. EnsureDefaultBackdrop called on every scene switch — if a scene has no background, seeds the default from Assets/. Removed Chat skip from EnsureDefaultBackdrop.

  5. New backdrop assets — ending-backdrop.jpg and chat-backdrop.jpg added to Assets + csproj as <Resource>.

  6. SceneCatalog fix — Chat scene display name corrected to "Chat" (was "YouTube Chat" — that name belongs to the layer/SourceType.ChatBox, not the scene).

  7. Left panel spacing + context menu reorder — HR margins matched, Row 4 changed from * to Auto, context menu items reordered (Border Thickness first).

  8. Border animation rendering — code-behind Storyboard approach via _activeBorderAnimations dictionary, FindBorderShape, CreateBorderAnimation for all 9 types.

Files changed

  • ViewModels/MainViewModel.cs — ShowDesktop, ClearBackdropCaptureAsync, BackdropShowDesktop, top bar avatar/login/status light, RunMockChatPreviewAsync, StartMockChatPreview/StopMockChatPreview, SeedEndingBackdrop/SeedChatBackdrop/EnsureDefaultBackdrop, ShowStartStream requires IsConnected
  • Models/Source.cs — ShowDesktop, ChatPreviewEnabled
  • Models/SceneCatalog.cs — removed Chat → "YouTube Chat" display name override
  • Services/LayoutStore.cs — ShowDesktop column migration + read/write
  • MainWindow.xaml — top bar status light + avatar + Log In button, Show Desktop context menu toggle
  • MainWindow.xaml.cs — LoadAvatarImage, OnViewModelPropertyChanged handles avatar
  • Assets/ending-backdrop.jpg — new Ending scene default backdrop
  • Assets/chat-backdrop.jpg — new Chat scene default backdrop
  • ytLive.csproj — new asset resources
  • Themes/Controls.xaml — slider fix (Background="{x:Null}")

Build

taskkill.exe /F /IM ytLive.exe  # if running
"/mnt/c/Program Files/dotnet/dotnet.exe" build "C:\Users\gramp\Documents\Code\projects\ytLive\ytLive.csproj" --no-restore

Known issues

  • YouTube session expired at 11:45 — need to re-sign-in via the new "Log In" button
  • Build often fails when ytLive.exe is running — taskkill.exe /F /IM ytLive.exe first
  • Mix_HonorsProviderGains_AndGameMute_KillsTheLoopback integration test is flaky in headless CI

Next steps

  1. TASK 10 + Velopack — license validation + auto-updates (1 full session)
  2. TASK 20 — hotkeys (global keyboard shortcuts)
  3. TASK 19 — scene transitions (Cut/Fade/Move/Custom)
  4. TASK 21 — media source (video file playback)
  5. TASK 22 — audio sync offset
  6. TASK 23 — studio mode

Polar.sh resources

Resource ID
Org ID c05fb364-b967-4f6c-adf2-8a144e46d085
Product d105dfa1-497e-423b-8cd4-e0ee2e3abbc0
Price 7c1b6f70-cf8c-46df-9bc8-6703f9fa64d0
Benefit 80f66bc1-d5a3-44a1-b9ea-1709ae508535
Checkout 70e037cd-9bcb-414e-8b26-c82c1d268f65
LLAMAFOUNDER 01a8c29f-9bb8-4e96-9cbe-417a6a5cec9b
LLAMA50 8cff803e-053f-49b4-8d12-d74d468f2943
Checkout URL https://buy.polar.sh/polar_cl_ueMy8AyAClO0o0yo19IroZwKTbD587gzUsjEW3bFapw
Customer-portal validate POST https://api.polar.sh/v1/customer-portal/license-keys/validate
Key prefix LCYT-

v1 vision

A streaming tool that's intuitive and ready to go out-the-gate with nothing held back. Minimal configuration — they're ready to go live or record. Eliminate the OBS pain-point completely.