The site said "Coming soon to Steam" while the app docs still said direct download plus winget primary with Steam parked. One of them had to move, and the creator's ruling is Steam exclusive: a free app on Steam with the paid edition as a Steam DLC, and the $10/month plan sold off-Steam by Polar. Records the constraint that shapes the code, not just the prose: - Steamworks requires in-app purchases to use the Steam Wallet (Microtransactions doc, quoted in commercial.md), so the monthly is *stated*, never *sold*, inside a Steam build; the lifetime is plain DLC bought on the store page and read with BIsDlcInstalled. - Entitlement is `steamDlcOwned || polarKeyValid`, both resolving to one OutputProfile. steam_api64.dll ships beside the exe and is a functional dependency, not the rejected "IP protection" native DLL — without it DLC ownership cannot be read. Launched without Steam, the app falls back to the free profile rather than refusing to start. - Signing is moot: Steam installs never meet SmartScreen. Artifact Signing stays on the shelf for the day a non-Steam download exists. Year-one fixed cost is ~$115. - The exe rename must land before the first depot upload — Steamworks warns about renaming a live exe. Distribution.md is rewritten to SteamPipe mechanics (publish output, depot, steamcmd, DLC wiring, clean-account purchase/refund test). product.md, decisions.md (a new "Steam exclusive" entry with every dead vector), TASKS.md (Steamworks entitlement row, Steam packaging row), ai.md, index.md and the TASK 48 banner follow. MyMistakes.md gains the Steam rules that cost real time today: installs skip SmartScreen, updates are free, the Wallet rule, and the recurring-billing caveat.
8.3 KiB
TASKS — the active queue
One line per live item; the detail lives in
TASKS/task-*.md. Done work is inTASKS/archive.md(2026-10-29 snapshot of the old catalogue). Retired decisions are indocs/ai/decisions.md. Markers: ☐ queued · 🔶 in progress · ⏳ blocked · ⏸ deferred · ❌ retired.
Next up
The surge week (4 days, in this order). Not every row below — this slice only, because it is what the first public release is waiting on:
- Artifact shape —
LlamaCasty.exerename (three pack URIs),dotnet publishprofile withsteam_api64.dllbeside the exe. Ends with a build that starts standalone and falls back to the free profile. - OutputProfile gate — ≤921,600 px / ≤30 fps for the stream and the recorder, greyed tier entries, plus the TASK 53 geometry tests that pin every tier.
- Entitlement seam —
IEntitlementwith the Steam DLC path and a fake for tests, Polar's customer-portal path for the monthly,--activateparsing, system messages. - Real-machine day — licence UI skeleton, a Steam-less launch proving the free profile, a test broadcast.
Detail: commercial.md → Output profile / Entitlement;
Distribution.md. Day 5, if the four go well: the visibility picker (a hard
prerequisite for any public build).
TASK 3·17 — the Text layer stays the first product row after the surge. The TextOverlay source
type exists as a placeholder and nothing else does: AddSource creates it 0×0, all four compositor
paths continue past it, FramePump's hash skips it, it is not draggable, and it has no
text/font/colour properties or persistence. The unit: text content, font family/size/weight/style,
colour, alignment, drag/resize, persisted; renderer mirrors Services/ChatBoxRenderer.cs. One Good
Dog test.
Queue
| Task | Status | Scope | Detail |
|---|---|---|---|
| 3·17 | ☐ NEXT | Text layer — content, font family/size/weight/style, colour, alignment, drag/resize, persisted | task-03 |
| 21 | 🔶 | Media source: acquisition wiring + file picker + loop/volume UI (decoder, manager, pacing, loop all shipped — no AcquireAsync caller exists) |
task-21 |
| — | ☐ | Transitions Move: per-layer carry-across-scenes flag, per-scene placement, fixed z band | ui-surface |
| 55·2–3 | ☐ | Disk hygiene: delete %TEMP% alert clips on close + sweep at startup; low-disk guard before REC (slice 1 shipped) |
task-55 |
| 40·A/C/D | ☐ | App Settings: active-camera picker; persist output resolution + surface transition defaults + confirm-before-End; accent consolidation | task-40 |
| 3·20 | ☐ | RewardEvent persistence: canonical RewardEvents table + superChatEvents.list 30-day backfill (the session report and journey read it) |
task-03 |
| 32 | ☐ | Stream resilience: blip retry → measured grace + amber "RECONNECTING" → one-click Back on air → fragmented MP4 → ingest pre-flight | task-32 |
| 33 | ☐ | Bandwidth auto step-down: pure policy over dropped-frame rate, one-way within a broadcast | task-33 |
| 34 | ☐ | Scheduled streams (Text-drawer version) | task-34 |
| 35 | ☐ | Scene-linked audio | task-35 |
| 37 | ☐ | Defaults vs current layout split (build-id); enables one-click revert to defaults | task-37 |
| 39·2 | ☐ | YPP slice 2: Analytics scopes, watch-hours/Shorts velocity + ETA | task-39 |
| 49 | ☐ | Chat profanity filter: local, opt-in, non-persistent, user-supplied word list | task-49 |
| 50 | ☐ | One-button publish of the local recording (resumable upload) | task-50 |
| 53 | ☐ | Output-format contract: pin every tier with a geometry test, prove 9:16 end-to-end, recorded file matches output | task-53 |
| 54 | 🔶 | Freemium: EULA + privacy shipped; no licence path built — needs the entitlement seam, the output-profile cap and the licence UI below; site copy still says free forever | task-54 |
| — | ☐ | Steamworks entitlement — steam_api64.dll + SteamAPI.Init, BIsDlcInstalled(dlcAppId) behind IEntitlement, free profile when Steam is absent |
commercial |
| — | ☐ | Entitlement seam — Polar customer-portal path for the monthly (org ID public, org token never in the app), conditions: {channel_id}, 7–14 day lease, --activate CLI. No claim page, no server |
commercial |
| — | ☐ | OutputProfile gate — ≤921,600 px / ≤30 fps for stream and recording, greyed tier entries, live re-resolve, never mid-stream | commercial |
| — | ☐ | Licence UI — four states, 7/1/0-day notices, "monthly is on the website, not Steam" line, portal link, licence ID in About | commercial |
| — | ☐ | System messages — SystemMessage + MessageCenter, strip above the dock, dedupe by key, short history, never composited |
ui-surface |
| — | ☐ | Steam packaging — rename, publish output + steam_api64.dll, depot, steamcmd upload, store page + assets, DLC app |
Distribution.md |
| — | ☐ | Training-video series — capture the first 8–10 recurring questions as videos on @llamacasty; each is documentation, channel content and monetization at once |
MARCOM → support→content loop |
| 9·5 | ☐ | Webcam identity key reconciliation | task-09 |
| 14 | 🔶 | Creator feedback batch — branch 3+ | task-14 |
| — | ☐ | Small: StreamConfig defaults (TargetBitrate=6000, 1920x1080) are stale — the dropdown drives StreamHealth |
this line |
| 36 | ☐ | Gold pass — the v1 gate, always the last unit (see 1.0 gates) | task-36 |
| 48 | ⏸ | Distribution & packaging — route settled 2026-10-31 (winget/portable first; Steam + Store parked). Build steps: Distribution.md; starts after the entitlement seam |
task-48 |
| 10 | ❌ | Retired 2026-10-08; superseded by the TASK 54 rows above — the Polar design it described is rebuilt as a lease (commercial.md), not revived as written |
task-10 |
Pending the creator's hands (not programming)
- ✅ App Settings grouping + right-click gear — reported working 2026-10-29.
- ✅ Transition picker/durations, Wipe, preview + program transitions — reported working 2026-10-29.
- ✅ Brand logo layer — reported working 2026-10-29.
- ⏳ Vertical-tier camera check (Live tile inside the band, Chat rect-only) — outstanding.
- ⏳ Webcam cadence: a Release take in the failing geometry (vertical tier first) blocks Units 1–2. No fix until a reading names the stage.
1.0 gates (before the first shipped build)
- Visibility picker — replace the always-Private lock, hide the TEST button, and wire
UpdateBroadcastin the same unit (it is the only code that can change a broadcast's privacy). - Kill the dev multi-instance affordance —
Helpers/InstanceProfile.csis already#if DEBUG; re-prove it on a Release build. - Release engineering —
scripts/publish.sh(self-contained win-x64, no test artifacts), Debug-onlyInternalsVisibleTo, theLlamaCasty.exeassembly rename (three pack URIs, incl.MainWindow.xaml:14), full license texts besideTHIRD-PARTY-NOTICES.txt(TASK 4 req 9). - Gold pass (TASK 36): the screens/layers audit, native-Windows verification, and the branding-flash decision.