# HANDOFF — Session State ## Branch `main` — dirty (BRB backdrop + Polar org ID + doc updates, uncommitted) ## What shipped this session - **BRB backdrop seeded on every load** — `Assets/brb-backdrop.jpg` (user-provided image, Gemini-generated), added as `` in csproj; `SeedBrbBackdrop()` in MainViewModel mirrors the Starting pattern (idempotent, skips if Background already exists). Runs on every startup outside the `Scenes.Count == 0` guard. - **UI rename: Screens → Layers → Properties** — 16 UI text changes across MainWindow.xaml + MainViewModel.cs (section headers, tooltips, context menus, empty hints, onboarding text, fallback display name). Code identifiers unchanged. - **Polar org ID obtained** — `c05fb364-b967-4f6c-adf2-8a144e46d085` (Llama Chile Shop, slug: llamacasty). Organization Access Token (OAT) stored in `Downloads/llamacasty-polar-code.txt`. OATs are org-scoped — `organization_id` can be omitted from API calls. - **CREDENTIALS.md updated** — Polar org ID + validate endpoint + key prefix (`LCYT-`) recorded. ## 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-` | ## 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" "/mnt/c/Program Files/dotnet/dotnet.exe" vstest "C:\Users\gramp\Documents\Code\projects\ytLive\ytLive.Tests\bin\Debug\net8.0-windows10.0.19041.0\ytLive.Tests.dll" ``` ## Known issues - `Mix_HonorsProviderGains_AndGameMute_KillsTheLoopback` integration test is flaky — hangs when run via `vstest` (likely tries to acquire WASAPI devices in headless CI). Exclude with `--TestCaseFilter:"FullyQualifiedName!~Mix_HonorsProviderGains"` if needed. - Build often fails when ytLive.exe is running — `taskkill.exe /F /IM ytLive.exe` first. ## Next steps 1. **TASK 10 + Velopack** — license validation + auto-updates (1 full session). Polar org ID + OAT now available; all infra ready. Phases: LicenseService, license key UI, brand flash gating, Velopack integration, tests. 2. **TASK 20** — hotkeys (global keyboard shortcuts) — small scope, huge UX impact 3. **TASK 19** — scene transitions (Cut/Fade/Move/Custom) — already scoped 4. **TASK 17** — web source WebView2 (enables alert ecosystem) 5. **TASK 18** — local recording (independent) 6. **TASK 21** — media source (video file playback) — pairs with TRAX for non-Live scenes 7. **TASK 22** — audio sync offset — small, quality-of-life 8. **TASK 23** — studio mode (lightweight preview) 9. **TASK 15** — stock bg images — Starting and BRB seeded; Live, Chat, Ending still waiting on user images 10. **TASK 16** — kill infinity display (depends on TASK 15 for Live/Chat/Ending images) ## 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. ## Open items - Polar checkout page ~80% configured — needs logo upload via dashboard - Logo upload API was broken (Polar server 500 on `/v1/files/{id}/uploaded`) — upload via dashboard instead - Full codebase rename (ytLlive → LlamaCasty) still pending - BRB backdrop image is user-provided (Gemini-generated) — may need replacement with branded image