From 86fcd868a82f5383e96694e9f3314eb17bc11a48 Mon Sep 17 00:00:00 2001 From: gramps Date: Fri, 14 Aug 2026 18:48:42 -0700 Subject: [PATCH] =?UTF-8?q?Monetization=20policy=20locked=20+=20dev=20paus?= =?UTF-8?q?e=20recorded=20(docs=20changeset,=202026-08-14):=20the=20one=20?= =?UTF-8?q?paid=20line=20becomes=20an=20annual=20subscription=20=E2=80=94?= =?UTF-8?q?=20early=20access=20$49.99/yr=20=E2=86=92=20$99/yr=20list=20at?= =?UTF-8?q?=20GA,=20grandfather-while-subscribed=20with=20lapse=20?= =?UTF-8?q?=E2=86=92=20list=20on=20renewal=20(no=20escalation=20matrix);?= =?UTF-8?q?=20free=20tier=20unchanged=20(branding=20flash=20is=20the=20fre?= =?UTF-8?q?e=20tier's=20billboard=20+=20no=20Alerts,=20which=20is=20the=20?= =?UTF-8?q?one=20paid=20feature);=20billing=20NOT=20locked=20to=20itch.io?= =?UTF-8?q?=20(hunted=20fact:=20itch.io=20has=20no=20native=20subscription?= =?UTF-8?q?=20billing=20=E2=80=94=20candidates=20Gumroad,=20whose=20native?= =?UTF-8?q?=20affiliate=20program=20is=20the=20tiebreaker,=20and=20Lemon?= =?UTF-8?q?=20Squeezy);=20support=20=3D=20in-app=20bug-report=20=E2=86=92?= =?UTF-8?q?=20git=20issues=20with=20a=20when-I-get-around-to-it=20cadence?= =?UTF-8?q?=20+=20emergency=20patches.=20ai.md=20Monetization=20section=20?= =?UTF-8?q?rewritten=20+=20stale=20paid-unlock=20seams=20fixed=20(L115=20s?= =?UTF-8?q?ubscription-entitlement=20wording,=20the=20About=20hub's=20tabl?= =?UTF-8?q?ed=20billing=20PremiumUrl=20seam);=20TASKS.md=20gains=20TASK=20?= =?UTF-8?q?23=20(Monetization=20=E2=80=94=20billing=20provider=20decision,?= =?UTF-8?q?=20unlock=20mechanism=20with=20lapse=E2=86=92flash-returns=20en?= =?UTF-8?q?forcement,=20in-app=20bug-report=20loop,=20Unlock=20Premium=20s?= =?UTF-8?q?eam=20lighting,=20Alerts=20gating,=20and=20line-item=20pointers?= =?UTF-8?q?=20for=20the=20early-access=20strategy,=20affiliate/ads=20phase?= =?UTF-8?q?=202,=20and=20the=20channel=20revival);=20HANDOFF.md=20records?= =?UTF-8?q?=20the=20decisions=20+=20the=20development=20pause=20(resume=20?= =?UTF-8?q?streaming=20=3D=20pair-programming=20dev=20streams=20via=20OBS?= =?UTF-8?q?=20+=20The=20Division=202=20under=20the=20gramps/GOAT=20persona?= =?UTF-8?q?,=2067=20and=20gaming=20since=201981,=203D-printing=20content?= =?UTF-8?q?=20retired;=20dogfood=20switch=20to=20ytLlive=20once=20TASK=205?= =?UTF-8?q?=20lands;=20resume=20point=20=3D=20TASK=205).=20Stale=20itch.io?= =?UTF-8?q?=20assertions=20corrected=20across=20comments=20and=20indexes?= =?UTF-8?q?=20(MainViewModel.cs=20PremiumUrl/IsPremium=20seams,=20MainWind?= =?UTF-8?q?ow.xaml=20tooltip,=20AboutHubTests=20comment,=20ViewModels/inde?= =?UTF-8?q?x.md,=20TASK=209=20out-of-scope=20note).=20Build=200=20warnings?= =?UTF-8?q?,=20196=20tests=20passing?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- HANDOFF.md | 64 +++++++++++++++++++---------------- MainWindow.xaml | 2 +- TASKS.md | 49 +++++++++++++++++++++++++-- ViewModels/MainViewModel.cs | 8 ++--- ViewModels/index.md | 2 +- ai.md | 30 +++++++++++----- ytLive.Tests/AboutHubTests.cs | 2 +- 7 files changed, 110 insertions(+), 47 deletions(-) diff --git a/HANDOFF.md b/HANDOFF.md index 2979185..b6df16d 100644 --- a/HANDOFF.md +++ b/HANDOFF.md @@ -7,35 +7,39 @@ ## Session state (last updated: 2026-08-14) -- **Branch:** `main` (audio milestone work is uncommitted, see "Uncommitted"). -- **AUDIO MILESTONE (TASK 9) — SHIPPED this session.** Real stream audio + voice filters + auto-duck - + free TRAX background music. Build **0 warnings**, full suite **196 passing** (ONE integration - test: `AudioPipelineTests.Mix_WithFiltersDuckAndGain_Lands_On_AudioPipe`). Everything below in the - milestone section is DONE. **NOT yet committed** — next step is review + commit (with `ai.md`/ - `TASKS.md`/this file already updated in the same changeset). -- **Two build-time deviations from the settled plan (both recorded in ai.md + TASKS.md):** - 1. `MusicPlayer` uses **`WaveOutEvent`** (new sibling package `NAudio.WinMM` 2.2.1) — not `WasapiOut` - as planned; `WaveOutEvent` isn't in `NAudio.Wasapi`/`NAudio.Core`. - 2. No forced 48 kHz capture — NAudio 2.2.1's `WasapiCapture` has no overridable - `GetDefaultMixFormat`, so both sources run the device mix format and the mixer's - `TinyResampler` normalizes any rate to 48 kHz (resampler IS the design, not a fallback). - 3. `FfmpegEncoder.cs` is **untouched** — the VM closes the audio pipe (`_audioMixer.StopLive()`) in - `StopStream` BEFORE the frame pump stops (audio EOF then video EOF, in order). -- **SERVER RECOVERY (llamachile.tube / YunoHost / DO droplet) — done earlier session.** Side task - complete; **rotate the DO API token** (control-panel only) and any password no longer trusted. -- **Shipped, all pushed before this session:** TASK 21 (creator-hub About, `3d92bd0`), TASK 8 (meter - +10 dB), TASK 4 ship step 7 (one-click go-live + private-only). **174 tests passing, 0 warnings.** -- **Uncommitted (whole TASK 9 milestone):** `Services/Audio/` (new `VoiceFilterChain.cs`, - `AudioRingBuffer.cs`, `AutoDucker.cs`, `TinyResampler.cs`, `MusicPlayer.cs`, `NamedPipeAudioWriter.cs`, - rewritten `AudioMixer.cs`, simplified `WasapiMicAudioSource.cs`), `Models/Music.cs` (new), - `FfmpegArgs.cs`, `EncoderOptions.cs`, `LayoutStore.cs` (v9), `MainViewModel.cs`, `MainWindow.xaml`, - `MainWindow.xaml.cs`, `ytLive.csproj` (NAudio.WinMM), `ytLive.Tests/` (`AudioPipelineTests.cs` new, - `FfmpegEncoderTests.cs` + `LayoutStorePersistenceTests.cs` updated), and docs `ai.md`, `TASKS.md`, - `HANDOFF.md`. -- **Next step:** commit the milestone (docs already staged in the same changeset), push, then start - **TASK 5** (reusable stream → `_rtmpUrlProvider` — the last blocker before go-live actually encodes). - Then **itch.io product page setup** (premium URL lands in `MainViewModel.PremiumUrl`, lights up - Unlock Premium). Optional, not queued: rewriting the healed entry's `ProfileUrl` to +- **Branch:** `main`, tracking `origin/main` at **`f2f6401`** (pushed). Working tree was clean until the + monetization docs changeset below. +- **AUDIO MILESTONE (TASK 9) — SHIPPED + COMMITTED + PUSHED this session.** Real stream audio + voice + filters + auto-duck + free TRAX background music. Build **0 warnings**, full suite **196 passing** + (ONE integration test: `AudioPipelineTests.Mix_WithFiltersDuckAndGain_Lands_On_AudioPipe`). Commits + **`6d71ace`** (milestone) + **`f2f6401`** (secrets cleanup), force-pushed (`725f5a7...f2f6401`). +- **Secrets scrubbed from git history.** The DO token + passwords recorded in `HANDOFF.md` were removed + from the working file and **purged from all history** via `git filter-branch` over `3d92bd0..main` + + `git gc --prune=now --aggressive` (scan of all refs = 0 hits). They still exist in chat — **keep + treating as compromised**; rotate the DO API token. Old objects remain in llgit's store until server + GC (unreachable, not fetchable). If a value is ever needed, `git reflog` is expired — it's gone. +- **MONETIZATION LOCKED (2026-08-14, creator).** One paid line = **annual subscription**: early access + **$49.99/yr** → **$99/yr list at GA**, **grandfather-while-subscribed**, lapse → list on renewal. + Free tier unchanged (branding flash = the billboard + no Alerts; Alerts is the paid feature). + **Billing NOT itch-locked** — itch.io has no native subscription billing; candidates Gumroad (native + affiliates = tiebreaker) / Lemon Squeezy. Support = in-app bug-report → git issues, "when I get + around to it" + emergency patches. Full policy in `ai.md` → Monetization; scoped plan + line-items + in `TASKS.md` **TASK 23**. +- **DEVELOPMENT PAUSED (creator's call 2026-08-14) — resuming streaming instead.** Channel revival = + **pair-programming dev streams via OBS** (ytLlive can't go live yet: private-only + `_rtmpUrlProvider` + null) + **The Division 2** gaming streams under the **"gramps/GOAT"** persona (67, gaming since 1981). + 3D-printing content retired (printer hard down, novelty gone). **Dogfood switch** later: when TASK 5 + + go-live capability land, stream *with* ytLlive — Division 2 (loud game + voice) is the demo for the + ducking/voice-filter story. Early-access strategy + affiliate/ads are their own future line-item tasks. +- **Docs changeset in flight (THIS changeset):** `ai.md` Monetization rewritten + stale paid-unlock seams + fixed; `TASKS.md` TASK 23 added + TASK 21's itch.io URL mention corrected; this file rewritten. Commit + + push as one change. +- **Shipped, all pushed:** TASK 21 (creator-hub About, `3d92bd0`), TASK 8 (meter +10 dB), TASK 4 ship + step 7 (one-click go-live + private-only), TASK 9 audio milestone (`6d71ace`), secrets cleanup + (`f2f6401`). +- **Resume point (when dev starts again):** **TASK 5** — reusable stream → `_rtmpUrlProvider` (the last + blocker before go-live actually encodes + pushes). Then TASK 23 (billing + unlock + support). + Optional, not queued: rewriting the healed entry's `ProfileUrl` to `https://mastodon.llamachile.tube/@gramps` (user must say the word). ## TASK 9 audio milestone — SHIPPED 2026-08-14 (what changed) @@ -67,7 +71,7 @@ and `ai.md` ("Live audio capture"). Highlights: start-of-stream silence race was seen and eliminated). **Out of scope this branch:** IP webcam, chat box, alt-key crop, credits, bg removal, music-off-VOD -track (YouTube mutes VODs with copyrighted music — future feature), itch.io `PremiumUrl`. +track (YouTube mutes VODs with copyrighted music — future feature), `PremiumUrl` (TASK 23 seam). - **Landmines:** - Never add another test that constructs `new App()` — use `RealAppHost.Run(...)` (shared STA host diff --git a/MainWindow.xaml b/MainWindow.xaml index d6fddcc..b23a3c5 100644 --- a/MainWindow.xaml +++ b/MainWindow.xaml @@ -1158,7 +1158,7 @@