- 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
4.7 KiB
HANDOFF — Session State
Branch
main — dirty (all changes uncommitted, builds clean)
What shipped this session
-
Show Desktop toggle on Live backdrop —
Source.ShowDesktopbool 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.ClearBackdropCaptureAsyncclearsCaptureKey+VideoImageSourceso the static fallback actually renders. -
Top bar — status light + avatar + Log In button — red/green/pulsing ellipse (disconnected/connected/live). Avatar border visible only when connected, loads via
BitmapImagein code-behind (not XAML binding). "Log In" button visible when disconnected, callsStartStreamCommandwhich opens GoLiveWindow with the sign-in flow.ShowStartStreamnow requiresIsConnectedtoo. -
Chat preview — one-at-a-time mock messages —
RunMockChatPreviewAsync: simple async loop, displaysMockChatMessages[n]viaUpdateChatBoxPreview(chatBox, Take(n+1)), 1000ms between messages, wraps at end.ChatPreviewEnabledproperty on Source (default true). Stops when real messages arrive, restarts on fade timer clear. -
Default backdrop seeds for all scenes —
SeedEndingBackdropreplaces existing (not skip-if-exists).SeedChatBackdropadded.EnsureDefaultBackdropcalled on every scene switch — if a scene has no background, seeds the default fromAssets/. Removed Chat skip from EnsureDefaultBackdrop. -
New backdrop assets —
ending-backdrop.jpgandchat-backdrop.jpgadded to Assets + csproj as<Resource>. -
SceneCatalog fix — Chat scene display name corrected to "Chat" (was "YouTube Chat" — that name belongs to the layer/SourceType.ChatBox, not the scene).
-
Left panel spacing + context menu reorder — HR margins matched, Row 4 changed from
*toAuto, context menu items reordered (Border Thickness first). -
Border animation rendering — code-behind Storyboard approach via
_activeBorderAnimationsdictionary,FindBorderShape,CreateBorderAnimationfor all 9 types.
Files changed
ViewModels/MainViewModel.cs—ShowDesktop,ClearBackdropCaptureAsync,BackdropShowDesktop, top bar avatar/login/status light,RunMockChatPreviewAsync,StartMockChatPreview/StopMockChatPreview,SeedEndingBackdrop/SeedChatBackdrop/EnsureDefaultBackdrop,ShowStartStreamrequiresIsConnectedModels/Source.cs—ShowDesktop,ChatPreviewEnabledModels/SceneCatalog.cs— removed Chat → "YouTube Chat" display name overrideServices/LayoutStore.cs— ShowDesktop column migration + read/writeMainWindow.xaml— top bar status light + avatar + Log In button, Show Desktop context menu toggleMainWindow.xaml.cs—LoadAvatarImage,OnViewModelPropertyChangedhandles avatarAssets/ending-backdrop.jpg— new Ending scene default backdropAssets/chat-backdrop.jpg— new Chat scene default backdropytLive.csproj— new asset resourcesThemes/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.exefirst Mix_HonorsProviderGains_AndGameMute_KillsTheLoopbackintegration test is flaky in headless CI
Next steps
- TASK 10 + Velopack — license validation + auto-updates (1 full session)
- TASK 20 — hotkeys (global keyboard shortcuts)
- TASK 19 — scene transitions (Cut/Fade/Move/Custom)
- TASK 21 — media source (video file playback)
- TASK 22 — audio sync offset
- 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.