# 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 ``. 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 ```bash 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.