Monetization: Polar chosen as billing provider

- Updated ai.md billing decision to reference Polar (polar.sh)
- Updated code comments (PremiumUrl, IsPremium) to reference Polar
- MONETIZATION.md updated locally (gitignored — confidential)

207 tests, 0 warnings.
This commit is contained in:
2026-08-18 10:13:53 -07:00
parent 2e8629c5c2
commit 5ad58542fb
2 changed files with 6 additions and 6 deletions
+3 -3
View File
@@ -144,14 +144,14 @@ public class MainViewModel : ViewModelBase
// integration test can assert they point at real destinations.
public const string ChannelUrl = "https://youtube.com/@llamachileshop";
public const string MastodonUrl = "https://mastodon.llamachile.tube/@gramps";
// Tabled 2026-08-14: the billing provider is not chosen yet (Gumroad/Lemon Squeezy — TASK 23);
// Tabled 2026-08-14: billing provider chosen (Polar — polar.sh);
// the subscription page (premium unlock) lands here once set up. Coffee/thanks URL is live.
public const string PremiumUrl = "";
public const string CoffeeUrl = "https://buymeacoffee.com/llamachiley";
public static string AppVersionLabel => $"Version {typeof(MainViewModel).Assembly.GetName().Version?.ToString(3)}";
/// <summary>The About hub's Unlock Premium button lights up only once the
/// billing URL is set (tabled 2026-08-14 — provider undecided, TASK 23).</summary>
/// billing URL is set (Polar — polar.sh, pending TASK 10 implementation).</summary>
public bool IsPremiumAvailable => PremiumUrl.Length > 0;
/// <summary>Full in-app licensing/legal text, loaded on demand from the
@@ -257,7 +257,7 @@ public class MainViewModel : ViewModelBase
public SocialsConfig? Socials => _socials;
/// <summary>Freemium: 6 slots — YT + 1 other, the rest locked. Premium seam: all 6 open.</summary>
private static bool IsPremium => false; // unlock deferred (TASK 23) — seam only
private static bool IsPremium => false; // unlock deferred (TASK 10) — seam only
/// <summary>Canvas.Top for the social bar: 0 = top, 1040 = bottom (40px from the 1080 edge).</summary>
public double SocialBarTop => _socials?.BarPosition == SocialBarPosition.Top ? 0 : 1040;