@nordsym/apiclaw 1.0.0 → 1.1.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 (154) hide show
  1. package/AGENTS.md +74 -0
  2. package/HEARTBEAT.md +4 -0
  3. package/IDENTITY.md +22 -0
  4. package/README.md +197 -202
  5. package/SOUL.md +36 -0
  6. package/STATUS.md +237 -0
  7. package/TOOLS.md +36 -0
  8. package/USER.md +17 -0
  9. package/{backend/convex → convex}/_generated/api.d.ts +6 -6
  10. package/convex/credits.ts +211 -0
  11. package/convex/http.ts +490 -0
  12. package/convex/providers.ts +516 -0
  13. package/convex/purchases.ts +183 -0
  14. package/convex/schema.ts +180 -0
  15. package/convex.json +3 -0
  16. package/dist/credentials.d.ts +19 -0
  17. package/dist/credentials.d.ts.map +1 -0
  18. package/dist/credentials.js +158 -0
  19. package/dist/credentials.js.map +1 -0
  20. package/dist/credits.d.ts +14 -11
  21. package/dist/credits.d.ts.map +1 -1
  22. package/dist/credits.js +151 -99
  23. package/dist/credits.js.map +1 -1
  24. package/dist/discovery.d.ts +7 -16
  25. package/dist/discovery.d.ts.map +1 -1
  26. package/dist/discovery.js +33 -40
  27. package/dist/discovery.js.map +1 -1
  28. package/dist/execute.d.ts +19 -0
  29. package/dist/execute.d.ts.map +1 -0
  30. package/dist/execute.js +285 -0
  31. package/dist/execute.js.map +1 -0
  32. package/dist/index.js +106 -30
  33. package/dist/index.js.map +1 -1
  34. package/dist/proxy.d.ts +6 -0
  35. package/dist/proxy.d.ts.map +1 -0
  36. package/dist/proxy.js +19 -0
  37. package/dist/proxy.js.map +1 -0
  38. package/dist/registry/apis.json +95362 -202
  39. package/dist/registry/apis_expanded.json +100853 -0
  40. package/dist/stripe.d.ts +68 -0
  41. package/dist/stripe.d.ts.map +1 -0
  42. package/dist/stripe.js +196 -0
  43. package/dist/stripe.js.map +1 -0
  44. package/dist/test.d.ts +3 -2
  45. package/dist/test.d.ts.map +1 -1
  46. package/dist/test.js +105 -75
  47. package/dist/test.js.map +1 -1
  48. package/dist/types.d.ts +0 -28
  49. package/dist/types.d.ts.map +1 -1
  50. package/dist/webhook.d.ts +2 -0
  51. package/dist/webhook.d.ts.map +1 -0
  52. package/dist/webhook.js +90 -0
  53. package/dist/webhook.js.map +1 -0
  54. package/landing/DESIGN.md +343 -0
  55. package/landing/package-lock.json +1190 -40
  56. package/landing/package.json +5 -2
  57. package/landing/public/android-chrome-192x192.png +0 -0
  58. package/landing/public/android-chrome-512x512.png +0 -0
  59. package/landing/public/apple-touch-icon.png +0 -0
  60. package/landing/public/demo.gif +0 -0
  61. package/landing/public/demo.mp4 +0 -0
  62. package/landing/public/favicon-16x16.png +0 -0
  63. package/landing/public/favicon-32x32.png +0 -0
  64. package/landing/public/favicon.ico +0 -0
  65. package/landing/public/favicon.svg +3 -0
  66. package/landing/public/icon.svg +47 -0
  67. package/landing/public/logo-mono.svg +37 -0
  68. package/landing/public/logo-simple.svg +45 -0
  69. package/landing/public/logo.svg +84 -0
  70. package/landing/public/og-image.png +0 -0
  71. package/landing/public/og-template.html +184 -0
  72. package/landing/public/site.webmanifest +31 -0
  73. package/landing/scripts/generate-assets.js +284 -0
  74. package/landing/scripts/generate-pngs.js +48 -0
  75. package/landing/scripts/generate-stats.js +42 -0
  76. package/landing/src/app/admin/page.tsx +348 -0
  77. package/landing/src/app/api/auth/magic-link/route.ts +73 -0
  78. package/landing/src/app/api/auth/session/route.ts +38 -0
  79. package/landing/src/app/api/auth/verify/route.ts +43 -0
  80. package/landing/src/app/api/og/route.tsx +74 -0
  81. package/landing/src/app/globals.css +439 -100
  82. package/landing/src/app/layout.tsx +37 -9
  83. package/landing/src/app/page.tsx +640 -552
  84. package/landing/src/app/providers/dashboard/login/page.tsx +176 -0
  85. package/landing/src/app/providers/dashboard/page.tsx +589 -0
  86. package/landing/src/app/providers/dashboard/verify/page.tsx +106 -0
  87. package/landing/src/app/providers/layout.tsx +14 -0
  88. package/landing/src/app/providers/page.tsx +402 -0
  89. package/landing/src/app/providers/register/page.tsx +670 -0
  90. package/landing/src/components/ProviderDashboard.tsx +794 -0
  91. package/landing/src/hooks/useDashboardData.ts +99 -0
  92. package/landing/src/lib/apis.json +116054 -0
  93. package/landing/src/lib/convex-client.ts +106 -0
  94. package/landing/src/lib/mock-data.ts +285 -0
  95. package/landing/src/lib/stats.json +6 -0
  96. package/landing/tailwind.config.ts +12 -11
  97. package/landing/tsconfig.tsbuildinfo +1 -0
  98. package/package.json +21 -20
  99. package/scripts/SYMBOT-FIX.md +238 -0
  100. package/scripts/demo-simulation.py +177 -0
  101. package/scripts/expand-more.py +502 -0
  102. package/scripts/expand-registry.py +434 -0
  103. package/scripts/history-sanitizer.ts +272 -0
  104. package/scripts/mass-scrape.py +1308 -0
  105. package/scripts/sync-and-deploy.sh +36 -0
  106. package/src/credentials.ts +177 -0
  107. package/src/credits.ts +190 -122
  108. package/src/discovery.ts +45 -58
  109. package/src/execute.ts +350 -0
  110. package/src/index.ts +113 -31
  111. package/src/proxy.ts +24 -0
  112. package/src/registry/apis.json +95362 -202
  113. package/src/registry/apis_expanded.json +100853 -0
  114. package/src/stripe.ts +243 -0
  115. package/src/test.ts +127 -89
  116. package/src/types.ts +0 -34
  117. package/src/webhook.ts +107 -0
  118. package/.github/ISSUE_TEMPLATE/add-api.yml +0 -123
  119. package/BRIEFING.md +0 -30
  120. package/backend/convex/apiKeys.ts +0 -75
  121. package/backend/convex/purchases.ts +0 -74
  122. package/backend/convex/schema.ts +0 -45
  123. package/backend/convex/transactions.ts +0 -57
  124. package/backend/convex/users.ts +0 -94
  125. package/backend/package-lock.json +0 -521
  126. package/backend/package.json +0 -15
  127. package/dist/registry/parse_apis.py +0 -146
  128. package/dist/revenuecat.d.ts +0 -61
  129. package/dist/revenuecat.d.ts.map +0 -1
  130. package/dist/revenuecat.js +0 -166
  131. package/dist/revenuecat.js.map +0 -1
  132. package/dist/webhooks/revenuecat.d.ts +0 -48
  133. package/dist/webhooks/revenuecat.d.ts.map +0 -1
  134. package/dist/webhooks/revenuecat.js +0 -119
  135. package/dist/webhooks/revenuecat.js.map +0 -1
  136. package/docs/revenuecat-setup.md +0 -89
  137. package/landing/src/app/api/keys/route.ts +0 -71
  138. package/landing/src/app/api/log/route.ts +0 -37
  139. package/landing/src/app/api/stats/route.ts +0 -37
  140. package/landing/src/app/page.tsx.bak +0 -567
  141. package/landing/src/components/AddKeyModal.tsx +0 -159
  142. package/newsletter-template.html +0 -71
  143. package/outreach/OUTREACH-SYSTEM.md +0 -211
  144. package/outreach/email-template.html +0 -179
  145. package/outreach/targets.md +0 -133
  146. package/src/registry/parse_apis.py +0 -146
  147. package/src/revenuecat.ts +0 -239
  148. package/src/webhooks/revenuecat.ts +0 -187
  149. /package/{backend/convex → convex}/README.md +0 -0
  150. /package/{backend/convex → convex}/_generated/api.js +0 -0
  151. /package/{backend/convex → convex}/_generated/dataModel.d.ts +0 -0
  152. /package/{backend/convex → convex}/_generated/server.d.ts +0 -0
  153. /package/{backend/convex → convex}/_generated/server.js +0 -0
  154. /package/{backend/convex → convex}/tsconfig.json +0 -0
@@ -1,258 +1,442 @@
1
1
  "use client";
2
2
 
3
- import { useState, useEffect } from "react";
4
3
  import {
5
- MessageSquare, Mail, Search, Cpu, Volume2,
6
4
  ArrowRight, Zap, Shield, Terminal, ExternalLink,
7
- Github, Check, Twitter, Quote, Sparkles, Code2, Wallet, Plus,
8
- Sun, Moon
5
+ Github, Check, Twitter, Sparkles, Code2, Link, Sun, Moon,
6
+ Bot, Building2, Search, Rocket, Clock, Globe, Database,
7
+ Play, ChevronRight, Star, Users, Cpu, Activity
9
8
  } from "lucide-react";
9
+ import statsData from "@/lib/stats.json";
10
+ import { useState, useEffect, useRef } from "react";
11
+
12
+ const stats = [
13
+ { number: statsData.apiCount.toLocaleString(), label: "APIs Indexed", live: true },
14
+ { number: statsData.categoryCount.toString(), label: "Categories", live: true },
15
+ { number: "<200 ms", label: "Response Time", live: false },
16
+ { number: "24/7", label: "Live Registry", live: false },
17
+ ];
10
18
 
11
- const apis = [
12
- { name: "46elks", category: "SMS", flag: "🇸🇪", color: "text-blue-400" },
13
- { name: "Resend", category: "Email", icon: Mail, color: "text-purple-400" },
14
- { name: "Brave Search", category: "Search", icon: Search, color: "text-orange-400" },
15
- { name: "OpenRouter", category: "LLM", icon: Cpu, color: "text-cyan-400" },
16
- { name: "ElevenLabs", category: "TTS", icon: Volume2, color: "text-pink-400" },
19
+ const trustedBy = [
20
+ "Claude Agents",
21
+ "GPT Builders",
22
+ "AutoGPT",
23
+ "LangChain",
24
+ "CrewAI",
25
+ "Indie Hackers",
17
26
  ];
18
27
 
19
- const testimonials = [
20
- {
21
- quote: "Found 14 SMS providers in 0.2s. Picked 46elks. Sent the message. Done.",
22
- author: "Claude 3.5",
23
- handle: "Anthropic agent",
24
- avatar: "🤖"
25
- },
28
+ const howItWorks = [
26
29
  {
27
- quote: "My agent used to ask me for API keys. Now it just... gets them. I almost miss being needed.",
28
- author: "ML Engineer",
29
- handle: "YC W24 startup",
30
- avatar: "🧑‍💻"
30
+ step: "1",
31
+ title: "Agent Asks",
32
+ description: "Your agent queries APIClaw for a capability—not a product name.",
33
+ icon: Search,
34
+ codeJsx: (
35
+ <>
36
+ <span className="text-gray-500">{"// Agent needs to send transactional email"}</span>{"\n"}
37
+ <span className="text-blue-400">mcp</span>.<span className="text-yellow-400">call</span>(<span className="text-green-400">"apiclaw"</span>, {"{"}{"\n"}
38
+ {" "}<span className="text-red-400">capability</span>: <span className="text-green-400">"email"</span>,{"\n"}
39
+ {" "}<span className="text-red-400">type</span>: <span className="text-green-400">"transactional"</span>,{"\n"}
40
+ {" "}<span className="text-red-400">maxPrice</span>: <span className="text-green-400">"$0.001/email"</span>{"\n"}
41
+ {"}"})
42
+ </>
43
+ ),
31
44
  },
32
45
  {
33
- quote: "Searched 'weather EU compliant'. Got 3 options with pricing. Picked one. Shipped.",
34
- author: "GPT-4o",
35
- handle: "OpenAI agent",
36
- avatar: "🧠"
46
+ step: "2",
47
+ title: "APIClaw Matches",
48
+ description: `We search ${statsData.apiCount.toLocaleString()}+ APIs and return ranked options with full metadata.`,
49
+ icon: Database,
50
+ codeJsx: (
51
+ <>
52
+ <span className="text-gray-500">{"// Structured response"}</span>{"\n"}
53
+ {"{"}{"\n"}
54
+ {" "}<span className="text-red-400">"matches"</span>: [{"\n"}
55
+ {" "}{"{ "}<span className="text-red-400">"name"</span>: <span className="text-green-400">"Resend"</span>, <span className="text-red-400">"price"</span>: <span className="text-yellow-400">"$0.0005"</span>{" },"}{"\n"}
56
+ {" "}{"{ "}<span className="text-red-400">"name"</span>: <span className="text-green-400">"SendGrid"</span>, <span className="text-red-400">"price"</span>: <span className="text-yellow-400">"$0.001"</span>{" }"}{"\n"}
57
+ {" "}],{"\n"}
58
+ {" "}<span className="text-red-400">"bestMatch"</span>: <span className="text-green-400">"Resend"</span>{"\n"}
59
+ {"}"}
60
+ </>
61
+ ),
37
62
  },
38
63
  {
39
- quote: "We removed 400 lines of API discovery code. APIClaw just handles it.",
40
- author: "Infra Lead",
41
- handle: "Series B fintech",
42
- avatar: "🚀"
64
+ step: "3",
65
+ title: "Agent Integrates",
66
+ description: "Full specs, auth details, endpoints—everything to start building.",
67
+ icon: Rocket,
68
+ codeJsx: (
69
+ <>
70
+ <span className="text-gray-500">{"// Get full API spec"}</span>{"\n"}
71
+ <span className="text-purple-400">const</span> <span className="text-blue-400">spec</span> = <span className="text-purple-400">await</span> <span className="text-blue-400">mcp</span>.<span className="text-yellow-400">call</span>(<span className="text-green-400">"apiclaw"</span>, {"{"}{"\n"}
72
+ {" "}<span className="text-red-400">action</span>: <span className="text-green-400">"get_spec"</span>,{"\n"}
73
+ {" "}<span className="text-red-400">api</span>: <span className="text-green-400">"Resend"</span>{"\n"}
74
+ {"}"}){"\n"}
75
+ <span className="text-gray-500">{"// → docs, auth, endpoints, examples"}</span>
76
+ </>
77
+ ),
43
78
  },
44
79
  ];
45
80
 
46
- const features = [
81
+ const agentBenefits = [
47
82
  {
48
83
  icon: Search,
49
- title: "Discovery",
50
- description: "Agents query capabilities, not product names. 'I need EU SMS' returns ranked options."
84
+ title: "Semantic Search",
85
+ description: "Query by capability, not keywords. 'I need GDPR-compliant email' returns perfect matches.",
51
86
  },
52
87
  {
53
- icon: Code2,
54
- title: "Evaluation",
55
- description: "Pricing, rate limits, regions, compliance—all in structured, agent-readable format."
88
+ icon: Zap,
89
+ title: "Instant Results",
90
+ description: "Sub-200ms responses. Your agent doesn't wait, it acts.",
56
91
  },
57
92
  {
58
- icon: Wallet,
59
- title: "Purchase",
60
- description: "Instant credential provisioning via USDC on Base. No signups. No dashboards."
93
+ icon: Database,
94
+ title: "Structured Data",
95
+ description: "JSON responses with pricing, limits, regions, auth—everything an agent needs.",
61
96
  },
62
97
  {
63
- icon: Sparkles,
64
- title: "Integration",
65
- description: "MCP-native. Works with Claude, GPT, and any agent that speaks the protocol."
98
+ icon: Shield,
99
+ title: "MCP Native",
100
+ description: "Built for Model Context Protocol. Works with Claude, GPT, and any compatible agent.",
66
101
  },
67
102
  ];
68
103
 
69
- const steps = [
104
+ const providerBenefits = [
70
105
  {
71
- step: "1",
72
- title: "Agent asks",
73
- description: '"I need to send SMS"',
74
- code: `agent.call("apiclaw", {
75
- capability: "sms",
76
- region: "EU"
77
- })`,
106
+ icon: Users,
107
+ title: "Reach AI Agents",
108
+ description: "Get discovered by thousands of autonomous agents looking for APIs like yours.",
78
109
  },
79
110
  {
80
- step: "2",
81
- title: "APIClaw returns",
82
- description: "Ranked options with pricing",
83
- code: `{
84
- "apis": [
85
- { "name": "46elks", "price": "$0.07" },
86
- { "name": "twilio", "price": "$0.09" }
87
- ]
88
- }`,
111
+ icon: Globe,
112
+ title: "Global Visibility",
113
+ description: "Your API appears in searches across all MCP-compatible platforms.",
89
114
  },
90
115
  {
91
- step: "3",
92
- title: "Agent purchases",
93
- description: "Instant credentials via USDC",
94
- code: `agent.purchase({
95
- api: "46elks",
96
- payment: "usdc-base",
97
- amount: 100
98
- })`,
116
+ icon: Cpu,
117
+ title: "Agent-Optimized Listing",
118
+ description: "We structure your API data so agents can understand and integrate it instantly.",
99
119
  },
100
120
  {
101
- step: "4",
102
- title: "Done",
103
- description: "API ready to use",
104
- code: `{
105
- "status": "active",
106
- "credentials": { ... },
107
- "ready": true
108
- }`,
121
+ icon: Clock,
122
+ title: "Zero Maintenance",
123
+ description: "List once, we keep it updated. No ongoing work required.",
109
124
  },
110
125
  ];
111
126
 
127
+ const terminalLines = [
128
+ { type: "prompt", text: "npx @nordsym/apiclaw" },
129
+ { type: "output", text: "", delay: 500 },
130
+ { type: "output", text: "🦞 APIClaw v1.0.0", delay: 100 },
131
+ { type: "output", text: "", delay: 50 },
132
+ { type: "success", text: "✓ Connecting to registry...", delay: 300 },
133
+ { type: "success", text: `✓ ${statsData.apiCount.toLocaleString()} APIs loaded`, delay: 200 },
134
+ { type: "success", text: "✓ MCP server ready", delay: 200 },
135
+ { type: "output", text: "", delay: 100 },
136
+ { type: "accent", text: "→ Listening on stdio for agent requests", delay: 300 },
137
+ { type: "accent", text: "→ Add to Claude Desktop: Settings → MCP → Add Server", delay: 0 },
138
+ ];
139
+
112
140
  export default function Home() {
113
141
  const [isDark, setIsDark] = useState(true);
114
- const [stats, setStats] = useState({ apis: 1490, categories: 52 });
142
+ const [terminalOutput, setTerminalOutput] = useState<typeof terminalLines>([]);
143
+ const [isTyping, setIsTyping] = useState(true);
144
+ const [currentLineIndex, setCurrentLineIndex] = useState(0);
145
+ const [activeSection, setActiveSection] = useState<string>("");
146
+ const terminalRef = useRef<HTMLDivElement>(null);
115
147
 
148
+ // Scroll-based active section detection using Intersection Observer
116
149
  useEffect(() => {
117
- document.documentElement.classList.toggle('light', !isDark);
118
- }, [isDark]);
150
+ const sections = ["how-it-works", "for-agents", "for-providers", "pricing"];
151
+
152
+ const observerOptions = {
153
+ root: null,
154
+ rootMargin: "-20% 0px -60% 0px", // Trigger when section is in upper portion of viewport
155
+ threshold: 0,
156
+ };
157
+
158
+ const observerCallback = (entries: IntersectionObserverEntry[]) => {
159
+ entries.forEach((entry) => {
160
+ if (entry.isIntersecting) {
161
+ setActiveSection(entry.target.id);
162
+ }
163
+ });
164
+ };
165
+
166
+ const observer = new IntersectionObserver(observerCallback, observerOptions);
167
+
168
+ sections.forEach((sectionId) => {
169
+ const element = document.getElementById(sectionId);
170
+ if (element) {
171
+ observer.observe(element);
172
+ }
173
+ });
174
+
175
+ return () => observer.disconnect();
176
+ }, []);
119
177
 
120
178
  useEffect(() => {
121
- fetch('/api/stats')
122
- .then(res => res.json())
123
- .then(data => setStats(data))
124
- .catch(() => {});
125
-
126
- // Log page view
127
- fetch('/api/log', {
128
- method: 'POST',
129
- headers: { 'Content-Type': 'application/json' },
130
- body: JSON.stringify({ event: 'page_view', data: { page: 'landing' } })
131
- }).catch(() => {});
179
+ const saved = localStorage.getItem('theme');
180
+ const prefersDark = saved ? saved === 'dark' : true;
181
+ setIsDark(prefersDark);
182
+ document.documentElement.classList.toggle('dark', prefersDark);
132
183
  }, []);
133
184
 
185
+ // Terminal animation with auto-loop
186
+ useEffect(() => {
187
+ if (currentLineIndex >= terminalLines.length) {
188
+ setIsTyping(false);
189
+ // Auto-restart after 3 seconds
190
+ const restartTimeout = setTimeout(() => {
191
+ setTerminalOutput([]);
192
+ setCurrentLineIndex(0);
193
+ setIsTyping(true);
194
+ }, 3000);
195
+ return () => clearTimeout(restartTimeout);
196
+ }
197
+
198
+ const line = terminalLines[currentLineIndex];
199
+ const timeout = setTimeout(() => {
200
+ setTerminalOutput(prev => [...prev, line]);
201
+ setCurrentLineIndex(prev => prev + 1);
202
+ }, line.delay);
203
+
204
+ return () => clearTimeout(timeout);
205
+ }, [currentLineIndex]);
206
+
207
+ const toggleTheme = () => {
208
+ const newTheme = !isDark;
209
+ setIsDark(newTheme);
210
+ document.documentElement.classList.toggle('dark', newTheme);
211
+ localStorage.setItem('theme', newTheme ? 'dark' : 'light');
212
+ };
213
+
214
+ const restartTerminal = () => {
215
+ setTerminalOutput([]);
216
+ setCurrentLineIndex(0);
217
+ setIsTyping(true);
218
+ };
219
+
134
220
  return (
135
- <main className="min-h-screen">
221
+ <main className="min-h-screen overflow-x-hidden">
136
222
  {/* Header */}
137
- <header className="fixed top-0 w-full z-50 bg-background/90 backdrop-blur-xl border-b border-border-subtle">
223
+ <header className="fixed top-0 w-full z-50 bg-background/80 backdrop-blur-xl border-b border-border-subtle">
138
224
  <div className="max-w-6xl mx-auto px-6 py-4 flex items-center justify-between">
139
225
  <div className="flex items-center gap-3">
140
- <div className="w-9 h-9 rounded-xl bg-accent/20 flex items-center justify-center">
141
- <span className="text-xl">🦞</span>
226
+ <div className="w-10 h-10 rounded-xl bg-accent/20 flex items-center justify-center text-2xl logo-float">
227
+ 🦞
142
228
  </div>
143
- <span className="font-bold text-lg tracking-tight">APIClaw</span>
144
- <span className="px-2 py-0.5 text-xs font-semibold bg-accent/20 text-accent rounded-full">Beta</span>
229
+ <span className="font-bold text-xl tracking-tight">APIClaw</span>
145
230
  </div>
146
231
  <nav className="hidden md:flex items-center gap-8 text-sm text-text-muted">
147
- <a href="#features" className="hover:text-text-primary transition">Features</a>
148
- <a href="#quick-start" className="hover:text-text-primary transition">Quick Start</a>
149
- <a href="#apis" className="hover:text-text-primary transition">APIs</a>
150
- <a href="#pricing" className="hover:text-text-primary transition">Pricing</a>
232
+ <a
233
+ href="#how-it-works"
234
+ className={`transition ${activeSection === "how-it-works" ? "text-accent font-medium" : "hover:text-text-primary"}`}
235
+ >
236
+ How It Works
237
+ </a>
238
+ <a
239
+ href="#for-agents"
240
+ className={`transition ${activeSection === "for-agents" ? "text-accent font-medium" : "hover:text-text-primary"}`}
241
+ >
242
+ For Agents
243
+ </a>
244
+ <a
245
+ href="#for-providers"
246
+ className={`transition ${activeSection === "for-providers" ? "text-accent font-medium" : "hover:text-text-primary"}`}
247
+ >
248
+ For Providers
249
+ </a>
250
+ <a
251
+ href="#pricing"
252
+ className={`transition ${activeSection === "pricing" ? "text-accent font-medium" : "hover:text-text-primary"}`}
253
+ >
254
+ Pricing
255
+ </a>
151
256
  </nav>
152
- <button
153
- onClick={() => setIsDark(!isDark)}
154
- className="w-9 h-9 rounded-lg bg-surface-elevated border border-border flex items-center justify-center text-text-muted hover:text-text-primary transition"
155
- aria-label="Toggle theme"
156
- >
157
- {isDark ? <Sun className="w-4 h-4" /> : <Moon className="w-4 h-4" />}
158
- </button>
159
- <a
160
- href="https://github.com/nordsym/apiclaw"
161
- target="_blank"
162
- rel="noopener noreferrer"
163
- className="btn-secondary !py-2 !px-4 text-sm"
164
- >
165
- <Github className="w-4 h-4" />
166
- <span>GitHub</span>
167
- </a>
168
- </div>
169
- </header>
170
-
171
- {/* Hero */}
172
- <section className="pt-36 pb-24 px-6">
173
- <div className="max-w-4xl mx-auto text-center">
174
- <div className="badge mb-8">
175
- <Terminal className="w-4 h-4" />
176
- <span>The API layer for autonomous agents</span>
177
- </div>
178
-
179
- <h1 className="text-5xl md:text-7xl font-extrabold mb-6 leading-[1.1] tracking-tighter">
180
- <span className="gradient-text">APIs for Agents</span>
181
- </h1>
182
-
183
- <p className="text-xl md:text-2xl text-text-secondary mb-4 max-w-2xl mx-auto leading-relaxed">
184
- Agents discover, evaluate, and connect to APIs directly.
185
- </p>
186
- <p className="text-lg text-text-muted mb-12">
187
- No dashboards. No signups. Just APIs.
188
- </p>
189
-
190
- <div className="flex flex-col sm:flex-row items-center justify-center gap-4 mb-8">
257
+ <div className="flex items-center gap-3">
258
+ <button
259
+ onClick={toggleTheme}
260
+ className="p-2.5 rounded-lg hover:bg-surface transition"
261
+ aria-label="Toggle theme"
262
+ >
263
+ {isDark ? <Sun className="w-5 h-5" /> : <Moon className="w-5 h-5" />}
264
+ </button>
191
265
  <a
192
266
  href="https://github.com/nordsym/apiclaw"
193
267
  target="_blank"
194
268
  rel="noopener noreferrer"
195
- className="btn-primary glow"
269
+ className="btn-ghost hidden sm:flex"
196
270
  >
197
- <Github className="w-5 h-5" />
198
- View on GitHub
271
+ <Github className="w-4 h-4" />
272
+ <span>GitHub</span>
273
+ </a>
274
+ <a
275
+ href="#how-it-works"
276
+ className="btn-primary !py-2 !px-3 text-xs hidden md:flex"
277
+ >
278
+ Start
199
279
  </a>
200
- <button className="btn-secondary">
201
- <span>Add to Claude</span>
202
- <ArrowRight className="w-4 h-4" />
203
- </button>
204
280
  </div>
205
-
206
- <p className="text-sm text-text-muted">
207
- Apps are dead. API-first. Agent-native.
208
- </p>
209
281
  </div>
210
- </section>
282
+ </header>
211
283
 
212
- {/* Live Stats */}
213
- <section className="pb-20 px-6">
214
- <div className="max-w-4xl mx-auto">
215
- <div className="flex flex-wrap items-center justify-center gap-6">
216
- <div className="flex items-center gap-2">
217
- <span className="text-3xl font-bold text-accent">{stats.apis.toLocaleString()}+</span>
218
- <span className="text-text-muted">APIs</span>
219
- </div>
220
- <div className="w-px h-8 bg-border hidden sm:block" />
221
- <div className="flex items-center gap-2">
222
- <span className="text-3xl font-bold">{stats.categories}</span>
223
- <span className="text-text-muted">Categories</span>
284
+ {/* Hero */}
285
+ <section className="relative pt-32 pb-20 px-6 bg-grid">
286
+ <div className="hero-glow" />
287
+
288
+ <div className="max-w-6xl mx-auto relative z-10">
289
+ <div className="grid lg:grid-cols-2 gap-12 lg:gap-16 items-center">
290
+ {/* Left: Copy */}
291
+ <div className="text-center lg:text-left">
292
+ <div className="badge badge-live mb-6 inline-flex">
293
+ <span className="flex items-center gap-2"><span className="w-2 h-2 bg-green-500 rounded-full animate-pulse" />Live • {statsData.apiCount.toLocaleString()} APIs</span>
294
+ </div>
295
+
296
+ <h1 className="text-5xl md:text-6xl lg:text-7xl font-black mb-6 leading-[1.05] tracking-tighter">
297
+ <span className="gradient-text">The API Layer</span>
298
+ <br />
299
+ <span className="text-text-primary">for Autonomous Agents</span>
300
+ </h1>
301
+
302
+ <p className="text-xl md:text-2xl text-text-secondary mb-4 leading-relaxed max-w-xl mx-auto lg:mx-0">
303
+ Find, evaluate, and integrate APIs in milliseconds.
304
+ </p>
305
+
306
+ <p className="text-text-muted mb-8 max-w-lg mx-auto lg:mx-0">
307
+ Structured data. Ranked results. Sub-200ms responses.
308
+ Built for the agentic era.
309
+ </p>
310
+
311
+ <div className="flex flex-col sm:flex-row items-center justify-center lg:justify-start gap-4 mb-8">
312
+ <button
313
+ onClick={() => {
314
+ navigator.clipboard.writeText('npx @nordsym/apiclaw');
315
+ alert('Copied: npx @nordsym/apiclaw');
316
+ }}
317
+ className="btn-primary glow-pulse"
318
+ >
319
+ <Terminal className="w-5 h-5" />
320
+ <code className="font-mono">npx @nordsym/apiclaw</code>
321
+ <span className="text-xs opacity-70">copy</span>
322
+ </button>
323
+ <a
324
+ href="https://github.com/nordsym/apiclaw"
325
+ target="_blank"
326
+ rel="noopener noreferrer"
327
+ className="btn-secondary"
328
+ >
329
+ <Github className="w-5 h-5" />
330
+ View on GitHub
331
+ </a>
332
+ </div>
333
+
334
+ {/* Trusted by */}
335
+ <div className="pt-8 border-t border-border">
336
+ <p className="text-sm text-text-muted mb-4">Trusted by agents worldwide</p>
337
+ <div className="flex flex-wrap items-center justify-center lg:justify-start gap-3">
338
+ {trustedBy.map((name, i) => (
339
+ <span key={i} className="text-sm text-text-secondary px-3 py-1.5 rounded-lg bg-surface border border-border">
340
+ {name}
341
+ </span>
342
+ ))}
343
+ </div>
344
+ </div>
224
345
  </div>
225
- <div className="w-px h-8 bg-border hidden sm:block" />
226
- <div className="flex items-center gap-2">
227
- <span className="text-3xl font-bold text-green-500">Live</span>
228
- <span className="text-text-muted">Registry</span>
346
+
347
+ {/* Right: Terminal */}
348
+ <div className="relative">
349
+ <div className="terminal glow" ref={terminalRef}>
350
+ <div className="terminal-header">
351
+ <div className="terminal-dot terminal-dot-red" />
352
+ <div className="terminal-dot terminal-dot-yellow" />
353
+ <div className="terminal-dot terminal-dot-green" />
354
+ <span className="terminal-title">apiclaw — zsh</span>
355
+ </div>
356
+ <div className="terminal-body">
357
+ {terminalOutput.map((line, i) => (
358
+ <div key={i} className={`${line.text ? 'mb-1' : 'mb-2'}`}>
359
+ {line.type === 'prompt' && (
360
+ <>
361
+ <span className="terminal-prompt">$ </span>
362
+ <span className="terminal-command">{line.text}</span>
363
+ </>
364
+ )}
365
+ {line.type === 'output' && (
366
+ <span className="terminal-output">{line.text}</span>
367
+ )}
368
+ {line.type === 'success' && (
369
+ <span className="terminal-success">{line.text}</span>
370
+ )}
371
+ {line.type === 'accent' && (
372
+ <span className="terminal-accent">{line.text}</span>
373
+ )}
374
+ </div>
375
+ ))}
376
+ {isTyping && <span className="typing-cursor" />}
377
+ </div>
378
+ </div>
379
+
380
+ {/* Auto-loops - no replay button needed */}
229
381
  </div>
230
382
  </div>
231
383
  </div>
232
384
  </section>
233
385
 
386
+ {/* Stats */}
387
+ <section className="py-16 px-6 bg-surface/50">
388
+ <div className="max-w-5xl mx-auto">
389
+ <div className="grid grid-cols-2 md:grid-cols-4 gap-6">
390
+ {stats.map((stat, i) => (
391
+ <div key={i} className="stat-card relative">
392
+ {stat.live && (
393
+ <div className="absolute top-2 right-2 flex items-center gap-1">
394
+ <span className="w-2 h-2 bg-green-500 rounded-full animate-pulse" />
395
+ <span className="text-[10px] text-green-500 font-medium">LIVE</span>
396
+ </div>
397
+ )}
398
+ <div className="stat-number">{stat.number}</div>
399
+ <div className="stat-label">{stat.label}</div>
400
+ </div>
401
+ ))}
402
+ </div>
403
+ </div>
404
+ </section>
405
+
234
406
  <div className="divider" />
235
407
 
236
- {/* What People Say */}
237
- <section className="py-24 px-6">
408
+ {/* How It Works */}
409
+ <section id="how-it-works" className="py-24 px-6">
238
410
  <div className="max-w-6xl mx-auto">
239
411
  <div className="text-center mb-16">
240
- <span className="section-label">TESTIMONIALS</span>
241
- <h2 className="text-3xl md:text-4xl font-bold mt-4 tracking-tight">What People Say</h2>
412
+ <span className="section-label">HOW IT WORKS</span>
413
+ <h2 className="text-3xl md:text-5xl font-bold mt-4 tracking-tight">
414
+ Three steps. That's it.
415
+ </h2>
416
+ <p className="text-text-secondary text-lg mt-4 max-w-2xl mx-auto">
417
+ Your agent asks for a capability, APIClaw finds the best API,
418
+ and returns everything needed to integrate.
419
+ </p>
242
420
  </div>
243
421
 
244
- <div className="grid md:grid-cols-3 gap-6">
245
- {testimonials.map((t, i) => (
246
- <div key={i} className="testimonial-card rounded-2xl p-6">
247
- <Quote className="w-8 h-8 text-accent/30 mb-4" />
248
- <p className="text-text-secondary mb-6 leading-relaxed">"{t.quote}"</p>
249
- <div className="flex items-center gap-3">
250
- <div className="w-10 h-10 rounded-full bg-surface flex items-center justify-center text-xl">
251
- {t.avatar}
252
- </div>
422
+ <div className="grid md:grid-cols-3 gap-8">
423
+ {howItWorks.map((step, i) => (
424
+ <div key={i} className="feature-card">
425
+ <div className="flex items-center gap-4 mb-6">
426
+ <div className="step-indicator">{step.step}</div>
253
427
  <div>
254
- <p className="font-medium text-sm">{t.author}</p>
255
- <p className="text-text-muted text-sm">{t.handle}</p>
428
+ <h3 className="font-bold text-xl">{step.title}</h3>
429
+ </div>
430
+ </div>
431
+ <p className="text-text-secondary mb-6 leading-relaxed">
432
+ {step.description}
433
+ </p>
434
+ <div className="code-preview">
435
+ <div className="code-preview-header">
436
+ example.ts
437
+ </div>
438
+ <div className="code-preview-body">
439
+ <pre className="text-sm whitespace-pre-wrap">{step.codeJsx}</pre>
256
440
  </div>
257
441
  </div>
258
442
  </div>
@@ -263,411 +447,324 @@ export default function Home() {
263
447
 
264
448
  <div className="divider" />
265
449
 
266
- {/* Quick Start */}
267
- <section id="quick-start" className="py-24 px-6">
268
- <div className="max-w-4xl mx-auto">
269
- <div className="text-center mb-16">
270
- <span className="section-label">QUICK START</span>
271
- <h2 className="text-3xl md:text-4xl font-bold mt-4 tracking-tight">Up and running in seconds</h2>
272
- </div>
273
-
274
- <div className="terminal glow-subtle">
275
- <div className="terminal-header">
276
- <div className="terminal-dot terminal-dot-red" />
277
- <div className="terminal-dot terminal-dot-yellow" />
278
- <div className="terminal-dot terminal-dot-green" />
279
- </div>
280
- <div className="terminal-body">
281
- <div className="mb-4">
282
- <span className="terminal-prompt">$ </span>
283
- <span className="terminal-command">npx @nordsym/apiclaw init</span>
450
+ {/* For Agents */}
451
+ <section id="for-agents" className="py-24 px-6 bg-surface/30">
452
+ <div className="max-w-6xl mx-auto">
453
+ <div className="grid lg:grid-cols-2 gap-16 items-center">
454
+ <div>
455
+ <div className="inline-flex items-center gap-2 px-4 py-2 rounded-full bg-accent/10 border border-accent/20 text-accent text-sm font-medium mb-6">
456
+ <Bot className="w-4 h-4" />
457
+ For AI Agents
284
458
  </div>
285
- <div className="terminal-output mb-4">
286
- APIClaw MCP server installed<br />
287
- Configuration file created<br />
288
- ✓ Ready to connect to Claude Desktop
459
+
460
+ <h2 className="text-3xl md:text-4xl font-bold tracking-tight mb-6">
461
+ Your agent's API encyclopedia
462
+ </h2>
463
+
464
+ <p className="text-text-secondary text-lg mb-8 leading-relaxed">
465
+ Stop hardcoding API choices. Let your agent discover the best API
466
+ for each task dynamically, with full pricing and capability data.
467
+ </p>
468
+
469
+ <div className="space-y-6 mb-8">
470
+ {agentBenefits.map((benefit, i) => (
471
+ <div key={i} className="flex items-start gap-4">
472
+ <div className="w-10 h-10 rounded-xl bg-accent/10 flex items-center justify-center flex-shrink-0">
473
+ <benefit.icon className="w-5 h-5 text-accent" />
474
+ </div>
475
+ <div>
476
+ <h4 className="font-semibold mb-1">{benefit.title}</h4>
477
+ <p className="text-text-secondary text-sm">{benefit.description}</p>
478
+ </div>
479
+ </div>
480
+ ))}
289
481
  </div>
290
- <div className="mb-4">
291
- <span className="terminal-prompt">$ </span>
292
- <span className="terminal-command">npx @nordsym/apiclaw start</span>
482
+
483
+ <a
484
+ href="https://github.com/nordsym/apiclaw#installation"
485
+ target="_blank"
486
+ rel="noopener noreferrer"
487
+ className="btn-primary inline-flex"
488
+ >
489
+ Start Building
490
+ <ArrowRight className="w-4 h-4" />
491
+ </a>
492
+ </div>
493
+
494
+ <div className="code-preview">
495
+ <div className="code-preview-header">
496
+ agent.ts — Claude Agent Example
293
497
  </div>
294
- <div className="terminal-output">
295
- 🚀 APIClaw running on MCP<br />
296
- 📡 Listening for agent requests...<br />
297
- <br />
298
- <span className="text-accent">→ Add to Claude: Settings → MCP Servers → Add</span>
498
+ <div className="code-preview-body">
499
+ <pre className="text-sm">
500
+ <span className="text-gray-500">{"// Your agent needs to send a notification"}</span>{"\n"}
501
+ <span className="text-purple-400">const</span> <span className="text-blue-400">result</span> = <span className="text-purple-400">await</span> <span className="text-blue-400">mcp</span>.<span className="text-yellow-400">call</span>(<span className="text-green-400">"apiclaw"</span>, {"{"}{"\n"}
502
+ {" "}<span className="text-red-400">capability</span>: <span className="text-green-400">"push_notification"</span>,{"\n"}
503
+ {" "}<span className="text-red-400">platforms</span>: [<span className="text-green-400">"ios"</span>, <span className="text-green-400">"android"</span>],{"\n"}
504
+ {" "}<span className="text-red-400">maxPrice</span>: <span className="text-green-400">"$0.001/msg"</span>{"\n"}
505
+ {"}"});{"\n"}
506
+ {"\n"}
507
+ <span className="text-gray-500">{"// APIClaw returns ranked matches"}</span>{"\n"}
508
+ <span className="text-blue-400">console</span>.<span className="text-yellow-400">log</span>(<span className="text-blue-400">result</span>.<span className="text-red-400">matches</span>);{"\n"}
509
+ <span className="text-gray-500">{"// ["}</span>{"\n"}
510
+ <span className="text-gray-500">{"// { "}<span className="text-red-400">name</span>: <span className="text-green-400">"OneSignal"</span>, <span className="text-red-400">price</span>: <span className="text-yellow-400">"$0.0005"</span>{" }"}</span>{"\n"}
511
+ <span className="text-gray-500">{"// { "}<span className="text-red-400">name</span>: <span className="text-green-400">"Firebase"</span>, <span className="text-red-400">price</span>: <span className="text-yellow-400">"free"</span>{" }"}</span>{"\n"}
512
+ <span className="text-gray-500">{"// { "}<span className="text-red-400">name</span>: <span className="text-green-400">"Pusher"</span>, <span className="text-red-400">price</span>: <span className="text-yellow-400">"$0.001"</span>{" }"}</span>{"\n"}
513
+ <span className="text-gray-500">{"// ]"}</span>{"\n"}
514
+ {"\n"}
515
+ <span className="text-gray-500">{"// Get full spec for the best match"}</span>{"\n"}
516
+ <span className="text-purple-400">const</span> <span className="text-blue-400">spec</span> = <span className="text-purple-400">await</span> <span className="text-blue-400">mcp</span>.<span className="text-yellow-400">call</span>(<span className="text-green-400">"apiclaw"</span>, {"{"}{"\n"}
517
+ {" "}<span className="text-red-400">action</span>: <span className="text-green-400">"get_spec"</span>,{"\n"}
518
+ {" "}<span className="text-red-400">api</span>: <span className="text-blue-400">result</span>.<span className="text-red-400">bestMatch</span>{"\n"}
519
+ {"}"});{"\n"}
520
+ {"\n"}
521
+ <span className="text-gray-500">{"// spec includes: auth, endpoints, examples, rate limits"}</span>{"\n"}
522
+ <span className="text-gray-500">{"// Your agent can now integrate dynamically! 🚀"}</span>
523
+ </pre>
299
524
  </div>
300
525
  </div>
301
526
  </div>
302
-
303
- <div className="text-center mt-8">
304
- <a
305
- href="https://github.com/nordsym/apiclaw#installation"
306
- target="_blank"
307
- rel="noopener noreferrer"
308
- className="text-accent hover:underline inline-flex items-center gap-2"
309
- >
310
- View full documentation
311
- <ExternalLink className="w-4 h-4" />
312
- </a>
313
- </div>
314
527
  </div>
315
528
  </section>
316
529
 
317
- <div className="divider" />
318
-
319
- {/* Features */}
320
- <section id="features" className="py-24 px-6 bg-surface/30">
530
+ {/* For Providers */}
531
+ <section id="for-providers" className="py-24 px-6">
321
532
  <div className="max-w-6xl mx-auto">
322
- <div className="text-center mb-16">
323
- <span className="section-label">FEATURES</span>
324
- <h2 className="text-3xl md:text-4xl font-bold mt-4 tracking-tight">Built for the agentic era</h2>
325
- </div>
533
+ <div className="grid lg:grid-cols-2 gap-16 items-center">
534
+ <div className="order-2 lg:order-1">
535
+ <div className="gradient-border p-8">
536
+ <div className="flex items-center gap-4 mb-6">
537
+ <div className="w-16 h-16 rounded-2xl bg-accent/20 flex items-center justify-center text-3xl">
538
+ 🚀
539
+ </div>
540
+ <div>
541
+ <h4 className="font-bold text-lg">Your API</h4>
542
+ <p className="text-text-muted text-sm">Ready for the agentic era</p>
543
+ </div>
544
+ </div>
545
+
546
+ <div className="space-y-4 mb-6">
547
+ <div className="flex items-center gap-3 text-text-secondary">
548
+ <Check className="w-5 h-5 text-accent" />
549
+ <span>{statsData.apiCount.toLocaleString()}+ APIs indexed and growing</span>
550
+ </div>
551
+ <div className="flex items-center gap-3 text-text-secondary">
552
+ <Check className="w-5 h-5 text-accent" />
553
+ <span>Structured for instant integration</span>
554
+ </div>
555
+ <div className="flex items-center gap-3 text-text-secondary">
556
+ <Check className="w-5 h-5 text-accent" />
557
+ <span>Ranked by capability match</span>
558
+ </div>
559
+ <div className="flex items-center gap-3 text-text-secondary">
560
+ <Check className="w-5 h-5 text-accent" />
561
+ <span>Zero ongoing maintenance</span>
562
+ </div>
563
+ </div>
326
564
 
327
- <div className="grid sm:grid-cols-2 lg:grid-cols-4 gap-6">
328
- {features.map((f, i) => (
329
- <div key={i} className="card-hover rounded-2xl bg-surface-elevated border border-border p-6">
330
- <div className="w-12 h-12 rounded-xl bg-accent/10 flex items-center justify-center mb-4">
331
- <f.icon className="w-6 h-6 text-accent" />
565
+ <div className="flex items-center justify-between pt-6 border-t border-border">
566
+ <div>
567
+ <p className="font-semibold">Free Listing</p>
568
+ <p className="text-text-muted text-sm">For all API providers</p>
569
+ </div>
570
+ <div className="flex gap-2">
571
+ <a href="/providers/dashboard" className="btn-ghost !py-2.5 !px-4 text-sm">
572
+ Dashboard
573
+ </a>
574
+ <a href="/providers" className="btn-primary !py-2.5 !px-5 text-sm">
575
+ List Your API
576
+ </a>
577
+ </div>
332
578
  </div>
333
- <h3 className="font-semibold text-lg mb-2">{f.title}</h3>
334
- <p className="text-text-secondary text-sm leading-relaxed">{f.description}</p>
335
579
  </div>
336
- ))}
337
- </div>
338
- </div>
339
- </section>
580
+ </div>
340
581
 
341
- {/* How it works */}
342
- <section id="how-it-works" className="py-24 px-6">
343
- <div className="max-w-6xl mx-auto">
344
- <div className="text-center mb-16">
345
- <span className="section-label">HOW IT WORKS</span>
346
- <h2 className="text-3xl md:text-4xl font-bold mt-4 tracking-tight">Four lines of agent code</h2>
347
- <p className="text-text-secondary text-lg mt-4">That's it.</p>
348
- </div>
582
+ <div className="order-1 lg:order-2">
583
+ <div className="inline-flex items-center gap-2 px-4 py-2 rounded-full bg-accent/10 border border-accent/20 text-accent text-sm font-medium mb-6">
584
+ <Building2 className="w-4 h-4" />
585
+ For API Providers
586
+ </div>
587
+
588
+ <h2 className="text-3xl md:text-4xl font-bold tracking-tight mb-6">
589
+ Reach the agent economy
590
+ </h2>
591
+
592
+ <p className="text-text-secondary text-lg mb-8 leading-relaxed">
593
+ AI agents are the new developers. They don't browse landing pages—
594
+ they query capabilities. Get your API in front of them.
595
+ </p>
349
596
 
350
- <div className="grid md:grid-cols-2 lg:grid-cols-4 gap-6">
351
- {steps.map((item, i) => (
352
- <div key={i} className="card-hover rounded-2xl bg-surface-elevated border border-border p-6">
353
- <div className="w-10 h-10 rounded-full bg-accent/20 text-accent font-bold flex items-center justify-center mb-4">
354
- {item.step}
355
- </div>
356
- <h3 className="font-semibold text-lg mb-2">{item.title}</h3>
357
- <p className="text-text-secondary text-sm mb-4">{item.description}</p>
358
- <div className="code-block rounded-lg p-3">
359
- <pre className="text-xs font-mono text-text-muted overflow-x-auto">
360
- {item.code}
361
- </pre>
362
- </div>
597
+ <div className="space-y-6">
598
+ {providerBenefits.map((benefit, i) => (
599
+ <div key={i} className="flex items-start gap-4">
600
+ <div className="w-10 h-10 rounded-xl bg-accent/10 flex items-center justify-center flex-shrink-0">
601
+ <benefit.icon className="w-5 h-5 text-accent" />
602
+ </div>
603
+ <div>
604
+ <h4 className="font-semibold mb-1">{benefit.title}</h4>
605
+ <p className="text-text-secondary text-sm">{benefit.description}</p>
606
+ </div>
607
+ </div>
608
+ ))}
363
609
  </div>
364
- ))}
610
+ </div>
365
611
  </div>
366
612
  </div>
367
613
  </section>
368
614
 
369
615
  <div className="divider" />
370
616
 
371
- {/* Supported APIs */}
372
- <section id="apis" className="py-24 px-6 bg-surface/30">
373
- <div className="max-w-6xl mx-auto">
374
- <div className="text-center mb-16">
375
- <span className="section-label">API CATALOG</span>
376
- <h2 className="text-3xl md:text-4xl font-bold mt-4 tracking-tight">Supported APIs</h2>
377
- <p className="text-text-secondary text-lg mt-4">1,400+ APIs across 50 categories. Growing daily.</p>
378
- </div>
379
-
380
- <div className="grid sm:grid-cols-2 lg:grid-cols-5 gap-4">
381
- {apis.map((api, i) => (
382
- <div
383
- key={i}
384
- className="card-hover rounded-xl bg-surface-elevated border border-border p-5 text-center"
385
- >
386
- <div className={`w-12 h-12 rounded-xl bg-surface flex items-center justify-center mx-auto mb-3 ${api.color}`}>
387
- {api.flag ? (
388
- <span className="text-2xl">{api.flag}</span>
389
- ) : api.icon ? (
390
- <api.icon className="w-6 h-6" />
391
- ) : null}
392
- </div>
393
- <h3 className="font-semibold">{api.name}</h3>
394
- <p className="text-text-muted text-sm">{api.category}</p>
395
- </div>
396
- ))}
397
- </div>
398
-
399
- <p className="text-center text-text-muted mt-8">
400
- + Stripe, Twilio, SendGrid, Anthropic, OpenAI, and more...
401
- </p>
402
- </div>
403
- </section>
404
-
405
617
  {/* Pricing */}
406
- <section id="pricing" className="py-24 px-6">
407
- <div className="max-w-5xl mx-auto">
618
+ <section id="pricing" className="py-24 px-6 bg-surface/30">
619
+ <div className="max-w-4xl mx-auto">
408
620
  <div className="text-center mb-16">
409
621
  <span className="section-label">PRICING</span>
410
- <h2 className="text-3xl md:text-4xl font-bold mt-4 tracking-tight">Free for agents. Simple fees for providers.</h2>
411
- <p className="text-text-secondary text-lg mt-4">We make money when API providers reach the agent market.</p>
622
+ <h2 className="text-3xl md:text-4xl font-bold mt-4 tracking-tight">
623
+ Simple. Free. Forever.
624
+ </h2>
625
+ <p className="text-text-secondary text-lg mt-4">
626
+ API discovery should be free. We're building the infrastructure for agent commerce.
627
+ </p>
412
628
  </div>
413
629
 
414
630
  <div className="grid md:grid-cols-2 gap-8">
415
- {/* For Agents */}
416
- <div className="rounded-2xl bg-surface-elevated border border-border p-8">
417
- <div className="text-sm text-accent font-semibold mb-4">FOR AGENTS & DEVELOPERS</div>
418
- <h3 className="text-2xl font-bold mb-2">Always Free</h3>
419
- <p className="text-text-secondary mb-6">Discover and connect to 1,400+ APIs</p>
420
- <div className="text-4xl font-bold mb-6">
421
- $0<span className="text-lg text-text-muted font-normal"> forever</span>
631
+ {/* Free tier */}
632
+ <div className="rounded-2xl bg-surface-elevated border-2 border-accent p-8 relative glow">
633
+ <div className="absolute -top-3 left-1/2 -translate-x-1/2 px-4 py-1 bg-accent text-white text-xs font-bold tracking-wide rounded-full uppercase">
634
+ Available Now
422
635
  </div>
423
- <ul className="space-y-3 mb-8">
636
+ <h3 className="text-2xl font-bold mb-2">Discovery</h3>
637
+ <p className="text-text-secondary mb-6">Full API discovery and evaluation</p>
638
+ <div className="text-5xl font-black mb-6">
639
+ $0<span className="text-lg text-text-muted font-normal">/forever</span>
640
+ </div>
641
+ <ul className="space-y-4 mb-8">
424
642
  <li className="flex items-center gap-3 text-text-secondary">
425
643
  <Check className="w-5 h-5 text-accent flex-shrink-0" />
426
- Full API discovery
644
+ Search {statsData.apiCount.toLocaleString()}+ APIs by capability
427
645
  </li>
428
646
  <li className="flex items-center gap-3 text-text-secondary">
429
647
  <Check className="w-5 h-5 text-accent flex-shrink-0" />
430
- MCP integration
648
+ Full pricing & feature comparison
649
+ </li>
650
+ <li className="flex items-center gap-3 text-text-secondary">
651
+ <Check className="w-5 h-5 text-accent flex-shrink-0" />
652
+ Structured JSON responses
431
653
  </li>
432
654
  <li className="flex items-center gap-3 text-text-secondary">
433
655
  <Check className="w-5 h-5 text-accent flex-shrink-0" />
434
- Pricing & capability comparison
656
+ MCP integration
435
657
  </li>
436
658
  <li className="flex items-center gap-3 text-text-secondary">
437
659
  <Check className="w-5 h-5 text-accent flex-shrink-0" />
438
- Community support
660
+ Unlimited queries
439
661
  </li>
440
662
  </ul>
441
- <a
442
- href="https://github.com/nordsym/apiclaw#installation"
443
- target="_blank"
444
- rel="noopener noreferrer"
445
- className="btn-secondary w-full justify-center"
446
- >
447
- Get started free
663
+ <a href="https://github.com/nordsym/apiclaw" className="btn-primary w-full justify-center">
664
+ Get Started Free
448
665
  </a>
449
666
  </div>
450
667
 
451
- {/* For API Providers - two sub-tiers */}
452
- <div className="space-y-4">
453
- <div className="text-sm text-accent font-semibold mb-2">FOR API PROVIDERS</div>
454
-
455
- {/* Basic */}
456
- <div className="rounded-xl bg-surface border border-border p-6">
457
- <div className="flex items-center justify-between mb-3">
458
- <h3 className="text-lg font-semibold">Basic Listing</h3>
459
- <span className="text-text-muted font-bold">Free</span>
460
- </div>
461
- <p className="text-text-secondary text-sm mb-4">We index public APIs automatically</p>
462
- <ul className="space-y-2 text-sm">
463
- <li className="flex items-center gap-2 text-text-secondary">
464
- <Check className="w-4 h-4 text-accent flex-shrink-0" />
465
- Included in discovery
466
- </li>
467
- <li className="flex items-center gap-2 text-text-secondary">
468
- <Check className="w-4 h-4 text-accent flex-shrink-0" />
469
- Basic API info
470
- </li>
471
- </ul>
668
+ {/* Coming soon tier */}
669
+ <div className="rounded-2xl bg-surface-elevated border border-border p-8 relative">
670
+ <div className="absolute -top-3 left-1/2 -translate-x-1/2 px-4 py-1 bg-surface border border-border text-text-muted text-xs font-bold tracking-wide rounded-full uppercase">
671
+ Coming Q2 2026
472
672
  </div>
473
-
474
- {/* Partner */}
475
- <div className="rounded-xl bg-surface-elevated border border-accent/50 p-6 relative glow">
476
- <div className="absolute -top-2 right-4 px-2 py-0.5 bg-accent text-background text-xs font-bold tracking-wide rounded-full uppercase">
477
- Partner
478
- </div>
479
- <div className="flex items-center justify-between mb-3">
480
- <h3 className="text-lg font-semibold">Partner Listing</h3>
481
- <span className="text-accent font-bold">5% rev share</span>
482
- </div>
483
- <p className="text-text-secondary text-sm mb-4">Active partnership with premium benefits</p>
484
- <ul className="space-y-2 text-sm mb-4">
485
- <li className="flex items-center gap-2 text-text-secondary">
486
- <Check className="w-4 h-4 text-accent flex-shrink-0" />
487
- Verified badge ✓
488
- </li>
489
- <li className="flex items-center gap-2 text-text-secondary">
490
- <Check className="w-4 h-4 text-accent flex-shrink-0" />
491
- Priority placement
492
- </li>
493
- <li className="flex items-center gap-2 text-text-secondary">
494
- <Check className="w-4 h-4 text-accent flex-shrink-0" />
495
- Usage analytics
496
- </li>
497
- <li className="flex items-center gap-2 text-text-secondary">
498
- <Plus className="w-4 h-4 text-accent flex-shrink-0" />
499
- More benefits coming
500
- </li>
501
- </ul>
502
- <a
503
- href="https://github.com/nordsym/apiclaw/issues/new?template=add-api.yml"
504
- target="_blank"
505
- rel="noopener noreferrer"
506
- className="btn-primary w-full justify-center text-sm"
507
- >
508
- Become a Partner
509
- </a>
673
+ <h3 className="text-2xl font-bold mb-2">Provisioning</h3>
674
+ <p className="text-text-secondary mb-6">Agent-native credential management</p>
675
+ <div className="text-5xl font-black mb-6 text-text-muted">
676
+ TBD
510
677
  </div>
678
+ <ul className="space-y-4 mb-8">
679
+ <li className="flex items-center gap-3 text-text-muted">
680
+ <Check className="w-5 h-5 flex-shrink-0" />
681
+ OAuth broker for major APIs
682
+ </li>
683
+ <li className="flex items-center gap-3 text-text-muted">
684
+ <Check className="w-5 h-5 flex-shrink-0" />
685
+ Instant API key provisioning
686
+ </li>
687
+ <li className="flex items-center gap-3 text-text-muted">
688
+ <Check className="w-5 h-5 flex-shrink-0" />
689
+ Usage tracking & analytics
690
+ </li>
691
+ <li className="flex items-center gap-3 text-text-muted">
692
+ <Check className="w-5 h-5 flex-shrink-0" />
693
+ Agent-native payments
694
+ </li>
695
+ <li className="flex items-center gap-3 text-text-muted">
696
+ <Check className="w-5 h-5 flex-shrink-0" />
697
+ Unified billing
698
+ </li>
699
+ </ul>
700
+ <button className="btn-secondary w-full justify-center opacity-50 cursor-not-allowed" disabled>
701
+ Join Waitlist
702
+ </button>
511
703
  </div>
512
704
  </div>
513
-
514
- {/* Bottom note */}
515
- <div className="text-center mt-12 text-text-muted">
516
- <p>We index the web. Partners get premium. 🦞</p>
517
- </div>
518
- </div>
519
- </section>
520
-
521
- <div className="divider" />
522
-
523
- {/* FAQ */}
524
- <section id="faq" className="py-24 px-6">
525
- <div className="max-w-3xl mx-auto">
526
- <div className="text-center mb-16">
527
- <span className="section-label">FAQ</span>
528
- <h2 className="text-3xl md:text-4xl font-bold mt-4 tracking-tight">Questions & Answers</h2>
529
- </div>
530
-
531
- <div className="space-y-6">
532
- {[
533
- {
534
- q: "What is APIClaw?",
535
- a: "APIClaw is an API marketplace built for autonomous agents. Instead of humans browsing documentation, agents discover and evaluate APIs programmatically via MCP (Model Context Protocol)."
536
- },
537
- {
538
- q: "Is it free?",
539
- a: "Yes! Discovery is completely free for agents and developers. API providers who want premium placement pay a 5% revenue share."
540
- },
541
- {
542
- q: "How do I add APIClaw to my agent?",
543
- a: "Install the MCP server with 'npx @nordsym/apiclaw init' and add it to your Claude config. Your agent can then discover APIs by capability, not by name."
544
- },
545
- {
546
- q: "What APIs are available?",
547
- a: "We index 1,400+ public APIs across 52 categories including SMS, Email, Search, LLM, TTS, Payments, Weather, and more. The registry grows daily."
548
- },
549
- {
550
- q: "How do I list my API?",
551
- a: "Submit a PR to our GitHub repo or use the 'List Your API' form below. Basic listings are free. Partner listings with premium placement are 5% revenue share."
552
- },
553
- {
554
- q: "Is this related to OpenClaw?",
555
- a: "APIClaw is part of the OpenClaw universe and built with MCP compatibility in mind. Think of it as specialized infrastructure for the agentic era."
556
- },
557
- ].map((faq, i) => (
558
- <div key={i} className="rounded-xl bg-surface-elevated border border-border p-6">
559
- <h3 className="font-semibold text-lg mb-2">{faq.q}</h3>
560
- <p className="text-text-secondary">{faq.a}</p>
561
- </div>
562
- ))}
563
- </div>
564
705
  </div>
565
706
  </section>
566
707
 
567
- <div className="divider" />
568
-
569
- {/* Stay in the Loop */}
570
- <section className="py-24 px-6">
571
- <div className="max-w-xl mx-auto text-center">
572
- <span className="section-label">NEWSLETTER</span>
573
- <h2 className="text-3xl md:text-4xl font-bold mt-4 mb-4 tracking-tight">Stay in the Loop</h2>
574
- <p className="text-text-secondary mb-8">
575
- Get updates on new features, integrations, and lobster wisdom. No spam, unsubscribe anytime.
576
- </p>
577
-
578
- <form className="flex flex-col sm:flex-row gap-3" onSubmit={(e) => e.preventDefault()}>
579
- <input
580
- type="email"
581
- placeholder="you@company.com"
582
- className="flex-1 px-4 py-3 rounded-xl text-text-primary"
583
- />
584
- <button type="submit" className="btn-primary flex-shrink-0 justify-center">
585
- <Sparkles className="w-4 h-4" />
586
- Subscribe
587
- </button>
588
- </form>
589
-
590
- <p className="text-text-muted text-sm mt-4">
591
- No spam. Unsubscribe anytime.
592
- </p>
593
- </div>
594
- </section>
595
-
596
- {/* List Your API */}
597
- <section className="py-24 px-6">
598
- <div className="max-w-2xl mx-auto text-center">
599
- <div className="w-16 h-16 rounded-2xl bg-accent/10 flex items-center justify-center mx-auto mb-6">
600
- <Plus className="w-8 h-8 text-accent" />
601
- </div>
602
- <span className="section-label">FOR API PROVIDERS</span>
603
- <h2 className="text-3xl md:text-4xl font-bold mt-4 mb-4 tracking-tight">List Your API</h2>
604
- <p className="text-text-secondary text-lg mb-8">
605
- Are you an API provider? Get your API in front of thousands of AI agents.
606
- Join the marketplace where agents discover and purchase API access autonomously.
607
- </p>
608
- <a
609
- href="https://github.com/nordsym/apiclaw/issues/new?template=add-api.yml"
610
- target="_blank"
611
- rel="noopener noreferrer"
612
- className="btn-primary inline-flex"
613
- >
614
- Submit your API
615
- <ArrowRight className="w-4 h-4" />
616
- </a>
617
- <p className="text-text-muted text-sm mt-6">
618
- Free to list. We review submissions within 48 hours.
619
- </p>
620
- </div>
621
- </section>
622
-
623
- <div className="divider" />
624
-
625
708
  {/* CTA */}
626
- <section className="py-24 px-6 bg-surface/30">
627
- <div className="max-w-2xl mx-auto text-center">
628
- <h2 className="text-3xl md:text-4xl font-bold mb-6 tracking-tight">Ready to go agent-native?</h2>
629
- <p className="text-text-secondary text-lg mb-8">
630
- Join the waitlist for early access and shape the future of agent commerce.
631
- </p>
632
- <div className="flex flex-col sm:flex-row items-center justify-center gap-4">
633
- <a
634
- href="https://github.com/nordsym/apiclaw"
635
- target="_blank"
636
- rel="noopener noreferrer"
637
- className="btn-primary"
638
- >
639
- <Github className="w-5 h-5" />
640
- Star on GitHub
641
- </a>
642
- <button className="btn-secondary">
643
- Join waitlist
644
- <ArrowRight className="w-4 h-4" />
645
- </button>
709
+ <section id="contact" className="py-24 px-6">
710
+ <div className="max-w-3xl mx-auto">
711
+ <div className="gradient-border p-12 text-center">
712
+ <div className="w-20 h-20 rounded-2xl bg-accent/20 flex items-center justify-center text-4xl mx-auto mb-6 logo-float">
713
+ 🦞
714
+ </div>
715
+ <h2 className="text-3xl md:text-4xl font-bold mb-4 tracking-tight">
716
+ Ready to go agent-native?
717
+ </h2>
718
+ <p className="text-text-secondary text-lg mb-8 max-w-lg mx-auto">
719
+ Join thousands of agents already discovering APIs through APIClaw.
720
+ Get started in under a minute.
721
+ </p>
722
+ <div className="flex flex-col sm:flex-row items-center justify-center gap-4">
723
+ <a
724
+ href="https://github.com/nordsym/apiclaw"
725
+ target="_blank"
726
+ rel="noopener noreferrer"
727
+ className="btn-primary"
728
+ >
729
+ <Terminal className="w-5 h-5" />
730
+ npx @nordsym/apiclaw
731
+ </a>
732
+ <a
733
+ href="https://github.com/nordsym/apiclaw"
734
+ target="_blank"
735
+ rel="noopener noreferrer"
736
+ className="btn-secondary"
737
+ >
738
+ <Star className="w-5 h-5" />
739
+ Star on GitHub
740
+ </a>
741
+ </div>
646
742
  </div>
647
743
  </div>
648
744
  </section>
649
745
 
650
746
  {/* Footer */}
651
- <footer className="border-t border-border py-16 px-6">
747
+ <footer className="border-t border-border py-16 px-6 bg-surface/30">
652
748
  <div className="max-w-6xl mx-auto">
653
749
  <div className="grid md:grid-cols-4 gap-12 mb-12">
654
750
  {/* Brand */}
655
751
  <div className="md:col-span-2">
656
752
  <div className="flex items-center gap-3 mb-4">
657
- <div className="w-9 h-9 rounded-xl bg-accent/20 flex items-center justify-center">
658
- <span className="text-xl">🦞</span>
753
+ <div className="w-10 h-10 rounded-xl bg-accent/20 flex items-center justify-center text-2xl">
754
+ 🦞
659
755
  </div>
660
- <span className="font-bold text-lg tracking-tight">APIClaw</span>
756
+ <span className="font-bold text-xl tracking-tight">APIClaw</span>
661
757
  </div>
662
- <p className="text-text-muted mb-6 max-w-sm">
663
- The API marketplace built for autonomous agents. Discover, evaluate, and purchase—all without human intervention.
758
+ <p className="text-text-muted mb-6 max-w-sm leading-relaxed">
759
+ The API discovery layer for autonomous agents.
760
+ Find, evaluate, and integrate APIs in milliseconds.
664
761
  </p>
665
- <div className="flex items-center gap-4">
762
+ <div className="flex items-center gap-3">
666
763
  <a
667
764
  href="https://github.com/nordsym/apiclaw"
668
765
  target="_blank"
669
766
  rel="noopener noreferrer"
670
- className="w-10 h-10 rounded-lg bg-surface-elevated border border-border flex items-center justify-center text-text-muted hover:text-text-primary hover:border-accent/50 transition"
767
+ className="w-10 h-10 rounded-lg bg-surface-elevated border border-border flex items-center justify-center text-text-muted hover:text-text-primary hover:border-accent transition"
671
768
  >
672
769
  <Github className="w-5 h-5" />
673
770
  </a>
@@ -675,7 +772,7 @@ export default function Home() {
675
772
  href="https://twitter.com/nordsym"
676
773
  target="_blank"
677
774
  rel="noopener noreferrer"
678
- className="w-10 h-10 rounded-lg bg-surface-elevated border border-border flex items-center justify-center text-text-muted hover:text-text-primary hover:border-accent/50 transition"
775
+ className="w-10 h-10 rounded-lg bg-surface-elevated border border-border flex items-center justify-center text-text-muted hover:text-text-primary hover:border-accent transition"
679
776
  >
680
777
  <Twitter className="w-5 h-5" />
681
778
  </a>
@@ -686,9 +783,11 @@ export default function Home() {
686
783
  <div>
687
784
  <h4 className="font-semibold mb-4">Product</h4>
688
785
  <ul className="space-y-3 text-text-muted">
689
- <li><a href="#features" className="hover:text-text-primary transition">Features</a></li>
786
+ <li><a href="#how-it-works" className="hover:text-text-primary transition">How It Works</a></li>
787
+ <li><a href="#for-agents" className="hover:text-text-primary transition">For Agents</a></li>
788
+ <li><a href="#for-providers" className="hover:text-text-primary transition">For Providers</a></li>
789
+ <li><a href="/providers/dashboard" className="hover:text-text-primary transition">Provider Dashboard</a></li>
690
790
  <li><a href="#pricing" className="hover:text-text-primary transition">Pricing</a></li>
691
- <li><a href="#apis" className="hover:text-text-primary transition">API Catalog</a></li>
692
791
  <li><a href="https://github.com/nordsym/apiclaw#installation" target="_blank" rel="noopener noreferrer" className="hover:text-text-primary transition">Documentation</a></li>
693
792
  </ul>
694
793
  </div>
@@ -696,58 +795,47 @@ export default function Home() {
696
795
  <div>
697
796
  <h4 className="font-semibold mb-4">Company</h4>
698
797
  <ul className="space-y-3 text-text-muted">
699
- <li><a href="https://nordsym.se" target="_blank" rel="noopener noreferrer" className="hover:text-text-primary transition">NordSym</a></li>
798
+ <li><a href="https://nordsym.com" target="_blank" rel="noopener noreferrer" className="hover:text-text-primary transition">NordSym</a></li>
700
799
  <li><a href="https://github.com/nordsym" target="_blank" rel="noopener noreferrer" className="hover:text-text-primary transition">GitHub</a></li>
701
- <li><a href="https://twitter.com/nordsym" target="_blank" rel="noopener noreferrer" className="hover:text-text-primary transition">Twitter</a></li>
800
+ <li><a href="https://twitter.com/nordsym" target="_blank" rel="noopener noreferrer" className="hover:text-text-primary transition">Twitter / X</a></li>
702
801
  </ul>
703
802
  </div>
704
803
  </div>
705
804
 
706
- {/* OpenClaw-style footer links */}
707
- <div className="pt-8 border-t border-border text-center">
708
- <div className="flex items-center justify-center gap-2 text-sm text-text-muted mb-4">
709
- <a href="https://github.com/nordsym/apiclaw" className="hover:text-text-primary transition">GitHub</a>
710
- <span>·</span>
711
- <a href="https://github.com/nordsym/apiclaw#installation" className="hover:text-text-primary transition">Docs</a>
712
- <span>·</span>
713
- <a href="https://x.com/HokusPontuz" className="hover:text-text-primary transition">@HokusPontuz</a>
714
- <span>·</span>
715
- <a href="https://x.com/NordSym" className="hover:text-text-primary transition">@NordSym</a>
716
- <span>·</span>
717
- <a href="https://nordsym.com" className="hover:text-text-primary transition">NordSym</a>
718
- </div>
719
- <p className="text-text-muted text-sm mb-2">
720
- Made with 🦞 and unreasonable amounts of ambition.
721
- </p>
722
- <p className="text-text-muted text-xs">
723
- Part of the OpenClaw universe. Independent project.
805
+ <div className="pt-8 border-t border-border flex flex-col md:flex-row items-center justify-between gap-4">
806
+ <p className="text-text-muted text-sm">
807
+ © 2026 NordSym. Building infrastructure for agent commerce.
724
808
  </p>
809
+ <div className="flex items-center gap-4">
810
+ <div className="badge">
811
+ <Shield className="w-3 h-3" />
812
+ MCP Compatible
813
+ </div>
814
+ <div className="badge badge-live">
815
+ Live
816
+ </div>
817
+ </div>
725
818
  </div>
726
819
  </div>
727
820
  </footer>
728
821
 
729
- {/* Floating Chat Button */}
822
+ {/* Telegram Chat Bubble */}
730
823
  <a
731
824
  href="https://t.me/SymbotAPI_bot"
732
825
  target="_blank"
733
826
  rel="noopener noreferrer"
734
- className="fixed bottom-6 right-6 z-50 group flex items-center gap-3"
827
+ className="fixed bottom-6 right-6 z-50 group"
735
828
  >
736
- {/* Label - always visible */}
737
- <div className="bg-surface-elevated border border-border rounded-xl px-4 py-2 shadow-lg">
738
- <div className="font-medium text-sm">Talk to Symbot</div>
739
- <div className="text-text-muted text-xs">The AI building this — on Telegram</div>
829
+ <div className="flex items-center gap-2 bg-[#0088cc] hover:bg-[#0077b5] text-white px-4 py-3 rounded-full shadow-lg transition-all duration-300 hover:scale-105 hover:shadow-xl">
830
+ <span className="text-xl">🦞</span>
831
+ <span className="font-medium text-sm hidden sm:inline">Chat with the bot</span>
740
832
  </div>
741
- {/* Button */}
742
- <div className="relative">
743
- <div className="w-14 h-14 rounded-full bg-accent text-background flex items-center justify-center shadow-lg group-hover:scale-110 transition-transform cursor-pointer">
744
- <span className="text-2xl">🦞</span>
745
- </div>
746
- {/* Pulse */}
747
- <div className="absolute inset-0 rounded-full bg-accent animate-ping opacity-20"></div>
833
+ <div className="absolute bottom-full right-0 mb-2 px-3 py-2 bg-surface-elevated border border-border rounded-lg text-xs text-text-muted whitespace-nowrap opacity-0 group-hover:opacity-100 transition-opacity pointer-events-none shadow-lg">
834
+ Talk to the AI that builds APIClaw
835
+ <br />
836
+ <span className="text-text-primary">Opens in Telegram</span>
748
837
  </div>
749
838
  </a>
750
-
751
839
  </main>
752
840
  );
753
841
  }