thumbgate 0.9.10 → 0.9.11

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (113) hide show
  1. package/.claude-plugin/README.md +2 -2
  2. package/.claude-plugin/marketplace.json +4 -2
  3. package/.claude-plugin/plugin.json +1 -1
  4. package/.well-known/mcp/server-card.json +1 -1
  5. package/README.md +115 -312
  6. package/adapters/README.md +1 -1
  7. package/adapters/claude/.mcp.json +2 -2
  8. package/adapters/codex/config.toml +4 -4
  9. package/adapters/mcp/server-stdio.js +61 -1
  10. package/adapters/opencode/opencode.json +4 -2
  11. package/bin/cli.js +156 -8
  12. package/bin/memory.sh +3 -3
  13. package/config/e2e-critical-flows.json +4 -0
  14. package/config/gates/default.json +74 -2
  15. package/config/github-about.json +1 -1
  16. package/config/mcp-allowlists.json +27 -0
  17. package/package.json +22 -5
  18. package/plugins/amp-skill/INSTALL.md +1 -0
  19. package/plugins/amp-skill/SKILL.md +1 -0
  20. package/plugins/claude-codex-bridge/.claude-plugin/plugin.json +1 -1
  21. package/plugins/claude-codex-bridge/.mcp.json +4 -2
  22. package/plugins/claude-skill/INSTALL.md +1 -0
  23. package/plugins/codex-profile/.codex-plugin/plugin.json +1 -1
  24. package/plugins/codex-profile/.mcp.json +4 -2
  25. package/plugins/codex-profile/INSTALL.md +1 -1
  26. package/plugins/codex-profile/README.md +1 -1
  27. package/plugins/cursor-marketplace/.cursor-plugin/plugin.json +1 -1
  28. package/plugins/cursor-marketplace/README.md +3 -3
  29. package/plugins/cursor-marketplace/mcp.json +3 -1
  30. package/plugins/cursor-marketplace/scripts/gate-check.sh +15 -5
  31. package/plugins/gemini-extension/INSTALL.md +3 -3
  32. package/plugins/opencode-profile/INSTALL.md +1 -1
  33. package/public/dashboard.html +15 -8
  34. package/public/index.html +125 -185
  35. package/public/js/buyer-intent.js +252 -0
  36. package/public/pro.html +1085 -0
  37. package/scripts/__pycache__/train_from_feedback.cpython-312.pyc +0 -0
  38. package/scripts/adk-consolidator.js +14 -2
  39. package/scripts/agent-readiness.js +3 -1
  40. package/scripts/agent-security-hardening.js +4 -4
  41. package/scripts/auto-promote-gates.js +2 -0
  42. package/scripts/auto-wire-hooks.js +105 -17
  43. package/scripts/behavioral-extraction.js +2 -6
  44. package/scripts/billing.js +107 -3
  45. package/scripts/budget-guard.js +2 -2
  46. package/scripts/build-metadata.js +14 -0
  47. package/scripts/context-engine.js +1 -0
  48. package/scripts/deploy-policy.js +3 -17
  49. package/scripts/dpo-optimizer.js +3 -6
  50. package/scripts/ensure-repo-bootstrap.js +129 -0
  51. package/scripts/export-dpo-pairs.js +2 -3
  52. package/scripts/export-kto-pairs.js +3 -4
  53. package/scripts/export-training.js +8 -6
  54. package/scripts/feedback-attribution.js +23 -11
  55. package/scripts/feedback-loop.js +40 -2
  56. package/scripts/feedback-to-rules.js +2 -1
  57. package/scripts/filesystem-search.js +3 -2
  58. package/scripts/gates-engine.js +760 -29
  59. package/scripts/generate-pretool-hook.sh +0 -0
  60. package/scripts/gtm-revenue-loop.js +20 -1
  61. package/scripts/hook-auto-capture.sh +8 -3
  62. package/scripts/hook-runtime.js +89 -0
  63. package/scripts/hook-stop-self-score.sh +3 -3
  64. package/scripts/hook-thumbgate-cache-updater.js +99 -38
  65. package/scripts/hosted-config.js +4 -16
  66. package/scripts/hybrid-feedback-context.js +54 -14
  67. package/scripts/install-mcp.js +13 -0
  68. package/scripts/intent-router.js +2 -2
  69. package/scripts/license.js +52 -14
  70. package/scripts/local-model-profile.js +3 -2
  71. package/scripts/mcp-config.js +68 -6
  72. package/scripts/meta-policy.js +4 -8
  73. package/scripts/money-watcher.js +166 -16
  74. package/scripts/obsidian-export.js +1 -0
  75. package/scripts/operational-integrity.js +480 -0
  76. package/scripts/post-everywhere.js +7 -12
  77. package/scripts/pr-manager.js +14 -11
  78. package/scripts/profile-router.js +2 -0
  79. package/scripts/prompt-dlp.js +1 -0
  80. package/scripts/publish-decision.js +10 -0
  81. package/scripts/published-cli.js +34 -0
  82. package/scripts/risk-scorer.js +3 -2
  83. package/scripts/rlhf_session_start.sh +32 -0
  84. package/scripts/skill-quality-tracker.js +3 -5
  85. package/scripts/social-analytics/db/social-analytics.db-shm +0 -0
  86. package/scripts/social-analytics/db/social-analytics.db-wal +0 -0
  87. package/scripts/social-analytics/engagement-audit.js +202 -0
  88. package/scripts/social-analytics/instagram-thumbgate-post.js +45 -7
  89. package/scripts/social-analytics/install-growth-automation.js +114 -0
  90. package/scripts/social-analytics/load-env.js +46 -0
  91. package/scripts/social-analytics/poll-all.js +3 -18
  92. package/scripts/social-analytics/pollers/zernio.js +3 -0
  93. package/scripts/social-analytics/publish-instagram-thumbgate.js +22 -3
  94. package/scripts/social-analytics/publish-thumbgate-launch.js +316 -0
  95. package/scripts/social-analytics/publishers/reddit.js +7 -12
  96. package/scripts/social-analytics/publishers/zernio.js +210 -22
  97. package/scripts/social-analytics/reconcile-thumbgate-campaign.js +165 -0
  98. package/scripts/social-analytics/schedule-thumbgate-campaign.js +275 -0
  99. package/scripts/social-analytics/sync-launch-assets.js +185 -0
  100. package/scripts/social-post-hourly.js +185 -0
  101. package/scripts/social-quality-gate.js +119 -3
  102. package/scripts/social-reply-monitor.js +148 -32
  103. package/scripts/statusline-cache-path.js +27 -0
  104. package/scripts/statusline-meta.js +22 -0
  105. package/scripts/statusline.sh +24 -32
  106. package/scripts/sync-version.js +11 -3
  107. package/scripts/test-coverage.js +20 -13
  108. package/scripts/tool-registry.js +97 -0
  109. package/scripts/train_from_feedback.py +32 -9
  110. package/scripts/validate-feedback.js +3 -2
  111. package/scripts/vector-store.js +2 -3
  112. package/scripts/verify-obsidian-setup.sh +3 -3
  113. package/src/api/server.js +281 -33
package/public/index.html CHANGED
@@ -19,12 +19,12 @@
19
19
  <meta charset="UTF-8">
20
20
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
21
21
  __GOOGLE_SITE_VERIFICATION_META__
22
- <title>ThumbGate — Stop AI Coding Agents From Repeating Mistakes</title>
23
- <meta name="description" content="Pre-action gates for AI coding agents. Skill disclosure cuts tokens. Hallucination and PII checks harden outputs. 👍 Thumbs up reinforces good behavior. 👎 Thumbs down blocks repeated mistakes. Free is local. History-aware lessons distill vague feedback. Team adds shared lessons and org visibility, plus generated review views.">
24
- <meta property="og:title" content="ThumbGate — Human-in-the-Loop Enforcement for AI Agents">
25
- <meta property="og:description" content="Pre-action gates for AI coding agents. Skill disclosure cuts tokens. Hallucination and PII checks harden outputs. 👍 Thumbs up reinforces good behavior. 👎 Thumbs down blocks repeated mistakes. Free is local. History-aware lessons distill vague feedback. Team adds shared lessons and org visibility, plus generated review views.">
22
+ <title>ThumbGate — Self-improving AI coding agents that learn from every mistake</title>
23
+ <meta name="description" content="Pre-action gates for AI coding agents. 👎 Thumbs down prevention rule mistake permanently blocked. 👍 Thumbs up pattern reinforced. History-aware lessons from your corrections. Team adds shared lessons and org visibility.">
24
+ <meta property="og:title" content="ThumbGate — Self-improving AI coding agents that learn from every mistake">
25
+ <meta property="og:description" content="Pre-action gates for AI coding agents. 👎 Thumbs down prevention rule mistake permanently blocked. 👍 Thumbs up pattern reinforced. History-aware lessons from your corrections. Team adds shared lessons and org visibility.">
26
26
  <meta property="og:type" content="website">
27
- <meta name="keywords" content="ThumbGate, thumbgate, AI agent guardrails, pre-action gates, MCP server, Claude Code, Claude Code security, Claude Code guardrails, Claw-code, Cursor, Codex, Gemini, Amp, OpenCode, vibe coding safety, SpecLock alternative, Mem0 alternative, AI coding agent memory, PreToolUse hooks, prevention rules, feedback enforcement">
27
+ <meta name="keywords" content="ThumbGate, thumbgate, self-improving AI agents, AI agent self-improvement, AI agent learning, AI agent memory, pre-action gates, human-in-the-loop, MCP server, Claude Code, Cursor, Codex, Gemini, Amp, OpenCode, vibe coding safety, SpecLock alternative, Mem0 alternative, AI coding agent feedback loop, PreToolUse hooks, prevention rules, feedback enforcement, context engineering">
28
28
 
29
29
  <!-- Privacy-friendly analytics by Plausible -->
30
30
  <script defer data-domain="thumbgate-production.up.railway.app" data-api="/api/event" src="/js/analytics.js"></script>
@@ -44,7 +44,7 @@ __GA_BOOTSTRAP__
44
44
  "@type": "SoftwareApplication",
45
45
  "name": "ThumbGate",
46
46
  "alternateName": "thumbgate",
47
- "description": "👍 Thumbs up reinforces good behavior. 👎 Thumbs down blocks repeated mistakes. Free is local. History-aware lessons distill vague feedback. Team adds shared lessons and org visibility, plus generated review views.",
47
+ "description": "Make your AI coding agent self-improving. Every mistake becomes a prevention rule. Every correction makes it permanently smarter. Turns feedback into enforcement your agent gets better with every session.",
48
48
  "applicationCategory": "DeveloperApplication",
49
49
  "operatingSystem": "Cross-platform, Node.js >=18.18.0",
50
50
  "license": "https://opensource.org/licenses/MIT",
@@ -82,7 +82,7 @@ __GA_BOOTSTRAP__
82
82
  "price": "19",
83
83
  "priceCurrency": "USD",
84
84
  "description": "Personal local dashboard, DPO export, advanced data exports, and founder-license support for individual operators",
85
- "url": "https://buy.stripe.com/fZu9AT3Ug6zcdWh0XN3sI08"
85
+ "url": "https://thumbgate-production.up.railway.app/checkout/pro?plan_id=pro&landing_path=%2F"
86
86
  },
87
87
  {
88
88
  "@type": "Offer",
@@ -90,12 +90,12 @@ __GA_BOOTSTRAP__
90
90
  "price": "149",
91
91
  "priceCurrency": "USD",
92
92
  "description": "Annual Pro for individual operators who want the personal local dashboard and proof-ready exports",
93
- "url": "https://buy.stripe.com/9B66oHeyUaPsaK521R3sI09"
93
+ "url": "https://thumbgate-production.up.railway.app/checkout/pro?plan_id=pro&billing_cycle=annual&landing_path=%2F"
94
94
  },
95
95
  {
96
96
  "@type": "Offer",
97
97
  "name": "Team",
98
- "description": "Hosted shared lesson database, generated hosted review views, org dashboard, multi-agent visibility, and workflow hardening rollout support for teams",
98
+ "description": "Shared enforcement memory, review visibility, org dashboard, and pilot rollout support for teams shipping AI-generated changes",
99
99
  "url": "https://thumbgate-production.up.railway.app/#workflow-sprint-intake"
100
100
  }
101
101
  ]
@@ -106,8 +106,8 @@ __GA_BOOTSTRAP__
106
106
  {
107
107
  "@context": "https://schema.org",
108
108
  "@type": "HowTo",
109
- "name": "How to prevent AI coding agents from repeating mistakes",
110
- "description": "Set up ThumbGate to capture feedback, generate prevention rules, and block known-bad actions before execution.",
109
+ "name": "How to make your AI coding agent self-improving",
110
+ "description": "Set up ThumbGate so your AI agent learns from every mistake and never repeats it — a self-improvement loop powered by feedback enforcement.",
111
111
  "step": [
112
112
  {
113
113
  "@type": "HowToStep",
@@ -250,6 +250,11 @@ __GA_BOOTSTRAP__
250
250
  .signal-pill { display: inline-flex; align-items: center; gap: 8px; padding: 8px 14px; border-radius: 999px; border: 1px solid var(--border); background: var(--bg-raised); font-size: 13px; font-weight: 600; letter-spacing: -0.01em; }
251
251
  .signal-pill.signal-up { border-color: rgba(74, 222, 128, 0.28); color: #b8f7c8; background: rgba(74, 222, 128, 0.08); }
252
252
  .signal-pill.signal-down { border-color: rgba(248, 113, 113, 0.28); color: #ffc0c0; background: rgba(248, 113, 113, 0.08); }
253
+ .hero-actions { display: flex; justify-content: center; flex-wrap: wrap; gap: 12px; margin: 0 auto 16px; max-width: 760px; }
254
+ .btn-pro-page { display: inline-flex; align-items: center; justify-content: center; padding: 11px 18px; background: var(--cyan); color: var(--bg); border-radius: 999px; text-decoration: none; font-size: 14px; font-weight: 700; box-shadow: 0 0 0 1px rgba(34,211,238,0.28), 0 12px 32px rgba(34,211,238,0.18); transition: opacity 0.15s, transform 0.15s; }
255
+ .btn-pro-page:hover { opacity: 0.9; transform: translateY(-1px); }
256
+ .hero-paid-note { font-size: 14px; color: var(--text-muted); max-width: 720px; margin: 0 auto 24px; }
257
+ .hero-paid-note strong { color: var(--text); }
253
258
  .hero-install { background: var(--bg-raised); border: 1px solid var(--border); border-radius: 10px; padding: 14px 24px; display: inline-flex; align-items: center; gap: 12px; font-family: var(--mono); font-size: 15px; margin-bottom: 40px; cursor: pointer; transition: border-color 0.2s; position: relative; max-width: 100%; overflow-x: auto; }
254
259
  .hero-install:hover { border-color: var(--cyan); }
255
260
  .hero-install .prompt { color: var(--text-muted); user-select: none; }
@@ -343,8 +348,10 @@ __GA_BOOTSTRAP__
343
348
  .price-card li { font-size: 14px; color: var(--text-muted); padding: 6px 0; display: flex; align-items: flex-start; gap: 8px; }
344
349
  .price-card li::before { content: "✓"; color: var(--cyan); font-weight: 700; flex-shrink: 0; }
345
350
  .price-card.pro li::before { color: var(--cyan); }
346
- .btn-free { display: block; text-align: center; padding: 10px; border: 1px solid var(--border); border-radius: 8px; color: var(--text); text-decoration: none; font-size: 14px; font-weight: 500; transition: border-color 0.15s; }
347
- .btn-free:hover { border-color: var(--text-muted); }
351
+ .btn-free,
352
+ .btn-demo-link { display: block; text-align: center; padding: 10px; border: 1px solid var(--border); border-radius: 8px; color: var(--text); text-decoration: none; font-size: 14px; font-weight: 500; transition: border-color 0.15s; }
353
+ .btn-free:hover,
354
+ .btn-demo-link:hover { border-color: var(--text-muted); }
348
355
  .btn-pro { display: block; text-align: center; padding: 10px; background: var(--cyan); color: var(--bg); border-radius: 8px; text-decoration: none; font-size: 14px; font-weight: 600; transition: opacity 0.15s; }
349
356
  .btn-pro:hover { opacity: 0.85; }
350
357
  .btn-team { display: block; text-align: center; padding: 10px; background: rgba(74,222,128,0.14); color: var(--green); border: 1px solid rgba(74,222,128,0.4); border-radius: 8px; text-decoration: none; font-size: 14px; font-weight: 600; transition: border-color 0.15s, transform 0.15s; }
@@ -387,6 +394,8 @@ __GA_BOOTSTRAP__
387
394
  .pricing-grid { grid-template-columns: 1fr; }
388
395
  .team-form { grid-template-columns: 1fr; }
389
396
  .hero { padding: 72px 0 56px; }
397
+ .hero-actions { flex-direction: column; }
398
+ .hero-actions a { width: 100%; }
390
399
  .nav-links a:not(.nav-cta) { display: none; }
391
400
  .proof-bar { gap: 16px; }
392
401
  .proof-bar .dot { display: none; }
@@ -409,7 +418,7 @@ __GA_BOOTSTRAP__
409
418
  <a href="/guide">Setup Guide</a>
410
419
  <a href="/learn">Learn</a>
411
420
  <a href="/dashboard">Dashboard Demo</a>
412
- <a href="#pricing" class="nav-cta">View Plans</a>
421
+ <a href="/pro?utm_source=website&utm_medium=homepage_nav&utm_campaign=pro_page" class="nav-cta">See Pro</a>
413
422
  </div>
414
423
  </div>
415
424
  </nav>
@@ -418,14 +427,19 @@ __GA_BOOTSTRAP__
418
427
  <section class="hero">
419
428
  <div class="container">
420
429
  <div class="hero-thumbs">👍👎</div>
421
- <div class="hero-badge">● Human-in-the-Loop Enforcement for AI Agents</div>
422
- <h1>AI agents repeat mistakes.<br>Yours won't.</h1>
430
+ <div class="hero-badge">● Self-improving AI agents every mistake makes it smarter</div>
431
+ <h1>Your AI agent learns<br>from every mistake.</h1>
423
432
  <div class="hero-signals">
424
- <div class="signal-pill signal-down">👎 blocks dangerous and dumb mistakes before they run</div>
425
- <div class="signal-pill signal-up">👍 reinforces what worked across sessions</div>
433
+ <div class="signal-pill signal-down">👎 Mistake becomes a prevention rule permanently blocked</div>
434
+ <div class="signal-pill signal-up">👍 Good pattern reinforced — reused across sessions</div>
426
435
  </div>
427
- <p class="hero-persona">For power users of Claude Code, Cursor, Codex, Gemini, Amp, and any MCP agent who are tired of fixing the same mistakes every session.</p>
428
- <p><strong>Every mistake makes your agent stronger.</strong> ThumbGate turns thumbs-up/down feedback into hard gates that block bad actions before they execute. Think of it as an immune system for your AI agent — it learns from your corrections, distills vague signals from conversation context, and enforces lessons automatically. More errors = stronger gates. The safety net for vibe coding that gets more valuable the more chaos it encounters.</p>
436
+ <p class="hero-persona">For developers using Claude Code, Cursor, Codex, Gemini, Amp, and OpenCode who want their AI agent to actually get better over time — not repeat the same mistakes every session.</p>
437
+ <p><strong>The self-improvement loop:</strong> Your agent makes a mistake you give a thumbs-down ThumbGate auto-generates a prevention rule a gate physically blocks that mistake from ever happening again. Your agent gets permanently smarter with every correction. No model retraining. No prompt hacking. Just enforcement that compounds.</p>
438
+ <div class="hero-actions">
439
+ <a href="/pro?utm_source=website&utm_medium=homepage_hero&utm_campaign=pro_page" class="btn-pro-page">See Pro for individual operators</a>
440
+ <a href="/dashboard?utm_source=website&utm_medium=homepage_hero&utm_campaign=demo" class="btn-demo-link">Open dashboard demo</a>
441
+ </div>
442
+ <p class="hero-paid-note"><strong>Paid path:</strong> Free stays the local install lane. Pro is the buyer-ready page for your personal local dashboard, DPO export, and review-ready evidence.</p>
429
443
  <div class="hero-install" onclick="copyInstall(this)" title="Click to copy">
430
444
  <span class="prompt">$</span>
431
445
  <span class="cmd">npx thumbgate init</span>
@@ -477,20 +491,20 @@ __GA_BOOTSTRAP__
477
491
  <section class="compatibility" id="social-proof">
478
492
  <div class="container">
479
493
  <div class="section-label">See It In Action</div>
480
- <h2 class="section-title">Try the dashboard before you buy anything</h2>
494
+ <h2 class="section-title">See the enforcement before you buy anything</h2>
481
495
  <div class="agent-grid">
482
496
  <div class="agent-card">
483
497
  <h3>🔍 Live Dashboard Demo</h3>
484
- <p>Search lessons, inspect gates, see blocked actions all with real sample data. No signup, no install required.</p>
498
+ <p>Search lessons, inspect gates, and see exactly why risky actions were blocked. No signup or install required.</p>
485
499
  <a href="/dashboard" style="display:inline-block;margin-top:12px;color:var(--cyan);font-weight:600;text-decoration:underline;">Open Dashboard Demo →</a>
486
500
  </div>
487
501
  <div class="agent-card">
488
502
  <h3>⛔ Gate Reasoning Chains</h3>
489
- <p>Every block explains WHY: which pattern matched, what evidence triggered it, whether it was auto-promoted from your feedback or manually set.</p>
503
+ <p>Every block explains why: which pattern matched, what evidence triggered it, and whether the rule came from your own corrections.</p>
490
504
  </div>
491
505
  <div class="agent-card">
492
506
  <h3>📊 Org Dashboard (Pro)</h3>
493
- <p>See what ALL your agents are doing. Adherence rates, risk alerts, top blocked gates across every session in your org.</p>
507
+ <p>See which agents are creating review churn, which gates are saving time, and where rollout risk is still concentrated.</p>
494
508
  </div>
495
509
  <div class="agent-card">
496
510
  <h3>🧪 Thompson Sampling</h3>
@@ -540,8 +554,8 @@ __GA_BOOTSTRAP__
540
554
  <!-- HOW IT WORKS -->
541
555
  <section class="how-it-works" id="how-it-works">
542
556
  <div class="container">
543
- <div class="section-label">How It Works</div>
544
- <h2 class="section-title">Three steps to mistake-proof vibe coding</h2>
557
+ <div class="section-label">New in v0.9.11</div>
558
+ <h2 class="section-title">Three steps to stop repeated AI failures</h2>
545
559
  <div class="steps">
546
560
  <div class="step">
547
561
  <div class="step-num">1</div>
@@ -563,130 +577,27 @@ __GA_BOOTSTRAP__
563
577
  </section>
564
578
 
565
579
  <!-- PROENTROPIC -->
566
- <section class="compatibility" id="proentropic">
567
- <div class="container">
568
- <div class="section-label">Proentropic Infrastructure</div>
569
- <h2 class="section-title">Built to get stronger from chaos, not break from it</h2>
570
- <div class="agent-grid">
571
- <div class="agent-card">
572
- <h3>Errors are fuel</h3>
573
- <p>Every agent mistake becomes a prevention rule. Every thumbs-down becomes a gate. The more your agents fail, the more ThumbGate learns. Fragile systems break under chaos — ThumbGate feeds on it.</p>
574
- </div>
575
- <div class="agent-card">
576
- <h3>Organizational learning</h3>
577
- <p>One developer's thumbs-down becomes the whole team's protection. Lessons compound across agents, sessions, and projects. Your 100th agent inherits everything the first 99 learned.</p>
578
- </div>
579
- <div class="agent-card">
580
- <h3>Enterprise-grade governance</h3>
581
- <p>CISOs fear agent chaos. ThumbGate turns that chaos into structured audit trails, per-agent governance scores, PII scanning, and credential attestation. Compliance officers get a single dashboard, not scattered logs.</p>
582
- </div>
583
- </div>
584
- </div>
585
- </section>
586
-
587
- <!-- WHY GUARDRAILS -->
580
+ <!-- GUARDRAILS -->
588
581
  <section class="compatibility" id="guardrails">
589
582
  <div class="container">
590
- <div class="section-label">Production-Grade AI Safety</div>
591
- <h2 class="section-title">Every guardrail pattern experts recommend, built in</h2>
583
+ <div class="section-label">Enforcement</div>
584
+ <h2 class="section-title">Gates block. They don't ask nicely.</h2>
592
585
  <div class="agent-grid">
593
586
  <div class="agent-card">
594
587
  <h3>Don't trust — verify</h3>
595
- <p>Gate reasoning chains show exactly WHY an action was blocked: pattern match, evidence, fire count. No hidden decisions.</p>
588
+ <p>Every block shows why: pattern match, evidence, confidence score.</p>
596
589
  </div>
597
590
  <div class="agent-card">
598
591
  <h3>Real tools, not wishes</h3>
599
- <p>MCP tools call real enforcement — gates physically block tool calls, not ask the agent nicely. External system, not prompt tricks.</p>
592
+ <p>Gates physically block tool calls. Not prompt tricks. Not "please don't."</p>
600
593
  </div>
601
594
  <div class="agent-card">
602
595
  <h3>Force models to show work</h3>
603
- <p>Every gate decision includes step-by-step reasoning. Thompson Sampling confidence tiers tell you when to trust the model vs fall back to rules.</p>
596
+ <p>Reasoning chains on every gate decision. Thompson Sampling confidence tiers.</p>
604
597
  </div>
605
598
  <div class="agent-card">
606
599
  <h3>Log everything, learn automatically</h3>
607
- <p>Audit trail records every allow/deny/warn. Repeated failures auto-promote to gates. Org dashboard shows all agents across your team.</p>
608
- </div>
609
- <div class="agent-card">
610
- <h3>Keep one correction thread</h3>
611
- <p>Feedback sessions let you open, append, and finalize one linked correction instead of spraying follow-up notes across separate records. Better lessons, less operator friction.</p>
612
- </div>
613
- </div>
614
- </div>
615
- </section>
616
-
617
- <!-- AI CONTROL TOWER -->
618
- <section class="compatibility" id="control-tower">
619
- <div class="container">
620
- <div class="section-label">Recently shipped</div>
621
- <h2 class="section-title">AI Control Tower: monitor, alert, and act</h2>
622
- <div class="agent-grid">
623
- <div class="agent-card">
624
- <h3>Domain skill packs</h3>
625
- <p>Installable best-practice rules for Stripe, Railway, database migrations. Auto-match by task context. 100% eval pass rate with packs vs 0% without.</p>
626
- </div>
627
- <div class="agent-card">
628
- <h3>Tool-level KPIs</h3>
629
- <p>P50/P90/P95 latency and success rate per tool. Drill from gateway health down to the exact tool causing issues.</p>
630
- </div>
631
- <div class="agent-card">
632
- <h3>SLO alerts</h3>
633
- <p>Define thresholds for success rate and latency. Breach triggers webhook alerts to Slack, Teams, or Discord automatically.</p>
634
- </div>
635
- <div class="agent-card">
636
- <h3>Access anomaly detection</h3>
637
- <p>Tracks authorized vs failed access. Moving-average spike detection flags per-agent abuse. Security governance on autopilot.</p>
638
- </div>
639
- <div class="agent-card">
640
- <h3>Metered outcome pricing</h3>
641
- <p>$0.10 per blocked mistake (Pro). Minimum $19/mo floor. You pay for value delivered, not seats warmed.</p>
642
- </div>
643
- <div class="agent-card">
644
- <h3>Ambient daily digest</h3>
645
- <p>Push Slack/Teams/Discord summary at 9am. Weekly stats export for build-in-public content. Check in once a day, not babysit.</p>
646
- </div>
647
- </div>
648
- </div>
649
- </section>
650
-
651
- <!-- PROGRESSIVE DISCLOSURE -->
652
- <section class="compatibility" id="progressive-disclosure">
653
- <div class="container">
654
- <div class="section-label">New in v0.9.10</div>
655
- <h2 class="section-title">82% fewer tokens with progressive skill loading</h2>
656
- <div class="agent-grid">
657
- <div class="agent-card">
658
- <h3>3-tier disclosure</h3>
659
- <p>L1 metadata at startup (27 tokens). L2 rules on activation. L3 reference files on demand. Agents load only what they need.</p>
660
- </div>
661
- <div class="agent-card">
662
- <h3>Skill factory</h3>
663
- <p>Agent auto-generates new skill packs from recurring failures. Lessons become NEVER/ALWAYS rules. No manual curation needed.</p>
664
- </div>
665
- <div class="agent-card">
666
- <h3>Security hardening</h3>
667
- <p>Credential attestation per tool call. Privilege escalation detection against MCP profiles. Dependency gate blocks supply chain attacks.</p>
668
- </div>
669
- </div>
670
- </div>
671
- </section>
672
-
673
- <!-- BACKGROUND AGENT GOVERNANCE -->
674
- <section class="compatibility" id="background-agents">
675
- <div class="container">
676
- <div class="section-label">For Background Agent Teams</div>
677
- <h2 class="section-title">Your agents write 57% of PRs. ThumbGate makes sure they don't repeat mistakes.</h2>
678
- <div class="agent-grid">
679
- <div class="agent-card">
680
- <h3>Run governance gate</h3>
681
- <p>Before a background agent opens a PR, check its failure history. Agents with >50% fail rate get blocked. Protected branches get extra scrutiny.</p>
682
- </div>
683
- <div class="agent-card">
684
- <h3>Auto-capture from CI</h3>
685
- <p>CI pass/fail auto-generates structured feedback. No human in the loop. The agent learns from every merge and every rejection.</p>
686
- </div>
687
- <div class="agent-card">
688
- <h3>Governance report</h3>
689
- <p>Per-agent pass rates, gate blocks, run types, blast radius warnings. Know which agents are reliable and which need guardrails.</p>
600
+ <p>Repeated failures auto-promote to gates. Org dashboard shows all agents.</p>
690
601
  </div>
691
602
  </div>
692
603
  </div>
@@ -721,14 +632,14 @@ __GA_BOOTSTRAP__
721
632
  <!-- PRICING -->
722
633
  <section class="pricing" id="pricing">
723
634
  <div class="container">
724
- <div class="section-label">Pricing — 7-Day Free Trial</div>
725
- <h2 class="section-title">Start free. Try Pro for 7 days. Cancel anytime.</h2>
635
+ <div class="section-label">Pricing</div>
636
+ <h2 class="section-title">Start free. Prove value on a real workflow. Upgrade when review churn costs more than $19/mo.</h2>
726
637
  <div class="pricing-grid">
727
638
  <div class="price-card">
728
639
  <div class="tier">Free</div>
729
640
  <div class="price">$0</div>
730
- <div class="price-sub">Forever free · Local-only, single dev</div>
731
- <p style="font-size:13px;color:#aaa;margin-bottom:16px;">For solo devs experimenting with gates on one machine.</p>
641
+ <div class="price-sub">Forever free · Local enforcement for one developer</div>
642
+ <p style="font-size:13px;color:#aaa;margin-bottom:16px;">For solo developers who want to stop the same agent mistake from showing up twice.</p>
732
643
  <ul>
733
644
  <li>Unlimited feedback captures · 5 lesson searches/day · unlimited recall</li>
734
645
  <li>5 auto-promoted gates plus the core safety policy</li>
@@ -743,9 +654,9 @@ __GA_BOOTSTRAP__
743
654
  <div class="tier">Pro</div>
744
655
  <div class="price">$19<span style="font-size:16px;color:var(--text-dim)">/mo</span></div>
745
656
  <div class="price-sub">or $149/yr (save 35%) · Personal dashboard + exports</div>
746
- <p style="font-size:13px;color:var(--cyan);margin-bottom:16px;font-weight:500;">For individual operators who want a personal local dashboard with proof-ready exports.</p>
657
+ <p style="font-size:13px;color:var(--cyan);margin-bottom:16px;font-weight:500;">For individual operators who need review-ready evidence, faster debugging, and a dashboard of exactly what got blocked.</p>
747
658
  <div class="pro-upgrade-triggers" style="font-size:12px;color:#aaa;margin-bottom:12px;">
748
- <strong style="color:#fff;">Go Pro when:</strong> you've blocked 20+ actions, want your own dashboard, or need DPO exports without extra setup.
659
+ <strong style="color:#fff;">Go Pro when:</strong> you want review-ready evidence, need your own dashboard, or keep correcting the same failure modes.
749
660
  </div>
750
661
  <div class="dashboard-preview" style="margin-bottom:16px;border:1px solid #333;border-radius:8px;overflow:hidden;">
751
662
  <div style="background:linear-gradient(135deg,#1a1a2e 0%,#16213e 100%);padding:16px;text-align:center;">
@@ -764,13 +675,13 @@ __GA_BOOTSTRAP__
764
675
  <li>Auto-connect — activate once with your license key, then your running agents appear automatically on your local dashboard</li>
765
676
  <li><a href="/dashboard" style="color:var(--cyan);text-decoration:underline;">DPO training data export →</a> turn real thumbs-downs into ready-to-use preference pairs for fine-tuning (LoRA / JSONL)</li>
766
677
  <li><strong>Model Hardening Advisor</strong> — get recommendations on when and how to fine-tune your model to natively avoid recurring failures</li>
767
- <li>Personal local dashboard — every Pro user gets their own localhost dashboard without extra cloud setup</li>
768
- <li>Founder-license support — we help you wire your riskiest flows (migrations, force-pushes, CI) in the first week</li>
678
+ <li>Personal local dashboard — every Pro user gets a localhost dashboard without extra cloud setup</li>
679
+ <li>Founder-license support — we help you wire the riskiest flows first: migrations, force-pushes, deploys, and CI</li>
769
680
  </ul>
770
- <a href="https://buy.stripe.com/fZu9AT3Ug6zcdWh0XN3sI08" class="btn-pro" style="display:none" id="pro-checkout-link">Start Free Trial — then $19/mo</a>
681
+ <a href="/checkout/pro?utm_source=website&utm_medium=homepage_pricing&utm_campaign=pro_pack&cta_id=homepage_pricing_trial&cta_placement=pricing&plan_id=pro&landing_path=%2F" class="btn-pro" style="display:none" id="pro-checkout-link">Start Free Trial — then $19/mo</a>
771
682
  <div class="trial-badge" style="background:var(--cyan);color:#000;display:inline-block;padding:4px 12px;border-radius:12px;font-size:12px;font-weight:700;margin-bottom:12px;">7-DAY FREE TRIAL</div>
772
683
  <div class="email-gate" style="margin-bottom:12px;">
773
- <input type="email" id="pro-email" placeholder="Your email to start trial" style="width:100%;padding:10px 14px;border:1px solid #333;border-radius:6px;background:#1a1a2e;color:#fff;font-size:14px;">
684
+ <input type="email" id="pro-email" data-buyer-email placeholder="Your email to start trial" style="width:100%;padding:10px 14px;border:1px solid #333;border-radius:6px;background:#1a1a2e;color:#fff;font-size:14px;">
774
685
  </div>
775
686
  <button class="btn-pro" id="pro-trial-btn" onclick="handleProTrial()" style="width:100%;cursor:pointer;border:none;">Start 7-Day Free Trial</button>
776
687
  <p style="font-size:11px;color:#666;margin-top:8px;">Founder pricing — <a href="https://buy.stripe.com/aFa4gz1M84r419v7mb3sI05" style="color:var(--cyan);text-decoration:underline;">preserved $49 one-time founder link</a> for early buyers who still want that path.</p>
@@ -779,21 +690,21 @@ __GA_BOOTSTRAP__
779
690
  <div class="price-card team">
780
691
  <div class="tier">Team</div>
781
692
  <div class="price">$12<span style="font-size:16px;color:var(--text-dim)">/seat/mo</span></div>
782
- <div class="price-sub">Starts at $36/mo for 3 seats · or $297/yr · Shared lessons + org visibility</div>
783
- <p style="font-size:13px;color:var(--green);margin-bottom:16px;font-weight:500;">For teams running multiple agents across shared repos who need one lesson to protect everyone.</p>
693
+ <div class="price-sub">Starts at $36/mo for 3 seats · or $297/yr · Shared enforcement + org visibility</div>
694
+ <p style="font-size:13px;color:var(--green);margin-bottom:16px;font-weight:500;">For teams shipping AI-generated changes across shared repos who need one correction to protect every reviewer and runtime.</p>
784
695
  <div class="pro-upgrade-triggers" style="font-size:12px;color:#aaa;margin-bottom:12px;">
785
- <strong style="color:#fff;">Start Team when:</strong> you need a shared lesson DB, org-wide metrics, or workflow hardening that survives handoffs.
696
+ <strong style="color:#fff;">Start Team when:</strong> you need shared enforcement, org-wide proof, or one workflow pilot that proves ROI internally.
786
697
  </div>
787
698
  <ul>
788
- <li>Hosted shared lesson DB one dev's 👎 on a bad migration protects every agent on the team</li>
699
+ <li>Shared enforcement memory — a shared lesson database where one developer's 👎 on a bad migration protects every agent on the team</li>
789
700
  <li>Org dashboard — active agents, gate hit rates, risk agents, and proof-backed team metrics in one place</li>
790
- <li>Generated hosted review views — constrained cards, lists, and callouts assemble team, incident, and rollout dashboards without custom page work</li>
701
+ <li>Hosted review views — constrained cards, lists, and callouts for rollout, incident, and audit visibility</li>
791
702
  <li>Gate template library — pre-built guardrails for force-pushes, skipped tests, destructive SQL, and evidence-before-done</li>
792
- <li>Workflow hardening sprint — intake, rollout plan, and evidence pack for the first shared workflow</li>
793
- <li>Product Hunt and campaign attribution stay tied to the team funnel instead of generic referral traffic</li>
703
+ <li>Workflow proof sprint — pilot one painful workflow first, then expand once the before/after evidence is real</li>
704
+ <li>Rollout attribution stays tied to the team funnel instead of disappearing into generic referral traffic</li>
794
705
  </ul>
795
- <a href="#workflow-sprint-intake" class="btn-team">Start Team Rollout</a>
796
- <p style="font-size:11px;color:#666;margin-top:8px;">Hosted team rollout starts with the workflow sprint intake so we scope the shared workflow honestly.</p>
706
+ <a href="#workflow-sprint-intake" class="btn-team">Start Team Pilot</a>
707
+ <p style="font-size:11px;color:#666;margin-top:8px;">Hosted rollout starts with one workflow pilot so the first expansion has measurable before/after proof.</p>
797
708
  </div>
798
709
  </div>
799
710
  </div>
@@ -801,9 +712,9 @@ __GA_BOOTSTRAP__
801
712
 
802
713
  <section class="compatibility" id="workflow-sprint-intake">
803
714
  <div class="container">
804
- <div class="section-label">Team Rollout</div>
805
- <h2 class="section-title">Start the Team lane with one workflow that matters</h2>
806
- <p style="color:var(--text-dim);max-width:720px;margin:0 auto 16px;">The recurring value is shared enforcement. Start with one workflow, one owner, and one blocker. The hosted intake gives us a proof-backed path into the shared lesson DB, org dashboard, and team-wide gate rollout.</p>
715
+ <div class="section-label">Team Pilot</div>
716
+ <h2 class="section-title">Start with one repo, one workflow, one repeat failure</h2>
717
+ <p style="color:var(--text-dim);max-width:720px;margin:0 auto 16px;">The recurring value is shared enforcement. Start with one workflow, one owner, and one blocker. The intake is designed to prove that ThumbGate reduces review churn, rollout risk, or repeated agent mistakes before a wider rollout.</p>
807
718
  <form class="team-form" action="/v1/intake/workflow-sprint" method="POST">
808
719
  <input type="hidden" name="ctaId" value="workflow_sprint_intake">
809
720
  <input type="hidden" name="ctaPlacement" value="team_pricing">
@@ -816,7 +727,7 @@ __GA_BOOTSTRAP__
816
727
  <textarea class="full" name="blocker" placeholder="What repeat mistake, rollout blocker, or team handoff failure keeps happening?" required></textarea>
817
728
  <textarea class="full" name="note" placeholder="Optional context: team size, repos involved, target rollout date, or what you need to prove internally."></textarea>
818
729
  <div class="full">
819
- <button type="submit" class="btn-team">Submit Team Workflow Intake</button>
730
+ <button type="submit" class="btn-team">Start Team Pilot Intake</button>
820
731
  </div>
821
732
  </form>
822
733
  </div>
@@ -846,7 +757,7 @@ __GA_BOOTSTRAP__
846
757
  </div>
847
758
  <div class="faq-item">
848
759
  <div class="faq-q" role="button" tabindex="0" aria-expanded="false" onclick="toggleFaq(this)" onkeydown="handleFaqKeydown(event)">Do I need a cloud account?</div>
849
- <div class="faq-a">No. Free keeps local enforcement on your machine with 5 daily feedback captures, 10 lesson searches, unlimited recall, gates, and hook blocking. No cloud account is required. Pro adds a personal local dashboard on your machine plus DPO export. Team is the hosted rollout lane when your group wants a shared lesson database, generated hosted review views, org dashboard, and team-wide gate visibility.</div>
760
+ <div class="faq-a">No. Free keeps local enforcement on your machine with 5 daily feedback captures, 10 lesson searches, unlimited recall, gates, and hook blocking. No cloud account is required. Pro adds a personal local dashboard plus DPO export. Team is the hosted rollout lane when your group wants a shared lesson database, hosted review views, org dashboard visibility, and team-wide proof.</div>
850
761
  </div>
851
762
  <div class="faq-item">
852
763
  <div class="faq-q" role="button" tabindex="0" aria-expanded="false" onclick="toggleFaq(this)" onkeydown="handleFaqKeydown(event)">What if my thumbs-down is vague?</div>
@@ -854,7 +765,7 @@ __GA_BOOTSTRAP__
854
765
  </div>
855
766
  <div class="faq-item">
856
767
  <div class="faq-q" role="button" tabindex="0" aria-expanded="false" onclick="toggleFaq(this)" onkeydown="handleFaqKeydown(event)">How are pre-action gates different from prompt rules?</div>
857
- <div class="faq-a">Prompt rules are suggestions that agents can ignore. Pre-Action Gates are enforcement — they block the action before execution. Gates are auto-generated from your feedback and use Thompson Sampling to adapt over time.</div>
768
+ <div class="faq-a">Prompt rules are suggestions that agents can ignore. Pre-Action Gates are enforcement — they block the action before execution. Gates are auto-generated from your human-in-the-loop feedback and use Thompson Sampling to adapt over time.</div>
858
769
  </div>
859
770
  <div class="faq-item">
860
771
  <div class="faq-q" role="button" tabindex="0" aria-expanded="false" onclick="toggleFaq(this)" onkeydown="handleFaqKeydown(event)">What does Pro cost?</div>
@@ -867,24 +778,25 @@ __GA_BOOTSTRAP__
867
778
  <!-- NEWSLETTER SIGNUP -->
868
779
  <section class="compatibility" id="newsletter" style="padding: 48px 0;">
869
780
  <div class="container" style="text-align: center;">
870
- <div class="section-label">Stay in the loop</div>
871
- <h2 class="section-title" style="margin-bottom: 16px;">Get notified when we ship</h2>
872
- <p style="color: var(--text-dim); margin-bottom: 24px; max-width: 480px; margin-left: auto; margin-right: auto;">Release notes, new gate patterns, and agent governance insights. No spam. Unsubscribe anytime.</p>
873
- <form action="https://thumbgate-production.up.railway.app/api/newsletter" method="POST" style="display: flex; gap: 8px; max-width: 420px; margin: 0 auto; flex-wrap: wrap; justify-content: center;">
874
- <input type="email" name="email" placeholder="you@company.com" required style="flex: 1; min-width: 200px; padding: 12px 16px; border: 1px solid var(--border); border-radius: 8px; background: var(--surface); color: var(--text); font-size: 15px;">
875
- <button type="submit" style="padding: 12px 24px; background: var(--cyan); color: #000; border: none; border-radius: 8px; font-weight: 600; font-size: 15px; cursor: pointer;" onclick="if(typeof plausible==='function')plausible('newsletter_signup')">Subscribe</button>
781
+ <div class="section-label">Buyer Follow-Up</div>
782
+ <h2 class="section-title" style="margin-bottom: 16px;">Not ready to buy today? Keep the demo and checkout link one click away.</h2>
783
+ <p style="color: var(--text-dim); margin-bottom: 24px; max-width: 560px; margin-left: auto; margin-right: auto;">Save your work email for launch updates, new gate patterns, and the paid demo path. We also keep it on this device so the Pro checkout can open prefilled instead of making you type it again.</p>
784
+ <form action="/api/newsletter" method="POST" data-newsletter-form data-page="homepage" data-intent="buyer_follow_up" style="display: flex; gap: 8px; max-width: 480px; margin: 0 auto; flex-wrap: wrap; justify-content: center;">
785
+ <input type="email" name="email" data-buyer-email placeholder="you@company.com" required style="flex: 1; min-width: 220px; padding: 12px 16px; border: 1px solid var(--border); border-radius: 8px; background: var(--bg-raised); color: var(--text); font-size: 15px;">
786
+ <button type="submit" style="padding: 12px 24px; background: var(--cyan); color: #000; border: none; border-radius: 8px; font-weight: 600; font-size: 15px; cursor: pointer;">Get updates + keep checkout ready</button>
876
787
  </form>
788
+ <p data-newsletter-status style="min-height:20px;font-size:12px;color:var(--text-dim);margin-top:10px;" aria-live="polite"></p>
877
789
  </div>
878
790
  </section>
879
791
 
880
792
  <!-- FINAL CTA -->
881
793
  <section class="final-cta">
882
794
  <div class="container">
883
- <h2>Ready to stop fixing the same AI mistakes?</h2>
884
- <p>Try the dashboard demo first. Install in 30 seconds. No account required.</p>
795
+ <h2>Put ThumbGate on your next AI-generated change.</h2>
796
+ <p>Try the dashboard demo first or install in 30 seconds. Prove the value on a real PR, deploy, or migration.</p>
885
797
  <div style="display:flex;gap:12px;justify-content:center;flex-wrap:wrap;">
886
- <a href="/dashboard" class="btn-free" style="background:transparent;border:1px solid var(--cyan);color:var(--cyan);">Try Dashboard Demo</a>
887
- <a href="https://buy.stripe.com/fZu9AT3Ug6zcdWh0XN3sI08" class="btn-pro">Try Pro free for 7 days → $19/mo</a>
798
+ <a href="/dashboard" class="btn-demo-link" style="background:transparent;border:1px solid var(--cyan);color:var(--cyan);">Try Dashboard Demo</a>
799
+ <a href="/checkout/pro?utm_source=website&utm_medium=homepage_final&utm_campaign=pro_pack&cta_id=homepage_final_trial&cta_placement=final&plan_id=pro&landing_path=%2F" class="btn-pro">Try Pro free for 7 days → $19/mo</a>
888
800
  </div>
889
801
  </div>
890
802
  </section>
@@ -899,11 +811,29 @@ __GA_BOOTSTRAP__
899
811
  <a href="https://www.linkedin.com/in/igorganapolsky" target="_blank" rel="noopener">LinkedIn</a>
900
812
  <a href="/blog">Blog</a>
901
813
  </div>
902
- <span class="footer-copy">© 2026 Max Smith KDP LLC · MIT License · v0.9.8</span>
814
+ <span class="footer-copy">© 2026 Max Smith KDP LLC · MIT License · v0.9.10</span>
903
815
  </div>
904
816
  </footer>
905
817
 
818
+ <script src="/js/buyer-intent.js"></script>
906
819
  <script>
820
+ function initializeBuyerIntentForms() {
821
+ globalThis.ThumbGateBuyerIntent.initializeBuyerIntent({
822
+ page: 'homepage',
823
+ duplicateMessage: 'You are already on the list. Checkout on this device is now prefilled.',
824
+ successMessage: 'Saved. We will keep checkout prefilled on this device.',
825
+ });
826
+ }
827
+
828
+ function resolvePricingClickTier(el) {
829
+ if (el.classList.contains('btn-pro')) return 'pro';
830
+ if (el.classList.contains('btn-pro-page')) return 'pro_page';
831
+ if (el.classList.contains('btn-team')) return 'team';
832
+ if (el.classList.contains('btn-free')) return 'free';
833
+ if (el.classList.contains('btn-demo-link')) return 'demo';
834
+ return 'nav';
835
+ }
836
+
907
837
  function copyInstall(el) {
908
838
  navigator.clipboard.writeText('npx thumbgate init').then(function() {
909
839
  var hint = el.querySelector('.copy-hint');
@@ -938,20 +868,19 @@ function copyInstall(el) {
938
868
 
939
869
  /* CTA clicks */
940
870
  trackClick('.btn-pro', 'checkout_start', { tier: 'pro', price: 19, billing: 'monthly' });
871
+ trackClick('.btn-pro-page', 'pro_page_click', { tier: 'pro', source: 'hero' });
941
872
  trackClick('.btn-team', 'workflow_sprint_intake_click', { tier: 'team', offer: 'workflow_hardening_sprint' });
942
873
  trackClick('.btn-free', 'install_click', { tier: 'free' });
943
- trackClick('.nav-cta', 'checkout_start', { tier: 'pro', source: 'nav' });
874
+ trackClick('.btn-demo-link', 'demo_click', { source: 'homepage' });
875
+ trackClick('.nav-cta', 'pro_page_click', { tier: 'pro', source: 'nav' });
944
876
 
945
877
  /* Pricing CTA conversion tracking — fires on every Get Started / Pro / Team button click
946
878
  with section context so we can distinguish pricing section vs final CTA section clicks */
947
- document.querySelectorAll('.btn-pro, .btn-team, .btn-free, .nav-cta').forEach(function(el) {
879
+ document.querySelectorAll('.btn-pro, .btn-pro-page, .btn-team, .btn-free, .btn-demo-link, .nav-cta').forEach(function(el) {
948
880
  el.addEventListener('click', function() {
949
881
  var section = el.closest('section');
950
882
  var sectionId = section ? (section.id || section.className.split(' ')[0] || 'unknown') : 'unknown';
951
- var tier = el.classList.contains('btn-pro') ? 'pro'
952
- : el.classList.contains('btn-team') ? 'team'
953
- : el.classList.contains('btn-free') ? 'free'
954
- : 'nav';
883
+ var tier = resolvePricingClickTier(el);
955
884
  var label = (el.textContent || '').trim().substring(0, 40);
956
885
  if (typeof plausible === 'function') {
957
886
  plausible('pricing_cta_click', { props: { tier: tier, section: sectionId, label: label } });
@@ -992,22 +921,33 @@ function copyInstall(el) {
992
921
  })();
993
922
  </script>
994
923
  <script>
995
- function handleProTrial() {
924
+ initializeBuyerIntentForms();
925
+
926
+ async function handleProTrial() {
927
+ var buyerIntent = globalThis.ThumbGateBuyerIntent;
996
928
  var email = document.getElementById('pro-email');
997
- if (!email || !email.value || !email.value.includes('@')) {
929
+ var normalizedEmail = buyerIntent.normalizeBuyerEmail(email && email.value);
930
+ if (!email || !buyerIntent.isValidBuyerEmail(normalizedEmail)) {
998
931
  email.style.border = '2px solid #f87171';
999
932
  email.placeholder = 'Please enter a valid email';
1000
933
  email.focus();
1001
934
  return;
1002
935
  }
1003
936
  email.style.border = '1px solid #333';
1004
- var checkoutUrl = document.getElementById('pro-checkout-link').href;
1005
- var sep = checkoutUrl.includes('?') ? '&' : '?';
1006
- var finalUrl = checkoutUrl + sep + 'prefilled_email=' + encodeURIComponent(email.value);
937
+ buyerIntent.storeBuyerEmail(normalizedEmail);
938
+ buyerIntent.hydrateBuyerEmailInputs(normalizedEmail);
939
+ buyerIntent.applyBuyerEmailToCheckoutLinks(normalizedEmail);
940
+ var checkoutLink = document.getElementById('pro-checkout-link');
941
+ var checkoutUrl = checkoutLink ? checkoutLink.href : '/checkout/pro';
1007
942
  if (typeof plausible === 'function') {
1008
- plausible('trial_email_captured', { props: { email: email.value } });
943
+ plausible('trial_email_captured', { props: { page: 'homepage', intent: 'checkout' } });
944
+ }
945
+ try {
946
+ await buyerIntent.submitNewsletterSignup(normalizedEmail);
947
+ } catch (_err) {
948
+ // Continue to checkout even if lead capture fails.
1009
949
  }
1010
- window.location.href = finalUrl;
950
+ globalThis.location.assign(checkoutUrl);
1011
951
  }
1012
952
  </script>
1013
953
  </body>