gramps
27fc6fb507
feat(profile): the free budget is pixels and fps, enforced once — with a dev-only release hatch
...
The paid delta is output quality, so the rule needs to be measurable rather than a word:
921,600 pixels and 30 fps, fail-closed. Models/OutputProfile.cs is that rule as pure
policy — a permitted tier passes through untouched (Pro, or the free tier's own 720p30),
a disallowed one resolves to the best tier the budget allows and carries ITS bitrate, so
a capped user is never offered an 8 Mbps budget for a 720p frame.
Applied once, in BuildEncoderOptions. That is genuinely one place: the stream and the
local recording are two output blocks of ONE ffmpeg process fed by one EncoderOptions,
so there is no second encoder to forget. (commercial.md claimed "both encoders — never
two checks"; the code is stronger than the doc, and the doc is corrected.)
Developer override, as asked: a "Developer mode — all resolutions" checkbox in App
Settings, bound to MainViewModel.DeveloperMode, which feeds HasProOutput. It is not
hidden in a release build — Controls/DeveloperPanel's Page and Compile items are removed
when Configuration != Debug, and OverlayHost adds it at runtime inside #if DEBUG, so a
shipped exe has no BAML for it at all. The setter also refuses the value when
DevBuild.IsDevelopment is false, which is now the single source for that question (the
scoreboard partial had its own duplicate const).
Two traps worth their lines: a `const bool` dev flag makes `if (!Flag) return;` an
unreachable-code warning in one configuration or the other (CS0162), so DevBuild uses
static readonly; and a Condition on an ItemGroup is invisible to a test reading
item.Attribute("Condition") — read the parent.
Tests: 14 pass across OutputProfileTests, AssemblyIdentityTests and StorePackagingTests.
The invariant test is the one that matters: iterate every shipped tier under a free
entitlement and assert none emits more than the budget, so a future 4K tier fails here
instead of shipping to everyone. App builds Debug and Release at 0 warnings.
2026-11-01 07:11:49 -08:00
..
2026-10-09 09:24:13 -07:00
Monetization policy locked + dev pause recorded (docs changeset, 2026-08-14): the one paid line becomes an annual subscription — early access $49.99/yr → $99/yr list at GA, grandfather-while-subscribed with lapse → list on renewal (no escalation matrix); free tier unchanged (branding flash is the free tier's billboard + no Alerts, which is the one paid feature); billing NOT locked to itch.io (hunted fact: itch.io has no native subscription billing — candidates Gumroad, whose native affiliate program is the tiebreaker, and Lemon Squeezy); support = in-app bug-report → git issues with a when-I-get-around-to-it cadence + emergency patches. ai.md Monetization section rewritten + stale paid-unlock seams fixed (L115 subscription-entitlement wording, the About hub's tabled billing PremiumUrl seam); TASKS.md gains TASK 23 (Monetization — billing provider decision, unlock mechanism with lapse→flash-returns enforcement, in-app bug-report loop, Unlock Premium seam lighting, Alerts gating, and line-item pointers for the early-access strategy, affiliate/ads phase 2, and the channel revival); HANDOFF.md records the decisions + the development pause (resume streaming = pair-programming dev streams via OBS + The Division 2 under the gramps/GOAT persona, 67 and gaming since 1981, 3D-printing content retired; dogfood switch to ytLlive once TASK 5 lands; resume point = TASK 5). Stale itch.io assertions corrected across comments and indexes (MainViewModel.cs PremiumUrl/IsPremium seams, MainWindow.xaml tooltip, AboutHubTests comment, ViewModels/index.md, TASK 9 out-of-scope note). Build 0 warnings, 196 tests passing
2026-08-14 18:48:42 -07:00
2026-09-26 14:44:57 -07:00
2026-09-26 12:45:40 -07:00
2026-09-26 14:44:57 -07:00
2026-09-24 08:27:00 -07:00
2026-09-26 12:08:27 -07:00
2026-09-27 09:43:26 -07:00
2026-10-30 14:42:40 -07:00
2026-10-22 06:51:04 -07:00
2026-11-01 07:01:50 -08:00
2026-10-30 12:39:36 -07:00
2026-10-30 13:18:23 -07:00
2026-10-09 13:27:53 -07:00
2026-10-09 13:27:53 -07:00
2026-09-14 12:30:44 -07:00
2026-10-10 07:08:01 -07:00
2026-08-23 13:33:33 -07:00
2026-08-31 19:32:41 -07:00
2026-10-21 23:09:11 -07:00
2026-10-28 13:09:15 -07:00
2026-10-09 13:22:52 -07:00
2026-10-30 08:39:42 -07:00
2026-10-27 09:25:49 -07:00
2026-10-04 15:05:28 -07:00
2026-10-04 15:28:05 -07:00
2026-09-05 14:31:03 -07:00
2026-10-30 07:53:37 -07:00
2026-10-09 22:15:59 -07:00
2026-09-23 16:45:56 -07:00
2026-08-24 09:08:03 -07:00
2026-09-04 11:01:51 -07:00
2026-10-16 18:23:20 -07:00
2026-10-30 08:29:28 -07:00
2026-10-10 11:52:17 -07:00
2026-10-30 09:18:50 -07:00
2026-09-10 09:32:55 -07:00
2026-08-31 19:45:48 -07:00
2026-09-28 11:53:52 -07:00
2026-10-05 11:10:22 -07:00
2026-10-16 19:02:14 -07:00
2026-10-30 12:32:07 -07:00
2026-10-30 13:46:05 -07:00
2026-10-30 08:30:33 -07:00
2026-10-21 22:19:13 -07:00
2026-08-26 06:48:14 -07:00
2026-08-26 06:48:14 -07:00
2026-09-28 11:53:52 -07:00
2026-10-28 13:09:15 -07:00
2026-10-09 10:19:48 -07:00
2026-10-30 13:18:23 -07:00
2026-09-15 19:25:39 -07:00
2026-08-31 19:52:10 -07:00
2026-08-31 19:52:10 -07:00
2026-10-30 14:01:29 -07:00
2026-10-30 12:46:57 -07:00
2026-10-30 13:32:24 -07:00
2026-08-23 12:25:04 -07:00
2026-08-23 12:25:04 -07:00
2026-10-30 09:58:52 -07:00
2026-10-30 09:30:56 -07:00
2026-11-01 07:11:49 -08:00
2026-09-22 17:57:06 -07:00
2026-10-27 10:20:53 -07:00
2026-10-09 13:32:38 -07:00
2026-10-21 19:58:28 -07:00
2026-10-21 19:46:25 -07:00
2026-09-27 08:55:55 -07:00
2026-09-27 15:37:46 -07:00
2026-09-27 15:37:46 -07:00
2026-09-18 10:20:25 -07:00
2026-09-14 16:14:00 -07:00
2026-08-23 13:33:33 -07:00
2026-10-05 18:54:47 -07:00
2026-08-31 17:53:34 -07:00
Scene strip now renders in canonical F-key order regardless of persisted SortOrder. The strip loads Scenes ORDER BY SortOrder while each tab's F-key label is name-derived, so a session that persisted Chat before BRB (found on the creator's DB: SortOrder 2/3) showed tabs 'Chat F4' then 'BRB F3'. MainViewModel.LoadLayout now calls the new ReorderScenesToCanonical() - the five canonical scenes reorder to Starting, Live, BRB, Chat, Ending (F1-F5, stable among renamed non-canonical scenes), and the next auto-save re-stamps SortOrder so the heal persists. One integration test (SceneOrderTests) seeds the swapped-order DB and asserts loaded order, F1-F5 labels, and that a save persists the corrected ordering. 423 pass, 0 build warnings. (Unit: scene order)
2026-10-10 12:09:07 -07:00
2026-10-28 13:09:15 -07:00
2026-10-30 14:54:05 -07:00
2026-10-30 14:50:20 -07:00
2026-10-30 15:05:33 -07:00
2026-10-30 14:36:56 -07:00
2026-10-30 15:19:28 -07:00
2026-10-30 15:24:14 -07:00
2026-10-30 14:36:13 -07:00
2026-10-30 15:24:14 -07:00
2026-10-30 15:11:35 -07:00
2026-10-30 14:35:42 -07:00
2026-09-14 18:40:20 -07:00
2026-08-13 08:57:56 -07:00
2026-10-28 13:09:15 -07:00
2026-10-30 11:17:11 -07:00
2026-09-01 22:25:20 -07:00
2026-10-30 09:06:53 -07:00
2026-08-13 11:04:32 -07:00
2026-08-19 11:51:32 -07:00
2026-10-30 10:02:06 -07:00
2026-08-13 09:29:58 -07:00
2026-09-28 11:53:52 -07:00
2026-10-28 13:09:15 -07:00
2026-10-30 12:33:40 -07:00
2026-11-01 07:01:50 -08:00
2026-08-16 17:48:37 -07:00
2026-10-30 13:16:19 -07:00
2026-09-25 08:18:25 -07:00
2026-10-30 10:29:22 -07:00
2026-08-06 09:38:35 -07:00
2026-09-23 16:53:25 -07:00
2026-10-27 08:39:49 -07:00
2026-10-27 09:12:37 -07:00
2026-10-30 13:46:05 -07:00
2026-10-04 09:24:12 -07:00
2026-10-30 13:22:13 -07:00
2026-10-30 11:18:36 -07:00
2026-10-21 19:23:29 -07:00
2026-10-21 08:58:24 -07:00
2026-10-09 10:31:11 -07:00
2026-09-17 09:16:56 -07:00
2026-09-01 22:25:20 -07:00
Screen backdrop (schema v5/v6) + five-scene catalog + webcam polish: live desktop/game capture as a permanent non-deletable bottom layer (Source.IsBackdrop), auto full-screen game detection (Win32FullScreenDetector) else primary display, GraphicsCapturePicker re-designation, refcounted shared ScreenCaptureManager, Live-only backdrop by policy (HasBackdrop + v5-v6 backfill + EnforceBackdropPolicy, checkbox gone), SceneCatalog (Starting/Live/BRB/Chat/Ending) with + button re-adding missing scenes, webcam mid-session transparent-container fix (GetPreviewBitmap propagation), Chat half-screen-area cap, 'Add Webcam' always opens the picker (SwapWebcamIdentityAsync, no silent resurrect), WindowsRuntimeMarshal frame-read + 5s-throttled errors, docs updated, tests (65 passing)
2026-08-07 14:15:50 -07:00
2026-09-17 08:56:04 -07:00
2026-09-14 16:14:00 -07:00
2026-09-22 07:00:47 -07:00
2026-10-04 15:28:05 -07:00
2026-10-27 09:12:59 -07:00
2026-10-30 14:42:40 -07:00
2026-10-04 15:27:01 -07:00
2026-09-23 16:45:56 -07:00
2026-10-09 10:01:38 -07:00
2026-10-28 13:09:15 -07:00
2026-10-08 08:26:29 -07:00