thumbgate 1.19.0 → 1.21.0
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/marketplace.json +40 -12
- package/.claude-plugin/plugin.json +15 -6
- package/.well-known/mcp/server-card.json +1 -1
- package/README.md +34 -14
- package/adapters/claude/.mcp.json +2 -2
- package/adapters/mcp/server-stdio.js +15 -5
- package/adapters/opencode/opencode.json +1 -1
- package/bin/cli.js +131 -3
- package/bin/postinstall.js +19 -13
- package/config/merge-quality-checks.json +0 -1
- package/config/post-deploy-marketing-pages.json +46 -0
- package/package.json +75 -60
- package/public/agent-manager.html +139 -0
- package/public/compare.html +6 -0
- package/public/guide.html +23 -0
- package/public/index.html +100 -127
- package/public/learn.html +31 -0
- package/public/numbers.html +2 -2
- package/public/pricing.html +345 -0
- package/public/pro.html +3 -22
- package/scripts/auto-promote-gates.js +160 -13
- package/scripts/auto-wire-hooks.js +50 -29
- package/scripts/billing.js +64 -0
- package/scripts/cli-feedback.js +9 -1
- package/scripts/context-manager.js +42 -2
- package/scripts/feedback-loop.js +2 -1
- package/scripts/gates-engine.js +133 -7
- package/scripts/license.js +0 -1
- package/scripts/rate-limiter.js +47 -1
- package/scripts/tool-registry.js +28 -0
- package/scripts/verify-marketing-pages-deployed.js +195 -0
- package/src/api/server.js +514 -239
|
@@ -0,0 +1,345 @@
|
|
|
1
|
+
<!DOCTYPE html>
|
|
2
|
+
<html lang="en">
|
|
3
|
+
<head>
|
|
4
|
+
<meta charset="UTF-8">
|
|
5
|
+
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
|
6
|
+
__GOOGLE_SITE_VERIFICATION_META__
|
|
7
|
+
<title>Pricing — ThumbGate</title>
|
|
8
|
+
<meta name="description" content="ThumbGate pricing: free CLI forever, $19/mo Pro dashboard, and intake-led Team enforcement at $49/seat after scope. One clear subscription path.">
|
|
9
|
+
<meta property="og:title" content="Pricing — ThumbGate">
|
|
10
|
+
<meta property="og:description" content="Free CLI, Pro self-serve, and Team after workflow scope. No mixed consulting checkout maze.">
|
|
11
|
+
<meta property="og:type" content="website">
|
|
12
|
+
<meta property="og:url" content="__APP_ORIGIN__/pricing">
|
|
13
|
+
<meta property="og:image" content="/og.png">
|
|
14
|
+
<link rel="canonical" href="__APP_ORIGIN__/pricing">
|
|
15
|
+
<link rel="icon" type="image/png" href="/thumbgate-icon.png">
|
|
16
|
+
<link rel="apple-touch-icon" href="/assets/brand/thumbgate-mark.svg">
|
|
17
|
+
|
|
18
|
+
<script defer data-domain="thumbgate-production.up.railway.app" src="https://plausible.io/js/script.tagged-events.js"></script>
|
|
19
|
+
__GA_BOOTSTRAP__
|
|
20
|
+
|
|
21
|
+
<script>
|
|
22
|
+
const gaMeasurementId = '__GA_MEASUREMENT_ID__';
|
|
23
|
+
const serverVisitorId = '__SERVER_VISITOR_ID__';
|
|
24
|
+
const serverSessionId = '__SERVER_SESSION_ID__';
|
|
25
|
+
const serverAcquisitionId = '__SERVER_ACQUISITION_ID__';
|
|
26
|
+
const serverTelemetryCaptured = '__SERVER_TELEMETRY_CAPTURED__' === 'true';
|
|
27
|
+
const proPriceDollars = Number('__PRO_PRICE_DOLLARS__') || 19;
|
|
28
|
+
</script>
|
|
29
|
+
|
|
30
|
+
<script type="application/ld+json">
|
|
31
|
+
{
|
|
32
|
+
"@context": "https://schema.org",
|
|
33
|
+
"@type": "SoftwareApplication",
|
|
34
|
+
"name": "ThumbGate",
|
|
35
|
+
"applicationCategory": "DeveloperApplication",
|
|
36
|
+
"operatingSystem": "Cross-platform, Node.js >=18.18.0",
|
|
37
|
+
"url": "__APP_ORIGIN__/pricing",
|
|
38
|
+
"offers": [
|
|
39
|
+
{ "@type": "Offer", "name": "ThumbGate CLI (Free)", "price": "0", "priceCurrency": "USD" },
|
|
40
|
+
{ "@type": "Offer", "name": "ThumbGate Pro Monthly", "price": "__PRO_PRICE_DOLLARS__", "priceCurrency": "USD", "url": "__APP_ORIGIN__/checkout/pro?plan_id=pro&billing_cycle=monthly&landing_path=%2Fpricing" },
|
|
41
|
+
{ "@type": "Offer", "name": "ThumbGate Pro Annual", "price": "149", "priceCurrency": "USD", "url": "__APP_ORIGIN__/checkout/pro?plan_id=pro&billing_cycle=annual&landing_path=%2Fpricing" },
|
|
42
|
+
{ "@type": "Offer", "name": "ThumbGate Team", "price": "49", "priceCurrency": "USD", "url": "__APP_ORIGIN__/#workflow-sprint-intake" }
|
|
43
|
+
]
|
|
44
|
+
}
|
|
45
|
+
</script>
|
|
46
|
+
|
|
47
|
+
<script type="application/ld+json">
|
|
48
|
+
{
|
|
49
|
+
"@context": "https://schema.org",
|
|
50
|
+
"@type": "FAQPage",
|
|
51
|
+
"mainEntity": [
|
|
52
|
+
{ "@type": "Question", "name": "What does Pro add over the free CLI?", "acceptedAnswer": { "@type": "Answer", "text": "Free gives you unlimited captures and 5 active rules, running entirely on your machine. Pro is the hosted layer: lesson sync across machines, a dashboard without self-hosting, managed adapter updates, unlimited rules, and DPO export. You're paying for infrastructure we run, not features we hide." } },
|
|
53
|
+
{ "@type": "Question", "name": "Does ThumbGate send my code to the cloud?", "acceptedAnswer": { "@type": "Answer", "text": "No. The CLI is local-first — no data leaves your machine. Pro and Team add hosted sync for dashboards and shared lessons, but your source code stays local." } },
|
|
54
|
+
{ "@type": "Question", "name": "When should I pick Team over Pro?", "acceptedAnswer": { "@type": "Answer", "text": "When one engineer's correction should protect the whole team. Team shares the lesson database across seats so a fix in one repo prevents the same mistake in every repo." } },
|
|
55
|
+
{ "@type": "Question", "name": "Can I cancel anytime?", "acceptedAnswer": { "@type": "Answer", "text": "Yes. Pro and Team are month-to-month with a 7-day refund window on the first charge. Cancel from the billing portal and your subscription ends at the period close." } }
|
|
56
|
+
]
|
|
57
|
+
}
|
|
58
|
+
</script>
|
|
59
|
+
|
|
60
|
+
<style>
|
|
61
|
+
*, *::before, *::after { box-sizing: border-box; }
|
|
62
|
+
|
|
63
|
+
:root {
|
|
64
|
+
--bg: #0a0a0b;
|
|
65
|
+
--bg-raised: #111113;
|
|
66
|
+
--bg-card: #161618;
|
|
67
|
+
--border: #232327;
|
|
68
|
+
--text: #ececf1;
|
|
69
|
+
--text-muted: #9a9aa6;
|
|
70
|
+
--text-dim: #6b6b78;
|
|
71
|
+
--cyan: #22d3ee;
|
|
72
|
+
--cyan-dim: rgba(34, 211, 238, 0.12);
|
|
73
|
+
--cyan-glow: rgba(34, 211, 238, 0.22);
|
|
74
|
+
--green: #4ade80;
|
|
75
|
+
--green-dim: rgba(74, 222, 128, 0.12);
|
|
76
|
+
--font: -apple-system, BlinkMacSystemFont, 'Segoe UI', 'Inter', Roboto, sans-serif;
|
|
77
|
+
--mono: 'SF Mono', 'Cascadia Code', 'JetBrains Mono', 'Fira Code', Consolas, monospace;
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
html { scroll-behavior: smooth; }
|
|
81
|
+
body {
|
|
82
|
+
margin: 0;
|
|
83
|
+
font-family: var(--font);
|
|
84
|
+
background:
|
|
85
|
+
radial-gradient(circle at top, rgba(34, 211, 238, 0.16) 0%, rgba(34, 211, 238, 0) 28%),
|
|
86
|
+
linear-gradient(180deg, #0a0a0b 0%, #0d1016 48%, #0a0a0b 100%);
|
|
87
|
+
color: var(--text);
|
|
88
|
+
line-height: 1.6;
|
|
89
|
+
-webkit-font-smoothing: antialiased;
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
a { color: inherit; }
|
|
93
|
+
.container { max-width: 1080px; margin: 0 auto; padding: 0 24px; }
|
|
94
|
+
|
|
95
|
+
/* NAV */
|
|
96
|
+
nav {
|
|
97
|
+
position: sticky; top: 0; z-index: 50;
|
|
98
|
+
backdrop-filter: blur(12px);
|
|
99
|
+
background: rgba(10, 10, 11, 0.86);
|
|
100
|
+
border-bottom: 1px solid rgba(35, 35, 39, 0.92);
|
|
101
|
+
}
|
|
102
|
+
nav .container { min-height: 68px; display: flex; align-items: center; justify-content: space-between; gap: 20px; }
|
|
103
|
+
.nav-logo { font-size: 15px; font-weight: 700; letter-spacing: -0.02em; text-decoration: none; }
|
|
104
|
+
.nav-links { display: flex; gap: 20px; align-items: center; }
|
|
105
|
+
.nav-links a { font-size: 13px; color: var(--text-muted); text-decoration: none; transition: color 0.15s; }
|
|
106
|
+
.nav-links a:hover { color: var(--text); }
|
|
107
|
+
.nav-cta { background: var(--cyan); color: var(--bg); padding: 7px 16px; border-radius: 6px; font-size: 13px; font-weight: 600; text-decoration: none; transition: opacity 0.15s; }
|
|
108
|
+
.nav-cta:hover { opacity: 0.85; }
|
|
109
|
+
|
|
110
|
+
/* HERO */
|
|
111
|
+
.pricing-hero { padding: 80px 0 24px; text-align: center; }
|
|
112
|
+
.pricing-hero h1 { font-size: clamp(28px, 4vw, 40px); font-weight: 700; letter-spacing: -0.03em; margin: 0 0 12px; }
|
|
113
|
+
.pricing-hero .lede { color: var(--text-muted); font-size: 17px; max-width: 560px; margin: 0 auto; }
|
|
114
|
+
|
|
115
|
+
/* GRID */
|
|
116
|
+
.pricing-grid { display: grid; grid-template-columns: repeat(3, 1fr); gap: 20px; margin: 40px 0 32px; }
|
|
117
|
+
@media (max-width: 768px) { .pricing-grid { grid-template-columns: 1fr; } }
|
|
118
|
+
|
|
119
|
+
/* CARDS */
|
|
120
|
+
.price-card {
|
|
121
|
+
background: var(--bg-card); border: 1px solid var(--border); border-radius: 12px;
|
|
122
|
+
padding: 32px 28px; display: flex; flex-direction: column;
|
|
123
|
+
}
|
|
124
|
+
.price-card.highlight {
|
|
125
|
+
border-color: var(--cyan);
|
|
126
|
+
box-shadow: 0 0 40px var(--cyan-dim), inset 0 1px 0 rgba(34, 211, 238, 0.15);
|
|
127
|
+
position: relative;
|
|
128
|
+
}
|
|
129
|
+
.price-card.highlight::before {
|
|
130
|
+
content: "Most popular";
|
|
131
|
+
position: absolute; top: -10px; left: 50%; transform: translateX(-50%);
|
|
132
|
+
background: var(--cyan); color: var(--bg);
|
|
133
|
+
padding: 3px 12px; border-radius: 6px;
|
|
134
|
+
font-size: 11px; font-weight: 700; letter-spacing: 0.5px; text-transform: uppercase;
|
|
135
|
+
}
|
|
136
|
+
.price-card.team-card { border-color: rgba(74, 222, 128, 0.45); box-shadow: inset 0 1px 0 rgba(74, 222, 128, 0.16); }
|
|
137
|
+
|
|
138
|
+
.tier { font-size: 13px; text-transform: uppercase; letter-spacing: 0.08em; color: var(--text-muted); font-weight: 600; margin-bottom: 8px; }
|
|
139
|
+
.price-card.highlight .tier { color: var(--cyan); }
|
|
140
|
+
.price-card.team-card .tier { color: var(--green); }
|
|
141
|
+
|
|
142
|
+
.price { font-size: 40px; font-weight: 700; letter-spacing: -0.03em; margin-bottom: 4px; }
|
|
143
|
+
.price span { font-size: 16px; color: var(--text-dim); }
|
|
144
|
+
.price-sub { font-size: 13px; color: var(--text-muted); margin-bottom: 24px; line-height: 1.55; }
|
|
145
|
+
|
|
146
|
+
.price-card ul { list-style: none; padding: 0; margin: 0 0 28px; }
|
|
147
|
+
.price-card li { font-size: 14px; color: var(--text-muted); padding: 6px 0; display: flex; align-items: flex-start; gap: 8px; }
|
|
148
|
+
.price-card li::before { content: "\2713"; color: var(--cyan); font-weight: 700; flex-shrink: 0; }
|
|
149
|
+
.price-card.team-card li::before { color: var(--green); }
|
|
150
|
+
|
|
151
|
+
/* BUTTONS */
|
|
152
|
+
.btn-install {
|
|
153
|
+
display: block; text-align: center; padding: 12px; border: 1px solid var(--border);
|
|
154
|
+
border-radius: 8px; color: var(--text); text-decoration: none; font-size: 14px; font-weight: 500;
|
|
155
|
+
transition: border-color 0.15s; margin-top: auto;
|
|
156
|
+
}
|
|
157
|
+
.btn-install:hover { border-color: var(--text-muted); }
|
|
158
|
+
|
|
159
|
+
.btn-pro {
|
|
160
|
+
display: block; text-align: center; padding: 12px;
|
|
161
|
+
background: var(--cyan); color: var(--bg); border-radius: 8px;
|
|
162
|
+
text-decoration: none; font-size: 14px; font-weight: 600; transition: opacity 0.15s;
|
|
163
|
+
margin-top: auto;
|
|
164
|
+
}
|
|
165
|
+
.btn-pro:hover { opacity: 0.85; }
|
|
166
|
+
|
|
167
|
+
.btn-team {
|
|
168
|
+
display: block; text-align: center; padding: 12px;
|
|
169
|
+
background: rgba(74, 222, 128, 0.14); color: var(--green);
|
|
170
|
+
border: 1px solid rgba(74, 222, 128, 0.4); border-radius: 8px;
|
|
171
|
+
text-decoration: none; font-size: 14px; font-weight: 600;
|
|
172
|
+
transition: border-color 0.15s, transform 0.15s; margin-top: auto;
|
|
173
|
+
}
|
|
174
|
+
.btn-team:hover { border-color: var(--green); transform: translateY(-1px); }
|
|
175
|
+
|
|
176
|
+
.btn-sub { font-size: 11px; color: var(--text-muted); margin-top: 8px; text-align: center; }
|
|
177
|
+
|
|
178
|
+
/* FAQ */
|
|
179
|
+
.faq { padding: 48px 0; }
|
|
180
|
+
.faq h2 { text-align: center; font-size: 24px; margin-bottom: 24px; }
|
|
181
|
+
.faq-list { max-width: 640px; margin: 0 auto; }
|
|
182
|
+
.faq-item { border-bottom: 1px solid var(--border); }
|
|
183
|
+
.faq-q {
|
|
184
|
+
padding: 20px 0; font-size: 15px; font-weight: 600; cursor: pointer;
|
|
185
|
+
display: flex; justify-content: space-between; align-items: center;
|
|
186
|
+
}
|
|
187
|
+
.faq-q::after { content: "+"; font-size: 18px; color: var(--text-muted); transition: transform 0.2s; }
|
|
188
|
+
.faq-item.open .faq-q::after { transform: rotate(45deg); }
|
|
189
|
+
.faq-a { font-size: 14px; color: var(--text-muted); line-height: 1.65; padding-bottom: 20px; display: none; }
|
|
190
|
+
.faq-item.open .faq-a { display: block; }
|
|
191
|
+
|
|
192
|
+
/* FOOTER */
|
|
193
|
+
footer { border-top: 1px solid var(--border); padding: 32px 0; margin-top: 48px; }
|
|
194
|
+
footer .container { display: flex; justify-content: space-between; align-items: center; flex-wrap: wrap; gap: 12px; }
|
|
195
|
+
.footer-links { display: flex; gap: 20px; }
|
|
196
|
+
.footer-links a { color: var(--text-muted); text-decoration: none; font-size: 13px; transition: color 0.15s; }
|
|
197
|
+
.footer-links a:hover { color: var(--text); }
|
|
198
|
+
.footer-copy { font-size: 12px; color: var(--text-muted); }
|
|
199
|
+
</style>
|
|
200
|
+
<script>
|
|
201
|
+
!function(t,e){var o,n,p,r;e.__SV||(window.posthog=e,e._i=[],e.init=function(i,s,a){function g(t,e){var o=e.split(".");2==o.length&&(t=t[o[0]],e=o[1]),t[e]=function(){t.push([e].concat(Array.prototype.slice.call(arguments,0)))}}(p=t.createElement("script")).type="text/javascript",p.crossOrigin="anonymous",p.async=!0,p.src=s.api_host.replace("/ingest","")+ "/static/array.js",(r=t.getElementsByTagName("script")[0]).parentNode.insertBefore(p,r);var u=e;for(void 0!==a?u=e[a]=[]:a="posthog",u.people=u.people||[],u.toString=function(t){var e="posthog";return"posthog"!==a&&(e+="."+a),t||(e+=" (stub)"),e},u.people.toString=function(){return u.toString(1)+".people (stub)"},o="init capture register register_once unregister opt_out_capturing has_opted_out_capturing opt_in_capturing reset isFeatureEnabled onFeatureFlags getFeatureFlag getFeatureFlagPayload reloadFeatureFlags group identify setPersonProperties setPersonPropertiesForFlags".split(" "),n=0;n<o.length;n++)g(u,o[n]);e._i.push([i,s,a])},e.__SV=1)}(document,window.posthog||[]);
|
|
202
|
+
posthog.init('__POSTHOG_API_KEY__', {
|
|
203
|
+
api_host: '/ingest',
|
|
204
|
+
ui_host: 'https://us.posthog.com',
|
|
205
|
+
person_profiles: 'identified_only',
|
|
206
|
+
});
|
|
207
|
+
posthog.capture('$pageview');
|
|
208
|
+
</script>
|
|
209
|
+
</head>
|
|
210
|
+
<body>
|
|
211
|
+
|
|
212
|
+
<nav>
|
|
213
|
+
<div class="container">
|
|
214
|
+
<a href="/" class="nav-logo">ThumbGate</a>
|
|
215
|
+
<div class="nav-links">
|
|
216
|
+
<a href="/#features">Features</a>
|
|
217
|
+
<a href="/pricing" style="color:var(--text);">Pricing</a>
|
|
218
|
+
<a href="/guide">Guide</a>
|
|
219
|
+
<a href="/dashboard">Dashboard</a>
|
|
220
|
+
<a class="nav-cta" href="/checkout/pro?utm_source=pricing&utm_medium=nav&utm_campaign=pricing_page&plan_id=pro&landing_path=%2Fpricing">Start Pro</a>
|
|
221
|
+
</div>
|
|
222
|
+
</div>
|
|
223
|
+
</nav>
|
|
224
|
+
|
|
225
|
+
<section class="pricing-hero">
|
|
226
|
+
<div class="container">
|
|
227
|
+
<h1>Stop paying for the same AI mistake twice.</h1>
|
|
228
|
+
<p class="lede">One self-serve paid path for solo operators. Teams start with workflow scope so shared enforcement is mapped before checkout.</p>
|
|
229
|
+
</div>
|
|
230
|
+
</section>
|
|
231
|
+
|
|
232
|
+
<section class="container">
|
|
233
|
+
<div class="pricing-grid">
|
|
234
|
+
|
|
235
|
+
<div class="price-card">
|
|
236
|
+
<div class="tier" style="color:var(--cyan);">Free</div>
|
|
237
|
+
<div class="price">$0</div>
|
|
238
|
+
<div class="price-sub">Block repeated mistakes daily. Forever free for solo devs.</div>
|
|
239
|
+
<ul>
|
|
240
|
+
<li>Unlimited feedback captures — every thumbs-down, every session</li>
|
|
241
|
+
<li>Up to 5 active prevention rules</li>
|
|
242
|
+
<li>All MCP integrations (Claude Code, Cursor, Codex, Gemini, Amp)</li>
|
|
243
|
+
<li>PreToolUse hook blocking with built-in safety checks</li>
|
|
244
|
+
<li>Runs 100% local — no account, no signup, no data leaves your machine</li>
|
|
245
|
+
</ul>
|
|
246
|
+
<a class="btn-install" href="/go/install?utm_source=pricing&utm_medium=free_card" onclick="try{posthog.capture('pricing_cta_click',{cta:'install_free',tier:'free',placement:'pricing_page'})}catch(_){};try{plausible('pricing_cta_click',{props:{cta:'install_free',tier:'free'}})}catch(_){}">Install free</a>
|
|
247
|
+
</div>
|
|
248
|
+
|
|
249
|
+
<div class="price-card highlight" id="pro">
|
|
250
|
+
<div class="tier">Pro</div>
|
|
251
|
+
<div class="price">$19<span>/mo</span></div>
|
|
252
|
+
<div class="price-sub">
|
|
253
|
+
The free CLI runs your gates locally and never expires.
|
|
254
|
+
Pro is what we operate for you: hosted lesson sync across all your machines, adapter matrix kept current as agent runtimes ship breaking changes, and a dashboard you never have to self-host.
|
|
255
|
+
</div>
|
|
256
|
+
<ul>
|
|
257
|
+
<li><strong>Hosted lesson sync</strong> — corrections follow you across machines, no manual export</li>
|
|
258
|
+
<li><strong>Managed adapter matrix</strong> — we track runtime changes in Claude Code, Cursor, Codex, Gemini, Amp so you don't</li>
|
|
259
|
+
<li><strong>Hosted dashboard</strong> — see every blocked action, every rule that fired, without running your own server</li>
|
|
260
|
+
<li><strong>Unlimited prevention rules</strong> — free caps at 5 auto-promoted rules</li>
|
|
261
|
+
<li><strong>DPO + HuggingFace export</strong> — training data from your real corrections</li>
|
|
262
|
+
<li><strong>Auto-connect</strong> — new agent surfaces appear automatically after setup</li>
|
|
263
|
+
<li>7-day refund window. Cancel anytime.</li>
|
|
264
|
+
</ul>
|
|
265
|
+
<a class="btn-pro" href="/checkout/pro?utm_source=pricing&utm_medium=hero_card&utm_campaign=pricing_page&plan_id=pro&landing_path=%2Fpricing" onclick="try{posthog.capture('pricing_cta_click',{cta:'start_pro',tier:'pro',placement:'pricing_page',price:19})}catch(_){};try{plausible('pricing_cta_click',{props:{cta:'start_pro',tier:'pro'}})}catch(_){}">Start Pro — $19/mo</a>
|
|
266
|
+
<p class="btn-sub">or $149/year (save 35%)</p>
|
|
267
|
+
</div>
|
|
268
|
+
|
|
269
|
+
<div class="price-card team-card" id="team">
|
|
270
|
+
<div class="tier">Team</div>
|
|
271
|
+
<div class="price">$49<span>/seat/mo</span></div>
|
|
272
|
+
<div class="price-sub">Shared enforcement memory for the whole team. One engineer's save protects every agent.</div>
|
|
273
|
+
<ul>
|
|
274
|
+
<li>Everything in Pro for each seat</li>
|
|
275
|
+
<li><strong>Shared lesson database</strong> — one engineer's fix protects every agent on the team</li>
|
|
276
|
+
<li><strong>Org dashboard</strong> — visibility across all agent surfaces and developers</li>
|
|
277
|
+
<li>Check template library for deploys, publish, and DB operations</li>
|
|
278
|
+
<li>Email support during pilot rollout</li>
|
|
279
|
+
<li>3-seat minimum after scope; rollout starts only after workflow and proof review are explicit</li>
|
|
280
|
+
</ul>
|
|
281
|
+
<a class="btn-team" href="/?utm_source=pricing&utm_medium=team_card&utm_campaign=team_intake&cta_id=pricing_team_intake&cta_placement=pricing&plan_id=team#workflow-sprint-intake" onclick="try{posthog.capture('pricing_cta_click',{cta:'team_intake',tier:'team',placement:'pricing_page',price:0})}catch(_){};try{plausible('pricing_cta_click',{props:{cta:'team_intake',tier:'team'}})}catch(_){}">Send team workflow first</a>
|
|
282
|
+
<p class="btn-sub">Rollout starts through intake so the workflow is scoped before checkout.</p>
|
|
283
|
+
</div>
|
|
284
|
+
|
|
285
|
+
</div>
|
|
286
|
+
|
|
287
|
+
<div style="text-align:center;margin:32px 0;color:var(--text-muted);font-size:14px;">
|
|
288
|
+
Need founder help? Do not buy a blind diagnostic from a pricing table.
|
|
289
|
+
<a href="/?utm_source=pricing&utm_medium=scope_first&utm_campaign=team_intake&cta_id=pricing_scope_first&cta_placement=pricing_note&plan_id=team#workflow-sprint-intake" style="color:var(--cyan);text-decoration:none;font-weight:600;" onclick="try{posthog.capture('pricing_cta_click',{cta:'scope_first',tier:'team',price:0})}catch(_){};try{plausible('pricing_cta_click',{props:{cta:'scope_first',tier:'team'}})}catch(_){}">Send the workflow first</a> — then we scope the smallest paid rollout that can prove one repeated failure is blocked.
|
|
290
|
+
</div>
|
|
291
|
+
</section>
|
|
292
|
+
|
|
293
|
+
<section class="faq">
|
|
294
|
+
<div class="container">
|
|
295
|
+
<h2>Questions</h2>
|
|
296
|
+
<div class="faq-list">
|
|
297
|
+
<div class="faq-item">
|
|
298
|
+
<div class="faq-q">What does Pro add over the free CLI?</div>
|
|
299
|
+
<div class="faq-a">Free gives you unlimited captures and 5 active rules, running entirely on your machine. Pro is the hosted layer: lesson sync across machines, a dashboard without self-hosting, managed adapter updates, unlimited rules, and DPO export. You're paying for infrastructure we run, not features we hide.</div>
|
|
300
|
+
</div>
|
|
301
|
+
<div class="faq-item">
|
|
302
|
+
<div class="faq-q">Does ThumbGate send my code to the cloud?</div>
|
|
303
|
+
<div class="faq-a">No. The CLI is local-first and no source code leaves your machine. Pro and Team add hosted sync for dashboards and shared lessons, but your code stays local.</div>
|
|
304
|
+
</div>
|
|
305
|
+
<div class="faq-item">
|
|
306
|
+
<div class="faq-q">When should I pick Team over Pro?</div>
|
|
307
|
+
<div class="faq-a">When one engineer's correction should protect the whole team. Team shares the lesson database across seats so a fix in one repo prevents the same mistake in every repo.</div>
|
|
308
|
+
</div>
|
|
309
|
+
<div class="faq-item">
|
|
310
|
+
<div class="faq-q">Can I cancel anytime?</div>
|
|
311
|
+
<div class="faq-a">Yes. Pro and Team are month-to-month with a 7-day refund window on the first charge. Cancel from the billing portal and your subscription ends at the period close.</div>
|
|
312
|
+
</div>
|
|
313
|
+
<div class="faq-item">
|
|
314
|
+
<div class="faq-q">What happens if I stop paying?</div>
|
|
315
|
+
<div class="faq-a">You keep the free CLI with 5-rule cap. Your existing rules and captures stay on your machine. You lose dashboard access, lesson search, exports, and auto-connect.</div>
|
|
316
|
+
</div>
|
|
317
|
+
</div>
|
|
318
|
+
</div>
|
|
319
|
+
</section>
|
|
320
|
+
|
|
321
|
+
<footer>
|
|
322
|
+
<div class="container">
|
|
323
|
+
<div class="footer-links">
|
|
324
|
+
<a href="/">Home</a>
|
|
325
|
+
<a href="/guide">Guide</a>
|
|
326
|
+
<a href="/support">Support</a>
|
|
327
|
+
<a href="/privacy">Privacy</a>
|
|
328
|
+
<a href="/terms">Terms</a>
|
|
329
|
+
</div>
|
|
330
|
+
<span class="footer-copy">One source of truth for ThumbGate pricing. Numbers here override anything stale elsewhere.</span>
|
|
331
|
+
</div>
|
|
332
|
+
</footer>
|
|
333
|
+
|
|
334
|
+
<script>
|
|
335
|
+
document.querySelectorAll('.faq-q').forEach(function(q) {
|
|
336
|
+
q.addEventListener('click', function() {
|
|
337
|
+
this.parentElement.classList.toggle('open');
|
|
338
|
+
});
|
|
339
|
+
});
|
|
340
|
+
</script>
|
|
341
|
+
<script>
|
|
342
|
+
window.plausible = window.plausible || function() { (window.plausible.q = window.plausible.q || []).push(arguments) };
|
|
343
|
+
</script>
|
|
344
|
+
</body>
|
|
345
|
+
</html>
|
package/public/pro.html
CHANGED
|
@@ -718,7 +718,7 @@ __GA_BOOTSTRAP__
|
|
|
718
718
|
<a href="#pricing">Pricing</a>
|
|
719
719
|
<a href="#faq">FAQ</a>
|
|
720
720
|
<a href="/dashboard">Demo</a>
|
|
721
|
-
<a
|
|
721
|
+
<a class="nav-cta btn-pro-checkout" href="/checkout/pro?utm_source=website&utm_medium=pro_page_nav&utm_campaign=pro_pack&cta_id=pro_page_nav&cta_placement=nav&plan_id=pro&landing_path=%2Fpro">Start Pro</a>
|
|
722
722
|
</div>
|
|
723
723
|
</div>
|
|
724
724
|
</nav>
|
|
@@ -730,7 +730,7 @@ __GA_BOOTSTRAP__
|
|
|
730
730
|
<h1>Buy the operator loop that proves your AI agent stopped repeating the mistake.</h1>
|
|
731
731
|
<p style="font-size:13px;opacity:0.8;margin-bottom:0.5rem;">Updated: <time datetime="2026-04-20">2026-04-20</time> · by <a href="https://github.com/IgorGanapolsky" style="color:inherit;">Igor Ganapolsky</a></p>
|
|
732
732
|
<p>ThumbGate Pro is for one operator who already hit a repeated AI-agent failure and now needs proof: what was blocked, why it was blocked, and what changed before the next risky run.</p>
|
|
733
|
-
<p>
|
|
733
|
+
<p>Start Pro when you want the local dashboard, DPO export, and a single proof lane for the repeated mistake you need to stop. Team diagnostics and custom services are handled through intake, not this buyer path.</p>
|
|
734
734
|
<div class="hero-proof">
|
|
735
735
|
<div class="proof-pill">Personal local dashboard</div>
|
|
736
736
|
<div class="proof-pill">DPO export from real corrections</div>
|
|
@@ -738,8 +738,7 @@ __GA_BOOTSTRAP__
|
|
|
738
738
|
<div class="proof-pill">Founder support on risky flows</div>
|
|
739
739
|
</div>
|
|
740
740
|
<div class="hero-actions">
|
|
741
|
-
<a
|
|
742
|
-
<a class="btn-secondary btn-pro-checkout" href="/checkout/pro?utm_source=website&utm_medium=pro_page_hero&utm_campaign=pro_pack&cta_id=pro_page_primary&cta_placement=hero&plan_id=pro&landing_path=%2Fpro">Start Pro dashboard</a>
|
|
741
|
+
<a class="btn-primary btn-pro-checkout" href="/checkout/pro?utm_source=website&utm_medium=pro_page_hero&utm_campaign=pro_pack&cta_id=pro_page_primary&cta_placement=hero&plan_id=pro&landing_path=%2Fpro">Start Pro dashboard</a>
|
|
743
742
|
<a class="btn-secondary btn-demo" href="/dashboard?utm_source=website&utm_medium=pro_page&utm_campaign=pro_pack">Open dashboard demo</a>
|
|
744
743
|
<a class="btn-ghost btn-free-path" href="/guide?utm_source=website&utm_medium=pro_page&utm_campaign=free_install">Stay on Free and install locally</a>
|
|
745
744
|
</div>
|
|
@@ -775,18 +774,6 @@ __GA_BOOTSTRAP__
|
|
|
775
774
|
<p>Visual check debugger, DPO export, auto-connect after activation, Model Hardening Advisor, and founder support for the risky flow you need to harden first.</p>
|
|
776
775
|
</div>
|
|
777
776
|
|
|
778
|
-
<div class="aside-card" data-pro-paid-recovery>
|
|
779
|
-
<div class="aside-kicker">Team workflow blocked?</div>
|
|
780
|
-
<h3>Buy the paid diagnostic</h3>
|
|
781
|
-
<p>Skip self-serve Pro and pay for the smallest useful review now.</p>
|
|
782
|
-
<div class="price-stack">
|
|
783
|
-
<a rel="nofollow noopener noreferrer" target="_blank" class="btn-secondary" data-first-rule-link href="https://buy.stripe.com/fZu28rfCY6zcbO99uj3sI2G" onclick="sendFirstPartyTelemetry('first_failure_rule_checkout_started',{ctaId:'pro_page_first_failure_rule_checkout',price:1});sendGa4Event('begin_checkout',{currency:'USD',value:1,items:[{item_id:'first_failure_rule',item_name:'First AI Agent Failure Rule'}]});">Pay $1 first rule</a>
|
|
784
|
-
<a rel="nofollow noopener noreferrer" target="_blank" class="btn-secondary" data-quick-read-link href="https://buy.stripe.com/5kQ7sL76s1eSaK55e33sI2H" onclick="sendFirstPartyTelemetry('quick_read_checkout_started',{ctaId:'pro_page_quick_read_checkout',price:19});">Pay $19 quick read</a>
|
|
785
|
-
<a class="btn-primary" data-sprint-diagnostic-link href="__SPRINT_DIAGNOSTIC_CHECKOUT_URL__" onclick="sendFirstPartyTelemetry('workflow_sprint_diagnostic_checkout_started',{ctaId:'pro_page_sprint_diagnostic_checkout'});sendGa4Event('begin_checkout',{currency:'USD',value:__SPRINT_DIAGNOSTIC_PRICE_DOLLARS__});">Pay $__SPRINT_DIAGNOSTIC_PRICE_DOLLARS__ diagnostic</a>
|
|
786
|
-
<a class="btn-secondary" data-workflow-sprint-link href="__WORKFLOW_SPRINT_CHECKOUT_URL__" onclick="sendFirstPartyTelemetry('workflow_sprint_checkout_started',{ctaId:'pro_page_workflow_sprint_checkout'});sendGa4Event('begin_checkout',{currency:'USD',value:__WORKFLOW_SPRINT_PRICE_DOLLARS__});">Pay $__WORKFLOW_SPRINT_PRICE_DOLLARS__ sprint</a>
|
|
787
|
-
</div>
|
|
788
|
-
</div>
|
|
789
|
-
|
|
790
777
|
<div class="aside-card">
|
|
791
778
|
<div class="aside-kicker">Keep the buyer path warm</div>
|
|
792
779
|
<h3>Save your work email before you decide</h3>
|
|
@@ -1024,7 +1011,6 @@ function sendFirstPartyTelemetry(eventType, props) {
|
|
|
1024
1011
|
}
|
|
1025
1012
|
|
|
1026
1013
|
function sendGa4Event(e,p){if(typeof gtag==='function')gtag('event',e,p||{})}
|
|
1027
|
-
function initializeProPaidRecovery(){var c=document.querySelector('[data-pro-paid-recovery]');if(!c)return;var n=0;c.querySelectorAll('a[href]').forEach(function(a){var h=a.getAttribute('href')||'';if(/^https?:\/\//.test(h))n+=1;else a.hidden=true});c.hidden=n===0}
|
|
1028
1014
|
|
|
1029
1015
|
function initializeBuyerIntent() {
|
|
1030
1016
|
globalThis.ThumbGateBuyerIntent.initializeBuyerIntent({
|
|
@@ -1067,7 +1053,6 @@ trackClick('.btn-pro-checkout', 'pro_checkout_start', { tier: 'pro', page: 'pro'
|
|
|
1067
1053
|
trackClick('.btn-demo', 'pro_demo_click', { page: 'pro' });
|
|
1068
1054
|
trackClick('.btn-free-path', 'pro_free_path_click', { page: 'pro' });
|
|
1069
1055
|
trackClick('.proof-links a', 'pro_proof_click', { page: 'pro' });
|
|
1070
|
-
initializeProPaidRecovery();
|
|
1071
1056
|
initializeBuyerIntent();
|
|
1072
1057
|
globalThis.buyerJourney = globalThis.ThumbGateBuyerIntent.initializeBehaviorAnalytics({
|
|
1073
1058
|
pageType: 'marketing',
|
|
@@ -1084,10 +1069,6 @@ globalThis.buyerJourney = globalThis.ThumbGateBuyerIntent.initializeBehaviorAnal
|
|
|
1084
1069
|
],
|
|
1085
1070
|
ctaImpressions: [
|
|
1086
1071
|
{ selector: '.btn-pro-checkout', ctaId: 'pro_checkout', ctaPlacement: 'pro_page', planId: 'pro' },
|
|
1087
|
-
{ selector: '[data-first-rule-link]', ctaId: 'pro_page_first_failure_rule_checkout', ctaPlacement: 'pro_paid_recovery', planId: 'first_failure_rule' },
|
|
1088
|
-
{ selector: '[data-quick-read-link]', ctaId: 'pro_page_quick_read_checkout', ctaPlacement: 'pro_paid_recovery', planId: 'quick_read' },
|
|
1089
|
-
{ selector: '[data-sprint-diagnostic-link]', ctaId: 'pro_page_sprint_diagnostic_checkout', ctaPlacement: 'pro_paid_recovery', planId: 'sprint_diagnostic' },
|
|
1090
|
-
{ selector: '[data-workflow-sprint-link]', ctaId: 'pro_page_workflow_sprint_checkout', ctaPlacement: 'pro_paid_recovery', planId: 'workflow_sprint' },
|
|
1091
1072
|
{ selector: '.btn-demo', ctaId: 'pro_demo', ctaPlacement: 'pro_page', planId: 'proof' },
|
|
1092
1073
|
{ selector: '.btn-free-path', ctaId: 'pro_free_path', ctaPlacement: 'pro_page', planId: 'free' }
|
|
1093
1074
|
]
|