clawmoat 0.7.0 → 1.0.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.
Files changed (178) hide show
  1. package/.dockerignore +9 -0
  2. package/CHANGELOG.md +18 -0
  3. package/CONTRIBUTING.md +4 -2
  4. package/DEMO.md +87 -0
  5. package/Dockerfile +5 -18
  6. package/README.md +294 -8
  7. package/SECURITY.md +58 -10
  8. package/THREAT_MODEL.md +129 -0
  9. package/agent/README.md +131 -0
  10. package/agent/index.js +471 -0
  11. package/agent/install-service.sh +94 -0
  12. package/agent/openclaw-hook.js +453 -0
  13. package/agent/provider-setup.js +649 -0
  14. package/agent/setup.js +274 -0
  15. package/assets/BADGE-USAGE.md +20 -0
  16. package/assets/clawmoat-badge.svg +21 -0
  17. package/bin/clawmoat.js +468 -111
  18. package/docs/affiliates/dashboard.html +124 -0
  19. package/docs/affiliates/index.html +236 -0
  20. package/docs/agent-install.html +183 -0
  21. package/docs/ai-agent-security-scanner.html +10 -6
  22. package/docs/badge/index.html +149 -0
  23. package/docs/badge/scanning.svg +23 -0
  24. package/docs/blog/386-malicious-skills.html +262 -0
  25. package/docs/blog/40000-exposed-openclaw-instances.html +201 -0
  26. package/docs/blog/agent-trust-protocol.html +198 -0
  27. package/docs/blog/ai-agent-earns-commissions.html +230 -0
  28. package/docs/blog/bugmageddon-agent-firewall.html +174 -0
  29. package/docs/blog/calculator-math.html +180 -0
  30. package/docs/blog/clawmoat-vs-llamafirewall-nemo-guardrails.html +229 -0
  31. package/docs/blog/host-guardian-launch.html +18 -8
  32. package/docs/blog/ibm-experts-agent-runtime-protection.html +247 -0
  33. package/docs/blog/index.html +211 -9
  34. package/docs/blog/langchain-security-tutorial.html +18 -8
  35. package/docs/blog/mcp-30-cves-security-crisis.html +286 -0
  36. package/docs/blog/meta-researcher-rogue-agent.html +201 -0
  37. package/docs/blog/microsoft-openclaw-workstation-security.html +235 -0
  38. package/docs/blog/nist-ai-agent-standards-clawmoat.html +377 -0
  39. package/docs/blog/oasis-websocket-hijack.html +212 -0
  40. package/docs/blog/ollama-openclaw-security.html +160 -0
  41. package/docs/blog/openclaw-enterprise-readiness-claw10.html +199 -0
  42. package/docs/blog/openclaw-security-reckoning-2026.html +368 -0
  43. package/docs/blog/owasp-agentic-ai-top10.html +18 -8
  44. package/docs/blog/securing-ai-agents.html +18 -8
  45. package/docs/blog/supply-chain-agents.html +18 -8
  46. package/docs/business/index.html +525 -0
  47. package/docs/business/install.html +261 -0
  48. package/docs/checklist.html +174 -0
  49. package/docs/compare/index.html +122 -0
  50. package/docs/compare/lakera/index.html +62 -0
  51. package/docs/compare/llm-guard/index.html +49 -0
  52. package/docs/compare/snyk-agent-scan/index.html +63 -0
  53. package/docs/compare.html +10 -6
  54. package/docs/dashboard/index.html +520 -0
  55. package/docs/finance/index.html +220 -0
  56. package/docs/guides/business-deployment.html +770 -0
  57. package/docs/hall-of-fame.html +174 -0
  58. package/docs/index.html +447 -154
  59. package/docs/install.sh +557 -0
  60. package/docs/integrations/langchain.html +14 -6
  61. package/docs/integrations/openai.html +14 -6
  62. package/docs/integrations/openclaw.html +55 -7
  63. package/docs/plans/2026-03-26-threat-intel-api.md +255 -0
  64. package/docs/plans/2026-04-14-bugmageddon-marketing-pack.md +329 -0
  65. package/docs/plans/2026-04-14-clawmoat-v1-bugmageddon.md +248 -0
  66. package/docs/plans/2026-04-14-v1-release-update.md +91 -0
  67. package/docs/plans/2026-04-19-supabase-audit.md +68 -0
  68. package/docs/plans/2026-05-12-sales-push.md +303 -0
  69. package/docs/playground/index.html +893 -0
  70. package/docs/playground.html +4 -7
  71. package/docs/privacy-policy/index.html +122 -0
  72. package/docs/rfcs/defense-in-depth.md +467 -0
  73. package/docs/scan/index.html +358 -0
  74. package/docs/services/case-study.html +255 -0
  75. package/docs/services/downloads/install-openclaw.bat +45 -0
  76. package/docs/services/downloads/install-openclaw.command +38 -0
  77. package/docs/services/downloads/install-openclaw.sh +38 -0
  78. package/docs/services/get-started.html +165 -0
  79. package/docs/services/index.html +598 -0
  80. package/docs/services/multi-agent-security.html +284 -0
  81. package/docs/services/one-pager.html +99 -0
  82. package/docs/services/pitch-deck.html +229 -0
  83. package/docs/services/roi-calculator.html +258 -0
  84. package/docs/sitemap.xml +192 -2
  85. package/docs/support/index.html +135 -0
  86. package/docs/templates/customer-service/HEARTBEAT.md +61 -0
  87. package/docs/templates/customer-service/MEMORY.md +89 -0
  88. package/docs/templates/customer-service/SOUL.md +41 -0
  89. package/docs/templates/customer-service/USER.md +56 -0
  90. package/docs/templates/executive/HEARTBEAT.md +86 -0
  91. package/docs/templates/executive/MEMORY.md +92 -0
  92. package/docs/templates/executive/SOUL.md +44 -0
  93. package/docs/templates/executive/USER.md +62 -0
  94. package/docs/templates/finance/HEARTBEAT.md +58 -0
  95. package/docs/templates/finance/MEMORY.md +87 -0
  96. package/docs/templates/finance/SOUL.md +38 -0
  97. package/docs/templates/finance/USER.md +53 -0
  98. package/docs/templates/index.html +115 -0
  99. package/docs/templates/operations/HEARTBEAT.md +63 -0
  100. package/docs/templates/operations/MEMORY.md +68 -0
  101. package/docs/templates/operations/SOUL.md +38 -0
  102. package/docs/templates/operations/USER.md +49 -0
  103. package/docs/templates/sales/HEARTBEAT.md +55 -0
  104. package/docs/templates/sales/MEMORY.md +89 -0
  105. package/docs/templates/sales/SOUL.md +34 -0
  106. package/docs/templates/sales/USER.md +54 -0
  107. package/docs/terms-of-service/index.html +122 -0
  108. package/eslint.config.js +32 -0
  109. package/evals/README.md +29 -0
  110. package/evals/cases.json +390 -0
  111. package/evals/results.md +68 -0
  112. package/evals/run.js +180 -0
  113. package/examples/basic-usage.js +38 -0
  114. package/examples/demo-attack/demo.js +186 -0
  115. package/examples/python-quickstart/README.md +54 -0
  116. package/examples/python-quickstart/clawmoat_client.py +167 -0
  117. package/examples/video-demo/README.md +14 -0
  118. package/examples/video-demo/scene-a-normal.js +29 -0
  119. package/examples/video-demo/scene-b-attack-arrives.js +31 -0
  120. package/examples/video-demo/scene-c-hijack.js +44 -0
  121. package/examples/video-demo/scene-d-clawmoat.js +46 -0
  122. package/integrations/crewai/README.md +32 -0
  123. package/integrations/crewai/clawmoat_crewai/__init__.py +17 -0
  124. package/integrations/crewai/clawmoat_crewai/guard.py +103 -0
  125. package/integrations/crewai/pyproject.toml +21 -0
  126. package/integrations/langchain/README.md +91 -0
  127. package/integrations/langchain/clawmoat_langchain/__init__.py +17 -0
  128. package/integrations/langchain/clawmoat_langchain/callback.py +489 -0
  129. package/integrations/langchain/pyproject.toml +32 -0
  130. package/integrations/litellm/README.md +324 -0
  131. package/integrations/litellm/clawmoat_litellm/__init__.py +21 -0
  132. package/integrations/litellm/clawmoat_litellm/callback.py +329 -0
  133. package/integrations/litellm/clawmoat_litellm/proxy_middleware.py +224 -0
  134. package/integrations/litellm/pyproject.toml +74 -0
  135. package/integrations/openai-agents/README.md +392 -0
  136. package/integrations/openai-agents/clawmoat_openai_agents/__init__.py +20 -0
  137. package/integrations/openai-agents/clawmoat_openai_agents/guardrail.py +431 -0
  138. package/integrations/openai-agents/clawmoat_openai_agents/middleware.py +311 -0
  139. package/integrations/openai-agents/pyproject.toml +76 -0
  140. package/package.json +6 -5
  141. package/plugins/openclaw-adapter/PHASE1.md +439 -0
  142. package/plugins/openclaw-adapter/README.md +103 -0
  143. package/plugins/openclaw-adapter/SPEC.md +1644 -0
  144. package/plugins/openclaw-adapter/package.json +31 -0
  145. package/plugins/openclaw-adapter/src/index.test.ts +226 -0
  146. package/plugins/openclaw-adapter/src/index.ts +140 -0
  147. package/plugins/openclaw-adapter/tsconfig.json +14 -0
  148. package/server/data/threats.json +290 -0
  149. package/server/index.js +224 -10
  150. package/src/adapters/express.js +161 -0
  151. package/src/adapters/index.js +92 -0
  152. package/src/adapters/langchain.js +185 -0
  153. package/src/approval/index.js +456 -0
  154. package/src/ban-scanner.js +200 -0
  155. package/src/boundary-scanner.js +296 -0
  156. package/src/ci-scanner.js +279 -0
  157. package/src/code-scanner.js +245 -0
  158. package/src/enforce.js +166 -0
  159. package/src/finance/index.js +585 -0
  160. package/src/finance/mcp-firewall.js +486 -0
  161. package/src/formatters/json.js +80 -0
  162. package/src/formatters/sarif.js +388 -0
  163. package/src/guardian/alerts.js +34 -3
  164. package/src/guardian/gateway-monitor.js +590 -0
  165. package/src/guardian/index.js +41 -2
  166. package/src/index.js +105 -0
  167. package/src/integrations/agentmesh.js +501 -0
  168. package/src/language-detector.js +201 -0
  169. package/src/mcp-scanner.js +253 -0
  170. package/src/multimodal/index.js +579 -0
  171. package/src/obfuscation-scanner.js +457 -0
  172. package/src/policy-engine.js +402 -0
  173. package/src/scanners/dependency-attacks.js +128 -0
  174. package/src/scanners/prompt-injection.js +18 -0
  175. package/src/scanners/supply-chain.js +14 -0
  176. package/src/templates/default-config.yml +90 -0
  177. package/src/vuln-ops/exploitability.js +46 -0
  178. package/src/watch/live-monitor.js +720 -0
@@ -0,0 +1,220 @@
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
+ <title>ClawMoat Finance — Financial Security for AI Agents</title>
7
+ <meta name="description" content="Protect financial data when AI agents handle payments, banking, crypto, and accounting. Transaction guardrails, credential protection, SOX/PCI-DSS compliance.">
8
+ <meta property="og:title" content="ClawMoat Finance — Your AI Agent Shouldn't Have Access to Your Bank">
9
+ <meta property="og:description" content="Transaction approval thresholds, financial credential protection, crypto wallet guards, and compliance-ready audit trails for AI agents.">
10
+ <link rel="canonical" href="https://clawmoat.com/finance/">
11
+ <style>
12
+ :root { --bg: #0a0a0f; --fg: #e0e0e8; --accent: #00d4aa; --gold: #f5c542; --muted: #888; --card: #14141f; --red: #ff4444; }
13
+ * { margin:0; padding:0; box-sizing:border-box; }
14
+ body { background:var(--bg); color:var(--fg); font-family:-apple-system,BlinkMacSystemFont,'Segoe UI',Roboto,sans-serif; line-height:1.7; }
15
+ .container { max-width:900px; margin:0 auto; padding:2rem 1.5rem; }
16
+ .nav { padding:1rem 0; border-bottom:1px solid #2a2a3a; margin-bottom:2rem; display:flex; justify-content:space-between; align-items:center; }
17
+ .nav a { color:var(--fg); text-decoration:none; margin-right:1.5rem; }
18
+ .nav a:hover { color:var(--accent); }
19
+ h1 { font-size:2.8rem; line-height:1.15; margin-bottom:1rem; }
20
+ h1 span { color:var(--gold); }
21
+ h2 { color:var(--accent); margin:2.5rem 0 1rem; font-size:1.6rem; }
22
+ h3 { margin:1.5rem 0 .75rem; font-size:1.2rem; }
23
+ p { margin-bottom:1rem; }
24
+ a { color:var(--accent); }
25
+ .hero { text-align:center; padding:3rem 0; }
26
+ .hero-sub { color:var(--muted); font-size:1.2rem; max-width:600px; margin:0 auto 2rem; }
27
+ .badge { display:inline-block; background:var(--gold); color:#000; padding:4px 12px; border-radius:20px; font-size:.8rem; font-weight:700; margin-bottom:1rem; }
28
+ pre { background:#1a1a2e; padding:1.25rem; border-radius:8px; overflow-x:auto; margin:1rem 0; }
29
+ code { background:#1a1a2e; padding:.15em .4em; border-radius:4px; font-size:.9em; }
30
+ pre code { background:none; padding:0; }
31
+ .feature-grid { display:grid; grid-template-columns:repeat(auto-fit, minmax(260px, 1fr)); gap:1.5rem; margin:2rem 0; }
32
+ .feature-card { background:var(--card); border:1px solid #2a2a3a; border-radius:12px; padding:1.5rem; }
33
+ .feature-card h3 { margin-top:0; color:var(--gold); }
34
+ .feature-card .icon { font-size:2rem; margin-bottom:.5rem; }
35
+ .who-grid { display:grid; grid-template-columns:repeat(auto-fit, minmax(200px, 1fr)); gap:1rem; margin:1.5rem 0; }
36
+ .who-card { background:var(--card); border:1px solid #2a2a3a; border-radius:8px; padding:1rem; text-align:center; }
37
+ .cta { background:var(--gold); color:#000; padding:.75rem 2rem; border-radius:6px; text-decoration:none; font-weight:700; display:inline-block; margin:1rem .5rem 1rem 0; font-size:1.1rem; }
38
+ .cta:hover { opacity:.9; }
39
+ .cta-outline { border:2px solid var(--accent); color:var(--accent); background:transparent; padding:.75rem 1.5rem; border-radius:6px; text-decoration:none; font-weight:600; display:inline-block; margin:1rem 0; }
40
+ .protection-list { list-style:none; padding:0; margin:1rem 0; }
41
+ .protection-list li { padding:.5rem 0; border-bottom:1px solid #1a1a2e; display:flex; align-items:center; }
42
+ .protection-list .severity { width:70px; font-size:.75rem; font-weight:bold; border-radius:4px; padding:2px 6px; text-align:center; margin-right:12px; flex-shrink:0; }
43
+ .severity-critical { background:var(--red); color:#fff; }
44
+ .severity-high { background:#ff8800; color:#fff; }
45
+ .stat-grid { display:grid; grid-template-columns:repeat(auto-fit,minmax(140px,1fr)); gap:1rem; margin:2rem 0; }
46
+ .stat { text-align:center; }
47
+ .stat .number { font-size:2.5rem; font-weight:bold; color:var(--gold); }
48
+ .stat .label { color:var(--muted); font-size:.85rem; }
49
+ .pricing { background:var(--card); border:2px solid var(--gold); border-radius:12px; padding:2rem; margin:2rem 0; text-align:center; }
50
+ .pricing h3 { color:var(--gold); font-size:1.8rem; margin:0 0 .5rem; }
51
+ .pricing .price { font-size:2.5rem; font-weight:bold; margin:.5rem 0; }
52
+ .pricing .price span { font-size:1rem; color:var(--muted); }
53
+ .pricing ul { text-align:left; max-width:400px; margin:1rem auto; list-style:none; padding:0; }
54
+ .pricing li { padding:.4rem 0; }
55
+ .pricing li::before { content:'✅ '; }
56
+ </style>
57
+ </head>
58
+ <body>
59
+ <div class="container">
60
+ <nav>
61
+ <div class="container">
62
+ <a href="/" class="logo">🏰 Claw<span>Moat</span></a>
63
+ <button class="menu-toggle" onclick="document.querySelector('.nav-links').classList.toggle('open')" aria-label="Menu">☰</button>
64
+ <div class="nav-links">
65
+ <a href="/">Security</a>
66
+ <a href="/services/">AI Agents</a>
67
+ <a href="/blog/">Blog</a>
68
+ <a href="https://github.com/darfaz/clawmoat">GitHub ↗</a>
69
+ </div>
70
+ </div>
71
+ </nav>
72
+
73
+ <div class="hero">
74
+ <div class="badge">NEW IN v0.8.0</div>
75
+ <h1>Your AI Agent Shouldn't Have<br>Access to Your <span>Bank Account</span></h1>
76
+ <p class="hero-sub">Financial-grade security for AI agents handling payments, crypto, accounting, and banking. Transaction guardrails. Credential protection. Compliance-ready audit trails.</p>
77
+ <pre style="display:inline-block;text-align:left"><code>npm install clawmoat
78
+
79
+ const { FinanceGuard } = require('clawmoat');
80
+ const guard = new FinanceGuard({
81
+ transactionLimit: 1000, // Approval above $1K
82
+ dualApprovalThreshold: 10000, // Two approvals above $10K
83
+ auditFormat: 'sox', // SOX-compliant trails
84
+ });</code></pre>
85
+ </div>
86
+
87
+ <div class="stat-grid">
88
+ <div class="stat"><div class="number">30+</div><div class="label">Financial forbidden zones</div></div>
89
+ <div class="stat"><div class="number">15+</div><div class="label">Secret patterns detected</div></div>
90
+ <div class="stat"><div class="number">15</div><div class="label">Financial APIs monitored</div></div>
91
+ <div class="stat"><div class="number">240</div><div class="label">Tests passing</div></div>
92
+ </div>
93
+
94
+ <h2>What FinanceGuard Protects</h2>
95
+
96
+ <div class="feature-grid">
97
+ <div class="feature-card">
98
+ <div class="icon">💳</div>
99
+ <h3>Payment Credentials</h3>
100
+ <p>Blocks agent access to Stripe keys, Plaid tokens, PayPal configs, Square credentials, and 10+ payment providers.</p>
101
+ </div>
102
+ <div class="feature-card">
103
+ <div class="icon">🪙</div>
104
+ <h3>Crypto Wallets</h3>
105
+ <p>Protects Bitcoin, Ethereum, Solana wallets. Detects seed phrases, private keys, keystore files, MetaMask/Phantom data.</p>
106
+ </div>
107
+ <div class="feature-card">
108
+ <div class="icon">🏦</div>
109
+ <h3>Banking Data</h3>
110
+ <p>Guards ACH files, SWIFT MT940 statements, BAI files, NACHA payment files, routing numbers, and account data.</p>
111
+ </div>
112
+ <div class="feature-card">
113
+ <div class="icon">📊</div>
114
+ <h3>Accounting Software</h3>
115
+ <p>Protects QuickBooks (.qbw/.qbo), Xero, FreshBooks credentials and data files from unauthorized agent access.</p>
116
+ </div>
117
+ <div class="feature-card">
118
+ <div class="icon">💰</div>
119
+ <h3>Transaction Guardrails</h3>
120
+ <p>Configurable approval thresholds. Dual-approval for high-value transactions. Rate limiting on financial API calls.</p>
121
+ </div>
122
+ <div class="feature-card">
123
+ <div class="icon">📋</div>
124
+ <h3>Compliance Reports</h3>
125
+ <p>SOX and PCI-DSS compliant audit trail generation. Every transaction, every access attempt, every alert — documented.</p>
126
+ </div>
127
+ </div>
128
+
129
+ <h2>Transaction Approval Workflow</h2>
130
+
131
+ <pre><code>// Agent tries to make a $5,000 payment
132
+ const result = guard.evaluateTransaction({
133
+ amount: 5000,
134
+ type: 'transfer',
135
+ recipient: 'vendor@company.com',
136
+ });
137
+
138
+ // result.approved = false
139
+ // result.requiresApproval = true
140
+ // result.reason = "Amount $5,000 exceeds threshold ($1,000)"
141
+
142
+ // Human approves
143
+ guard.approveTransaction(result.transactionId, 'cfo@company.com');
144
+ // ✅ Transaction approved, audit trail logged
145
+
146
+ // For $15K+ transfers: TWO people must approve
147
+ const bigTx = guard.evaluateTransaction({ amount: 15000, type: 'wire' });
148
+ guard.approveTransaction(bigTx.transactionId, 'cfo@company.com');
149
+ // Still pending — needs second approval
150
+ guard.approveTransaction(bigTx.transactionId, 'ceo@company.com');
151
+ // ✅ Now approved</code></pre>
152
+
153
+ <h2>Who Needs This</h2>
154
+
155
+ <div class="who-grid">
156
+ <div class="who-card">
157
+ <div style="font-size:2rem">🏢</div>
158
+ <h3>Fintech Startups</h3>
159
+ <p>Using AI for invoicing, reconciliation, or payment processing</p>
160
+ </div>
161
+ <div class="who-card">
162
+ <div style="font-size:2rem">🪙</div>
163
+ <h3>Crypto Projects</h3>
164
+ <p>AI agents managing wallets, DeFi operations, or trading</p>
165
+ </div>
166
+ <div class="who-card">
167
+ <div style="font-size:2rem">📒</div>
168
+ <h3>Accounting Firms</h3>
169
+ <p>AI assistants with access to client financial data</p>
170
+ </div>
171
+ <div class="who-card">
172
+ <div style="font-size:2rem">👔</div>
173
+ <h3>CFOs & Controllers</h3>
174
+ <p>Automating financial workflows with AI agents</p>
175
+ </div>
176
+ </div>
177
+
178
+ <h2>Secrets It Catches</h2>
179
+
180
+ <ul class="protection-list">
181
+ <li><span class="severity severity-critical">CRITICAL</span> Stripe secret/restricted keys</li>
182
+ <li><span class="severity severity-critical">CRITICAL</span> Plaid access tokens</li>
183
+ <li><span class="severity severity-critical">CRITICAL</span> Bitcoin/Ethereum/Solana private keys</li>
184
+ <li><span class="severity severity-critical">CRITICAL</span> BIP-39 seed phrases</li>
185
+ <li><span class="severity severity-critical">CRITICAL</span> Credit card numbers (Visa/MC/Amex/Discover)</li>
186
+ <li><span class="severity severity-critical">CRITICAL</span> Social Security Numbers</li>
187
+ <li><span class="severity severity-critical">CRITICAL</span> Bank account + routing numbers</li>
188
+ <li><span class="severity severity-critical">CRITICAL</span> IBAN numbers</li>
189
+ <li><span class="severity severity-high">HIGH</span> Stripe publishable keys</li>
190
+ <li><span class="severity severity-high">HIGH</span> SWIFT/BIC codes</li>
191
+ <li><span class="severity severity-high">HIGH</span> EIN (Employer ID Numbers)</li>
192
+ <li><span class="severity severity-high">HIGH</span> Square API keys</li>
193
+ </ul>
194
+
195
+ <div id="pricing" class="pricing">
196
+ <h3>ClawMoat Finance</h3>
197
+ <p style="color:var(--muted)">Included in ClawMoat Pro</p>
198
+ <div class="price">$14.99<span>/mo</span></div>
199
+ <ul>
200
+ <li>All FinanceGuard features</li>
201
+ <li>30+ financial forbidden zones</li>
202
+ <li>Transaction approval workflows</li>
203
+ <li>Dual-approval for high-value ops</li>
204
+ <li>SOX & PCI-DSS audit reports</li>
205
+ <li>15 financial API monitors</li>
206
+ <li>Real-time alerts (Slack/Discord/email)</li>
207
+ <li>Priority support</li>
208
+ </ul>
209
+ <a href="/#pricing" class="cta">Start Free Trial</a>
210
+ <p style="margin-top:1rem;color:var(--muted);font-size:.85rem">Open-source core available free. Pro adds threat intel, persistent audit, and dashboard.</p>
211
+ </div>
212
+
213
+ <div style="text-align:center;padding:2rem 0">
214
+ <p style="color:var(--muted)">Part of the ClawMoat security suite — 240 tests, zero dependencies, MIT license.</p>
215
+ <a href="https://github.com/darfaz/clawmoat" class="cta-outline">View on GitHub</a>
216
+ </div>
217
+
218
+ </div>
219
+ </body>
220
+ </html>