The commercial plan was spread over five documents written in five different weeks, and they contradicted each other: product.md sold the Store, decisions.md called the Store dead then re-opened, Distribution.md (736 lines) still described Polar as a download host, MARCOM.md quoted "no subscription" next to a paid tier, and README.md promised "free forever". An outsider could not tell what ships. docs/ai/commercial.md is now the only place money is decided: free = whole app at a 921,600 px / 30 fps output profile covering the recording as well as the stream; Pro = $10/mo or $400 lifetime through Polar, key bound to the buyer's YouTube channel ID via a claim page, 2 activations, 7–14 day lease with offline grace, fail closed, never downgrade a running stream; one portable zip + winget primary, Steam and the Store parked; Azure Trusted Signing (~$9.99/mo), no EV; Founding 200 promo; ~$135/yr costs; anti-piracy posture and what is permanently rejected. Everything else now points at it instead of restating it: - product.md — money sections replaced with pointers; packaging rewritten to winget-first, Store parked; signing updated to Trusted Signing. - decisions.md — graveyard with cause of death for free-forever, the Store ordering, the updater, and the 2026-10-30 reversal of the quality-ceiling rejection. - Distribution.md — rewritten to release mechanics only (artifact, GitHub Releases, winget manifest, signing, checklist, takedown): 736 → 120 lines. - TASKS.md — TASK 54 rewritten, TASK 48's route settled, TASK 10 superseded, five new rows (entitlement seam, output-profile gate, licence UI, system messages, packaging). - README.md — "free forever" replaced with the real split. - capture.md — obs-backgroundremoval is GPL-3.0 and so licence-INCOMPATIBLE since the proprietary EULA; the old "compatible" line was falsified by that change. - TASKS/task-10, task-48, task-51, task-54 — superseded-banner at the top of each, so none of them reads as current policy. - HANDOFF.md — rewritten: plan settled, next code unit is the entitlement seam. MARCOM.md and MONETIZATION.md (gitignored) were corrected in place: policy pointer at the top of each, the flash removed from every live claim, the Polar fee break-even corrected to ~$900/mo, and the projections flagged as written against a dead model.
3.7 KiB
3.7 KiB
docs/ai — index
Subsystems split out of ai.md so a session pays only for the subsystem its task
touches. ai.md is now a router (what the product is, the architecture table, where truth
lives) and AGENTS.md carries the invariants that hold across all of them, so no rule is
reachable only from a file you forgot to open.
Read the file whose row matches the task. There is no required reading order.
| File | Covers | Read when |
|---|---|---|
frame-pipeline.md |
Render budget & measurement (FrameCadence, per-element composite timing, scene dump), SceneCompositor design + StripPool, and FramePump from scene snapshot to encoder (pacing, pool/paste caches, backpressure, teardown, health stats) |
Touching the compositor, the render loop, per-frame cost, Services/Encoder/*, or debugging dropped/juddering frames |
capture.md |
The locked Background layer (screen/game/window capture, WinRT GraphicsCapture interop), the webcam seam + CameraManager sessions, MediaPipe background effects, and the vertical 9:16 tier's per-scene camera placement |
Touching any frame source, the Background row, camera acquisition/conflicts, background effects, or vertical-tier camera geometry |
output.md |
The bundled ffmpeg.exe and the encoder subprocess (args, probe order, seams), local recording (REC/ON-AIR, filenames, private-broadcast close-out), and the WASAPI capture → filter → mix → named-pipe audio chain (TRAX, sync offset, ducking, limiter) |
Touching ffmpeg args/bundling, encoder or recording behaviour, REC/ON-AIR, the audio mix and its meters, or loudness/sync problems |
environment.md |
LAN hosts/IPs/SSH and the Gitea push recipe, the Windows dotnet.exe build + run commands, the test suite map, and the hermetic real-MainWindow test rule |
Before building, running, adding a test, or reaching any box on the LAN |
product.md |
Brand/naming split, AI transparency, the licensing prohibitions, the freemium posture, auth/account assumptions, and packaging behaviour | Branding, naming, packaging, or a legal/third-party obligation |
commercial.md |
The live commercial policy: model and prices, the output-profile cap (stream and recording), Polar entitlement and channel binding, the channels (winget, Steam, Store), signing, the Founding 200 promo, costs, anti-piracy posture | Any question about money: pricing, licence keys, what free gets, how it ships, what a sale costs |
youtube-api.md |
Go-live ordering + the broadcast-binding fix, the private-only lock, health parsing, end-stream pre-flight, Test mode, and chat-insert shape | Touching go-live, broadcast lifecycle, health polling, streaming close-out, or the chat service |
overlays.md |
The social bar, the native alert box (six animations, alert clip, ticker) and the chat box conventions — everything composited over the frame | Adding or changing anything drawn on top of the output |
decisions.md |
Retired paths with cause of death: the paid-tier history and pricing, the free-forever era, Store IAP, the Store ordering, rejected monetization and anti-piracy ideas, and the permanent out-of-product list | You are about to re-open a decision that was already settled |
ui-surface.md |
The control surface, scene strip, preview rail, hotkeys, broadcast drawer, toasts, transitions, brand logo, launch geometry, and the theme/properties-panel conventions | Changing anything the creator sees: layout, controls, theming, properties panel |
Split-out yet to come
Nothing — ai.md is now a router with the always-read invariants; the subsystem detail lives here.