thumbgate 0.9.9 → 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 (160) hide show
  1. package/.claude-plugin/README.md +4 -4
  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 +2 -2
  7. package/adapters/amp/skills/{rlhf-feedback → thumbgate-feedback}/SKILL.md +1 -1
  8. package/adapters/chatgpt/openapi.yaml +2 -2
  9. package/adapters/claude/.mcp.json +3 -3
  10. package/adapters/codex/config.toml +4 -4
  11. package/adapters/gemini/function-declarations.json +1 -1
  12. package/adapters/mcp/server-stdio.js +66 -6
  13. package/adapters/opencode/opencode.json +4 -2
  14. package/bin/cli.js +188 -39
  15. package/config/e2e-critical-flows.json +4 -0
  16. package/config/gates/default.json +74 -2
  17. package/config/github-about.json +1 -1
  18. package/config/mcp-allowlists.json +33 -6
  19. package/config/skill-packs/react-testing.json +1 -1
  20. package/config/tessl-tiles.json +3 -3
  21. package/openapi/openapi.yaml +2 -2
  22. package/package.json +23 -9
  23. package/plugins/amp-skill/INSTALL.md +3 -2
  24. package/plugins/amp-skill/SKILL.md +1 -0
  25. package/plugins/claude-codex-bridge/.claude-plugin/plugin.json +1 -1
  26. package/plugins/claude-codex-bridge/.mcp.json +5 -3
  27. package/plugins/claude-codex-bridge/README.md +1 -1
  28. package/plugins/claude-codex-bridge/skills/setup/SKILL.md +1 -1
  29. package/plugins/claude-skill/INSTALL.md +4 -3
  30. package/plugins/claude-skill/SKILL.md +1 -1
  31. package/plugins/codex-profile/.codex-plugin/plugin.json +1 -1
  32. package/plugins/codex-profile/.mcp.json +5 -3
  33. package/plugins/codex-profile/INSTALL.md +2 -2
  34. package/plugins/codex-profile/README.md +1 -1
  35. package/plugins/cursor-marketplace/.cursor-plugin/plugin.json +1 -1
  36. package/plugins/cursor-marketplace/README.md +5 -5
  37. package/plugins/cursor-marketplace/mcp.json +4 -2
  38. package/plugins/cursor-marketplace/rules/pre-action-gates.mdc +1 -1
  39. package/plugins/cursor-marketplace/scripts/gate-check.sh +15 -5
  40. package/plugins/gemini-extension/INSTALL.md +4 -4
  41. package/plugins/opencode-profile/INSTALL.md +5 -5
  42. package/public/dashboard.html +15 -8
  43. package/public/index.html +134 -375
  44. package/public/js/buyer-intent.js +252 -0
  45. package/public/pro.html +1085 -0
  46. package/scripts/__pycache__/train_from_feedback.cpython-312.pyc +0 -0
  47. package/scripts/adk-consolidator.js +17 -5
  48. package/scripts/agent-readiness.js +3 -1
  49. package/scripts/agent-security-hardening.js +4 -4
  50. package/scripts/auto-promote-gates.js +8 -0
  51. package/scripts/auto-wire-hooks.js +105 -21
  52. package/scripts/billing.js +111 -7
  53. package/scripts/build-metadata.js +14 -0
  54. package/scripts/check-congruence.js +1 -1
  55. package/scripts/context-engine.js +2 -1
  56. package/scripts/daemon-manager.js +2 -2
  57. package/scripts/dashboard.js +2 -2
  58. package/scripts/data-governance.js +1 -1
  59. package/scripts/deploy-gcp.sh +1 -1
  60. package/scripts/deploy-policy.js +22 -4
  61. package/scripts/dispatch-brief.js +1 -1
  62. package/scripts/ensure-repo-bootstrap.js +1 -1
  63. package/scripts/feedback-attribution.js +22 -10
  64. package/scripts/feedback-fallback.js +3 -2
  65. package/scripts/feedback-inbox-read.js +1 -1
  66. package/scripts/feedback-loop.js +41 -3
  67. package/scripts/feedback-paths.js +8 -8
  68. package/scripts/feedback-schema.js +1 -1
  69. package/scripts/feedback-to-memory.js +2 -2
  70. package/scripts/filesystem-search.js +2 -2
  71. package/scripts/gates-engine.js +765 -34
  72. package/scripts/generate-paperbanana-diagrams.sh +3 -3
  73. package/scripts/github-about.js +1 -1
  74. package/scripts/gtm-revenue-loop.js +20 -1
  75. package/scripts/hook-runtime.js +89 -0
  76. package/scripts/hook-stop-self-score.sh +3 -3
  77. package/scripts/hook-thumbgate-cache-updater.js +98 -37
  78. package/scripts/hosted-config.js +12 -10
  79. package/scripts/hybrid-feedback-context.js +54 -13
  80. package/scripts/install-mcp.js +14 -1
  81. package/scripts/intent-router.js +1 -1
  82. package/scripts/internal-agent-bootstrap.js +1 -1
  83. package/scripts/lesson-inference.js +6 -1
  84. package/scripts/license.js +54 -16
  85. package/scripts/mcp-config.js +69 -7
  86. package/scripts/memory-migration.js +1 -1
  87. package/scripts/money-watcher.js +166 -16
  88. package/scripts/operational-integrity.js +480 -0
  89. package/scripts/optimize-context.js +1 -1
  90. package/scripts/perplexity-marketing.js +1 -1
  91. package/scripts/post-everywhere.js +7 -12
  92. package/scripts/post-to-x.js +1 -1
  93. package/scripts/pr-manager.js +14 -11
  94. package/scripts/problem-detail.js +10 -10
  95. package/scripts/profile-router.js +2 -0
  96. package/scripts/prompt-dlp.js +1 -0
  97. package/scripts/prove-adapters.js +6 -6
  98. package/scripts/prove-automation.js +1 -1
  99. package/scripts/prove-autoresearch.js +1 -1
  100. package/scripts/prove-claim-verification.js +3 -3
  101. package/scripts/prove-data-pipeline.js +5 -5
  102. package/scripts/prove-data-quality.js +1 -1
  103. package/scripts/prove-evolution.js +7 -7
  104. package/scripts/prove-harnesses.js +2 -2
  105. package/scripts/prove-lancedb.js +2 -2
  106. package/scripts/prove-local-intelligence.js +1 -1
  107. package/scripts/prove-loop-closure.js +1 -1
  108. package/scripts/prove-predictive-insights.js +2 -2
  109. package/scripts/prove-runtime.js +6 -6
  110. package/scripts/prove-seo-gsd.js +1 -1
  111. package/scripts/prove-settings.js +4 -4
  112. package/scripts/prove-subway-upgrades.js +1 -1
  113. package/scripts/prove-tessl.js +2 -2
  114. package/scripts/prove-xmemory.js +2 -2
  115. package/scripts/publish-decision.js +10 -0
  116. package/scripts/published-cli.js +34 -0
  117. package/scripts/rate-limiter.js +2 -2
  118. package/scripts/reddit-monitor-cron.sh +2 -2
  119. package/scripts/reminder-engine.js +1 -1
  120. package/scripts/schedule-manager.js +3 -3
  121. package/scripts/self-healing-check.js +1 -1
  122. package/scripts/shieldcortex-memory-firewall-runner.mjs +1 -1
  123. package/scripts/skill-quality-tracker.js +1 -1
  124. package/scripts/social-analytics/db/social-analytics.db-shm +0 -0
  125. package/scripts/social-analytics/db/social-analytics.db-wal +0 -0
  126. package/scripts/social-analytics/engagement-audit.js +202 -0
  127. package/scripts/social-analytics/generate-instagram-card.js +1 -1
  128. package/scripts/social-analytics/instagram-thumbgate-post.js +5 -1
  129. package/scripts/social-analytics/install-growth-automation.js +114 -0
  130. package/scripts/social-analytics/publish-instagram-thumbgate.js +8 -2
  131. package/scripts/social-analytics/publish-thumbgate-launch.js +1 -1
  132. package/scripts/social-analytics/publishers/reddit.js +7 -12
  133. package/scripts/social-analytics/publishers/zernio.js +19 -0
  134. package/scripts/social-analytics/reconcile-thumbgate-campaign.js +165 -0
  135. package/scripts/social-analytics/schedule-thumbgate-campaign.js +275 -0
  136. package/scripts/social-analytics/sync-launch-assets.js +185 -0
  137. package/scripts/social-pipeline.js +2 -2
  138. package/scripts/social-post-hourly.js +185 -0
  139. package/scripts/social-quality-gate.js +119 -3
  140. package/scripts/social-reply-monitor.js +150 -34
  141. package/scripts/statusline-cache-path.js +27 -0
  142. package/scripts/statusline-meta.js +22 -0
  143. package/scripts/statusline.sh +24 -32
  144. package/scripts/sync-version.js +24 -12
  145. package/scripts/telemetry-analytics.js +4 -4
  146. package/scripts/tessl-export.js +1 -1
  147. package/scripts/test-coverage.js +20 -13
  148. package/scripts/thumbgate-search.js +2 -2
  149. package/scripts/tool-registry.js +98 -1
  150. package/scripts/train_from_feedback.py +1 -1
  151. package/scripts/user-profile.js +4 -4
  152. package/scripts/validate-feedback.js +1 -1
  153. package/scripts/vector-store.js +1 -1
  154. package/scripts/verification-loop.js +1 -1
  155. package/scripts/verify-run.js +1 -1
  156. package/scripts/weekly-auto-post.js +1 -1
  157. package/skills/{rlhf-feedback → thumbgate-feedback}/SKILL.md +1 -1
  158. package/src/api/server.js +291 -41
  159. package/scripts/__pycache__/train_from_feedback.cpython-314.pyc +0 -0
  160. package/scripts/social-analytics/db/social-analytics.db +0 -0
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",
@@ -154,10 +154,10 @@ __GA_BOOTSTRAP__
154
154
  },
155
155
  {
156
156
  "@type": "Question",
157
- "name": "How is ThumbGate different from RLHF-the-concept?",
157
+ "name": "How is ThumbGate different from model-training feedback loops?",
158
158
  "acceptedAnswer": {
159
159
  "@type": "Answer",
160
- "text": "ThumbGate updates model weights. ThumbGate doesn't touch the model it injects past feedback into context so your agent is conditioned by your corrections. Think of it as a behavioral immune system, not a training pipeline. The gate blocks are hard enforcement, not soft suggestions."
160
+ "text": "Model-training feedback loops update weights. ThumbGate does not touch the model. It injects past feedback into context so your agent is shaped by your corrections in real time. Think of it as a behavioral immune system, not a training pipeline. The gate blocks are hard enforcement, not soft suggestions."
161
161
  }
162
162
  },
163
163
  {
@@ -250,16 +250,17 @@ __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; }
256
261
  .hero-install .cmd { color: var(--cyan); }
257
262
  .hero-install .copy-hint { font-size: 11px; color: var(--text-muted); font-family: var(--font); margin-left: 8px; }
258
263
  .hero-install .copied { color: var(--green); }
259
- .hero-cta-group { display: flex; justify-content: center; gap: 12px; flex-wrap: wrap; margin: 0 auto 12px; }
260
- .hero-cta-note { font-size: 13px; color: var(--text-dim); max-width: 720px; margin: 0 auto 28px; line-height: 1.6; }
261
- .hero-cta-note a { color: var(--green); text-decoration: none; font-weight: 600; }
262
- .hero-cta-note a:hover { text-decoration: underline; }
263
264
 
264
265
  /* SOCIAL PROOF BAR */
265
266
  .proof-bar { display: flex; justify-content: center; flex-wrap: wrap; gap: 24px; font-size: 13px; color: var(--text-muted); padding: 0 0 8px; }
@@ -347,12 +348,10 @@ __GA_BOOTSTRAP__
347
348
  .price-card li { font-size: 14px; color: var(--text-muted); padding: 6px 0; display: flex; align-items: flex-start; gap: 8px; }
348
349
  .price-card li::before { content: "✓"; color: var(--cyan); font-weight: 700; flex-shrink: 0; }
349
350
  .price-card.pro li::before { color: var(--cyan); }
350
- .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; }
351
- .btn-free:hover { border-color: var(--text-muted); }
352
- .btn-demo { display: block; text-align: center; padding: 10px; border: 1px solid rgba(34,211,238,0.35); border-radius: 8px; color: var(--cyan); background: rgba(34,211,238,0.08); text-decoration: none; font-size: 14px; font-weight: 600; transition: border-color 0.15s, opacity 0.15s; }
353
- .btn-demo:hover { border-color: var(--cyan); opacity: 0.9; }
354
- .btn-proof { display: block; text-align: center; padding: 10px; border: 1px solid rgba(74,222,128,0.35); border-radius: 8px; color: var(--green); background: rgba(74,222,128,0.08); text-decoration: none; font-size: 14px; font-weight: 600; transition: border-color 0.15s, opacity 0.15s; }
355
- .btn-proof:hover { border-color: var(--green); opacity: 0.9; }
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); }
356
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; }
357
356
  .btn-pro:hover { opacity: 0.85; }
358
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; }
@@ -378,21 +377,6 @@ __GA_BOOTSTRAP__
378
377
  .final-cta h2 { font-size: clamp(24px, 3vw, 32px); font-weight: 700; letter-spacing: -0.025em; margin-bottom: 12px; }
379
378
  .final-cta p { font-size: 15px; color: var(--text-muted); margin-bottom: 28px; }
380
379
  .final-cta .btn-pro, .final-cta .btn-team { display: inline-block; padding: 12px 32px; font-size: 15px; border-radius: 8px; margin: 0 6px; }
381
- .buyer-loss-card { max-width: 760px; margin: 40px auto 0; padding: 24px; border: 1px solid var(--border); border-radius: 16px; background: linear-gradient(180deg, rgba(17,17,19,0.98) 0%, rgba(22,22,24,0.96) 100%); text-align: left; }
382
- .buyer-loss-card h3 { font-size: 20px; margin-bottom: 10px; letter-spacing: -0.02em; }
383
- .buyer-loss-card p { margin-bottom: 16px; }
384
- .buyer-loss-grid { display: flex; flex-wrap: wrap; gap: 10px; margin-bottom: 14px; }
385
- .buyer-loss-grid button,
386
- .interest-grid button { background: transparent; color: var(--text); border: 1px solid var(--border); border-radius: 999px; padding: 10px 14px; font: inherit; cursor: pointer; transition: border-color 0.15s, color 0.15s, background 0.15s; }
387
- .buyer-loss-grid button:hover,
388
- .interest-grid button:hover { border-color: var(--cyan); color: var(--cyan); }
389
- .buyer-loss-grid button.selected,
390
- .interest-grid button.selected { border-color: var(--cyan); color: var(--cyan); background: rgba(34,211,238,0.08); }
391
- .interest-label { font-size: 13px; color: var(--text-dim); margin-bottom: 8px; }
392
- .interest-grid { display: flex; flex-wrap: wrap; gap: 10px; margin-bottom: 14px; }
393
- .buyer-loss-card textarea { width: 100%; min-height: 96px; border-radius: 12px; border: 1px solid var(--border); background: var(--bg-card); color: var(--text); padding: 12px 14px; font: inherit; resize: vertical; margin-bottom: 14px; }
394
- .buyer-loss-actions { display: flex; flex-wrap: wrap; gap: 12px; align-items: center; }
395
- .buyer-loss-status { font-size: 13px; color: var(--text-dim); margin: 0; }
396
380
 
397
381
  /* FOOTER */
398
382
  footer { border-top: 1px solid var(--border); padding: 32px 0; }
@@ -410,6 +394,8 @@ __GA_BOOTSTRAP__
410
394
  .pricing-grid { grid-template-columns: 1fr; }
411
395
  .team-form { grid-template-columns: 1fr; }
412
396
  .hero { padding: 72px 0 56px; }
397
+ .hero-actions { flex-direction: column; }
398
+ .hero-actions a { width: 100%; }
413
399
  .nav-links a:not(.nav-cta) { display: none; }
414
400
  .proof-bar { gap: 16px; }
415
401
  .proof-bar .dot { display: none; }
@@ -432,7 +418,7 @@ __GA_BOOTSTRAP__
432
418
  <a href="/guide">Setup Guide</a>
433
419
  <a href="/learn">Learn</a>
434
420
  <a href="/dashboard">Dashboard Demo</a>
435
- <a href="#pricing" class="nav-cta" data-cta-id="nav_view_pricing" data-cta-placement="nav">View Plans</a>
421
+ <a href="/pro?utm_source=website&utm_medium=homepage_nav&utm_campaign=pro_page" class="nav-cta">See Pro</a>
436
422
  </div>
437
423
  </div>
438
424
  </nav>
@@ -441,20 +427,19 @@ __GA_BOOTSTRAP__
441
427
  <section class="hero">
442
428
  <div class="container">
443
429
  <div class="hero-thumbs">👍👎</div>
444
- <div class="hero-badge">● Human-in-the-Loop Enforcement for AI Agents</div>
445
- <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>
446
432
  <div class="hero-signals">
447
- <div class="signal-pill signal-down">👎 blocks dangerous and dumb mistakes before they run</div>
448
- <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>
449
435
  </div>
450
- <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>
451
- <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>
452
- <div class="hero-cta-group">
453
- <a href="https://www.npmjs.com/package/thumbgate" target="_blank" rel="noopener" class="btn-free" data-cta-id="hero_install_free" data-cta-placement="hero" data-plan-id="free">Install Free</a>
454
- <a href="https://github.com/IgorGanapolsky/ThumbGate/blob/main/docs/VERIFICATION_EVIDENCE.md" target="_blank" rel="noopener" class="btn-proof" data-cta-id="hero_proof_pack" data-cta-placement="hero">See Proof Pack</a>
455
- <a href="/checkout/pro?plan_id=pro&billing_cycle=monthly&utm_source=website&utm_medium=cta_button&utm_campaign=landing_page&utm_content=hero&cta_id=hero_pro_trial&cta_placement=hero&landing_path=/" class="btn-pro" data-cta-id="hero_pro_trial" data-cta-placement="hero" data-plan-id="pro">Start 7-Day Pro Trial</a>
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>
456
441
  </div>
457
- <p class="hero-cta-note">Start Free if you want local enforcement with no cloud account. Start Pro if repeated mistakes are already costing you real time and you want the personal local dashboard plus DPO export. Running multiple agents across shared repos? <a href="#workflow-sprint-intake">Start the Team rollout.</a></p>
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>
458
443
  <div class="hero-install" onclick="copyInstall(this)" title="Click to copy">
459
444
  <span class="prompt">$</span>
460
445
  <span class="cmd">npx thumbgate init</span>
@@ -506,20 +491,20 @@ __GA_BOOTSTRAP__
506
491
  <section class="compatibility" id="social-proof">
507
492
  <div class="container">
508
493
  <div class="section-label">See It In Action</div>
509
- <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>
510
495
  <div class="agent-grid">
511
496
  <div class="agent-card">
512
497
  <h3>🔍 Live Dashboard Demo</h3>
513
- <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>
514
499
  <a href="/dashboard" style="display:inline-block;margin-top:12px;color:var(--cyan);font-weight:600;text-decoration:underline;">Open Dashboard Demo →</a>
515
500
  </div>
516
501
  <div class="agent-card">
517
502
  <h3>⛔ Gate Reasoning Chains</h3>
518
- <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>
519
504
  </div>
520
505
  <div class="agent-card">
521
506
  <h3>📊 Org Dashboard (Pro)</h3>
522
- <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>
523
508
  </div>
524
509
  <div class="agent-card">
525
510
  <h3>🧪 Thompson Sampling</h3>
@@ -569,8 +554,8 @@ __GA_BOOTSTRAP__
569
554
  <!-- HOW IT WORKS -->
570
555
  <section class="how-it-works" id="how-it-works">
571
556
  <div class="container">
572
- <div class="section-label">How It Works</div>
573
- <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>
574
559
  <div class="steps">
575
560
  <div class="step">
576
561
  <div class="step-num">1</div>
@@ -592,130 +577,27 @@ __GA_BOOTSTRAP__
592
577
  </section>
593
578
 
594
579
  <!-- PROENTROPIC -->
595
- <section class="compatibility" id="proentropic">
596
- <div class="container">
597
- <div class="section-label">Proentropic Infrastructure</div>
598
- <h2 class="section-title">Built to get stronger from chaos, not break from it</h2>
599
- <div class="agent-grid">
600
- <div class="agent-card">
601
- <h3>Errors are fuel</h3>
602
- <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>
603
- </div>
604
- <div class="agent-card">
605
- <h3>Organizational learning</h3>
606
- <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>
607
- </div>
608
- <div class="agent-card">
609
- <h3>Enterprise-grade governance</h3>
610
- <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>
611
- </div>
612
- </div>
613
- </div>
614
- </section>
615
-
616
- <!-- WHY GUARDRAILS -->
580
+ <!-- GUARDRAILS -->
617
581
  <section class="compatibility" id="guardrails">
618
582
  <div class="container">
619
- <div class="section-label">Production-Grade AI Safety</div>
620
- <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>
621
585
  <div class="agent-grid">
622
586
  <div class="agent-card">
623
587
  <h3>Don't trust — verify</h3>
624
- <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>
625
589
  </div>
626
590
  <div class="agent-card">
627
591
  <h3>Real tools, not wishes</h3>
628
- <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>
629
593
  </div>
630
594
  <div class="agent-card">
631
595
  <h3>Force models to show work</h3>
632
- <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>
633
597
  </div>
634
598
  <div class="agent-card">
635
599
  <h3>Log everything, learn automatically</h3>
636
- <p>Audit trail records every allow/deny/warn. Repeated failures auto-promote to gates. Org dashboard shows all agents across your team.</p>
637
- </div>
638
- <div class="agent-card">
639
- <h3>Keep one correction thread</h3>
640
- <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>
641
- </div>
642
- </div>
643
- </div>
644
- </section>
645
-
646
- <!-- AI CONTROL TOWER -->
647
- <section class="compatibility" id="control-tower">
648
- <div class="container">
649
- <div class="section-label">Recently shipped</div>
650
- <h2 class="section-title">AI Control Tower: monitor, alert, and act</h2>
651
- <div class="agent-grid">
652
- <div class="agent-card">
653
- <h3>Domain skill packs</h3>
654
- <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>
655
- </div>
656
- <div class="agent-card">
657
- <h3>Tool-level KPIs</h3>
658
- <p>P50/P90/P95 latency and success rate per tool. Drill from gateway health down to the exact tool causing issues.</p>
659
- </div>
660
- <div class="agent-card">
661
- <h3>SLO alerts</h3>
662
- <p>Define thresholds for success rate and latency. Breach triggers webhook alerts to Slack, Teams, or Discord automatically.</p>
663
- </div>
664
- <div class="agent-card">
665
- <h3>Access anomaly detection</h3>
666
- <p>Tracks authorized vs failed access. Moving-average spike detection flags per-agent abuse. Security governance on autopilot.</p>
667
- </div>
668
- <div class="agent-card">
669
- <h3>Metered outcome pricing</h3>
670
- <p>$0.10 per blocked mistake (Pro). Minimum $19/mo floor. You pay for value delivered, not seats warmed.</p>
671
- </div>
672
- <div class="agent-card">
673
- <h3>Ambient daily digest</h3>
674
- <p>Push Slack/Teams/Discord summary at 9am. Weekly stats export for build-in-public content. Check in once a day, not babysit.</p>
675
- </div>
676
- </div>
677
- </div>
678
- </section>
679
-
680
- <!-- PROGRESSIVE DISCLOSURE -->
681
- <section class="compatibility" id="progressive-disclosure">
682
- <div class="container">
683
- <div class="section-label">New in v0.9.9</div>
684
- <h2 class="section-title">82% fewer tokens with progressive skill loading</h2>
685
- <div class="agent-grid">
686
- <div class="agent-card">
687
- <h3>3-tier disclosure</h3>
688
- <p>L1 metadata at startup (27 tokens). L2 rules on activation. L3 reference files on demand. Agents load only what they need.</p>
689
- </div>
690
- <div class="agent-card">
691
- <h3>Skill factory</h3>
692
- <p>Agent auto-generates new skill packs from recurring failures. Lessons become NEVER/ALWAYS rules. No manual curation needed.</p>
693
- </div>
694
- <div class="agent-card">
695
- <h3>Security hardening</h3>
696
- <p>Credential attestation per tool call. Privilege escalation detection against MCP profiles. Dependency gate blocks supply chain attacks.</p>
697
- </div>
698
- </div>
699
- </div>
700
- </section>
701
-
702
- <!-- BACKGROUND AGENT GOVERNANCE -->
703
- <section class="compatibility" id="background-agents">
704
- <div class="container">
705
- <div class="section-label">For Background Agent Teams</div>
706
- <h2 class="section-title">Your agents write 57% of PRs. ThumbGate makes sure they don't repeat mistakes.</h2>
707
- <div class="agent-grid">
708
- <div class="agent-card">
709
- <h3>Run governance gate</h3>
710
- <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>
711
- </div>
712
- <div class="agent-card">
713
- <h3>Auto-capture from CI</h3>
714
- <p>CI pass/fail auto-generates structured feedback. No human in the loop. The agent learns from every merge and every rejection.</p>
715
- </div>
716
- <div class="agent-card">
717
- <h3>Governance report</h3>
718
- <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>
719
601
  </div>
720
602
  </div>
721
603
  </div>
@@ -740,7 +622,7 @@ __GA_BOOTSTRAP__
740
622
  <div><span class="comment"># Rule auto-generated from your previous 👎</span></div>
741
623
  <div>&nbsp;</div>
742
624
  <div><span class="comment"># Works with your existing setup</span></div>
743
- <div><span class="fn">npx</span> thumbgate init <span class="comment"># bootstraps .rlhf and .mcp.json</span></div>
625
+ <div><span class="fn">npx</span> thumbgate init <span class="comment"># bootstraps .thumbgate and .mcp.json</span></div>
744
626
  <div><span class="comment"># Use repo guides for Claude plugin, Codex app plugin, Cursor plugin, and OpenCode profiles</span></div>
745
627
  </div>
746
628
  </div>
@@ -750,14 +632,14 @@ __GA_BOOTSTRAP__
750
632
  <!-- PRICING -->
751
633
  <section class="pricing" id="pricing">
752
634
  <div class="container">
753
- <div class="section-label">Pricing — 7-Day Free Trial</div>
754
- <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>
755
637
  <div class="pricing-grid">
756
638
  <div class="price-card">
757
639
  <div class="tier">Free</div>
758
640
  <div class="price">$0</div>
759
- <div class="price-sub">Forever free · Local-only, single dev</div>
760
- <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>
761
643
  <ul>
762
644
  <li>Unlimited feedback captures · 5 lesson searches/day · unlimited recall</li>
763
645
  <li>5 auto-promoted gates plus the core safety policy</li>
@@ -766,15 +648,15 @@ __GA_BOOTSTRAP__
766
648
  <li>Local SQLite lesson DB</li>
767
649
  <li><a href="/guide" style="color:var(--cyan);text-decoration:underline;">Setup guide for all agents →</a></li>
768
650
  </ul>
769
- <a href="https://www.npmjs.com/package/thumbgate" target="_blank" rel="noopener" class="btn-free" data-cta-id="pricing_free_install" data-cta-placement="pricing_card" data-plan-id="free">Install Free</a>
651
+ <a href="https://www.npmjs.com/package/thumbgate" target="_blank" rel="noopener" class="btn-free">Install Free</a>
770
652
  </div>
771
653
  <div class="price-card pro" data-price-dollars="__PRO_PRICE_DOLLARS__">
772
654
  <div class="tier">Pro</div>
773
655
  <div class="price">$19<span style="font-size:16px;color:var(--text-dim)">/mo</span></div>
774
656
  <div class="price-sub">or $149/yr (save 35%) · Personal dashboard + exports</div>
775
- <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>
776
658
  <div class="pro-upgrade-triggers" style="font-size:12px;color:#aaa;margin-bottom:12px;">
777
- <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.
778
660
  </div>
779
661
  <div class="dashboard-preview" style="margin-bottom:16px;border:1px solid #333;border-radius:8px;overflow:hidden;">
780
662
  <div style="background:linear-gradient(135deg,#1a1a2e 0%,#16213e 100%);padding:16px;text-align:center;">
@@ -793,36 +675,36 @@ __GA_BOOTSTRAP__
793
675
  <li>Auto-connect — activate once with your license key, then your running agents appear automatically on your local dashboard</li>
794
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>
795
677
  <li><strong>Model Hardening Advisor</strong> — get recommendations on when and how to fine-tune your model to natively avoid recurring failures</li>
796
- <li>Personal local dashboard — every Pro user gets their own localhost dashboard without extra cloud setup</li>
797
- <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>
798
680
  </ul>
799
- <a href="/checkout/pro?plan_id=pro&billing_cycle=monthly&utm_source=website&utm_medium=cta_button&utm_campaign=landing_page&utm_content=pricing_card&cta_id=pricing_pro_trial_email_gate&cta_placement=pricing_card&landing_path=/" class="btn-pro" style="display:none" id="pro-checkout-link" data-cta-id="pricing_pro_trial_email_gate" data-cta-placement="pricing_card" data-plan-id="pro">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>
800
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>
801
683
  <div class="email-gate" style="margin-bottom:12px;">
802
- <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;">
803
685
  </div>
804
- <button class="btn-pro" id="pro-trial-btn" onclick="handleProTrial()" style="width:100%;cursor:pointer;border:none;" data-cta-id="pricing_pro_trial_email_gate" data-cta-placement="pricing_card" data-plan-id="pro">Start 7-Day Free Trial</button>
686
+ <button class="btn-pro" id="pro-trial-btn" onclick="handleProTrial()" style="width:100%;cursor:pointer;border:none;">Start 7-Day Free Trial</button>
805
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>
806
688
  <p style="font-size:12px;color:var(--cyan);margin-top:6px;">Mem0 Pro: $249/mo. ThumbGate Pro: $19/mo.</p>
807
689
  </div>
808
690
  <div class="price-card team">
809
691
  <div class="tier">Team</div>
810
692
  <div class="price">$12<span style="font-size:16px;color:var(--text-dim)">/seat/mo</span></div>
811
- <div class="price-sub">Starts at $36/mo for 3 seats · or $297/yr · Shared lessons + org visibility</div>
812
- <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>
813
695
  <div class="pro-upgrade-triggers" style="font-size:12px;color:#aaa;margin-bottom:12px;">
814
- <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.
815
697
  </div>
816
698
  <ul>
817
- <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>
818
700
  <li>Org dashboard — active agents, gate hit rates, risk agents, and proof-backed team metrics in one place</li>
819
- <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>
820
702
  <li>Gate template library — pre-built guardrails for force-pushes, skipped tests, destructive SQL, and evidence-before-done</li>
821
- <li>Workflow hardening sprint — intake, rollout plan, and evidence pack for the first shared workflow</li>
822
- <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>
823
705
  </ul>
824
- <a href="#workflow-sprint-intake" class="btn-team" data-cta-id="pricing_team_rollout" data-cta-placement="pricing_card" data-plan-id="team">Start Team Rollout</a>
825
- <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>
826
708
  </div>
827
709
  </div>
828
710
  </div>
@@ -830,9 +712,9 @@ __GA_BOOTSTRAP__
830
712
 
831
713
  <section class="compatibility" id="workflow-sprint-intake">
832
714
  <div class="container">
833
- <div class="section-label">Team Rollout</div>
834
- <h2 class="section-title">Start the Team lane with one workflow that matters</h2>
835
- <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>
836
718
  <form class="team-form" action="/v1/intake/workflow-sprint" method="POST">
837
719
  <input type="hidden" name="ctaId" value="workflow_sprint_intake">
838
720
  <input type="hidden" name="ctaPlacement" value="team_pricing">
@@ -845,7 +727,7 @@ __GA_BOOTSTRAP__
845
727
  <textarea class="full" name="blocker" placeholder="What repeat mistake, rollout blocker, or team handoff failure keeps happening?" required></textarea>
846
728
  <textarea class="full" name="note" placeholder="Optional context: team size, repos involved, target rollout date, or what you need to prove internally."></textarea>
847
729
  <div class="full">
848
- <button type="submit" class="btn-team">Submit Team Workflow Intake</button>
730
+ <button type="submit" class="btn-team">Start Team Pilot Intake</button>
849
731
  </div>
850
732
  </form>
851
733
  </div>
@@ -862,7 +744,7 @@ __GA_BOOTSTRAP__
862
744
  <div class="faq-a">Yes. ThumbGate Pro includes a Model Hardening Advisor and LoRA JSONL export. Pro users can export their episodic memory as DPO (Direct Preference Optimization) pairs to fine-tune local models (like Llama 3 or Mistral) so they natively avoid repeating known mistakes.</div>
863
745
  </div>
864
746
  <div class="faq-item">
865
- <div class="faq-q" role="button" tabindex="0" aria-expanded="false" onclick="toggleFaq(this)" onkeydown="handleFaqKeydown(event)">How is ThumbGate different from RLHF-the-concept?</div>
747
+ <div class="faq-q" role="button" tabindex="0" aria-expanded="false" onclick="toggleFaq(this)" onkeydown="handleFaqKeydown(event)">How is ThumbGate different from model-training feedback loops?</div>
866
748
  <div class="faq-a">ThumbGate's intelligence is context, not weights. It doesn't touch the model — it injects past feedback into context so your agent is conditioned by your corrections. Think of it as a behavioral immune system, not a training pipeline. The gate blocks are hard enforcement, not soft suggestions.</div>
867
749
  </div>
868
750
  <div class="faq-item">
@@ -875,7 +757,7 @@ __GA_BOOTSTRAP__
875
757
  </div>
876
758
  <div class="faq-item">
877
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>
878
- <div class="faq-a">No. Free keeps local enforcement on your machine with unlimited feedback captures, 5 lesson searches/day, 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>
879
761
  </div>
880
762
  <div class="faq-item">
881
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>
@@ -883,7 +765,7 @@ __GA_BOOTSTRAP__
883
765
  </div>
884
766
  <div class="faq-item">
885
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>
886
- <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>
887
769
  </div>
888
770
  <div class="faq-item">
889
771
  <div class="faq-q" role="button" tabindex="0" aria-expanded="false" onclick="toggleFaq(this)" onkeydown="handleFaqKeydown(event)">What does Pro cost?</div>
@@ -896,51 +778,25 @@ __GA_BOOTSTRAP__
896
778
  <!-- NEWSLETTER SIGNUP -->
897
779
  <section class="compatibility" id="newsletter" style="padding: 48px 0;">
898
780
  <div class="container" style="text-align: center;">
899
- <div class="section-label">Stay in the loop</div>
900
- <h2 class="section-title" style="margin-bottom: 16px;">Get notified when we ship</h2>
901
- <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>
902
- <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;">
903
- <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;">
904
- <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>
905
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>
906
789
  </div>
907
790
  </section>
908
791
 
909
792
  <!-- FINAL CTA -->
910
793
  <section class="final-cta">
911
794
  <div class="container">
912
- <h2>Ready to stop fixing the same AI mistakes?</h2>
913
- <p>Install Free if you want local enforcement with no cloud account. Try the dashboard demo if you want proof first. Start Pro when repeated mistakes are already expensive.</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>
914
797
  <div style="display:flex;gap:12px;justify-content:center;flex-wrap:wrap;">
915
- <a href="https://www.npmjs.com/package/thumbgate" target="_blank" rel="noopener" class="btn-free" data-cta-id="final_install_free" data-cta-placement="final_cta" data-plan-id="free">Install Free</a>
916
- <a href="https://github.com/IgorGanapolsky/ThumbGate/blob/main/docs/VERIFICATION_EVIDENCE.md" target="_blank" rel="noopener" class="btn-proof" data-cta-id="final_proof_pack" data-cta-placement="final_cta">See Proof Pack</a>
917
- <a href="/dashboard" class="btn-demo" data-cta-id="final_dashboard_demo" data-cta-placement="final_cta">Try Dashboard Demo</a>
918
- <a href="/checkout/pro?plan_id=pro&billing_cycle=monthly&utm_source=website&utm_medium=cta_button&utm_campaign=landing_page&utm_content=final_cta&cta_id=final_pro_trial&cta_placement=final_cta&landing_path=/" class="btn-pro" data-cta-id="final_pro_trial" data-cta-placement="final_cta" data-plan-id="pro">Try Pro free for 7 days → $19/mo</a>
919
- </div>
920
- <p style="font-size:12px;color:var(--text-dim);margin-top:12px;">Teams start at $36/mo for 3 seats when one lesson needs to protect multiple engineers.</p>
921
- <div class="buyer-loss-card" id="buyer-loss-feedback">
922
- <h3>Not buying yet?</h3>
923
- <p>Tell us the blocker. This writes straight into first-party telemetry so we can fix the real objection instead of guessing.</p>
924
- <div class="buyer-loss-grid">
925
- <button type="button" data-reason="too_expensive">Too expensive</button>
926
- <button type="button" data-reason="not_ready">Just researching</button>
927
- <button type="button" data-reason="need_team_features">Need team workflow features</button>
928
- <button type="button" data-reason="need_team_approval">Need team approval</button>
929
- <button type="button" data-reason="need_more_proof">Need more proof or trust</button>
930
- <button type="button" data-reason="integration_unclear">Integration is unclear</button>
931
- </div>
932
- <div class="interest-label">How close are you?</div>
933
- <div class="interest-grid">
934
- <button type="button" data-interest="high">Ready this week</button>
935
- <button type="button" data-interest="medium">Maybe this month</button>
936
- <button type="button" data-interest="low">Just exploring</button>
937
- </div>
938
- <textarea id="buyer-loss-note" placeholder="Optional detail: team size, runtime, workflow, competitor, trust blocker, or missing feature."></textarea>
939
- <div class="buyer-loss-actions">
940
- <button type="button" id="buyer-loss-submit" class="btn-demo">Send feedback</button>
941
- <a href="https://github.com/IgorGanapolsky/ThumbGate/blob/main/docs/VERIFICATION_EVIDENCE.md" target="_blank" rel="noopener" class="btn-proof" data-cta-id="buyer_loss_proof_pack" data-cta-placement="buyer_loss">See Proof Pack</a>
942
- <p class="buyer-loss-status" id="buyer-loss-status">No feedback sent yet.</p>
943
- </div>
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>
944
800
  </div>
945
801
  </div>
946
802
  </section>
@@ -955,11 +811,29 @@ __GA_BOOTSTRAP__
955
811
  <a href="https://www.linkedin.com/in/igorganapolsky" target="_blank" rel="noopener">LinkedIn</a>
956
812
  <a href="/blog">Blog</a>
957
813
  </div>
958
- <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>
959
815
  </div>
960
816
  </footer>
961
817
 
818
+ <script src="/js/buyer-intent.js"></script>
962
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
+
963
837
  function copyInstall(el) {
964
838
  navigator.clipboard.writeText('npx thumbgate init').then(function() {
965
839
  var hint = el.querySelector('.copy-hint');
@@ -972,87 +846,10 @@ function copyInstall(el) {
972
846
 
973
847
  /* ── Plausible custom event tracking ── */
974
848
  (function() {
975
- function pickFirstText() {
976
- for (var i = 0; i < arguments.length; i += 1) {
977
- var value = arguments[i];
978
- if (value === undefined || value === null) continue;
979
- var text = String(value).trim();
980
- if (text) return text;
981
- }
982
- return null;
983
- }
984
-
985
- function sendFirstPartyTelemetry(payload) {
986
- var body = JSON.stringify(payload);
987
- if (navigator.sendBeacon) {
988
- navigator.sendBeacon('/v1/telemetry/ping', new Blob([body], { type: 'application/json' }));
989
- return;
990
- }
991
- fetch('/v1/telemetry/ping', {
992
- method: 'POST',
993
- headers: { 'Content-Type': 'application/json' },
994
- body: body,
995
- keepalive: true,
996
- }).catch(function() {});
997
- }
998
-
999
- function buildCtaTelemetryPayload(el, extra) {
1000
- var pageParams = new URLSearchParams(window.location.search);
1001
- var href = el.getAttribute('href');
1002
- var targetUrl = null;
1003
- try {
1004
- if (href) targetUrl = new URL(href, window.location.origin);
1005
- } catch (_) {
1006
- targetUrl = null;
1007
- }
1008
- var targetParams = targetUrl ? targetUrl.searchParams : null;
1009
- return Object.assign({
1010
- eventType: 'cta_click',
1011
- clientType: 'web',
1012
- visitorId: serverVisitorId || undefined,
1013
- sessionId: serverSessionId || undefined,
1014
- acquisitionId: serverAcquisitionId || undefined,
1015
- source: pickFirstText(pageParams.get('utm_source'), 'website'),
1016
- utmSource: pickFirstText(pageParams.get('utm_source'), 'website'),
1017
- utmMedium: pageParams.get('utm_medium') || undefined,
1018
- utmCampaign: pageParams.get('utm_campaign') || undefined,
1019
- utmContent: pageParams.get('utm_content') || undefined,
1020
- utmTerm: pageParams.get('utm_term') || undefined,
1021
- creator: pickFirstText(pageParams.get('creator'), pageParams.get('creator_handle')) || undefined,
1022
- community: pickFirstText(pageParams.get('community'), pageParams.get('subreddit')) || undefined,
1023
- postId: pageParams.get('post_id') || undefined,
1024
- commentId: pageParams.get('comment_id') || undefined,
1025
- campaignVariant: pageParams.get('campaign_variant') || undefined,
1026
- offerCode: pageParams.get('offer_code') || undefined,
1027
- ctaId: pickFirstText(el.getAttribute('data-cta-id'), targetParams && targetParams.get('cta_id')) || undefined,
1028
- ctaPlacement: pickFirstText(el.getAttribute('data-cta-placement'), targetParams && targetParams.get('cta_placement')) || undefined,
1029
- planId: pickFirstText(el.getAttribute('data-plan-id'), targetParams && targetParams.get('plan_id')) || undefined,
1030
- billingCycle: targetParams && targetParams.get('billing_cycle') || undefined,
1031
- landingPath: window.location.pathname || '/',
1032
- page: window.location.pathname || '/',
1033
- referrer: document.referrer || undefined,
1034
- }, extra || {});
1035
- }
1036
-
1037
- function bindToggleButtons(selector, stateKey) {
1038
- document.querySelectorAll(selector).forEach(function(button) {
1039
- button.addEventListener('click', function() {
1040
- document.querySelectorAll(selector).forEach(function(candidate) {
1041
- candidate.classList.remove('selected');
1042
- });
1043
- button.classList.add('selected');
1044
- window[stateKey] = button.getAttribute(stateKey === '__thumbgateReason' ? 'data-reason' : 'data-interest');
1045
- });
1046
- });
1047
- }
1048
-
1049
- function trackClick(selector, eventName, props, telemetryExtra) {
849
+ function trackClick(selector, eventName, props) {
1050
850
  document.querySelectorAll(selector).forEach(function(el) {
1051
851
  el.addEventListener('click', function() {
1052
852
  if (typeof plausible === 'function') plausible(eventName, { props: props || {} });
1053
- if (telemetryExtra) {
1054
- sendFirstPartyTelemetry(buildCtaTelemetryPayload(el, telemetryExtra));
1055
- }
1056
853
  });
1057
854
  });
1058
855
  }
@@ -1069,29 +866,21 @@ function copyInstall(el) {
1069
866
  toggleFaq(event.currentTarget);
1070
867
  }
1071
868
 
1072
- window.__thumbgateReason = null;
1073
- window.__thumbgateInterest = null;
1074
-
1075
869
  /* CTA clicks */
1076
- trackClick('.btn-pro', 'checkout_start', { tier: 'pro', price: 19, billing: 'monthly' }, { eventType: 'cta_click' });
1077
- trackClick('.btn-team', 'workflow_sprint_intake_click', { tier: 'team', offer: 'workflow_hardening_sprint' }, { eventType: 'cta_click' });
1078
- trackClick('.btn-free', 'install_click', { tier: 'free' }, { eventType: 'cta_click' });
1079
- trackClick('.btn-demo', 'dashboard_demo_click', { tier: 'demo' }, { eventType: 'cta_click' });
1080
- trackClick('.btn-proof', 'proof_pack_click', { tier: 'proof' }, { eventType: 'cta_click' });
1081
- trackClick('.nav-cta', 'view_pricing_click', { source: 'nav' }, { eventType: 'cta_click' });
870
+ trackClick('.btn-pro', 'checkout_start', { tier: 'pro', price: 19, billing: 'monthly' });
871
+ trackClick('.btn-pro-page', 'pro_page_click', { tier: 'pro', source: 'hero' });
872
+ trackClick('.btn-team', 'workflow_sprint_intake_click', { tier: 'team', offer: 'workflow_hardening_sprint' });
873
+ trackClick('.btn-free', 'install_click', { tier: 'free' });
874
+ trackClick('.btn-demo-link', 'demo_click', { source: 'homepage' });
875
+ trackClick('.nav-cta', 'pro_page_click', { tier: 'pro', source: 'nav' });
1082
876
 
1083
877
  /* Pricing CTA conversion tracking — fires on every Get Started / Pro / Team button click
1084
878
  with section context so we can distinguish pricing section vs final CTA section clicks */
1085
- document.querySelectorAll('.btn-pro, .btn-team, .btn-free, .btn-demo, .btn-proof, .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) {
1086
880
  el.addEventListener('click', function() {
1087
881
  var section = el.closest('section');
1088
882
  var sectionId = section ? (section.id || section.className.split(' ')[0] || 'unknown') : 'unknown';
1089
- var tier = el.classList.contains('btn-pro') ? 'pro'
1090
- : el.classList.contains('btn-team') ? 'team'
1091
- : el.classList.contains('btn-proof') ? 'proof'
1092
- : el.classList.contains('btn-demo') ? 'demo'
1093
- : el.classList.contains('btn-free') ? 'free'
1094
- : 'nav';
883
+ var tier = resolvePricingClickTier(el);
1095
884
  var label = (el.textContent || '').trim().substring(0, 40);
1096
885
  if (typeof plausible === 'function') {
1097
886
  plausible('pricing_cta_click', { props: { tier: tier, section: sectionId, label: label } });
@@ -1129,66 +918,36 @@ function copyInstall(el) {
1129
918
 
1130
919
  /* SEO/comparison page clicks */
1131
920
  trackClick('.seo-card', 'seo_page_click');
1132
-
1133
- bindToggleButtons('[data-reason]', '__thumbgateReason');
1134
- bindToggleButtons('[data-interest]', '__thumbgateInterest');
1135
-
1136
- var buyerLossButton = document.getElementById('buyer-loss-submit');
1137
- if (buyerLossButton) {
1138
- buyerLossButton.addEventListener('click', function() {
1139
- var noteEl = document.getElementById('buyer-loss-note');
1140
- var statusEl = document.getElementById('buyer-loss-status');
1141
- sendFirstPartyTelemetry({
1142
- eventType: 'reason_not_buying',
1143
- clientType: 'web',
1144
- visitorId: serverVisitorId || undefined,
1145
- sessionId: serverSessionId || undefined,
1146
- acquisitionId: serverAcquisitionId || undefined,
1147
- source: 'website',
1148
- utmSource: 'website',
1149
- utmMedium: 'landing_feedback',
1150
- utmCampaign: 'landing_page',
1151
- reasonCode: window.__thumbgateReason || 'unspecified',
1152
- reasonDetail: noteEl && noteEl.value ? noteEl.value : undefined,
1153
- pricingInterest: window.__thumbgateInterest || undefined,
1154
- landingPath: window.location.pathname || '/',
1155
- page: window.location.pathname || '/',
1156
- referrer: document.referrer || undefined,
1157
- });
1158
- if (typeof plausible === 'function') {
1159
- plausible('buyer_loss_feedback', {
1160
- props: {
1161
- reason: window.__thumbgateReason || 'unspecified',
1162
- interest: window.__thumbgateInterest || 'unknown',
1163
- },
1164
- });
1165
- }
1166
- if (statusEl) {
1167
- statusEl.textContent = window.__thumbgateReason
1168
- ? 'Feedback saved: ' + window.__thumbgateReason.replaceAll('_', ' ') + '.'
1169
- : 'Feedback saved.';
1170
- }
1171
- });
1172
- }
1173
921
  })();
1174
922
  </script>
1175
923
  <script>
1176
- function handleProTrial() {
924
+ initializeBuyerIntentForms();
925
+
926
+ async function handleProTrial() {
927
+ var buyerIntent = globalThis.ThumbGateBuyerIntent;
1177
928
  var email = document.getElementById('pro-email');
1178
- if (!email || !email.value || !email.value.includes('@')) {
929
+ var normalizedEmail = buyerIntent.normalizeBuyerEmail(email && email.value);
930
+ if (!email || !buyerIntent.isValidBuyerEmail(normalizedEmail)) {
1179
931
  email.style.border = '2px solid #f87171';
1180
932
  email.placeholder = 'Please enter a valid email';
1181
933
  email.focus();
1182
934
  return;
1183
935
  }
1184
936
  email.style.border = '1px solid #333';
1185
- var checkoutUrl = document.getElementById('pro-checkout-link').href;
1186
- var sep = checkoutUrl.includes('?') ? '&' : '?';
1187
- var finalUrl = checkoutUrl + sep + 'customer_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';
1188
942
  if (typeof plausible === 'function') {
1189
- plausible('trial_email_captured', { props: { email: email.value, ctaId: 'pricing_pro_trial_email_gate' } });
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.
1190
949
  }
1191
- window.location.href = finalUrl;
950
+ globalThis.location.assign(checkoutUrl);
1192
951
  }
1193
952
  </script>
1194
953
  </body>