gramps ec01a7deb8 design: the last VM-side colours come from tokens (ThemeBrush)
The state colours the view-models hand to bindings — top bar, REC/ON-AIR dots, health banner,
meter bands, toast tints — were hex literals in C#. They now resolve from Themes/Tokens.xaml
through `Helpers/ThemeBrush`, so the values live in one place. Without an Application (unit tests)
the helper returns a neutral grey: visibly wrong rather than silently plausible.

Four tokens the code needed and the document lacked, added to DESIGN.md (so the doc-is-the-contract
guard demanded their brushes): info-container #3a3b52, success-container #1d5c38,
warning-container #b8860b, test-container #9c6f1c (the test-stream gold bar).

Also fixed by this: the top bar still painted the RETIRED brand red #e94560 when live — the
standard's #ff5451 now, and `OnAirSignTests` (which pinned the old value) says so. BarOn/BarOff
became properties rather than static fields, because a static field would resolve tokens before
the Application exists.

Verified: DesignTokensTests, GameMeterHonestyTests, NotificationAreaIntegrationTests,
OnAirSignTests, SessionTeardownTests — 38 tests green.
2026-10-30 09:58:52 -07:00
Scene strip tile artwork + on-air indicator (creator ruling 2026-10-10). Top-bar tiles now carry their own art: each canonical scene's tile is a per-scene CRT-styled image stored in the internal DB (Scene.ThumbnailAssetId - additive migration, seeded at heal from the creator's five Downloads JPGs via SceneThumbnailSeedPaths), and the preview pane keeps rendering the scene's ORIGINAL background - never the tiles. One shared on-air image (Gemini 4zajyl...jpg) replaces the staged scene's tile and follows the scene swap ('the on-air screen jumps around the top bar as the user swaps scenes'): stored as an Asset BLOB tracked by the OnAirImageAssetId Setting (EnsureOnAirImage, same contract as the alert clip) with MainViewModel.OnAirSeedPath override; RefreshSnapshotsAsync shows it for the staged scene, otherwise thumbnail-or-background art, and a staged Live with no on-air art still falls back to the green placeholder (minis never render live captures). Removed the 6px #22c55e rectangle in PreviewPane's backdrop ('green outline around the preview screen' that surfaced when a scene had no background) - the outer PreviewGlow red border is the real live signal. Doubled the scene-tile labels (FontSize 10 -> 20). Fixed a real bug this surfaced: Save()'s Asset pruner only kept Source/alert-clip rows, so the first save would have DELETED the seeded tile + on-air assets - the keep-set now includes Scene.ThumbnailAssetId and the OnAirImageAssetId Setting. New Settings/Load/Save migrations + SceneThumbnailTests (4 tests: seeded tile in strip, preview keeps original bg, Live-staged tile, no-seed fallback, on-air swap + persistence). 427 pass, 0 build warnings. (Unit: strip tiles + on-air)
2026-10-10 13:27:26 -07:00

LlamaCasty

LlamaCasty — livestream smarter

A free, open-source Windows app for streaming live to YouTube and recording to your PC. Native Windows (C# / WPF / .NET 8). Website: https://llamacasty.com

LlamaCasty — main window with scenes, sources, and live preview

Why I built it

I'm Gramps. I've been gaming since 1981, and these days I stream The Division 2 on YouTube.

When I started streaming, I did what everybody does: I installed the big, general-purpose streaming tools. They're excellent software — powerful, flexible, and built to handle every platform, every camera rig, and every plugin anyone has ever dreamed up. That breadth is exactly what makes them great, and it's also what makes them a lot to learn. Before my first stream I was reading setup guides, picking encoders, balancing audio by hand, and wiring up scenes from scratch. The tools were ready for anything. I just wanted to go live.

Most streamers I talk to are in the same spot. They don't need a tool for every platform and every setup — they need one that's ready for theirs. So I built LlamaCasty around three choices:

  • One platform, done properly. LlamaCasty streams to YouTube and only YouTube. That focus lets it be built around how YouTube Live actually works — your channel, your chat, Super Chats and memberships, Shorts-style vertical video, and the YouTube Partner Program — instead of treating YouTube as one destination among many.
  • Ready the moment you open it. Five scenes (Starting, Live, BRB, Chat, Ending) are set up, your game and voice are balanced with auto-ducking and voice polish built in, and YouTube's settings are filled in. You arrange things by dragging them, then press Go Live.
  • Calm while you're live. A private Test Stream to practice, a layout that locks while you're on air, and warnings only when YouTube reports a real problem.

The general-purpose tools are the right choice when you need everything. LlamaCasty is for when you just want to get your show on air.

Free, and staying that way

LlamaCasty is free forever: no watermark, no branding on your stream, no subscription, no LlamaCasty account. It's also open source (see License) — enjoy it, explore it, experiment with it. If it earns a spot in your setup and you'd like to say thanks, there's a coffee jar and a merch store linked from https://llamacasty.com. Completely optional, never expected, and the app will never ask.

How it's built

LlamaCasty is built through AI-assisted pair programming, under the direction of a developer with decades of experience. Architecture, product direction, and quality gates are human-owned; AI speeds up the implementation. The repo's memory map (below) is how that collaboration stays honest from one session to the next.

Requirements

  • 64-bit Windows 10 or 11. (The bundled FFmpeg and ONNX Runtime are 64-bit only.)
  • A YouTube channel, to stream. LlamaCasty links an existing channel with "Sign in with Google" — it doesn't create accounts. Recording to an .mp4 works without signing in.
  • Working sound in Windows. Desktop and game audio come from your default output automatically; you choose your mic in the app. LlamaCasty doesn't diagnose or repair Windows audio — if it doesn't sound right in Windows, fix it there first.

Build from source

The internal project, assembly, and namespace names are still ytLive (the app was renamed to LlamaCasty; the internals weren't). Building needs Windows and the .NET 8 SDK.

  1. Fetch the bundled FFmpeg (not in git — ~135 MB, pinned and SHA-256-verified): scripts/fetch-ffmpeg.sh

  2. Add your own Google OAuth client. Helpers/OAuthCredentials.cs is gitignored. Create a "Desktop app" OAuth client with the YouTube Data API v3 enabled in Google Cloud Console, then:

    namespace ytLive.Helpers;
    
    public static class OAuthCredentials
    {
        public const string ClientId = "your-client-id.apps.googleusercontent.com";
        public const string ClientSecret = "your-client-secret";
    }
    
  3. Build and run:

    dotnet build ytLive.csproj
    dotnet run --project ytLive.csproj
    

Version roadmap

v1 is the finished product (no v1.x releases are planned). Everything still in the queue lands in v1; anything not on the feature list is on the "Out of product — permanently" list in TASKS.md — read that before asking for a feature.

What v1 ships: the five-scene control surface, webcam + screen capture, media + web + text sources, chat on stream, the social bar, mic/desktop audio with auto-ducking and TRAX background music, local recording, quality tiers including vertical 9:16, one-click go-live + scheduling, stream resilience, monetization awareness (YPP tracker), animated alerts, and webcam background removal and blur — all free and ungated.

Structure

Path Role
Models/ Scene, Source, WebcamSceneConfig, SceneElement, SceneCatalog, QualityOption, StreamConfig/Health, chat, Socials, BroadcastMetadata, Music, MicStatus, BackgroundEffect
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), background effects (ONNX person segmentation), SocialValidator, notifications, hotkeys, SceneGraph, ChatOverlayLayer
Helpers/ ViewModelBase, RelayCommand, ImageCache, AppLog, TokenStore (DPAPI), OAuthCredentials (gitignored), 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
tools/ Offline helper tools (e.g. selfie-seg/ — converts and verifies the background-effects model)

Docs (memory map)

schema.md defines the conventions; ai.md is the AI/session guide; TASKS.md is the task queue; HANDOFF.md is the current state. Each code directory carries an index.md.

License

LlamaCasty is free software, released under the GNU General Public License v3.0 or later (LICENSE) with three additional terms permitted by GPL-3.0 section 7 (ADDITIONAL-TERMS.md):

  • Keep the credit — any copy, modified or not, shows "Based on LlamaCasty by Gramps — https://llamacasty.com" in its About screen.
  • Rename your fork — modified versions are marked as modified and use a different name.
  • No trademark rights — the LlamaCasty name and llama logo aren't licensed. The icon and logo files are all rights reserved and aren't covered by the GPL.

The scene backgrounds and default alert video are AI-generated placeholders, licensed with the code — replace them with your own. Bundled third-party components keep their own licenses: see THIRD-PARTY-NOTICES.txt.

Source code: https://llgit.llamachile.tube/gramps/LlamaCasty

S
Description
Creator-proof live-streaming and recording app for YouTube — native Windows (C# / WPF / .NET 8). One-click go-live, visual scene building.
Readme
58 MiB
Languages
C# 97.7%
Python 1.5%
Shell 0.8%