Files
gramps 4e0915a36e feat(backdrop): Capture Window… in-app window pin (TASK 38, Good Dog ONE test)
Click-to-pin an open window as the full-bleed Live backdrop, via the existing
window:<hwnd> capture path (same render layer as game/desktop). Session-scoped:
window:/picker: keys heal to auto on reload (HWND-recycle hazard); pin wins
while the window enumerates, then auto-fallbacks (game → desktop → static); a
dead window's capture session heals to auto, no dead ends.

Fix: ScreenCaptureSourceFactory.Resolve hex-parsed "window:0x<Hwnd>" WITHOUT
stripping the 0x prefix — NumberStyles.HexNumber rejects it, so every pin
resolved null ("No capture target for this key") and the heal silently rolled
back. Same flaw in IsAliveWindowPin (pin-wins guard was dead). Both fixed.

Commit also carries an out-of-scope prerequisite: PillRadioTests.cs:105 had a
committed stray token ("...PrimaryStartButtonLabel soil;", CS1003) blocking the
whole test-project compile — token removed.

Plus the previous session's uncommitted pricing docs (one-time $29/$49) that
share TASKS.md/ai.md/HANDOFF.md.
2026-09-22 07:00:47 -07:00

75 lines
3.7 KiB
Markdown

# ytLlive
<p align="center">
<img src="Assets/llamacasty-logo.jpg" alt="LlamaCasty — livestream smarter" height="120"/>
</p>
A creator-proof live-streaming and recording app for YouTube — native Windows (C# / WPF / .NET 8).
## Screenshot
![ytLlive — main window with scenes, sources, and live preview](docs/ytLlive-preview.jpg)
## Design Principle
> This software is so intuitive that even the most right-brained person can easily intuit and use it.
Every feature is measured against this. One-click go-live, sane YouTube defaults, visual scene
building, and no dead ends — every action has a visible outcome.
## Why ytLlive
OBS treats YouTube as an afterthought; SLOBS is Twitch-first with YouTube bolted on. ytLlive is
designed and dedicated to YouTube livestreaming and recording, and to YouTube's specific quirks.
## Account Assumption
ytLlive assumes you already have a YouTube creator account — connecting uses "Sign in with Google"
to link that existing account. **ytLlive does not create accounts.** If you don't have a YouTube
channel yet, set one up on YouTube first, then connect it here.
## Audio Assumption
ytLlive uses your **default** microphone and desktop/game output — it never hunts for a device or
contends for one. **It assumes your audio is already configured and working** (default input and
output set, not hijacked by another app). Audio issues are a Windows/device matter outside ytLlive's
scope: we don't debug, detect, or try to fix them. If it doesn't sound right, fix the system's audio
settings first — it's on the OS, not on us.
## Run
```bash
dotnet build # Windows only — WPF
dotnet run
```
## Version Roadmap
**v1 is the finished product** (creator ruling, 2026-09-01 — there are no v1.x releases).
Everything still queueing lands in v1; anything not on the feature list is on the closed
**"Out of product — permanently"** list in `TASKS.md` — read that page before asking for a feature.
What v1 ships: the five-scene director's control surface, webcam + screen capture, media + web +
text sources, chat on-stream, the social bar, mic/desktop audio with auto-duck and TRAX, local
recording, variable quality tiers with auto step-down, one-click go-live + scheduling, stream
resilience (auto-reconnect inside YouTube's grace, one-click back on air), built-in monetization
awareness (reward capture, session reports, YPP journey tracker), Alerts — all free and ungated;
the one-time license only removes the branding flash.
## Structure
| Path | Role |
|------|------|
| `Models/` | Scene, Source, WebcamSceneConfig, SceneElement, SceneCatalog, QualityOption, StreamConfig/Health, chat, Socials, BroadcastMetadata, Music, MicStatus |
| `ViewModels/` | MainViewModel (partial classes per area) + dialogs: GoLive, CameraPicker, MicPicker, HotkeyConfig, Socials, LiveBroadcastForm |
| `Services/` | YouTube (OAuth, streams/broadcasts, chat polling), LayoutStore (SQLite), capture (camera/screen-capture/media-file via FFmpeg), SceneCompositor + FramePump, FFmpeg encoder + RTMP, audio pipeline (WASAPI loopback + mic, mixer, filters, ducker, limiter, TRAX), SocialValidator, notifications, hotkeys, SceneGraph, ChatOverlayLayer |
| `Helpers/` | ViewModelBase, RelayCommand, ImageCache, AppLog, TokenStore (DPAPI), OAuthCredentials, converters |
| `Themes/` | `Controls.xaml` — the dark-theme control styles, merged once in `App.xaml` |
| `MainWindow.xaml` | Dark-theme control surface: thumbnails + central preview, two-state left panel (layers/properties ↔ live chat), top bar, footer |
| `Distribution.md` | GA-time plan: signing, installer, EULA, hardening — executed as TASK 36 |
## Docs (memory map)
`schema.md` defines the conventions; `ai.md` is the AI/session guide;
`TASKS.md` is the task queue. Each code directory carries an `index.md`.