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.
- package/.claude-plugin/README.md +4 -4
- package/.claude-plugin/marketplace.json +4 -2
- package/.claude-plugin/plugin.json +1 -1
- package/.well-known/mcp/server-card.json +1 -1
- package/README.md +115 -312
- package/adapters/README.md +2 -2
- package/adapters/amp/skills/{rlhf-feedback → thumbgate-feedback}/SKILL.md +1 -1
- package/adapters/chatgpt/openapi.yaml +2 -2
- package/adapters/claude/.mcp.json +3 -3
- package/adapters/codex/config.toml +4 -4
- package/adapters/gemini/function-declarations.json +1 -1
- package/adapters/mcp/server-stdio.js +66 -6
- package/adapters/opencode/opencode.json +4 -2
- package/bin/cli.js +188 -39
- package/config/e2e-critical-flows.json +4 -0
- package/config/gates/default.json +74 -2
- package/config/github-about.json +1 -1
- package/config/mcp-allowlists.json +33 -6
- package/config/skill-packs/react-testing.json +1 -1
- package/config/tessl-tiles.json +3 -3
- package/openapi/openapi.yaml +2 -2
- package/package.json +23 -9
- package/plugins/amp-skill/INSTALL.md +3 -2
- package/plugins/amp-skill/SKILL.md +1 -0
- package/plugins/claude-codex-bridge/.claude-plugin/plugin.json +1 -1
- package/plugins/claude-codex-bridge/.mcp.json +5 -3
- package/plugins/claude-codex-bridge/README.md +1 -1
- package/plugins/claude-codex-bridge/skills/setup/SKILL.md +1 -1
- package/plugins/claude-skill/INSTALL.md +4 -3
- package/plugins/claude-skill/SKILL.md +1 -1
- package/plugins/codex-profile/.codex-plugin/plugin.json +1 -1
- package/plugins/codex-profile/.mcp.json +5 -3
- package/plugins/codex-profile/INSTALL.md +2 -2
- package/plugins/codex-profile/README.md +1 -1
- package/plugins/cursor-marketplace/.cursor-plugin/plugin.json +1 -1
- package/plugins/cursor-marketplace/README.md +5 -5
- package/plugins/cursor-marketplace/mcp.json +4 -2
- package/plugins/cursor-marketplace/rules/pre-action-gates.mdc +1 -1
- package/plugins/cursor-marketplace/scripts/gate-check.sh +15 -5
- package/plugins/gemini-extension/INSTALL.md +4 -4
- package/plugins/opencode-profile/INSTALL.md +5 -5
- package/public/dashboard.html +15 -8
- package/public/index.html +134 -375
- package/public/js/buyer-intent.js +252 -0
- package/public/pro.html +1085 -0
- package/scripts/__pycache__/train_from_feedback.cpython-312.pyc +0 -0
- package/scripts/adk-consolidator.js +17 -5
- package/scripts/agent-readiness.js +3 -1
- package/scripts/agent-security-hardening.js +4 -4
- package/scripts/auto-promote-gates.js +8 -0
- package/scripts/auto-wire-hooks.js +105 -21
- package/scripts/billing.js +111 -7
- package/scripts/build-metadata.js +14 -0
- package/scripts/check-congruence.js +1 -1
- package/scripts/context-engine.js +2 -1
- package/scripts/daemon-manager.js +2 -2
- package/scripts/dashboard.js +2 -2
- package/scripts/data-governance.js +1 -1
- package/scripts/deploy-gcp.sh +1 -1
- package/scripts/deploy-policy.js +22 -4
- package/scripts/dispatch-brief.js +1 -1
- package/scripts/ensure-repo-bootstrap.js +1 -1
- package/scripts/feedback-attribution.js +22 -10
- package/scripts/feedback-fallback.js +3 -2
- package/scripts/feedback-inbox-read.js +1 -1
- package/scripts/feedback-loop.js +41 -3
- package/scripts/feedback-paths.js +8 -8
- package/scripts/feedback-schema.js +1 -1
- package/scripts/feedback-to-memory.js +2 -2
- package/scripts/filesystem-search.js +2 -2
- package/scripts/gates-engine.js +765 -34
- package/scripts/generate-paperbanana-diagrams.sh +3 -3
- package/scripts/github-about.js +1 -1
- package/scripts/gtm-revenue-loop.js +20 -1
- package/scripts/hook-runtime.js +89 -0
- package/scripts/hook-stop-self-score.sh +3 -3
- package/scripts/hook-thumbgate-cache-updater.js +98 -37
- package/scripts/hosted-config.js +12 -10
- package/scripts/hybrid-feedback-context.js +54 -13
- package/scripts/install-mcp.js +14 -1
- package/scripts/intent-router.js +1 -1
- package/scripts/internal-agent-bootstrap.js +1 -1
- package/scripts/lesson-inference.js +6 -1
- package/scripts/license.js +54 -16
- package/scripts/mcp-config.js +69 -7
- package/scripts/memory-migration.js +1 -1
- package/scripts/money-watcher.js +166 -16
- package/scripts/operational-integrity.js +480 -0
- package/scripts/optimize-context.js +1 -1
- package/scripts/perplexity-marketing.js +1 -1
- package/scripts/post-everywhere.js +7 -12
- package/scripts/post-to-x.js +1 -1
- package/scripts/pr-manager.js +14 -11
- package/scripts/problem-detail.js +10 -10
- package/scripts/profile-router.js +2 -0
- package/scripts/prompt-dlp.js +1 -0
- package/scripts/prove-adapters.js +6 -6
- package/scripts/prove-automation.js +1 -1
- package/scripts/prove-autoresearch.js +1 -1
- package/scripts/prove-claim-verification.js +3 -3
- package/scripts/prove-data-pipeline.js +5 -5
- package/scripts/prove-data-quality.js +1 -1
- package/scripts/prove-evolution.js +7 -7
- package/scripts/prove-harnesses.js +2 -2
- package/scripts/prove-lancedb.js +2 -2
- package/scripts/prove-local-intelligence.js +1 -1
- package/scripts/prove-loop-closure.js +1 -1
- package/scripts/prove-predictive-insights.js +2 -2
- package/scripts/prove-runtime.js +6 -6
- package/scripts/prove-seo-gsd.js +1 -1
- package/scripts/prove-settings.js +4 -4
- package/scripts/prove-subway-upgrades.js +1 -1
- package/scripts/prove-tessl.js +2 -2
- package/scripts/prove-xmemory.js +2 -2
- package/scripts/publish-decision.js +10 -0
- package/scripts/published-cli.js +34 -0
- package/scripts/rate-limiter.js +2 -2
- package/scripts/reddit-monitor-cron.sh +2 -2
- package/scripts/reminder-engine.js +1 -1
- package/scripts/schedule-manager.js +3 -3
- package/scripts/self-healing-check.js +1 -1
- package/scripts/shieldcortex-memory-firewall-runner.mjs +1 -1
- package/scripts/skill-quality-tracker.js +1 -1
- package/scripts/social-analytics/db/social-analytics.db-shm +0 -0
- package/scripts/social-analytics/db/social-analytics.db-wal +0 -0
- package/scripts/social-analytics/engagement-audit.js +202 -0
- package/scripts/social-analytics/generate-instagram-card.js +1 -1
- package/scripts/social-analytics/instagram-thumbgate-post.js +5 -1
- package/scripts/social-analytics/install-growth-automation.js +114 -0
- package/scripts/social-analytics/publish-instagram-thumbgate.js +8 -2
- package/scripts/social-analytics/publish-thumbgate-launch.js +1 -1
- package/scripts/social-analytics/publishers/reddit.js +7 -12
- package/scripts/social-analytics/publishers/zernio.js +19 -0
- package/scripts/social-analytics/reconcile-thumbgate-campaign.js +165 -0
- package/scripts/social-analytics/schedule-thumbgate-campaign.js +275 -0
- package/scripts/social-analytics/sync-launch-assets.js +185 -0
- package/scripts/social-pipeline.js +2 -2
- package/scripts/social-post-hourly.js +185 -0
- package/scripts/social-quality-gate.js +119 -3
- package/scripts/social-reply-monitor.js +150 -34
- package/scripts/statusline-cache-path.js +27 -0
- package/scripts/statusline-meta.js +22 -0
- package/scripts/statusline.sh +24 -32
- package/scripts/sync-version.js +24 -12
- package/scripts/telemetry-analytics.js +4 -4
- package/scripts/tessl-export.js +1 -1
- package/scripts/test-coverage.js +20 -13
- package/scripts/thumbgate-search.js +2 -2
- package/scripts/tool-registry.js +98 -1
- package/scripts/train_from_feedback.py +1 -1
- package/scripts/user-profile.js +4 -4
- package/scripts/validate-feedback.js +1 -1
- package/scripts/vector-store.js +1 -1
- package/scripts/verification-loop.js +1 -1
- package/scripts/verify-run.js +1 -1
- package/scripts/weekly-auto-post.js +1 -1
- package/skills/{rlhf-feedback → thumbgate-feedback}/SKILL.md +1 -1
- package/src/api/server.js +291 -41
- package/scripts/__pycache__/train_from_feedback.cpython-314.pyc +0 -0
- 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 —
|
|
23
|
-
<meta name="description" content="Pre-action gates for AI coding agents.
|
|
24
|
-
<meta property="og:title" content="ThumbGate —
|
|
25
|
-
<meta property="og:description" content="Pre-action gates for AI coding agents.
|
|
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
|
|
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": "
|
|
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://
|
|
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://
|
|
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": "
|
|
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
|
|
110
|
-
"description": "Set up ThumbGate
|
|
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
|
|
157
|
+
"name": "How is ThumbGate different from model-training feedback loops?",
|
|
158
158
|
"acceptedAnswer": {
|
|
159
159
|
"@type": "Answer",
|
|
160
|
-
"text": "
|
|
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
|
|
351
|
-
.btn-
|
|
352
|
-
.btn-
|
|
353
|
-
.btn-demo:hover { border-color: var(--
|
|
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="
|
|
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">●
|
|
445
|
-
<h1>AI
|
|
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">👎
|
|
448
|
-
<div class="signal-pill signal-up">👍
|
|
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
|
|
451
|
-
<p><strong>
|
|
452
|
-
<div class="hero-
|
|
453
|
-
<a href="
|
|
454
|
-
<a href="
|
|
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-
|
|
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">
|
|
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
|
|
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
|
|
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
|
|
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">
|
|
573
|
-
<h2 class="section-title">Three steps to
|
|
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
|
-
|
|
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">
|
|
620
|
-
<h2 class="section-title">
|
|
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>
|
|
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>
|
|
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>
|
|
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>
|
|
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> </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 .
|
|
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
|
|
754
|
-
<h2 class="section-title">Start free.
|
|
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
|
|
760
|
-
<p style="font-size:13px;color:#aaa;margin-bottom:16px;">For solo
|
|
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"
|
|
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
|
|
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
|
|
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
|
|
797
|
-
<li>Founder-license support — we help you wire
|
|
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?
|
|
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;"
|
|
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
|
|
812
|
-
<p style="font-size:13px;color:var(--green);margin-bottom:16px;font-weight:500;">For teams
|
|
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
|
|
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>
|
|
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>
|
|
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
|
|
822
|
-
<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"
|
|
825
|
-
<p style="font-size:11px;color:#666;margin-top:8px;">Hosted
|
|
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
|
|
834
|
-
<h2 class="section-title">Start
|
|
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
|
|
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">
|
|
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
|
|
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
|
|
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">
|
|
900
|
-
<h2 class="section-title" style="margin-bottom: 16px;">
|
|
901
|
-
<p style="color: var(--text-dim); margin-bottom: 24px; max-width:
|
|
902
|
-
<form action="
|
|
903
|
-
<input type="email" name="email" placeholder="you@company.com" required style="flex: 1; min-width:
|
|
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;"
|
|
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>
|
|
913
|
-
<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="
|
|
916
|
-
<a href="
|
|
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.
|
|
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
|
|
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' }
|
|
1077
|
-
trackClick('.btn-
|
|
1078
|
-
trackClick('.btn-
|
|
1079
|
-
trackClick('.btn-
|
|
1080
|
-
trackClick('.btn-
|
|
1081
|
-
trackClick('.nav-cta', '
|
|
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-
|
|
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
|
|
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
|
-
|
|
924
|
+
initializeBuyerIntentForms();
|
|
925
|
+
|
|
926
|
+
async function handleProTrial() {
|
|
927
|
+
var buyerIntent = globalThis.ThumbGateBuyerIntent;
|
|
1177
928
|
var email = document.getElementById('pro-email');
|
|
1178
|
-
|
|
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
|
-
|
|
1186
|
-
|
|
1187
|
-
|
|
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: {
|
|
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
|
-
|
|
950
|
+
globalThis.location.assign(checkoutUrl);
|
|
1192
951
|
}
|
|
1193
952
|
</script>
|
|
1194
953
|
</body>
|