thumbgate 0.9.10
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 +134 -0
- package/.claude-plugin/bundle/icon.png +0 -0
- package/.claude-plugin/bundle/icon.svg +18 -0
- package/.claude-plugin/bundle/server/index.js +24 -0
- package/.claude-plugin/marketplace.json +36 -0
- package/.claude-plugin/plugin.json +21 -0
- package/.well-known/mcp/server-card.json +231 -0
- package/LICENSE +21 -0
- package/README.md +375 -0
- package/adapters/README.md +9 -0
- package/adapters/amp/skills/thumbgate-feedback/SKILL.md +22 -0
- package/adapters/chatgpt/INSTALL.md +83 -0
- package/adapters/chatgpt/openapi.yaml +1281 -0
- package/adapters/claude/.mcp.json +14 -0
- package/adapters/codex/config.toml +9 -0
- package/adapters/gemini/function-declarations.json +224 -0
- package/adapters/mcp/server-stdio.js +788 -0
- package/adapters/opencode/opencode.json +15 -0
- package/bin/cli.js +1484 -0
- package/bin/memory.sh +64 -0
- package/bin/obsidian-sync.sh +20 -0
- package/bin/postinstall.js +37 -0
- package/config/build-metadata.json +4 -0
- package/config/e2e-critical-flows.json +45 -0
- package/config/gate-templates.json +77 -0
- package/config/gates/claim-verification.json +29 -0
- package/config/gates/computer-use.json +39 -0
- package/config/gates/default.json +117 -0
- package/config/github-about.json +25 -0
- package/config/mcp-allowlists.json +135 -0
- package/config/model-tiers.json +33 -0
- package/config/partner-routing.json +132 -0
- package/config/policy-bundles/constrained-v1.json +64 -0
- package/config/policy-bundles/default-v1.json +91 -0
- package/config/rubrics/default-v1.json +52 -0
- package/config/skill-packs/react-testing.json +23 -0
- package/config/skill-packs/stripe-integration/references/api-spec.json +1 -0
- package/config/skill-packs/stripe-integration/references/webhook-guide.md +3 -0
- package/config/skill-specs/pr-reviewer.json +9 -0
- package/config/skill-specs/release-status.json +9 -0
- package/config/skill-specs/ticket-triage.json +9 -0
- package/config/subagent-profiles.json +32 -0
- package/config/tessl-tiles.json +29 -0
- package/config/thumbgate-settings.managed.json +12 -0
- package/openapi/openapi.yaml +1281 -0
- package/package.json +283 -0
- package/plugins/amp-skill/INSTALL.md +52 -0
- package/plugins/amp-skill/SKILL.md +64 -0
- package/plugins/claude-codex-bridge/.claude-plugin/plugin.json +22 -0
- package/plugins/claude-codex-bridge/.mcp.json +12 -0
- package/plugins/claude-codex-bridge/INSTALL.md +43 -0
- package/plugins/claude-codex-bridge/README.md +46 -0
- package/plugins/claude-codex-bridge/scripts/codex-bridge.js +288 -0
- package/plugins/claude-codex-bridge/skills/adversarial-review/SKILL.md +24 -0
- package/plugins/claude-codex-bridge/skills/result/SKILL.md +22 -0
- package/plugins/claude-codex-bridge/skills/review/SKILL.md +28 -0
- package/plugins/claude-codex-bridge/skills/second-pass/SKILL.md +27 -0
- package/plugins/claude-codex-bridge/skills/setup/SKILL.md +21 -0
- package/plugins/claude-codex-bridge/skills/status/SKILL.md +19 -0
- package/plugins/claude-skill/INSTALL.md +55 -0
- package/plugins/claude-skill/SKILL.md +46 -0
- package/plugins/codex-profile/.codex-plugin/plugin.json +43 -0
- package/plugins/codex-profile/.mcp.json +12 -0
- package/plugins/codex-profile/AGENTS.md +20 -0
- package/plugins/codex-profile/INSTALL.md +66 -0
- package/plugins/codex-profile/README.md +37 -0
- package/plugins/cursor-marketplace/.cursor-plugin/plugin.json +23 -0
- package/plugins/cursor-marketplace/CHANGELOG.md +30 -0
- package/plugins/cursor-marketplace/LICENSE +21 -0
- package/plugins/cursor-marketplace/README.md +124 -0
- package/plugins/cursor-marketplace/agents/reliability-reviewer.md +31 -0
- package/plugins/cursor-marketplace/assets/logo-400x400.png +0 -0
- package/plugins/cursor-marketplace/commands/capture-feedback.md +33 -0
- package/plugins/cursor-marketplace/commands/check-gates.md +25 -0
- package/plugins/cursor-marketplace/commands/show-lessons.md +27 -0
- package/plugins/cursor-marketplace/hooks/hooks.json +10 -0
- package/plugins/cursor-marketplace/mcp.json +12 -0
- package/plugins/cursor-marketplace/rules/feedback-capture.mdc +34 -0
- package/plugins/cursor-marketplace/rules/pre-action-gates.mdc +30 -0
- package/plugins/cursor-marketplace/rules/session-continuity.mdc +28 -0
- package/plugins/cursor-marketplace/scripts/gate-check.sh +11 -0
- package/plugins/cursor-marketplace/skills/capture-feedback/SKILL.md +47 -0
- package/plugins/cursor-marketplace/skills/prevention-rules/SKILL.md +31 -0
- package/plugins/cursor-marketplace/skills/recall-context/SKILL.md +30 -0
- package/plugins/cursor-marketplace/skills/search-lessons/SKILL.md +33 -0
- package/plugins/gemini-extension/INSTALL.md +92 -0
- package/plugins/gemini-extension/gemini_prompt.txt +14 -0
- package/plugins/gemini-extension/tool_contract.json +45 -0
- package/plugins/opencode-profile/INSTALL.md +57 -0
- package/public/assets/instagram-card.png +0 -0
- package/public/assets/tiktok-agent-memory.mp4 +0 -0
- package/public/blog.html +400 -0
- package/public/dashboard.html +1093 -0
- package/public/guide.html +317 -0
- package/public/index.html +1014 -0
- package/public/learn/agent-harness-pattern.html +180 -0
- package/public/learn/ai-agent-persistent-memory.html +202 -0
- package/public/learn/learn.css +45 -0
- package/public/learn/mcp-pre-action-gates-explained.html +172 -0
- package/public/learn/stop-ai-agent-force-push.html +134 -0
- package/public/learn/vibe-coding-safety-net.html +142 -0
- package/public/learn.html +213 -0
- package/public/lessons.html +650 -0
- package/public/vercel.json +8 -0
- package/scripts/__pycache__/train_from_feedback.cpython-312.pyc +0 -0
- package/scripts/a2ui-engine.js +73 -0
- package/scripts/access-anomaly-detector.js +12 -0
- package/scripts/adk-consolidator.js +266 -0
- package/scripts/agent-readiness.js +220 -0
- package/scripts/agent-security-hardening.js +227 -0
- package/scripts/agentic-data-pipeline.js +847 -0
- package/scripts/analytics-report.js +328 -0
- package/scripts/analytics-window.js +158 -0
- package/scripts/async-job-runner.js +1001 -0
- package/scripts/audit-trail.js +398 -0
- package/scripts/auto-promote-gates.js +299 -0
- package/scripts/auto-wire-hooks.js +312 -0
- package/scripts/autonomous-sales-agent.js +39 -0
- package/scripts/autoresearch-runner.js +216 -0
- package/scripts/background-agent-governance.js +237 -0
- package/scripts/behavioral-extraction.js +97 -0
- package/scripts/belief-update.js +84 -0
- package/scripts/billing.js +2438 -0
- package/scripts/bot-detector.js +50 -0
- package/scripts/budget-guard.js +173 -0
- package/scripts/build-claude-mcpb.js +189 -0
- package/scripts/build-metadata.js +97 -0
- package/scripts/check-congruence.js +322 -0
- package/scripts/cli-feedback.js +135 -0
- package/scripts/cli-telemetry.js +87 -0
- package/scripts/cloudflare-dynamic-sandbox.js +315 -0
- package/scripts/code-reasoning.js +350 -0
- package/scripts/codegraph-context.js +466 -0
- package/scripts/commercial-offer.js +56 -0
- package/scripts/computer-use-firewall.js +250 -0
- package/scripts/context-engine.js +694 -0
- package/scripts/contextfs.js +1287 -0
- package/scripts/conversation-context.js +119 -0
- package/scripts/creator-campaigns.js +239 -0
- package/scripts/daemon-manager.js +108 -0
- package/scripts/daily-digest.js +11 -0
- package/scripts/dashboard-render-spec.js +395 -0
- package/scripts/dashboard.js +1058 -0
- package/scripts/data-governance.js +173 -0
- package/scripts/delegation-runtime.js +900 -0
- package/scripts/deploy-gcp.sh +44 -0
- package/scripts/deploy-policy.js +263 -0
- package/scripts/disagreement-mining.js +315 -0
- package/scripts/dispatch-brief.js +159 -0
- package/scripts/distribution-surfaces.js +44 -0
- package/scripts/dpo-optimizer.js +209 -0
- package/scripts/ephemeral-agent-store.js +219 -0
- package/scripts/eval-harness.js +56 -0
- package/scripts/evolution-state.js +241 -0
- package/scripts/experiment-tracker.js +267 -0
- package/scripts/export-databricks-bundle.js +242 -0
- package/scripts/export-dpo-pairs.js +345 -0
- package/scripts/export-kto-pairs.js +310 -0
- package/scripts/export-training.js +448 -0
- package/scripts/failure-diagnostics.js +558 -0
- package/scripts/feedback-attribution.js +313 -0
- package/scripts/feedback-fallback.js +111 -0
- package/scripts/feedback-history-distiller.js +391 -0
- package/scripts/feedback-inbox-read.js +162 -0
- package/scripts/feedback-loop.js +1887 -0
- package/scripts/feedback-paths.js +145 -0
- package/scripts/feedback-quality.js +139 -0
- package/scripts/feedback-root-consolidator.js +238 -0
- package/scripts/feedback-schema.js +426 -0
- package/scripts/feedback-session.js +286 -0
- package/scripts/feedback-to-memory.js +185 -0
- package/scripts/feedback-to-rules.js +163 -0
- package/scripts/filesystem-search.js +404 -0
- package/scripts/funnel-analytics.js +35 -0
- package/scripts/gate-satisfy.js +42 -0
- package/scripts/gate-stats.js +116 -0
- package/scripts/gate-templates.js +70 -0
- package/scripts/gates-engine.js +816 -0
- package/scripts/generate-paperbanana-diagrams.sh +99 -0
- package/scripts/generate-pretool-hook.sh +40 -0
- package/scripts/github-about.js +350 -0
- package/scripts/github-outreach.js +65 -0
- package/scripts/gtm-revenue-loop.js +520 -0
- package/scripts/hallucination-detector.js +226 -0
- package/scripts/hf-papers.js +317 -0
- package/scripts/history-distiller.js +200 -0
- package/scripts/hook-auto-capture.sh +95 -0
- package/scripts/hook-stop-pr-thread-check.sh +68 -0
- package/scripts/hook-stop-self-score.sh +51 -0
- package/scripts/hook-stop-verify-deploy.sh +31 -0
- package/scripts/hook-thumbgate-cache-updater.js +48 -0
- package/scripts/hook-verify-before-done.sh +20 -0
- package/scripts/hosted-config.js +170 -0
- package/scripts/hybrid-feedback-context.js +676 -0
- package/scripts/install-mcp.js +159 -0
- package/scripts/intent-router.js +392 -0
- package/scripts/internal-agent-bootstrap.js +490 -0
- package/scripts/jsonl-watcher.js +155 -0
- package/scripts/lesson-db.js +613 -0
- package/scripts/lesson-inference.js +315 -0
- package/scripts/lesson-retrieval.js +95 -0
- package/scripts/lesson-rotation.js +137 -0
- package/scripts/lesson-search.js +644 -0
- package/scripts/lesson-synthesis.js +196 -0
- package/scripts/license.js +50 -0
- package/scripts/local-model-profile.js +383 -0
- package/scripts/markdown-escape.js +12 -0
- package/scripts/marketing-experiment.js +671 -0
- package/scripts/mcp-config.js +149 -0
- package/scripts/mcp-policy.js +99 -0
- package/scripts/memalign-recall.js +111 -0
- package/scripts/memory-firewall.js +222 -0
- package/scripts/memory-migration.js +296 -0
- package/scripts/meta-policy.js +194 -0
- package/scripts/metered-billing.js +16 -0
- package/scripts/model-tier-router.js +301 -0
- package/scripts/money-watcher.js +71 -0
- package/scripts/multi-hop-recall.js +240 -0
- package/scripts/natural-language-harness.js +330 -0
- package/scripts/obsidian-export.js +712 -0
- package/scripts/operational-dashboard.js +103 -0
- package/scripts/operational-summary.js +93 -0
- package/scripts/optimize-context.js +17 -0
- package/scripts/org-dashboard.js +201 -0
- package/scripts/partner-orchestration.js +146 -0
- package/scripts/per-step-scoring.js +165 -0
- package/scripts/perplexity-marketing.js +466 -0
- package/scripts/pii-scanner.js +153 -0
- package/scripts/plan-gate.js +154 -0
- package/scripts/post-everywhere.js +308 -0
- package/scripts/post-to-x-retry.sh +22 -0
- package/scripts/post-to-x.js +369 -0
- package/scripts/pr-manager.js +236 -0
- package/scripts/predictive-insights.js +356 -0
- package/scripts/principle-extractor.js +162 -0
- package/scripts/pro-features.js +40 -0
- package/scripts/pro-local-dashboard.js +174 -0
- package/scripts/problem-detail.js +53 -0
- package/scripts/product-feedback.js +134 -0
- package/scripts/profile-router.js +245 -0
- package/scripts/prompt-dlp.js +221 -0
- package/scripts/prompt-guard.js +83 -0
- package/scripts/prove-adapters.js +863 -0
- package/scripts/prove-attribution.js +365 -0
- package/scripts/prove-automation.js +653 -0
- package/scripts/prove-autoresearch.js +304 -0
- package/scripts/prove-claim-verification.js +277 -0
- package/scripts/prove-cloudflare-sandbox.js +163 -0
- package/scripts/prove-data-pipeline.js +410 -0
- package/scripts/prove-data-quality.js +227 -0
- package/scripts/prove-evolution.js +352 -0
- package/scripts/prove-harnesses.js +287 -0
- package/scripts/prove-intelligence.js +259 -0
- package/scripts/prove-lancedb.js +371 -0
- package/scripts/prove-local-intelligence.js +342 -0
- package/scripts/prove-loop-closure.js +263 -0
- package/scripts/prove-predictive-insights.js +357 -0
- package/scripts/prove-runtime.js +350 -0
- package/scripts/prove-seo-gsd.js +234 -0
- package/scripts/prove-settings.js +279 -0
- package/scripts/prove-subway-upgrades.js +277 -0
- package/scripts/prove-tessl.js +229 -0
- package/scripts/prove-training-export.js +327 -0
- package/scripts/prove-workflow-contract.js +116 -0
- package/scripts/prove-xmemory.js +332 -0
- package/scripts/publish-decision.js +133 -0
- package/scripts/pulse.js +80 -0
- package/scripts/rate-limiter.js +125 -0
- package/scripts/reddit-dm-outreach.js +182 -0
- package/scripts/reddit-monitor-cron.sh +26 -0
- package/scripts/reflector-agent.js +221 -0
- package/scripts/reminder-engine.js +132 -0
- package/scripts/revenue-status.js +472 -0
- package/scripts/risk-scorer.js +458 -0
- package/scripts/rlaif-self-audit.js +129 -0
- package/scripts/rubric-engine.js +230 -0
- package/scripts/schedule-manager.js +251 -0
- package/scripts/secret-scanner.js +414 -0
- package/scripts/self-heal.js +147 -0
- package/scripts/self-healing-check.js +188 -0
- package/scripts/semantic-layer.js +98 -0
- package/scripts/seo-gsd.js +1153 -0
- package/scripts/settings-hierarchy.js +214 -0
- package/scripts/shieldcortex-memory-firewall-runner.mjs +53 -0
- package/scripts/skill-exporter.js +262 -0
- package/scripts/skill-generator.js +446 -0
- package/scripts/skill-materializer.js +134 -0
- package/scripts/skill-packs.js +136 -0
- package/scripts/skill-proposer.js +99 -0
- package/scripts/skill-quality-tracker.js +284 -0
- package/scripts/slo-alert-engine.js +14 -0
- package/scripts/slow-loop.js +72 -0
- package/scripts/social-analytics/db/schema.sql +32 -0
- package/scripts/social-analytics/digest.js +256 -0
- package/scripts/social-analytics/generate-instagram-card.js +97 -0
- package/scripts/social-analytics/instagram-thumbgate-post.js +73 -0
- package/scripts/social-analytics/mcp-server.js +289 -0
- package/scripts/social-analytics/normalizer.js +580 -0
- package/scripts/social-analytics/notify.js +162 -0
- package/scripts/social-analytics/poll-all.js +107 -0
- package/scripts/social-analytics/pollers/github.js +195 -0
- package/scripts/social-analytics/pollers/instagram.js +253 -0
- package/scripts/social-analytics/pollers/linkedin.js +330 -0
- package/scripts/social-analytics/pollers/plausible.js +247 -0
- package/scripts/social-analytics/pollers/reddit.js +306 -0
- package/scripts/social-analytics/pollers/threads.js +233 -0
- package/scripts/social-analytics/pollers/tiktok.js +203 -0
- package/scripts/social-analytics/pollers/x.js +227 -0
- package/scripts/social-analytics/pollers/youtube.js +304 -0
- package/scripts/social-analytics/pollers/zernio.js +180 -0
- package/scripts/social-analytics/publish-instagram-thumbgate.js +85 -0
- package/scripts/social-analytics/publishers/devto.js +122 -0
- package/scripts/social-analytics/publishers/instagram.js +317 -0
- package/scripts/social-analytics/publishers/linkedin.js +294 -0
- package/scripts/social-analytics/publishers/reddit.js +390 -0
- package/scripts/social-analytics/publishers/threads.js +275 -0
- package/scripts/social-analytics/publishers/tiktok.js +217 -0
- package/scripts/social-analytics/publishers/x.js +259 -0
- package/scripts/social-analytics/publishers/youtube.js +223 -0
- package/scripts/social-analytics/publishers/zernio.js +209 -0
- package/scripts/social-analytics/run-digest.js +34 -0
- package/scripts/social-analytics/store.js +257 -0
- package/scripts/social-analytics/utm.js +143 -0
- package/scripts/social-pipeline.js +2628 -0
- package/scripts/social-quality-gate.js +18 -0
- package/scripts/social-reply-monitor.js +445 -0
- package/scripts/status-dashboard.js +155 -0
- package/scripts/statusline-lesson.js +16 -0
- package/scripts/statusline-tower.js +8 -0
- package/scripts/statusline.sh +116 -0
- package/scripts/stripe-live-status.js +115 -0
- package/scripts/subagent-profiles.js +79 -0
- package/scripts/sync-gh-secrets-from-env.sh +70 -0
- package/scripts/sync-github-about.js +52 -0
- package/scripts/sync-version.js +451 -0
- package/scripts/synthetic-dpo.js +234 -0
- package/scripts/telemetry-analytics.js +821 -0
- package/scripts/tessl-export.js +371 -0
- package/scripts/test-coverage.js +120 -0
- package/scripts/thompson-sampling.js +417 -0
- package/scripts/thumbgate-search.js +189 -0
- package/scripts/tool-kpi-tracker.js +12 -0
- package/scripts/tool-registry.js +811 -0
- package/scripts/train_from_feedback.py +910 -0
- package/scripts/user-profile.js +78 -0
- package/scripts/validate-feedback.js +580 -0
- package/scripts/validate-workflow-contract.js +287 -0
- package/scripts/vector-store.js +198 -0
- package/scripts/verification-loop.js +291 -0
- package/scripts/verify-obsidian-setup.sh +269 -0
- package/scripts/verify-run.js +269 -0
- package/scripts/webhook-delivery.js +62 -0
- package/scripts/weekly-auto-post.js +124 -0
- package/scripts/workflow-runs.js +154 -0
- package/scripts/workflow-sprint-intake.js +475 -0
- package/scripts/workspace-evolver.js +374 -0
- package/scripts/x-autonomous-marketing.js +139 -0
- package/scripts/xmemory-lite.js +405 -0
- package/skills/agent-memory/SKILL.md +97 -0
- package/skills/solve-architecture-autonomy/SKILL.md +17 -0
- package/skills/solve-architecture-autonomy/tool.js +33 -0
- package/skills/thumbgate/SKILL.md +114 -0
- package/skills/thumbgate-feedback/SKILL.md +49 -0
- package/src/api/server.js +4208 -0
|
@@ -0,0 +1,1014 @@
|
|
|
1
|
+
<!DOCTYPE html>
|
|
2
|
+
<html lang="en">
|
|
3
|
+
<head>
|
|
4
|
+
<!--
|
|
5
|
+
______ __
|
|
6
|
+
/ ____/___ ____ ___ ____ __ __/ /____ _____
|
|
7
|
+
/ / / __ \/ __ `__ \/ __ \/ / / / __/ _ \/ ___/
|
|
8
|
+
/ /___/ /_/ / / / / / / /_/ / /_/ / /_/ __/ /
|
|
9
|
+
\____/\____/_/ /_/ /_/ .___/\__,_/\__/\___/_/
|
|
10
|
+
/_/
|
|
11
|
+
Created with Perplexity Computer
|
|
12
|
+
https://www.perplexity.ai/computer
|
|
13
|
+
-->
|
|
14
|
+
<meta name="generator" content="Perplexity Computer">
|
|
15
|
+
<meta name="author" content="Perplexity Computer">
|
|
16
|
+
<meta property="og:see_also" content="https://www.perplexity.ai/computer">
|
|
17
|
+
<link rel="author" href="https://www.perplexity.ai/computer">
|
|
18
|
+
|
|
19
|
+
<meta charset="UTF-8">
|
|
20
|
+
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
|
21
|
+
__GOOGLE_SITE_VERIFICATION_META__
|
|
22
|
+
<title>ThumbGate — Stop AI Coding Agents From Repeating Mistakes</title>
|
|
23
|
+
<meta name="description" content="Pre-action gates for AI coding agents. Skill disclosure cuts tokens. Hallucination and PII checks harden outputs. 👍 Thumbs up reinforces good behavior. 👎 Thumbs down blocks repeated mistakes. Free is local. History-aware lessons distill vague feedback. Team adds shared lessons and org visibility, plus generated review views.">
|
|
24
|
+
<meta property="og:title" content="ThumbGate — Human-in-the-Loop Enforcement for AI Agents">
|
|
25
|
+
<meta property="og:description" content="Pre-action gates for AI coding agents. Skill disclosure cuts tokens. Hallucination and PII checks harden outputs. 👍 Thumbs up reinforces good behavior. 👎 Thumbs down blocks repeated mistakes. Free is local. History-aware lessons distill vague feedback. Team adds shared lessons and org visibility, plus generated review views.">
|
|
26
|
+
<meta property="og:type" content="website">
|
|
27
|
+
<meta name="keywords" content="ThumbGate, thumbgate, AI agent guardrails, pre-action gates, MCP server, Claude Code, Claude Code security, Claude Code guardrails, Claw-code, Cursor, Codex, Gemini, Amp, OpenCode, vibe coding safety, SpecLock alternative, Mem0 alternative, AI coding agent memory, PreToolUse hooks, prevention rules, feedback enforcement">
|
|
28
|
+
|
|
29
|
+
<!-- Privacy-friendly analytics by Plausible -->
|
|
30
|
+
<script defer data-domain="thumbgate-production.up.railway.app" data-api="/api/event" src="/js/analytics.js"></script>
|
|
31
|
+
__GA_BOOTSTRAP__
|
|
32
|
+
|
|
33
|
+
<script>
|
|
34
|
+
const gaMeasurementId = '__GA_MEASUREMENT_ID__';
|
|
35
|
+
const serverVisitorId = '__SERVER_VISITOR_ID__';
|
|
36
|
+
const serverSessionId = '__SERVER_SESSION_ID__';
|
|
37
|
+
const serverAcquisitionId = '__SERVER_ACQUISITION_ID__';
|
|
38
|
+
const serverTelemetryCaptured = '__SERVER_TELEMETRY_CAPTURED__' === 'true';
|
|
39
|
+
</script>
|
|
40
|
+
|
|
41
|
+
<script type="application/ld+json">
|
|
42
|
+
{
|
|
43
|
+
"@context": "https://schema.org",
|
|
44
|
+
"@type": "SoftwareApplication",
|
|
45
|
+
"name": "ThumbGate",
|
|
46
|
+
"alternateName": "thumbgate",
|
|
47
|
+
"description": "👍 Thumbs up reinforces good behavior. 👎 Thumbs down blocks repeated mistakes. Free is local. History-aware lessons distill vague feedback. Team adds shared lessons and org visibility, plus generated review views.",
|
|
48
|
+
"applicationCategory": "DeveloperApplication",
|
|
49
|
+
"operatingSystem": "Cross-platform, Node.js >=18.18.0",
|
|
50
|
+
"license": "https://opensource.org/licenses/MIT",
|
|
51
|
+
"url": "https://github.com/IgorGanapolsky/ThumbGate",
|
|
52
|
+
"downloadUrl": "https://www.npmjs.com/package/thumbgate",
|
|
53
|
+
"installUrl": "https://www.npmjs.com/package/thumbgate",
|
|
54
|
+
"dateModified": "2026-04-03",
|
|
55
|
+
"creator": {
|
|
56
|
+
"@type": "Person",
|
|
57
|
+
"name": "Igor Ganapolsky",
|
|
58
|
+
"url": "https://github.com/IgorGanapolsky"
|
|
59
|
+
},
|
|
60
|
+
"featureList": [
|
|
61
|
+
"Pre-Action Gates — block known-bad tool calls before execution",
|
|
62
|
+
"Domain Skill Packs — Stripe, Railway, database migration best practices",
|
|
63
|
+
"Progressive Disclosure — 82% token savings with 3-tier L1/L2/L3 loading",
|
|
64
|
+
"Hallucination Detection — decomposes claims into verifiable sub-claims",
|
|
65
|
+
"PII Scanner — blocks emails, credit cards, SSNs in feedback and exports",
|
|
66
|
+
"Background Agent Governance — per-agent pass rates, CI auto-feedback",
|
|
67
|
+
"Memory Migration — imports Claude Code MEMORY.md into unlimited SQLite DB",
|
|
68
|
+
"Prompt-Level DLP — scans tool call inputs before execution",
|
|
69
|
+
"Per-Step Scoring — every gate decision becomes a DPO/KTO training signal"
|
|
70
|
+
],
|
|
71
|
+
"offers": [
|
|
72
|
+
{
|
|
73
|
+
"@type": "Offer",
|
|
74
|
+
"name": "Free",
|
|
75
|
+
"price": "0",
|
|
76
|
+
"priceCurrency": "USD",
|
|
77
|
+
"description": "Local enforcement — captures, recalls, gates, and PreToolUse hook blocking for solo devs"
|
|
78
|
+
},
|
|
79
|
+
{
|
|
80
|
+
"@type": "Offer",
|
|
81
|
+
"name": "Pro Monthly",
|
|
82
|
+
"price": "19",
|
|
83
|
+
"priceCurrency": "USD",
|
|
84
|
+
"description": "Personal local dashboard, DPO export, advanced data exports, and founder-license support for individual operators",
|
|
85
|
+
"url": "https://buy.stripe.com/fZu9AT3Ug6zcdWh0XN3sI08"
|
|
86
|
+
},
|
|
87
|
+
{
|
|
88
|
+
"@type": "Offer",
|
|
89
|
+
"name": "Pro Annual",
|
|
90
|
+
"price": "149",
|
|
91
|
+
"priceCurrency": "USD",
|
|
92
|
+
"description": "Annual Pro for individual operators who want the personal local dashboard and proof-ready exports",
|
|
93
|
+
"url": "https://buy.stripe.com/9B66oHeyUaPsaK521R3sI09"
|
|
94
|
+
},
|
|
95
|
+
{
|
|
96
|
+
"@type": "Offer",
|
|
97
|
+
"name": "Team",
|
|
98
|
+
"description": "Hosted shared lesson database, generated hosted review views, org dashboard, multi-agent visibility, and workflow hardening rollout support for teams",
|
|
99
|
+
"url": "https://thumbgate-production.up.railway.app/#workflow-sprint-intake"
|
|
100
|
+
}
|
|
101
|
+
]
|
|
102
|
+
}
|
|
103
|
+
</script>
|
|
104
|
+
|
|
105
|
+
<script type="application/ld+json">
|
|
106
|
+
{
|
|
107
|
+
"@context": "https://schema.org",
|
|
108
|
+
"@type": "HowTo",
|
|
109
|
+
"name": "How to prevent AI coding agents from repeating mistakes",
|
|
110
|
+
"description": "Set up ThumbGate to capture feedback, generate prevention rules, and block known-bad actions before execution.",
|
|
111
|
+
"step": [
|
|
112
|
+
{
|
|
113
|
+
"@type": "HowToStep",
|
|
114
|
+
"position": 1,
|
|
115
|
+
"name": "Install ThumbGate",
|
|
116
|
+
"text": "Run: npx thumbgate init --agent claude-code. This adds the MCP server to your agent. No API key needed — everything runs locally."
|
|
117
|
+
},
|
|
118
|
+
{
|
|
119
|
+
"@type": "HowToStep",
|
|
120
|
+
"position": 2,
|
|
121
|
+
"name": "Give feedback when something goes wrong",
|
|
122
|
+
"text": "When your agent makes a mistake, give it a thumbs down with context: what went wrong and how to avoid it. ThumbGate validates the feedback and promotes it to a reusable memory."
|
|
123
|
+
},
|
|
124
|
+
{
|
|
125
|
+
"@type": "HowToStep",
|
|
126
|
+
"position": 3,
|
|
127
|
+
"name": "Prevention rules auto-generate",
|
|
128
|
+
"text": "After repeated failures in the same domain, ThumbGate auto-generates prevention rules. These rules are injected into the agent's context at the start of every session via the recall MCP tool."
|
|
129
|
+
},
|
|
130
|
+
{
|
|
131
|
+
"@type": "HowToStep",
|
|
132
|
+
"position": 4,
|
|
133
|
+
"name": "Pre-action gates block the mistake",
|
|
134
|
+
"text": "When the agent tries to repeat a known-bad action, the PreToolUse hook fires and physically blocks the tool call before execution. The agent cannot repeat the mistake."
|
|
135
|
+
}
|
|
136
|
+
],
|
|
137
|
+
"totalTime": "PT5M",
|
|
138
|
+
"tool": { "@type": "SoftwareApplication", "name": "thumbgate", "url": "https://www.npmjs.com/package/thumbgate" }
|
|
139
|
+
}
|
|
140
|
+
</script>
|
|
141
|
+
|
|
142
|
+
<script type="application/ld+json">
|
|
143
|
+
{
|
|
144
|
+
"@context": "https://schema.org",
|
|
145
|
+
"@type": "FAQPage",
|
|
146
|
+
"mainEntity": [
|
|
147
|
+
{
|
|
148
|
+
"@type": "Question",
|
|
149
|
+
"name": "Does ThumbGate support model fine-tuning?",
|
|
150
|
+
"acceptedAnswer": {
|
|
151
|
+
"@type": "Answer",
|
|
152
|
+
"text": "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."
|
|
153
|
+
}
|
|
154
|
+
},
|
|
155
|
+
{
|
|
156
|
+
"@type": "Question",
|
|
157
|
+
"name": "How is ThumbGate different from model-training feedback loops?",
|
|
158
|
+
"acceptedAnswer": {
|
|
159
|
+
"@type": "Answer",
|
|
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
|
+
}
|
|
162
|
+
},
|
|
163
|
+
{
|
|
164
|
+
"@type": "Question",
|
|
165
|
+
"name": "What is the ThumbGate tech stack?",
|
|
166
|
+
"acceptedAnswer": {
|
|
167
|
+
"@type": "Answer",
|
|
168
|
+
"text": "SQLite+FTS5 lesson DB, MemAlign-inspired dual recall, Thompson Sampling for adaptive gates, LanceDB vector search with Hugging Face embeddings, ContextFS context assembly, Bayesian belief updates, and PreToolUse hook enforcement."
|
|
169
|
+
}
|
|
170
|
+
},
|
|
171
|
+
{
|
|
172
|
+
"@type": "Question",
|
|
173
|
+
"name": "What AI agents does ThumbGate work with?",
|
|
174
|
+
"acceptedAnswer": {
|
|
175
|
+
"@type": "Answer",
|
|
176
|
+
"text": "Claude Code, Cursor, Codex, Gemini CLI, Amp, OpenCode, and any MCP-compatible agent."
|
|
177
|
+
}
|
|
178
|
+
},
|
|
179
|
+
{
|
|
180
|
+
"@type": "Question",
|
|
181
|
+
"name": "How are pre-action gates different from prompt rules?",
|
|
182
|
+
"acceptedAnswer": {
|
|
183
|
+
"@type": "Answer",
|
|
184
|
+
"text": "Prompt rules are suggestions agents can ignore. Pre-Action Gates are enforcement — they block the action before execution via PreToolUse hooks. Gates are auto-generated from feedback and use Thompson Sampling to adapt."
|
|
185
|
+
}
|
|
186
|
+
},
|
|
187
|
+
{
|
|
188
|
+
"@type": "Question",
|
|
189
|
+
"name": "How is ThumbGate different from SpecLock?",
|
|
190
|
+
"acceptedAnswer": {
|
|
191
|
+
"@type": "Answer",
|
|
192
|
+
"text": "SpecLock requires manually writing constraints or compiling them from a PRD. ThumbGate learns automatically from thumbs-up/down feedback and auto-generates prevention rules from repeated failures. SpecLock locks files from modification; ThumbGate blocks specific actions (like force-push) before they execute."
|
|
193
|
+
}
|
|
194
|
+
},
|
|
195
|
+
{
|
|
196
|
+
"@type": "Question",
|
|
197
|
+
"name": "How is ThumbGate different from Mem0?",
|
|
198
|
+
"acceptedAnswer": {
|
|
199
|
+
"@type": "Answer",
|
|
200
|
+
"text": "Mem0 is cloud-hosted memory for AI apps. ThumbGate is local-first enforcement. Mem0 remembers context but cannot block actions. ThumbGate captures feedback, promotes it to prevention rules, and physically blocks tool calls that match known failure patterns via PreToolUse hooks."
|
|
201
|
+
}
|
|
202
|
+
}
|
|
203
|
+
]
|
|
204
|
+
}
|
|
205
|
+
</script>
|
|
206
|
+
|
|
207
|
+
<style>
|
|
208
|
+
*, *::before, *::after { margin: 0; padding: 0; box-sizing: border-box; }
|
|
209
|
+
|
|
210
|
+
:root {
|
|
211
|
+
--bg: #0a0a0b;
|
|
212
|
+
--bg-raised: #111113;
|
|
213
|
+
--bg-card: #161618;
|
|
214
|
+
--border: #222225;
|
|
215
|
+
--text: #e8e8ec;
|
|
216
|
+
--text-muted: #8b8b96;
|
|
217
|
+
--cyan: #22d3ee;
|
|
218
|
+
--cyan-dim: rgba(34, 211, 238, 0.12);
|
|
219
|
+
--cyan-glow: rgba(34, 211, 238, 0.25);
|
|
220
|
+
--green: #4ade80;
|
|
221
|
+
--red: #f87171;
|
|
222
|
+
--font: -apple-system, BlinkMacSystemFont, 'Segoe UI', 'Inter', Roboto, sans-serif;
|
|
223
|
+
--mono: 'SF Mono', 'Cascadia Code', 'JetBrains Mono', 'Fira Code', Consolas, monospace;
|
|
224
|
+
}
|
|
225
|
+
|
|
226
|
+
html { scroll-behavior: smooth; }
|
|
227
|
+
body { font-family: var(--font); background: var(--bg); color: var(--text); line-height: 1.6; -webkit-font-smoothing: antialiased; }
|
|
228
|
+
|
|
229
|
+
.container { max-width: 960px; margin: 0 auto; padding: 0 24px; }
|
|
230
|
+
|
|
231
|
+
/* NAV */
|
|
232
|
+
nav { position: sticky; top: 0; z-index: 50; background: rgba(10,10,11,0.85); backdrop-filter: blur(12px); border-bottom: 1px solid var(--border); padding: 14px 0; }
|
|
233
|
+
nav .container { display: flex; justify-content: space-between; align-items: center; }
|
|
234
|
+
.nav-logo { font-weight: 700; font-size: 15px; letter-spacing: -0.02em; color: var(--text); text-decoration: none; }
|
|
235
|
+
.nav-logo span { color: var(--cyan); }
|
|
236
|
+
.nav-links { display: flex; gap: 24px; align-items: center; }
|
|
237
|
+
.nav-links a { color: var(--text-muted); text-decoration: none; font-size: 13px; transition: color 0.15s; }
|
|
238
|
+
.nav-links a:hover { color: var(--text); }
|
|
239
|
+
.nav-cta { background: var(--cyan); color: var(--bg); padding: 6px 14px; border-radius: 6px; font-weight: 600; font-size: 13px; text-decoration: none; transition: opacity 0.15s; }
|
|
240
|
+
.nav-cta:hover { opacity: 0.85; }
|
|
241
|
+
|
|
242
|
+
/* HERO */
|
|
243
|
+
.hero { padding: 100px 0 72px; text-align: center; }
|
|
244
|
+
.hero-thumbs { font-size: 72px; margin-bottom: 20px; line-height: 1; filter: drop-shadow(0 0 24px rgba(34,211,238,0.3)); }
|
|
245
|
+
.hero-badge { display: inline-flex; align-items: center; gap: 6px; font-size: 12px; color: var(--cyan); background: var(--cyan-dim); border: 1px solid rgba(34,211,238,0.2); padding: 4px 12px; border-radius: 100px; margin-bottom: 24px; font-weight: 500; letter-spacing: 0.02em; text-transform: uppercase; }
|
|
246
|
+
.hero h1 { font-size: clamp(32px, 5vw, 52px); font-weight: 700; letter-spacing: -0.035em; line-height: 1.1; max-width: 700px; margin: 0 auto 16px; }
|
|
247
|
+
.hero p { font-size: 17px; color: var(--text-muted); max-width: 520px; margin: 0 auto 36px; line-height: 1.6; }
|
|
248
|
+
.hero-persona { font-size: 15px; color: var(--cyan); max-width: 600px; margin: 0 auto 20px; line-height: 1.5; font-weight: 500; }
|
|
249
|
+
.hero-signals { display: flex; justify-content: center; flex-wrap: wrap; gap: 12px; margin: 0 auto 28px; max-width: 760px; }
|
|
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
|
+
.signal-pill.signal-up { border-color: rgba(74, 222, 128, 0.28); color: #b8f7c8; background: rgba(74, 222, 128, 0.08); }
|
|
252
|
+
.signal-pill.signal-down { border-color: rgba(248, 113, 113, 0.28); color: #ffc0c0; background: rgba(248, 113, 113, 0.08); }
|
|
253
|
+
.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
|
+
.hero-install:hover { border-color: var(--cyan); }
|
|
255
|
+
.hero-install .prompt { color: var(--text-muted); user-select: none; }
|
|
256
|
+
.hero-install .cmd { color: var(--cyan); }
|
|
257
|
+
.hero-install .copy-hint { font-size: 11px; color: var(--text-muted); font-family: var(--font); margin-left: 8px; }
|
|
258
|
+
.hero-install .copied { color: var(--green); }
|
|
259
|
+
|
|
260
|
+
/* SOCIAL PROOF BAR */
|
|
261
|
+
.proof-bar { display: flex; justify-content: center; flex-wrap: wrap; gap: 24px; font-size: 13px; color: var(--text-muted); padding: 0 0 8px; }
|
|
262
|
+
.proof-bar a { display: inline-flex; align-items: center; gap: 6px; color: var(--text-muted); text-decoration: none; transition: color 0.15s; }
|
|
263
|
+
.proof-bar a:hover { color: var(--cyan); }
|
|
264
|
+
.proof-bar .dot { width: 4px; height: 4px; background: var(--border); border-radius: 50%; display: inline-block; }
|
|
265
|
+
|
|
266
|
+
/* COMPATIBILITY */
|
|
267
|
+
.compatibility { padding: 0 0 80px; }
|
|
268
|
+
.compatibility-grid { display: grid; grid-template-columns: repeat(3, 1fr); gap: 20px; }
|
|
269
|
+
.compat-card { background: var(--bg-card); border: 1px solid var(--border); border-radius: 12px; padding: 24px; text-decoration: none; color: inherit; display: block; transition: border-color 0.2s, transform 0.15s; cursor: pointer; }
|
|
270
|
+
.compat-card:hover { border-color: rgba(34,211,238,0.3); transform: translateY(-2px); }
|
|
271
|
+
.compat-card h3 { font-size: 16px; font-weight: 600; letter-spacing: -0.01em; margin-bottom: 10px; }
|
|
272
|
+
.compat-card .card-arrow { font-size: 13px; color: var(--cyan); margin-top: 12px; font-weight: 500; }
|
|
273
|
+
.compat-card p { font-size: 14px; color: var(--text-muted); line-height: 1.6; }
|
|
274
|
+
.compat-card code { font-family: var(--mono); font-size: 12px; background: rgba(34,211,238,0.08); color: var(--cyan); padding: 2px 6px; border-radius: 4px; }
|
|
275
|
+
|
|
276
|
+
/* SEO PAGES */
|
|
277
|
+
.seo-pages { padding: 0 0 80px; }
|
|
278
|
+
.seo-grid { display: grid; grid-template-columns: repeat(2, 1fr); gap: 20px; }
|
|
279
|
+
.seo-card {
|
|
280
|
+
background: linear-gradient(180deg, rgba(17,17,19,0.98) 0%, rgba(22,22,24,0.96) 100%);
|
|
281
|
+
border: 1px solid var(--border);
|
|
282
|
+
border-radius: 14px;
|
|
283
|
+
padding: 24px;
|
|
284
|
+
text-decoration: none;
|
|
285
|
+
color: inherit;
|
|
286
|
+
transition: border-color 0.2s, transform 0.15s;
|
|
287
|
+
}
|
|
288
|
+
.seo-card:hover { border-color: rgba(34,211,238,0.3); transform: translateY(-2px); }
|
|
289
|
+
.seo-card h3 { font-size: 18px; margin-bottom: 10px; letter-spacing: -0.02em; }
|
|
290
|
+
.seo-card p { font-size: 14px; color: var(--text-muted); line-height: 1.6; }
|
|
291
|
+
.seo-kicker {
|
|
292
|
+
display: inline-flex;
|
|
293
|
+
align-items: center;
|
|
294
|
+
gap: 8px;
|
|
295
|
+
font-size: 11px;
|
|
296
|
+
text-transform: uppercase;
|
|
297
|
+
letter-spacing: 0.08em;
|
|
298
|
+
color: var(--cyan);
|
|
299
|
+
margin-bottom: 12px;
|
|
300
|
+
font-weight: 700;
|
|
301
|
+
}
|
|
302
|
+
.seo-card .card-arrow { font-size: 13px; color: var(--cyan); margin-top: 12px; font-weight: 500; }
|
|
303
|
+
|
|
304
|
+
/* HOW IT WORKS */
|
|
305
|
+
.how-it-works { padding: 80px 0; }
|
|
306
|
+
.section-label { font-size: 12px; text-transform: uppercase; letter-spacing: 0.1em; color: var(--cyan); font-weight: 600; margin-bottom: 12px; text-align: center; }
|
|
307
|
+
.section-title { font-size: clamp(24px, 3vw, 32px); font-weight: 700; letter-spacing: -0.025em; text-align: center; margin-bottom: 48px; }
|
|
308
|
+
.steps { display: grid; grid-template-columns: repeat(3, 1fr); gap: 20px; }
|
|
309
|
+
.step { background: var(--bg-card); border: 1px solid var(--border); border-radius: 12px; padding: 28px 24px; position: relative; transition: border-color 0.2s; }
|
|
310
|
+
.step:hover { border-color: rgba(34,211,238,0.3); }
|
|
311
|
+
.step-num { display: inline-flex; align-items: center; justify-content: center; width: 28px; height: 28px; border-radius: 8px; background: var(--cyan-dim); color: var(--cyan); font-size: 13px; font-weight: 700; margin-bottom: 16px; }
|
|
312
|
+
.step h3 { font-size: 16px; font-weight: 600; margin-bottom: 8px; letter-spacing: -0.01em; }
|
|
313
|
+
.step p { font-size: 14px; color: var(--text-muted); line-height: 1.55; }
|
|
314
|
+
.step code { font-family: var(--mono); font-size: 12px; background: rgba(34,211,238,0.08); color: var(--cyan); padding: 2px 6px; border-radius: 4px; }
|
|
315
|
+
|
|
316
|
+
/* CODE EXAMPLE */
|
|
317
|
+
.code-section { padding: 0 0 80px; }
|
|
318
|
+
.code-block { background: var(--bg-raised); border: 1px solid var(--border); border-radius: 12px; overflow: hidden; max-width: 640px; margin: 0 auto; }
|
|
319
|
+
.code-header { display: flex; align-items: center; gap: 8px; padding: 12px 16px; border-bottom: 1px solid var(--border); }
|
|
320
|
+
.code-dot { width: 10px; height: 10px; border-radius: 50%; }
|
|
321
|
+
.code-dot.red { background: #f87171; }
|
|
322
|
+
.code-dot.yellow { background: #fbbf24; }
|
|
323
|
+
.code-dot.green { background: #4ade80; }
|
|
324
|
+
.code-header span { font-size: 12px; color: var(--text-muted); margin-left: 8px; }
|
|
325
|
+
.code-body { padding: 20px; font-family: var(--mono); font-size: 13px; line-height: 1.7; overflow-x: auto; }
|
|
326
|
+
.code-body .comment { color: #6b7280; }
|
|
327
|
+
.code-body .keyword { color: #c084fc; }
|
|
328
|
+
.code-body .string { color: #4ade80; }
|
|
329
|
+
.code-body .fn { color: var(--cyan); }
|
|
330
|
+
|
|
331
|
+
/* PRICING */
|
|
332
|
+
.pricing { padding: 80px 0; }
|
|
333
|
+
.pricing-grid { display: grid; grid-template-columns: repeat(3, 1fr); gap: 20px; max-width: 1080px; margin: 0 auto; }
|
|
334
|
+
.price-card { background: var(--bg-card); border: 1px solid var(--border); border-radius: 12px; padding: 32px 28px; }
|
|
335
|
+
.price-card.pro { border-color: var(--cyan); box-shadow: 0 0 40px var(--cyan-dim), inset 0 1px 0 rgba(34,211,238,0.15); }
|
|
336
|
+
.price-card.team { border-color: rgba(74,222,128,0.45); box-shadow: inset 0 1px 0 rgba(74,222,128,0.16); }
|
|
337
|
+
.price-card .tier { font-size: 13px; text-transform: uppercase; letter-spacing: 0.08em; color: var(--text-muted); font-weight: 600; margin-bottom: 8px; }
|
|
338
|
+
.price-card.pro .tier { color: var(--cyan); }
|
|
339
|
+
.price-card.team .tier { color: var(--green); }
|
|
340
|
+
.price-card .price { font-size: 40px; font-weight: 700; letter-spacing: -0.03em; margin-bottom: 4px; }
|
|
341
|
+
.price-card .price-sub { font-size: 13px; color: var(--text-muted); margin-bottom: 24px; }
|
|
342
|
+
.price-card ul { list-style: none; margin-bottom: 28px; }
|
|
343
|
+
.price-card li { font-size: 14px; color: var(--text-muted); padding: 6px 0; display: flex; align-items: flex-start; gap: 8px; }
|
|
344
|
+
.price-card li::before { content: "✓"; color: var(--cyan); font-weight: 700; flex-shrink: 0; }
|
|
345
|
+
.price-card.pro li::before { color: var(--cyan); }
|
|
346
|
+
.btn-free { display: block; text-align: center; padding: 10px; border: 1px solid var(--border); border-radius: 8px; color: var(--text); text-decoration: none; font-size: 14px; font-weight: 500; transition: border-color 0.15s; }
|
|
347
|
+
.btn-free:hover { border-color: var(--text-muted); }
|
|
348
|
+
.btn-pro { display: block; text-align: center; padding: 10px; background: var(--cyan); color: var(--bg); border-radius: 8px; text-decoration: none; font-size: 14px; font-weight: 600; transition: opacity 0.15s; }
|
|
349
|
+
.btn-pro:hover { opacity: 0.85; }
|
|
350
|
+
.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; }
|
|
351
|
+
.btn-team:hover { border-color: var(--green); transform: translateY(-1px); }
|
|
352
|
+
.team-form { max-width: 860px; margin: 24px auto 0; display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); gap: 14px; }
|
|
353
|
+
.team-form .full { grid-column: 1 / -1; }
|
|
354
|
+
.team-form input, .team-form textarea { width: 100%; background: var(--bg-card); border: 1px solid var(--border); border-radius: 10px; padding: 12px 14px; color: var(--text); font-size: 14px; font-family: inherit; }
|
|
355
|
+
.team-form textarea { min-height: 120px; resize: vertical; }
|
|
356
|
+
.team-form button { width: 100%; }
|
|
357
|
+
|
|
358
|
+
/* FAQ */
|
|
359
|
+
.faq { padding: 80px 0; }
|
|
360
|
+
.faq-list { max-width: 640px; margin: 0 auto; }
|
|
361
|
+
.faq-item { border-bottom: 1px solid var(--border); }
|
|
362
|
+
.faq-q { padding: 20px 0; font-size: 15px; font-weight: 600; cursor: pointer; display: flex; justify-content: space-between; align-items: center; }
|
|
363
|
+
.faq-q::after { content: "+"; font-size: 18px; color: var(--text-muted); transition: transform 0.2s; }
|
|
364
|
+
.faq-item.open .faq-q::after { transform: rotate(45deg); }
|
|
365
|
+
.faq-a { font-size: 14px; color: var(--text-muted); line-height: 1.65; padding-bottom: 20px; display: none; }
|
|
366
|
+
.faq-item.open .faq-a { display: block; }
|
|
367
|
+
|
|
368
|
+
/* CTA SECTION */
|
|
369
|
+
.final-cta { padding: 80px 0; text-align: center; }
|
|
370
|
+
.final-cta h2 { font-size: clamp(24px, 3vw, 32px); font-weight: 700; letter-spacing: -0.025em; margin-bottom: 12px; }
|
|
371
|
+
.final-cta p { font-size: 15px; color: var(--text-muted); margin-bottom: 28px; }
|
|
372
|
+
.final-cta .btn-pro, .final-cta .btn-team { display: inline-block; padding: 12px 32px; font-size: 15px; border-radius: 8px; margin: 0 6px; }
|
|
373
|
+
|
|
374
|
+
/* FOOTER */
|
|
375
|
+
footer { border-top: 1px solid var(--border); padding: 32px 0; }
|
|
376
|
+
footer .container { display: flex; justify-content: space-between; align-items: center; flex-wrap: wrap; gap: 12px; }
|
|
377
|
+
.footer-links { display: flex; gap: 20px; }
|
|
378
|
+
.footer-links a { color: var(--text-muted); text-decoration: none; font-size: 13px; transition: color 0.15s; }
|
|
379
|
+
.footer-links a:hover { color: var(--text); }
|
|
380
|
+
.footer-copy { font-size: 12px; color: var(--text-muted); }
|
|
381
|
+
|
|
382
|
+
/* RESPONSIVE */
|
|
383
|
+
@media (max-width: 700px) {
|
|
384
|
+
.steps { grid-template-columns: 1fr; }
|
|
385
|
+
.compatibility-grid { grid-template-columns: 1fr; }
|
|
386
|
+
.seo-grid { grid-template-columns: 1fr; }
|
|
387
|
+
.pricing-grid { grid-template-columns: 1fr; }
|
|
388
|
+
.team-form { grid-template-columns: 1fr; }
|
|
389
|
+
.hero { padding: 72px 0 56px; }
|
|
390
|
+
.nav-links a:not(.nav-cta) { display: none; }
|
|
391
|
+
.proof-bar { gap: 16px; }
|
|
392
|
+
.proof-bar .dot { display: none; }
|
|
393
|
+
}
|
|
394
|
+
</style>
|
|
395
|
+
</head>
|
|
396
|
+
<body>
|
|
397
|
+
|
|
398
|
+
<!-- NAV -->
|
|
399
|
+
<nav>
|
|
400
|
+
<div class="container">
|
|
401
|
+
<a href="#" class="nav-logo"><span>👍👎</span> ThumbGate</a>
|
|
402
|
+
<div class="nav-links">
|
|
403
|
+
<a href="#how-it-works">How It Works</a>
|
|
404
|
+
<a href="#compatibility">Compatibility</a>
|
|
405
|
+
<a href="#compare-guides">Comparisons</a>
|
|
406
|
+
<a href="#pricing">Pricing</a>
|
|
407
|
+
<a href="#faq">FAQ</a>
|
|
408
|
+
<a href="https://github.com/IgorGanapolsky/ThumbGate" target="_blank" rel="noopener">GitHub</a>
|
|
409
|
+
<a href="/guide">Setup Guide</a>
|
|
410
|
+
<a href="/learn">Learn</a>
|
|
411
|
+
<a href="/dashboard">Dashboard Demo</a>
|
|
412
|
+
<a href="#pricing" class="nav-cta">View Plans</a>
|
|
413
|
+
</div>
|
|
414
|
+
</div>
|
|
415
|
+
</nav>
|
|
416
|
+
|
|
417
|
+
<!-- HERO -->
|
|
418
|
+
<section class="hero">
|
|
419
|
+
<div class="container">
|
|
420
|
+
<div class="hero-thumbs">👍👎</div>
|
|
421
|
+
<div class="hero-badge">● Human-in-the-Loop Enforcement for AI Agents</div>
|
|
422
|
+
<h1>AI agents repeat mistakes.<br>Yours won't.</h1>
|
|
423
|
+
<div class="hero-signals">
|
|
424
|
+
<div class="signal-pill signal-down">👎 blocks dangerous and dumb mistakes before they run</div>
|
|
425
|
+
<div class="signal-pill signal-up">👍 reinforces what worked across sessions</div>
|
|
426
|
+
</div>
|
|
427
|
+
<p class="hero-persona">For power users of Claude Code, Cursor, Codex, Gemini, Amp, and any MCP agent who are tired of fixing the same mistakes every session.</p>
|
|
428
|
+
<p><strong>Every mistake makes your agent stronger.</strong> ThumbGate turns thumbs-up/down feedback into hard gates that block bad actions before they execute. Think of it as an immune system for your AI agent — it learns from your corrections, distills vague signals from conversation context, and enforces lessons automatically. More errors = stronger gates. The safety net for vibe coding that gets more valuable the more chaos it encounters.</p>
|
|
429
|
+
<div class="hero-install" onclick="copyInstall(this)" title="Click to copy">
|
|
430
|
+
<span class="prompt">$</span>
|
|
431
|
+
<span class="cmd">npx thumbgate init</span>
|
|
432
|
+
<span class="copy-hint">click to copy</span>
|
|
433
|
+
</div>
|
|
434
|
+
<div class="proof-bar">
|
|
435
|
+
<a href="https://www.npmjs.com/package/thumbgate" target="_blank" rel="noopener">1,000+ npm downloads →</a>
|
|
436
|
+
<span class="dot"></span>
|
|
437
|
+
<a href="https://github.com/IgorGanapolsky/ThumbGate/actions" target="_blank" rel="noopener">1,500+ tests passing →</a>
|
|
438
|
+
<span class="dot"></span>
|
|
439
|
+
<a href="https://www.producthunt.com/products/thumbgate" target="_blank" rel="noopener">Product Hunt →</a>
|
|
440
|
+
<span class="dot"></span>
|
|
441
|
+
<a href="https://github.com/IgorGanapolsky/ThumbGate/blob/main/LICENSE" target="_blank" rel="noopener">MIT licensed</a>
|
|
442
|
+
<span class="dot"></span>
|
|
443
|
+
<a href="#compatibility">Claude Code · Cursor · Codex · Gemini · Amp · OpenCode</a>
|
|
444
|
+
</div>
|
|
445
|
+
</div>
|
|
446
|
+
</section>
|
|
447
|
+
|
|
448
|
+
<section class="compatibility" id="compatibility">
|
|
449
|
+
<div class="container">
|
|
450
|
+
<div class="section-label">Compatibility</div>
|
|
451
|
+
<h2 class="section-title">One gateway across the agent surfaces you already use</h2>
|
|
452
|
+
<div class="compatibility-grid">
|
|
453
|
+
<a class="compat-card" href="https://github.com/IgorGanapolsky/ThumbGate/blob/main/plugins/claude-codex-bridge/INSTALL.md" target="_blank" rel="noopener">
|
|
454
|
+
<h3>🤖 AI CLIs</h3>
|
|
455
|
+
<p>Claude Code, Claw-code, Codex, Gemini CLI, Amp, and OpenCode all use the same gateway and memory model. Any MCP-compatible agent gets pre-action gates, feedback memory, and enforcement out of the box.</p>
|
|
456
|
+
<div class="card-arrow">View setup guide →</div>
|
|
457
|
+
</a>
|
|
458
|
+
<a class="compat-card" href="/guides/claude-desktop">
|
|
459
|
+
<h3>🧩 Claude Desktop plugin</h3>
|
|
460
|
+
<p>One command install. No build step, no cloud account. Grab the <code>.mcpb</code> bundle or run <code>npx thumbgate init --claude-desktop</code>.</p>
|
|
461
|
+
<div class="card-arrow">Get the Claude plugin →</div>
|
|
462
|
+
</a>
|
|
463
|
+
<a class="compat-card" href="https://github.com/IgorGanapolsky/ThumbGate/tree/main/plugins" target="_blank" rel="noopener">
|
|
464
|
+
<h3>✏️ Editor workflows</h3>
|
|
465
|
+
<p>Cursor ships with a bundled marketplace plugin. VS Code works when you run an MCP-compatible agent inside it.</p>
|
|
466
|
+
<div class="card-arrow">Browse plugins →</div>
|
|
467
|
+
</a>
|
|
468
|
+
<a class="compat-card seo-card" href="https://github.com/IgorGanapolsky/ThumbGate/tree/main/.claude/skills/thumbgate" target="_blank" rel="noopener">
|
|
469
|
+
<h3>⚡ Claude Code Skill</h3>
|
|
470
|
+
<p>Type <code>/thumbgate</code> in any Claude Code session. Auto-triggers on "gate", "feedback", "block mistake". Free skill with Pro upgrade path built in.</p>
|
|
471
|
+
<div class="card-arrow">View skill on GitHub →</div>
|
|
472
|
+
</a>
|
|
473
|
+
</div>
|
|
474
|
+
</div>
|
|
475
|
+
</section>
|
|
476
|
+
|
|
477
|
+
<section class="compatibility" id="social-proof">
|
|
478
|
+
<div class="container">
|
|
479
|
+
<div class="section-label">See It In Action</div>
|
|
480
|
+
<h2 class="section-title">Try the dashboard before you buy anything</h2>
|
|
481
|
+
<div class="agent-grid">
|
|
482
|
+
<div class="agent-card">
|
|
483
|
+
<h3>🔍 Live Dashboard Demo</h3>
|
|
484
|
+
<p>Search lessons, inspect gates, see blocked actions — all with real sample data. No signup, no install required.</p>
|
|
485
|
+
<a href="/dashboard" style="display:inline-block;margin-top:12px;color:var(--cyan);font-weight:600;text-decoration:underline;">Open Dashboard Demo →</a>
|
|
486
|
+
</div>
|
|
487
|
+
<div class="agent-card">
|
|
488
|
+
<h3>⛔ Gate Reasoning Chains</h3>
|
|
489
|
+
<p>Every block explains WHY: which pattern matched, what evidence triggered it, whether it was auto-promoted from your feedback or manually set.</p>
|
|
490
|
+
</div>
|
|
491
|
+
<div class="agent-card">
|
|
492
|
+
<h3>📊 Org Dashboard (Pro)</h3>
|
|
493
|
+
<p>See what ALL your agents are doing. Adherence rates, risk alerts, top blocked gates — across every session in your org.</p>
|
|
494
|
+
</div>
|
|
495
|
+
<div class="agent-card">
|
|
496
|
+
<h3>🧪 Thompson Sampling</h3>
|
|
497
|
+
<p>Confidence tiers (none/low/medium/high) tell you when to trust the model vs fall back to rules. No guessing.</p>
|
|
498
|
+
</div>
|
|
499
|
+
<div class="agent-card">
|
|
500
|
+
<h3>🪞 History-Aware Lessons</h3>
|
|
501
|
+
<p>When a thumbs signal is vague, ThumbGate can reuse the last ~10 messages plus the failed tool call, propose what went wrong, and turn that into one linked lesson instead of a dead-end note.</p>
|
|
502
|
+
</div>
|
|
503
|
+
</div>
|
|
504
|
+
</div>
|
|
505
|
+
</section>
|
|
506
|
+
|
|
507
|
+
<section class="seo-pages" id="compare-guides">
|
|
508
|
+
<div class="container">
|
|
509
|
+
<div class="section-label">Learn More</div>
|
|
510
|
+
<h2 class="section-title">How ThumbGate compares and when to use it</h2>
|
|
511
|
+
<div class="seo-grid">
|
|
512
|
+
<a class="seo-card" href="/compare/speclock">
|
|
513
|
+
<div class="seo-kicker">Comparison</div>
|
|
514
|
+
<h3>ThumbGate vs SpecLock</h3>
|
|
515
|
+
<p>Why thumbs-up/down feedback and pre-action gates solve repeated mistakes faster than a manual spec-authoring loop.</p>
|
|
516
|
+
<div class="card-arrow">Read the comparison →</div>
|
|
517
|
+
</a>
|
|
518
|
+
<a class="seo-card" href="/compare/mem0">
|
|
519
|
+
<div class="seo-kicker">Comparison</div>
|
|
520
|
+
<h3>ThumbGate vs Mem0</h3>
|
|
521
|
+
<p>Mem0 remembers context. ThumbGate enforces behavior. Why retrieval alone is not enough when your agent keeps repeating the same mistakes.</p>
|
|
522
|
+
<div class="card-arrow">See the enforcement angle →</div>
|
|
523
|
+
</a>
|
|
524
|
+
<a class="seo-card" href="/guides/pre-action-gates">
|
|
525
|
+
<div class="seo-kicker">Guide</div>
|
|
526
|
+
<h3>What Are Pre-Action Gates?</h3>
|
|
527
|
+
<p>The core concept explained in plain language: how thumbs up, thumbs down, and runtime enforcement work together to prevent repeated failures.</p>
|
|
528
|
+
<div class="card-arrow">Read the guide →</div>
|
|
529
|
+
</a>
|
|
530
|
+
<a class="seo-card" href="/guides/claude-code-feedback">
|
|
531
|
+
<div class="seo-kicker">Integration</div>
|
|
532
|
+
<h3>Claude Code Feedback Memory That Enforces</h3>
|
|
533
|
+
<p>Why structured feedback memory matters more when it becomes a live gate that blocks your agent from repeating mistakes.</p>
|
|
534
|
+
<div class="card-arrow">Read the integration guide →</div>
|
|
535
|
+
</a>
|
|
536
|
+
</div>
|
|
537
|
+
</div>
|
|
538
|
+
</section>
|
|
539
|
+
|
|
540
|
+
<!-- HOW IT WORKS -->
|
|
541
|
+
<section class="how-it-works" id="how-it-works">
|
|
542
|
+
<div class="container">
|
|
543
|
+
<div class="section-label">How It Works</div>
|
|
544
|
+
<h2 class="section-title">Three steps to mistake-proof vibe coding</h2>
|
|
545
|
+
<div class="steps">
|
|
546
|
+
<div class="step">
|
|
547
|
+
<div class="step-num">1</div>
|
|
548
|
+
<h3>Feedback</h3>
|
|
549
|
+
<p>Give <code>👍</code> or <code>👎</code> on your AI agent's actions. Feedback is stored in a SQLite+FTS5 lesson DB. If the signal is vague, ThumbGate can distill it from the recent conversation window and failed tool call before promotion. Example: you 👎 a risky migration → it auto-promotes to a "never run DROP on prod" gate.</p>
|
|
550
|
+
</div>
|
|
551
|
+
<div class="step">
|
|
552
|
+
<div class="step-num">2</div>
|
|
553
|
+
<h3>Distill + Rules</h3>
|
|
554
|
+
<p>Repeated failures auto-promote into prevention rules. Thompson Sampling adapts which rules fire, and the reflector lane can propose a reusable rule from the same transcript so high-risk patterns get stricter enforcement while low-risk ones stay relaxed.</p>
|
|
555
|
+
</div>
|
|
556
|
+
<div class="step">
|
|
557
|
+
<div class="step-num">3</div>
|
|
558
|
+
<h3>Gates</h3>
|
|
559
|
+
<p>Rules become Pre-Action Gates that <strong>block</strong> your agent before it repeats the same mistake. Your agent can't force-push, skip tests, or repeat a refactor you already rejected. No more fix-loops.</p>
|
|
560
|
+
</div>
|
|
561
|
+
</div>
|
|
562
|
+
</div>
|
|
563
|
+
</section>
|
|
564
|
+
|
|
565
|
+
<!-- PROENTROPIC -->
|
|
566
|
+
<section class="compatibility" id="proentropic">
|
|
567
|
+
<div class="container">
|
|
568
|
+
<div class="section-label">Proentropic Infrastructure</div>
|
|
569
|
+
<h2 class="section-title">Built to get stronger from chaos, not break from it</h2>
|
|
570
|
+
<div class="agent-grid">
|
|
571
|
+
<div class="agent-card">
|
|
572
|
+
<h3>Errors are fuel</h3>
|
|
573
|
+
<p>Every agent mistake becomes a prevention rule. Every thumbs-down becomes a gate. The more your agents fail, the more ThumbGate learns. Fragile systems break under chaos — ThumbGate feeds on it.</p>
|
|
574
|
+
</div>
|
|
575
|
+
<div class="agent-card">
|
|
576
|
+
<h3>Organizational learning</h3>
|
|
577
|
+
<p>One developer's thumbs-down becomes the whole team's protection. Lessons compound across agents, sessions, and projects. Your 100th agent inherits everything the first 99 learned.</p>
|
|
578
|
+
</div>
|
|
579
|
+
<div class="agent-card">
|
|
580
|
+
<h3>Enterprise-grade governance</h3>
|
|
581
|
+
<p>CISOs fear agent chaos. ThumbGate turns that chaos into structured audit trails, per-agent governance scores, PII scanning, and credential attestation. Compliance officers get a single dashboard, not scattered logs.</p>
|
|
582
|
+
</div>
|
|
583
|
+
</div>
|
|
584
|
+
</div>
|
|
585
|
+
</section>
|
|
586
|
+
|
|
587
|
+
<!-- WHY GUARDRAILS -->
|
|
588
|
+
<section class="compatibility" id="guardrails">
|
|
589
|
+
<div class="container">
|
|
590
|
+
<div class="section-label">Production-Grade AI Safety</div>
|
|
591
|
+
<h2 class="section-title">Every guardrail pattern experts recommend, built in</h2>
|
|
592
|
+
<div class="agent-grid">
|
|
593
|
+
<div class="agent-card">
|
|
594
|
+
<h3>Don't trust — verify</h3>
|
|
595
|
+
<p>Gate reasoning chains show exactly WHY an action was blocked: pattern match, evidence, fire count. No hidden decisions.</p>
|
|
596
|
+
</div>
|
|
597
|
+
<div class="agent-card">
|
|
598
|
+
<h3>Real tools, not wishes</h3>
|
|
599
|
+
<p>MCP tools call real enforcement — gates physically block tool calls, not ask the agent nicely. External system, not prompt tricks.</p>
|
|
600
|
+
</div>
|
|
601
|
+
<div class="agent-card">
|
|
602
|
+
<h3>Force models to show work</h3>
|
|
603
|
+
<p>Every gate decision includes step-by-step reasoning. Thompson Sampling confidence tiers tell you when to trust the model vs fall back to rules.</p>
|
|
604
|
+
</div>
|
|
605
|
+
<div class="agent-card">
|
|
606
|
+
<h3>Log everything, learn automatically</h3>
|
|
607
|
+
<p>Audit trail records every allow/deny/warn. Repeated failures auto-promote to gates. Org dashboard shows all agents across your team.</p>
|
|
608
|
+
</div>
|
|
609
|
+
<div class="agent-card">
|
|
610
|
+
<h3>Keep one correction thread</h3>
|
|
611
|
+
<p>Feedback sessions let you open, append, and finalize one linked correction instead of spraying follow-up notes across separate records. Better lessons, less operator friction.</p>
|
|
612
|
+
</div>
|
|
613
|
+
</div>
|
|
614
|
+
</div>
|
|
615
|
+
</section>
|
|
616
|
+
|
|
617
|
+
<!-- AI CONTROL TOWER -->
|
|
618
|
+
<section class="compatibility" id="control-tower">
|
|
619
|
+
<div class="container">
|
|
620
|
+
<div class="section-label">Recently shipped</div>
|
|
621
|
+
<h2 class="section-title">AI Control Tower: monitor, alert, and act</h2>
|
|
622
|
+
<div class="agent-grid">
|
|
623
|
+
<div class="agent-card">
|
|
624
|
+
<h3>Domain skill packs</h3>
|
|
625
|
+
<p>Installable best-practice rules for Stripe, Railway, database migrations. Auto-match by task context. 100% eval pass rate with packs vs 0% without.</p>
|
|
626
|
+
</div>
|
|
627
|
+
<div class="agent-card">
|
|
628
|
+
<h3>Tool-level KPIs</h3>
|
|
629
|
+
<p>P50/P90/P95 latency and success rate per tool. Drill from gateway health down to the exact tool causing issues.</p>
|
|
630
|
+
</div>
|
|
631
|
+
<div class="agent-card">
|
|
632
|
+
<h3>SLO alerts</h3>
|
|
633
|
+
<p>Define thresholds for success rate and latency. Breach triggers webhook alerts to Slack, Teams, or Discord automatically.</p>
|
|
634
|
+
</div>
|
|
635
|
+
<div class="agent-card">
|
|
636
|
+
<h3>Access anomaly detection</h3>
|
|
637
|
+
<p>Tracks authorized vs failed access. Moving-average spike detection flags per-agent abuse. Security governance on autopilot.</p>
|
|
638
|
+
</div>
|
|
639
|
+
<div class="agent-card">
|
|
640
|
+
<h3>Metered outcome pricing</h3>
|
|
641
|
+
<p>$0.10 per blocked mistake (Pro). Minimum $19/mo floor. You pay for value delivered, not seats warmed.</p>
|
|
642
|
+
</div>
|
|
643
|
+
<div class="agent-card">
|
|
644
|
+
<h3>Ambient daily digest</h3>
|
|
645
|
+
<p>Push Slack/Teams/Discord summary at 9am. Weekly stats export for build-in-public content. Check in once a day, not babysit.</p>
|
|
646
|
+
</div>
|
|
647
|
+
</div>
|
|
648
|
+
</div>
|
|
649
|
+
</section>
|
|
650
|
+
|
|
651
|
+
<!-- PROGRESSIVE DISCLOSURE -->
|
|
652
|
+
<section class="compatibility" id="progressive-disclosure">
|
|
653
|
+
<div class="container">
|
|
654
|
+
<div class="section-label">New in v0.9.10</div>
|
|
655
|
+
<h2 class="section-title">82% fewer tokens with progressive skill loading</h2>
|
|
656
|
+
<div class="agent-grid">
|
|
657
|
+
<div class="agent-card">
|
|
658
|
+
<h3>3-tier disclosure</h3>
|
|
659
|
+
<p>L1 metadata at startup (27 tokens). L2 rules on activation. L3 reference files on demand. Agents load only what they need.</p>
|
|
660
|
+
</div>
|
|
661
|
+
<div class="agent-card">
|
|
662
|
+
<h3>Skill factory</h3>
|
|
663
|
+
<p>Agent auto-generates new skill packs from recurring failures. Lessons become NEVER/ALWAYS rules. No manual curation needed.</p>
|
|
664
|
+
</div>
|
|
665
|
+
<div class="agent-card">
|
|
666
|
+
<h3>Security hardening</h3>
|
|
667
|
+
<p>Credential attestation per tool call. Privilege escalation detection against MCP profiles. Dependency gate blocks supply chain attacks.</p>
|
|
668
|
+
</div>
|
|
669
|
+
</div>
|
|
670
|
+
</div>
|
|
671
|
+
</section>
|
|
672
|
+
|
|
673
|
+
<!-- BACKGROUND AGENT GOVERNANCE -->
|
|
674
|
+
<section class="compatibility" id="background-agents">
|
|
675
|
+
<div class="container">
|
|
676
|
+
<div class="section-label">For Background Agent Teams</div>
|
|
677
|
+
<h2 class="section-title">Your agents write 57% of PRs. ThumbGate makes sure they don't repeat mistakes.</h2>
|
|
678
|
+
<div class="agent-grid">
|
|
679
|
+
<div class="agent-card">
|
|
680
|
+
<h3>Run governance gate</h3>
|
|
681
|
+
<p>Before a background agent opens a PR, check its failure history. Agents with >50% fail rate get blocked. Protected branches get extra scrutiny.</p>
|
|
682
|
+
</div>
|
|
683
|
+
<div class="agent-card">
|
|
684
|
+
<h3>Auto-capture from CI</h3>
|
|
685
|
+
<p>CI pass/fail auto-generates structured feedback. No human in the loop. The agent learns from every merge and every rejection.</p>
|
|
686
|
+
</div>
|
|
687
|
+
<div class="agent-card">
|
|
688
|
+
<h3>Governance report</h3>
|
|
689
|
+
<p>Per-agent pass rates, gate blocks, run types, blast radius warnings. Know which agents are reliable and which need guardrails.</p>
|
|
690
|
+
</div>
|
|
691
|
+
</div>
|
|
692
|
+
</div>
|
|
693
|
+
</section>
|
|
694
|
+
|
|
695
|
+
<!-- CODE EXAMPLE -->
|
|
696
|
+
<section class="code-section">
|
|
697
|
+
<div class="container">
|
|
698
|
+
<div class="code-block">
|
|
699
|
+
<div class="code-header">
|
|
700
|
+
<div class="code-dot red"></div>
|
|
701
|
+
<div class="code-dot yellow"></div>
|
|
702
|
+
<div class="code-dot green"></div>
|
|
703
|
+
<span>terminal</span>
|
|
704
|
+
</div>
|
|
705
|
+
<div class="code-body">
|
|
706
|
+
<div><span class="comment"># Install in 30 seconds</span></div>
|
|
707
|
+
<div><span class="fn">npx</span> thumbgate init</div>
|
|
708
|
+
<div> </div>
|
|
709
|
+
<div><span class="comment"># Your agent tries to delete production db...</span></div>
|
|
710
|
+
<div><span class="keyword">⛔ Gate blocked:</span> <span class="string">"Never run DROP on production tables"</span></div>
|
|
711
|
+
<div><span class="comment"># Rule auto-generated from your previous 👎</span></div>
|
|
712
|
+
<div> </div>
|
|
713
|
+
<div><span class="comment"># Works with your existing setup</span></div>
|
|
714
|
+
<div><span class="fn">npx</span> thumbgate init <span class="comment"># bootstraps .thumbgate and .mcp.json</span></div>
|
|
715
|
+
<div><span class="comment"># Use repo guides for Claude plugin, Codex app plugin, Cursor plugin, and OpenCode profiles</span></div>
|
|
716
|
+
</div>
|
|
717
|
+
</div>
|
|
718
|
+
</div>
|
|
719
|
+
</section>
|
|
720
|
+
|
|
721
|
+
<!-- PRICING -->
|
|
722
|
+
<section class="pricing" id="pricing">
|
|
723
|
+
<div class="container">
|
|
724
|
+
<div class="section-label">Pricing — 7-Day Free Trial</div>
|
|
725
|
+
<h2 class="section-title">Start free. Try Pro for 7 days. Cancel anytime.</h2>
|
|
726
|
+
<div class="pricing-grid">
|
|
727
|
+
<div class="price-card">
|
|
728
|
+
<div class="tier">Free</div>
|
|
729
|
+
<div class="price">$0</div>
|
|
730
|
+
<div class="price-sub">Forever free · Local-only, single dev</div>
|
|
731
|
+
<p style="font-size:13px;color:#aaa;margin-bottom:16px;">For solo devs experimenting with gates on one machine.</p>
|
|
732
|
+
<ul>
|
|
733
|
+
<li>Unlimited feedback captures · 5 lesson searches/day · unlimited recall</li>
|
|
734
|
+
<li>5 auto-promoted gates plus the core safety policy</li>
|
|
735
|
+
<li>All MCP integrations (Claude Code, Cursor, Codex, etc.)</li>
|
|
736
|
+
<li>PreToolUse hook blocking</li>
|
|
737
|
+
<li>Local SQLite lesson DB</li>
|
|
738
|
+
<li><a href="/guide" style="color:var(--cyan);text-decoration:underline;">Setup guide for all agents →</a></li>
|
|
739
|
+
</ul>
|
|
740
|
+
<a href="https://www.npmjs.com/package/thumbgate" target="_blank" rel="noopener" class="btn-free">Install Free</a>
|
|
741
|
+
</div>
|
|
742
|
+
<div class="price-card pro" data-price-dollars="__PRO_PRICE_DOLLARS__">
|
|
743
|
+
<div class="tier">Pro</div>
|
|
744
|
+
<div class="price">$19<span style="font-size:16px;color:var(--text-dim)">/mo</span></div>
|
|
745
|
+
<div class="price-sub">or $149/yr (save 35%) · Personal dashboard + exports</div>
|
|
746
|
+
<p style="font-size:13px;color:var(--cyan);margin-bottom:16px;font-weight:500;">For individual operators who want a personal local dashboard with proof-ready exports.</p>
|
|
747
|
+
<div class="pro-upgrade-triggers" style="font-size:12px;color:#aaa;margin-bottom:12px;">
|
|
748
|
+
<strong style="color:#fff;">Go Pro when:</strong> you've blocked 20+ actions, want your own dashboard, or need DPO exports without extra setup.
|
|
749
|
+
</div>
|
|
750
|
+
<div class="dashboard-preview" style="margin-bottom:16px;border:1px solid #333;border-radius:8px;overflow:hidden;">
|
|
751
|
+
<div style="background:linear-gradient(135deg,#1a1a2e 0%,#16213e 100%);padding:16px;text-align:center;">
|
|
752
|
+
<div style="font-size:11px;color:var(--cyan);text-transform:uppercase;letter-spacing:1px;margin-bottom:8px;">What your Pro dashboard looks like</div>
|
|
753
|
+
<div style="background:#0d0d1a;border-radius:6px;padding:12px;text-align:left;font-family:monospace;font-size:11px;line-height:1.6;">
|
|
754
|
+
<div style="color:#4ade80;">✅ gate:no-force-push — blocked 12 times</div>
|
|
755
|
+
<div style="color:#4ade80;">✅ gate:require-tests — blocked 8 times</div>
|
|
756
|
+
<div style="color:#f87171;">❌ gate:no-drop-prod — FIRED (blocked DROP TABLE)</div>
|
|
757
|
+
<div style="color:#888;margin-top:6px;">DPO pairs exported: 47 | Lessons: 23 active</div>
|
|
758
|
+
</div>
|
|
759
|
+
</div>
|
|
760
|
+
</div>
|
|
761
|
+
<ul>
|
|
762
|
+
<li>Everything in Free, plus:</li>
|
|
763
|
+
<li><a href="/dashboard" style="color:var(--cyan);text-decoration:underline;">Visual gate debugger →</a> see every blocked action and the gate that fired so you can trust the system in minutes</li>
|
|
764
|
+
<li>Auto-connect — activate once with your license key, then your running agents appear automatically on your local dashboard</li>
|
|
765
|
+
<li><a href="/dashboard" style="color:var(--cyan);text-decoration:underline;">DPO training data export →</a> turn real thumbs-downs into ready-to-use preference pairs for fine-tuning (LoRA / JSONL)</li>
|
|
766
|
+
<li><strong>Model Hardening Advisor</strong> — get recommendations on when and how to fine-tune your model to natively avoid recurring failures</li>
|
|
767
|
+
<li>Personal local dashboard — every Pro user gets their own localhost dashboard without extra cloud setup</li>
|
|
768
|
+
<li>Founder-license support — we help you wire your riskiest flows (migrations, force-pushes, CI) in the first week</li>
|
|
769
|
+
</ul>
|
|
770
|
+
<a href="https://buy.stripe.com/fZu9AT3Ug6zcdWh0XN3sI08" class="btn-pro" style="display:none" id="pro-checkout-link">Start Free Trial — then $19/mo</a>
|
|
771
|
+
<div class="trial-badge" style="background:var(--cyan);color:#000;display:inline-block;padding:4px 12px;border-radius:12px;font-size:12px;font-weight:700;margin-bottom:12px;">7-DAY FREE TRIAL</div>
|
|
772
|
+
<div class="email-gate" style="margin-bottom:12px;">
|
|
773
|
+
<input type="email" id="pro-email" placeholder="Your email to start trial" style="width:100%;padding:10px 14px;border:1px solid #333;border-radius:6px;background:#1a1a2e;color:#fff;font-size:14px;">
|
|
774
|
+
</div>
|
|
775
|
+
<button class="btn-pro" id="pro-trial-btn" onclick="handleProTrial()" style="width:100%;cursor:pointer;border:none;">Start 7-Day Free Trial</button>
|
|
776
|
+
<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>
|
|
777
|
+
<p style="font-size:12px;color:var(--cyan);margin-top:6px;">Mem0 Pro: $249/mo. ThumbGate Pro: $19/mo.</p>
|
|
778
|
+
</div>
|
|
779
|
+
<div class="price-card team">
|
|
780
|
+
<div class="tier">Team</div>
|
|
781
|
+
<div class="price">$12<span style="font-size:16px;color:var(--text-dim)">/seat/mo</span></div>
|
|
782
|
+
<div class="price-sub">Starts at $36/mo for 3 seats · or $297/yr · Shared lessons + org visibility</div>
|
|
783
|
+
<p style="font-size:13px;color:var(--green);margin-bottom:16px;font-weight:500;">For teams running multiple agents across shared repos who need one lesson to protect everyone.</p>
|
|
784
|
+
<div class="pro-upgrade-triggers" style="font-size:12px;color:#aaa;margin-bottom:12px;">
|
|
785
|
+
<strong style="color:#fff;">Start Team when:</strong> you need a shared lesson DB, org-wide metrics, or workflow hardening that survives handoffs.
|
|
786
|
+
</div>
|
|
787
|
+
<ul>
|
|
788
|
+
<li>Hosted shared lesson DB — one dev's 👎 on a bad migration protects every agent on the team</li>
|
|
789
|
+
<li>Org dashboard — active agents, gate hit rates, risk agents, and proof-backed team metrics in one place</li>
|
|
790
|
+
<li>Generated hosted review views — constrained cards, lists, and callouts assemble team, incident, and rollout dashboards without custom page work</li>
|
|
791
|
+
<li>Gate template library — pre-built guardrails for force-pushes, skipped tests, destructive SQL, and evidence-before-done</li>
|
|
792
|
+
<li>Workflow hardening sprint — intake, rollout plan, and evidence pack for the first shared workflow</li>
|
|
793
|
+
<li>Product Hunt and campaign attribution stay tied to the team funnel instead of generic referral traffic</li>
|
|
794
|
+
</ul>
|
|
795
|
+
<a href="#workflow-sprint-intake" class="btn-team">Start Team Rollout</a>
|
|
796
|
+
<p style="font-size:11px;color:#666;margin-top:8px;">Hosted team rollout starts with the workflow sprint intake so we scope the shared workflow honestly.</p>
|
|
797
|
+
</div>
|
|
798
|
+
</div>
|
|
799
|
+
</div>
|
|
800
|
+
</section>
|
|
801
|
+
|
|
802
|
+
<section class="compatibility" id="workflow-sprint-intake">
|
|
803
|
+
<div class="container">
|
|
804
|
+
<div class="section-label">Team Rollout</div>
|
|
805
|
+
<h2 class="section-title">Start the Team lane with one workflow that matters</h2>
|
|
806
|
+
<p style="color:var(--text-dim);max-width:720px;margin:0 auto 16px;">The recurring value is shared enforcement. Start with one workflow, one owner, and one blocker. The hosted intake gives us a proof-backed path into the shared lesson DB, org dashboard, and team-wide gate rollout.</p>
|
|
807
|
+
<form class="team-form" action="/v1/intake/workflow-sprint" method="POST">
|
|
808
|
+
<input type="hidden" name="ctaId" value="workflow_sprint_intake">
|
|
809
|
+
<input type="hidden" name="ctaPlacement" value="team_pricing">
|
|
810
|
+
<input type="hidden" name="planId" value="team">
|
|
811
|
+
<input type="email" name="email" placeholder="you@company.com" required>
|
|
812
|
+
<input type="text" name="company" placeholder="Company">
|
|
813
|
+
<input type="text" name="workflow" placeholder="Workflow to harden (e.g. deploy approvals, migrations, PR review)" required>
|
|
814
|
+
<input type="text" name="owner" placeholder="Workflow owner" required>
|
|
815
|
+
<input type="text" name="runtime" placeholder="Current agent/runtime (Claude Code, Codex, Cursor, Gemini...)" required>
|
|
816
|
+
<textarea class="full" name="blocker" placeholder="What repeat mistake, rollout blocker, or team handoff failure keeps happening?" required></textarea>
|
|
817
|
+
<textarea class="full" name="note" placeholder="Optional context: team size, repos involved, target rollout date, or what you need to prove internally."></textarea>
|
|
818
|
+
<div class="full">
|
|
819
|
+
<button type="submit" class="btn-team">Submit Team Workflow Intake</button>
|
|
820
|
+
</div>
|
|
821
|
+
</form>
|
|
822
|
+
</div>
|
|
823
|
+
</section>
|
|
824
|
+
|
|
825
|
+
<!-- FAQ -->
|
|
826
|
+
<section class="faq" id="faq">
|
|
827
|
+
<div class="container">
|
|
828
|
+
<div class="section-label">FAQ</div>
|
|
829
|
+
<h2 class="section-title">Common questions</h2>
|
|
830
|
+
<div class="faq-list">
|
|
831
|
+
<div class="faq-item open">
|
|
832
|
+
<div class="faq-q" role="button" tabindex="0" aria-expanded="true" onclick="toggleFaq(this)" onkeydown="handleFaqKeydown(event)">Does ThumbGate support model fine-tuning?</div>
|
|
833
|
+
<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>
|
|
834
|
+
</div>
|
|
835
|
+
<div class="faq-item">
|
|
836
|
+
<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>
|
|
837
|
+
<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>
|
|
838
|
+
</div>
|
|
839
|
+
<div class="faq-item">
|
|
840
|
+
<div class="faq-q" role="button" tabindex="0" aria-expanded="false" onclick="toggleFaq(this)" onkeydown="handleFaqKeydown(event)">What's the tech stack?</div>
|
|
841
|
+
<div class="faq-a">SQLite+FTS5 lesson DB for fast full-text search. MemAlign-inspired dual recall (principle-based rules + episodic context). Thompson Sampling for adaptive gate sensitivity per failure domain. LanceDB + Apache Arrow for local vector search with Hugging Face embeddings. ContextFS for context assembly. Bayesian belief updates on each memory. PreToolUse hook enforcement blocks known-bad actions before execution. All local-first — no cloud required.</div>
|
|
842
|
+
</div>
|
|
843
|
+
<div class="faq-item">
|
|
844
|
+
<div class="faq-q" role="button" tabindex="0" aria-expanded="false" onclick="toggleFaq(this)" onkeydown="handleFaqKeydown(event)">What AI agents and editors does this work with?</div>
|
|
845
|
+
<div class="faq-a">ThumbGate works with Claude Code, Cursor, Codex, Gemini CLI, Amp, OpenCode, and any other MCP-compatible agent. Cursor ships with a plugin bundle in this repo. Codex ships with a repo-local app plugin profile. VS Code works when you run an MCP-compatible agent inside it, but this repo does not ship a standalone VS Code extension today.</div>
|
|
846
|
+
</div>
|
|
847
|
+
<div class="faq-item">
|
|
848
|
+
<div class="faq-q" role="button" tabindex="0" aria-expanded="false" onclick="toggleFaq(this)" onkeydown="handleFaqKeydown(event)">Do I need a cloud account?</div>
|
|
849
|
+
<div class="faq-a">No. Free keeps local enforcement on your machine with 5 daily feedback captures, 10 lesson searches, unlimited recall, gates, and hook blocking. No cloud account is required. Pro adds a personal local dashboard on your machine plus DPO export. Team is the hosted rollout lane when your group wants a shared lesson database, generated hosted review views, org dashboard, and team-wide gate visibility.</div>
|
|
850
|
+
</div>
|
|
851
|
+
<div class="faq-item">
|
|
852
|
+
<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>
|
|
853
|
+
<div class="faq-a">ThumbGate can reuse the last ~10 messages, the failed tool call, and later follow-up notes to propose <code>whatWentWrong</code>, <code>whatToChange</code>, and a reusable lesson. The feedback session stays linked instead of creating duplicate records.</div>
|
|
854
|
+
</div>
|
|
855
|
+
<div class="faq-item">
|
|
856
|
+
<div class="faq-q" role="button" tabindex="0" aria-expanded="false" onclick="toggleFaq(this)" onkeydown="handleFaqKeydown(event)">How are pre-action gates different from prompt rules?</div>
|
|
857
|
+
<div class="faq-a">Prompt rules are suggestions that agents can ignore. Pre-Action Gates are enforcement — they block the action before execution. Gates are auto-generated from your feedback and use Thompson Sampling to adapt over time.</div>
|
|
858
|
+
</div>
|
|
859
|
+
<div class="faq-item">
|
|
860
|
+
<div class="faq-q" role="button" tabindex="0" aria-expanded="false" onclick="toggleFaq(this)" onkeydown="handleFaqKeydown(event)">What does Pro cost?</div>
|
|
861
|
+
<div class="faq-a">Pro is $19/mo or $149/yr (save 35%). Team starts at $36/mo for 3 seats, then $12/seat/mo, or $297/yr at the 3-seat floor. Cancel anytime. No contracts.</div>
|
|
862
|
+
</div>
|
|
863
|
+
</div>
|
|
864
|
+
</div>
|
|
865
|
+
</section>
|
|
866
|
+
|
|
867
|
+
<!-- NEWSLETTER SIGNUP -->
|
|
868
|
+
<section class="compatibility" id="newsletter" style="padding: 48px 0;">
|
|
869
|
+
<div class="container" style="text-align: center;">
|
|
870
|
+
<div class="section-label">Stay in the loop</div>
|
|
871
|
+
<h2 class="section-title" style="margin-bottom: 16px;">Get notified when we ship</h2>
|
|
872
|
+
<p style="color: var(--text-dim); margin-bottom: 24px; max-width: 480px; margin-left: auto; margin-right: auto;">Release notes, new gate patterns, and agent governance insights. No spam. Unsubscribe anytime.</p>
|
|
873
|
+
<form action="https://thumbgate-production.up.railway.app/api/newsletter" method="POST" style="display: flex; gap: 8px; max-width: 420px; margin: 0 auto; flex-wrap: wrap; justify-content: center;">
|
|
874
|
+
<input type="email" name="email" placeholder="you@company.com" required style="flex: 1; min-width: 200px; padding: 12px 16px; border: 1px solid var(--border); border-radius: 8px; background: var(--surface); color: var(--text); font-size: 15px;">
|
|
875
|
+
<button type="submit" style="padding: 12px 24px; background: var(--cyan); color: #000; border: none; border-radius: 8px; font-weight: 600; font-size: 15px; cursor: pointer;" onclick="if(typeof plausible==='function')plausible('newsletter_signup')">Subscribe</button>
|
|
876
|
+
</form>
|
|
877
|
+
</div>
|
|
878
|
+
</section>
|
|
879
|
+
|
|
880
|
+
<!-- FINAL CTA -->
|
|
881
|
+
<section class="final-cta">
|
|
882
|
+
<div class="container">
|
|
883
|
+
<h2>Ready to stop fixing the same AI mistakes?</h2>
|
|
884
|
+
<p>Try the dashboard demo first. Install in 30 seconds. No account required.</p>
|
|
885
|
+
<div style="display:flex;gap:12px;justify-content:center;flex-wrap:wrap;">
|
|
886
|
+
<a href="/dashboard" class="btn-free" style="background:transparent;border:1px solid var(--cyan);color:var(--cyan);">Try Dashboard Demo</a>
|
|
887
|
+
<a href="https://buy.stripe.com/fZu9AT3Ug6zcdWh0XN3sI08" class="btn-pro">Try Pro free for 7 days → $19/mo</a>
|
|
888
|
+
</div>
|
|
889
|
+
</div>
|
|
890
|
+
</section>
|
|
891
|
+
|
|
892
|
+
<!-- FOOTER -->
|
|
893
|
+
<footer>
|
|
894
|
+
<div class="container">
|
|
895
|
+
<div class="footer-links">
|
|
896
|
+
<a href="https://github.com/IgorGanapolsky/ThumbGate" target="_blank" rel="noopener">GitHub</a>
|
|
897
|
+
<a href="https://www.npmjs.com/package/thumbgate" target="_blank" rel="noopener">npm</a>
|
|
898
|
+
<a href="https://x.com/IgorGanapolsky" target="_blank" rel="noopener">X / Twitter</a>
|
|
899
|
+
<a href="https://www.linkedin.com/in/igorganapolsky" target="_blank" rel="noopener">LinkedIn</a>
|
|
900
|
+
<a href="/blog">Blog</a>
|
|
901
|
+
</div>
|
|
902
|
+
<span class="footer-copy">© 2026 Max Smith KDP LLC · MIT License · v0.9.8</span>
|
|
903
|
+
</div>
|
|
904
|
+
</footer>
|
|
905
|
+
|
|
906
|
+
<script>
|
|
907
|
+
function copyInstall(el) {
|
|
908
|
+
navigator.clipboard.writeText('npx thumbgate init').then(function() {
|
|
909
|
+
var hint = el.querySelector('.copy-hint');
|
|
910
|
+
hint.textContent = 'copied!';
|
|
911
|
+
hint.classList.add('copied');
|
|
912
|
+
setTimeout(function() { hint.textContent = 'click to copy'; hint.classList.remove('copied'); }, 2000);
|
|
913
|
+
});
|
|
914
|
+
if (typeof plausible === 'function') plausible('install_copy');
|
|
915
|
+
}
|
|
916
|
+
|
|
917
|
+
/* ── Plausible custom event tracking ── */
|
|
918
|
+
(function() {
|
|
919
|
+
function trackClick(selector, eventName, props) {
|
|
920
|
+
document.querySelectorAll(selector).forEach(function(el) {
|
|
921
|
+
el.addEventListener('click', function() {
|
|
922
|
+
if (typeof plausible === 'function') plausible(eventName, { props: props || {} });
|
|
923
|
+
});
|
|
924
|
+
});
|
|
925
|
+
}
|
|
926
|
+
|
|
927
|
+
function toggleFaq(el) {
|
|
928
|
+
var item = el.parentElement;
|
|
929
|
+
var open = item.classList.toggle('open');
|
|
930
|
+
el.setAttribute('aria-expanded', open ? 'true' : 'false');
|
|
931
|
+
}
|
|
932
|
+
|
|
933
|
+
function handleFaqKeydown(event) {
|
|
934
|
+
if (event.key !== 'Enter' && event.key !== ' ') return;
|
|
935
|
+
event.preventDefault();
|
|
936
|
+
toggleFaq(event.currentTarget);
|
|
937
|
+
}
|
|
938
|
+
|
|
939
|
+
/* CTA clicks */
|
|
940
|
+
trackClick('.btn-pro', 'checkout_start', { tier: 'pro', price: 19, billing: 'monthly' });
|
|
941
|
+
trackClick('.btn-team', 'workflow_sprint_intake_click', { tier: 'team', offer: 'workflow_hardening_sprint' });
|
|
942
|
+
trackClick('.btn-free', 'install_click', { tier: 'free' });
|
|
943
|
+
trackClick('.nav-cta', 'checkout_start', { tier: 'pro', source: 'nav' });
|
|
944
|
+
|
|
945
|
+
/* Pricing CTA conversion tracking — fires on every Get Started / Pro / Team button click
|
|
946
|
+
with section context so we can distinguish pricing section vs final CTA section clicks */
|
|
947
|
+
document.querySelectorAll('.btn-pro, .btn-team, .btn-free, .nav-cta').forEach(function(el) {
|
|
948
|
+
el.addEventListener('click', function() {
|
|
949
|
+
var section = el.closest('section');
|
|
950
|
+
var sectionId = section ? (section.id || section.className.split(' ')[0] || 'unknown') : 'unknown';
|
|
951
|
+
var tier = el.classList.contains('btn-pro') ? 'pro'
|
|
952
|
+
: el.classList.contains('btn-team') ? 'team'
|
|
953
|
+
: el.classList.contains('btn-free') ? 'free'
|
|
954
|
+
: 'nav';
|
|
955
|
+
var label = (el.textContent || '').trim().substring(0, 40);
|
|
956
|
+
if (typeof plausible === 'function') {
|
|
957
|
+
plausible('pricing_cta_click', { props: { tier: tier, section: sectionId, label: label } });
|
|
958
|
+
}
|
|
959
|
+
});
|
|
960
|
+
});
|
|
961
|
+
|
|
962
|
+
/* FAQ accordion opens */
|
|
963
|
+
document.querySelectorAll('.faq-q').forEach(function(el) {
|
|
964
|
+
el.addEventListener('click', function() {
|
|
965
|
+
var question = this.textContent.trim().substring(0, 60);
|
|
966
|
+
if (typeof plausible === 'function') plausible('faq_open', { props: { question: question } });
|
|
967
|
+
});
|
|
968
|
+
});
|
|
969
|
+
|
|
970
|
+
/* Scroll depth (25%, 50%, 75%, 100%) */
|
|
971
|
+
var scrollMarks = { 25: false, 50: false, 75: false, 100: false };
|
|
972
|
+
window.addEventListener('scroll', function() {
|
|
973
|
+
var docHeight = document.documentElement.scrollHeight - window.innerHeight;
|
|
974
|
+
if (docHeight <= 0) return;
|
|
975
|
+
var pct = Math.round((window.scrollY / docHeight) * 100);
|
|
976
|
+
[25, 50, 75, 100].forEach(function(mark) {
|
|
977
|
+
if (pct >= mark && !scrollMarks[mark]) {
|
|
978
|
+
scrollMarks[mark] = true;
|
|
979
|
+
if (typeof plausible === 'function') plausible('scroll_depth', { props: { depth: mark + '%' } });
|
|
980
|
+
}
|
|
981
|
+
});
|
|
982
|
+
});
|
|
983
|
+
|
|
984
|
+
/* Proof bar link clicks */
|
|
985
|
+
trackClick('.proof-bar a', 'proof_bar_click');
|
|
986
|
+
|
|
987
|
+
/* Compatibility card clicks */
|
|
988
|
+
trackClick('.compat-card', 'compat_click');
|
|
989
|
+
|
|
990
|
+
/* SEO/comparison page clicks */
|
|
991
|
+
trackClick('.seo-card', 'seo_page_click');
|
|
992
|
+
})();
|
|
993
|
+
</script>
|
|
994
|
+
<script>
|
|
995
|
+
function handleProTrial() {
|
|
996
|
+
var email = document.getElementById('pro-email');
|
|
997
|
+
if (!email || !email.value || !email.value.includes('@')) {
|
|
998
|
+
email.style.border = '2px solid #f87171';
|
|
999
|
+
email.placeholder = 'Please enter a valid email';
|
|
1000
|
+
email.focus();
|
|
1001
|
+
return;
|
|
1002
|
+
}
|
|
1003
|
+
email.style.border = '1px solid #333';
|
|
1004
|
+
var checkoutUrl = document.getElementById('pro-checkout-link').href;
|
|
1005
|
+
var sep = checkoutUrl.includes('?') ? '&' : '?';
|
|
1006
|
+
var finalUrl = checkoutUrl + sep + 'prefilled_email=' + encodeURIComponent(email.value);
|
|
1007
|
+
if (typeof plausible === 'function') {
|
|
1008
|
+
plausible('trial_email_captured', { props: { email: email.value } });
|
|
1009
|
+
}
|
|
1010
|
+
window.location.href = finalUrl;
|
|
1011
|
+
}
|
|
1012
|
+
</script>
|
|
1013
|
+
</body>
|
|
1014
|
+
</html>
|