@nordsym/apiclaw 1.0.0 → 1.1.1

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 (161) hide show
  1. package/AGENTS.md +74 -0
  2. package/HEARTBEAT.md +4 -0
  3. package/IDENTITY.md +22 -0
  4. package/README.md +193 -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 +12 -6
  10. package/convex/analytics.ts +90 -0
  11. package/convex/credits.ts +211 -0
  12. package/convex/http.ts +578 -0
  13. package/convex/providers.ts +516 -0
  14. package/convex/purchases.ts +183 -0
  15. package/convex/ratelimit.ts +104 -0
  16. package/convex/schema.ts +220 -0
  17. package/convex/telemetry.ts +81 -0
  18. package/convex.json +3 -0
  19. package/dist/credentials.d.ts +19 -0
  20. package/dist/credentials.d.ts.map +1 -0
  21. package/dist/credentials.js +158 -0
  22. package/dist/credentials.js.map +1 -0
  23. package/dist/credits.d.ts +14 -11
  24. package/dist/credits.d.ts.map +1 -1
  25. package/dist/credits.js +151 -99
  26. package/dist/credits.js.map +1 -1
  27. package/dist/discovery.d.ts +7 -16
  28. package/dist/discovery.d.ts.map +1 -1
  29. package/dist/discovery.js +33 -40
  30. package/dist/discovery.js.map +1 -1
  31. package/dist/execute.d.ts +19 -0
  32. package/dist/execute.d.ts.map +1 -0
  33. package/dist/execute.js +285 -0
  34. package/dist/execute.js.map +1 -0
  35. package/dist/index.js +175 -31
  36. package/dist/index.js.map +1 -1
  37. package/dist/proxy.d.ts +6 -0
  38. package/dist/proxy.d.ts.map +1 -0
  39. package/dist/proxy.js +19 -0
  40. package/dist/proxy.js.map +1 -0
  41. package/dist/registry/apis.json +95362 -202
  42. package/dist/registry/apis_expanded.json +100853 -0
  43. package/dist/stripe.d.ts +68 -0
  44. package/dist/stripe.d.ts.map +1 -0
  45. package/dist/stripe.js +196 -0
  46. package/dist/stripe.js.map +1 -0
  47. package/dist/telemetry.d.ts +28 -0
  48. package/dist/telemetry.d.ts.map +1 -0
  49. package/dist/telemetry.js +50 -0
  50. package/dist/telemetry.js.map +1 -0
  51. package/dist/test.d.ts +3 -2
  52. package/dist/test.d.ts.map +1 -1
  53. package/dist/test.js +105 -75
  54. package/dist/test.js.map +1 -1
  55. package/dist/types.d.ts +0 -28
  56. package/dist/types.d.ts.map +1 -1
  57. package/dist/webhook.d.ts +2 -0
  58. package/dist/webhook.d.ts.map +1 -0
  59. package/dist/webhook.js +90 -0
  60. package/dist/webhook.js.map +1 -0
  61. package/landing/DESIGN.md +343 -0
  62. package/landing/package-lock.json +1196 -7
  63. package/landing/package.json +5 -1
  64. package/landing/public/android-chrome-192x192.png +0 -0
  65. package/landing/public/android-chrome-512x512.png +0 -0
  66. package/landing/public/apple-touch-icon.png +0 -0
  67. package/landing/public/demo.gif +0 -0
  68. package/landing/public/demo.mp4 +0 -0
  69. package/landing/public/favicon-16x16.png +0 -0
  70. package/landing/public/favicon-32x32.png +0 -0
  71. package/landing/public/favicon.ico +0 -0
  72. package/landing/public/favicon.svg +3 -0
  73. package/landing/public/icon.svg +47 -0
  74. package/landing/public/logo-mono.svg +37 -0
  75. package/landing/public/logo-simple.svg +45 -0
  76. package/landing/public/logo.svg +84 -0
  77. package/landing/public/og-template.html +184 -0
  78. package/landing/public/site.webmanifest +31 -0
  79. package/landing/scripts/generate-assets.js +284 -0
  80. package/landing/scripts/generate-pngs.js +48 -0
  81. package/landing/scripts/generate-stats.js +42 -0
  82. package/landing/src/app/admin/page.tsx +348 -0
  83. package/landing/src/app/api/auth/magic-link/route.ts +73 -0
  84. package/landing/src/app/api/auth/session/route.ts +38 -0
  85. package/landing/src/app/api/auth/verify/route.ts +43 -0
  86. package/landing/src/app/api/og/route.tsx +84 -0
  87. package/landing/src/app/globals.css +439 -100
  88. package/landing/src/app/layout.tsx +37 -7
  89. package/landing/src/app/page.tsx +627 -552
  90. package/landing/src/app/providers/dashboard/login/page.tsx +176 -0
  91. package/landing/src/app/providers/dashboard/page.tsx +589 -0
  92. package/landing/src/app/providers/dashboard/verify/page.tsx +106 -0
  93. package/landing/src/app/providers/layout.tsx +14 -0
  94. package/landing/src/app/providers/page.tsx +402 -0
  95. package/landing/src/app/providers/register/page.tsx +670 -0
  96. package/landing/src/components/ProviderDashboard.tsx +794 -0
  97. package/landing/src/hooks/useDashboardData.ts +99 -0
  98. package/landing/src/lib/apis.json +116054 -0
  99. package/landing/src/lib/convex-client.ts +106 -0
  100. package/landing/src/lib/mock-data.ts +285 -0
  101. package/landing/src/lib/stats.json +6 -0
  102. package/landing/tailwind.config.ts +12 -11
  103. package/landing/tsconfig.tsbuildinfo +1 -0
  104. package/package.json +21 -20
  105. package/scripts/SYMBOT-FIX.md +238 -0
  106. package/scripts/demo-simulation.py +177 -0
  107. package/scripts/expand-more.py +502 -0
  108. package/scripts/expand-registry.py +434 -0
  109. package/scripts/history-sanitizer.ts +272 -0
  110. package/scripts/mass-scrape.py +1308 -0
  111. package/scripts/sync-and-deploy.sh +36 -0
  112. package/src/credentials.ts +177 -0
  113. package/src/credits.ts +190 -122
  114. package/src/discovery.ts +45 -58
  115. package/src/execute.ts +350 -0
  116. package/src/index.ts +184 -32
  117. package/src/proxy.ts +24 -0
  118. package/src/registry/apis.json +95362 -202
  119. package/src/registry/apis_expanded.json +100853 -0
  120. package/src/stripe.ts +243 -0
  121. package/src/telemetry.ts +71 -0
  122. package/src/test.ts +127 -89
  123. package/src/types.ts +0 -34
  124. package/src/webhook.ts +107 -0
  125. package/.github/ISSUE_TEMPLATE/add-api.yml +0 -123
  126. package/BRIEFING.md +0 -30
  127. package/backend/convex/apiKeys.ts +0 -75
  128. package/backend/convex/purchases.ts +0 -74
  129. package/backend/convex/schema.ts +0 -45
  130. package/backend/convex/transactions.ts +0 -57
  131. package/backend/convex/users.ts +0 -94
  132. package/backend/package-lock.json +0 -521
  133. package/backend/package.json +0 -15
  134. package/dist/registry/parse_apis.py +0 -146
  135. package/dist/revenuecat.d.ts +0 -61
  136. package/dist/revenuecat.d.ts.map +0 -1
  137. package/dist/revenuecat.js +0 -166
  138. package/dist/revenuecat.js.map +0 -1
  139. package/dist/webhooks/revenuecat.d.ts +0 -48
  140. package/dist/webhooks/revenuecat.d.ts.map +0 -1
  141. package/dist/webhooks/revenuecat.js +0 -119
  142. package/dist/webhooks/revenuecat.js.map +0 -1
  143. package/docs/revenuecat-setup.md +0 -89
  144. package/landing/src/app/api/keys/route.ts +0 -71
  145. package/landing/src/app/api/log/route.ts +0 -37
  146. package/landing/src/app/api/stats/route.ts +0 -37
  147. package/landing/src/app/page.tsx.bak +0 -567
  148. package/landing/src/components/AddKeyModal.tsx +0 -159
  149. package/newsletter-template.html +0 -71
  150. package/outreach/OUTREACH-SYSTEM.md +0 -211
  151. package/outreach/email-template.html +0 -179
  152. package/outreach/targets.md +0 -133
  153. package/src/registry/parse_apis.py +0 -146
  154. package/src/revenuecat.ts +0 -239
  155. package/src/webhooks/revenuecat.ts +0 -187
  156. /package/{backend/convex → convex}/README.md +0 -0
  157. /package/{backend/convex → convex}/_generated/api.js +0 -0
  158. /package/{backend/convex → convex}/_generated/dataModel.d.ts +0 -0
  159. /package/{backend/convex → convex}/_generated/server.d.ts +0 -0
  160. /package/{backend/convex → convex}/_generated/server.js +0 -0
  161. /package/{backend/convex → convex}/tsconfig.json +0 -0
@@ -1,258 +1,431 @@
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>
281
+ </div>
282
+ </header>
283
+
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 AI 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
+ </div>
205
335
 
206
- <p className="text-sm text-text-muted">
207
- Apps are dead. API-first. Agent-native.
208
- </p>
336
+ {/* Right: Terminal */}
337
+ <div className="relative">
338
+ <div className="terminal glow" ref={terminalRef}>
339
+ <div className="terminal-header">
340
+ <div className="terminal-dot terminal-dot-red" />
341
+ <div className="terminal-dot terminal-dot-yellow" />
342
+ <div className="terminal-dot terminal-dot-green" />
343
+ <span className="terminal-title">apiclaw — zsh</span>
344
+ </div>
345
+ <div className="terminal-body">
346
+ {terminalOutput.map((line, i) => (
347
+ <div key={i} className={`${line.text ? 'mb-1' : 'mb-2'}`}>
348
+ {line.type === 'prompt' && (
349
+ <>
350
+ <span className="terminal-prompt">$ </span>
351
+ <span className="terminal-command">{line.text}</span>
352
+ </>
353
+ )}
354
+ {line.type === 'output' && (
355
+ <span className="terminal-output">{line.text}</span>
356
+ )}
357
+ {line.type === 'success' && (
358
+ <span className="terminal-success">{line.text}</span>
359
+ )}
360
+ {line.type === 'accent' && (
361
+ <span className="terminal-accent">{line.text}</span>
362
+ )}
363
+ </div>
364
+ ))}
365
+ {isTyping && <span className="typing-cursor" />}
366
+ </div>
367
+ </div>
368
+
369
+ {/* Auto-loops - no replay button needed */}
370
+ </div>
371
+ </div>
209
372
  </div>
210
373
  </section>
211
374
 
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>
224
- </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>
229
- </div>
375
+ {/* Stats */}
376
+ <section className="py-16 px-6 bg-surface/50">
377
+ <div className="max-w-5xl mx-auto">
378
+ <div className="grid grid-cols-2 md:grid-cols-4 gap-6">
379
+ {stats.map((stat, i) => (
380
+ <div key={i} className="stat-card relative">
381
+ {stat.live && (
382
+ <div className="absolute top-2 right-2 flex items-center gap-1">
383
+ <span className="w-2 h-2 bg-green-500 rounded-full animate-pulse" />
384
+ <span className="text-[10px] text-green-500 font-medium">LIVE</span>
385
+ </div>
386
+ )}
387
+ <div className="stat-number">{stat.number}</div>
388
+ <div className="stat-label">{stat.label}</div>
389
+ </div>
390
+ ))}
230
391
  </div>
231
392
  </div>
232
393
  </section>
233
394
 
234
395
  <div className="divider" />
235
396
 
236
- {/* What People Say */}
237
- <section className="py-24 px-6">
397
+ {/* How It Works */}
398
+ <section id="how-it-works" className="py-24 px-6">
238
399
  <div className="max-w-6xl mx-auto">
239
400
  <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>
401
+ <span className="section-label">HOW IT WORKS</span>
402
+ <h2 className="text-3xl md:text-5xl font-bold mt-4 tracking-tight">
403
+ Three steps. That's it.
404
+ </h2>
405
+ <p className="text-text-secondary text-lg mt-4 max-w-2xl mx-auto">
406
+ Your agent asks for a capability, APIClaw finds the best API,
407
+ and returns everything needed to integrate.
408
+ </p>
242
409
  </div>
243
410
 
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>
411
+ <div className="grid md:grid-cols-3 gap-8">
412
+ {howItWorks.map((step, i) => (
413
+ <div key={i} className="feature-card">
414
+ <div className="flex items-center gap-4 mb-6">
415
+ <div className="step-indicator">{step.step}</div>
253
416
  <div>
254
- <p className="font-medium text-sm">{t.author}</p>
255
- <p className="text-text-muted text-sm">{t.handle}</p>
417
+ <h3 className="font-bold text-xl">{step.title}</h3>
418
+ </div>
419
+ </div>
420
+ <p className="text-text-secondary mb-6 leading-relaxed">
421
+ {step.description}
422
+ </p>
423
+ <div className="code-preview">
424
+ <div className="code-preview-header">
425
+ example.ts
426
+ </div>
427
+ <div className="code-preview-body">
428
+ <pre className="text-sm whitespace-pre-wrap">{step.codeJsx}</pre>
256
429
  </div>
257
430
  </div>
258
431
  </div>
@@ -263,411 +436,324 @@ export default function Home() {
263
436
 
264
437
  <div className="divider" />
265
438
 
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>
439
+ {/* For Agents */}
440
+ <section id="for-agents" className="py-24 px-6 bg-surface/30">
441
+ <div className="max-w-6xl mx-auto">
442
+ <div className="grid lg:grid-cols-2 gap-16 items-center">
443
+ <div>
444
+ <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">
445
+ <Bot className="w-4 h-4" />
446
+ For AI Agents
284
447
  </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
448
+
449
+ <h2 className="text-3xl md:text-4xl font-bold tracking-tight mb-6">
450
+ Your agent's API encyclopedia
451
+ </h2>
452
+
453
+ <p className="text-text-secondary text-lg mb-8 leading-relaxed">
454
+ Stop hardcoding API choices. Let your agent discover the best API
455
+ for each task dynamically, with full pricing and capability data.
456
+ </p>
457
+
458
+ <div className="space-y-6 mb-8">
459
+ {agentBenefits.map((benefit, i) => (
460
+ <div key={i} className="flex items-start gap-4">
461
+ <div className="w-10 h-10 rounded-xl bg-accent/10 flex items-center justify-center flex-shrink-0">
462
+ <benefit.icon className="w-5 h-5 text-accent" />
463
+ </div>
464
+ <div>
465
+ <h4 className="font-semibold mb-1">{benefit.title}</h4>
466
+ <p className="text-text-secondary text-sm">{benefit.description}</p>
467
+ </div>
468
+ </div>
469
+ ))}
289
470
  </div>
290
- <div className="mb-4">
291
- <span className="terminal-prompt">$ </span>
292
- <span className="terminal-command">npx @nordsym/apiclaw start</span>
471
+
472
+ <a
473
+ href="https://github.com/nordsym/apiclaw#installation"
474
+ target="_blank"
475
+ rel="noopener noreferrer"
476
+ className="btn-primary inline-flex"
477
+ >
478
+ Start Building
479
+ <ArrowRight className="w-4 h-4" />
480
+ </a>
481
+ </div>
482
+
483
+ <div className="code-preview">
484
+ <div className="code-preview-header">
485
+ agent.ts — Claude Agent Example
293
486
  </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>
487
+ <div className="code-preview-body">
488
+ <pre className="text-sm">
489
+ <span className="text-gray-500">{"// Your agent needs to send a notification"}</span>{"\n"}
490
+ <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"}
491
+ {" "}<span className="text-red-400">capability</span>: <span className="text-green-400">"push_notification"</span>,{"\n"}
492
+ {" "}<span className="text-red-400">platforms</span>: [<span className="text-green-400">"ios"</span>, <span className="text-green-400">"android"</span>],{"\n"}
493
+ {" "}<span className="text-red-400">maxPrice</span>: <span className="text-green-400">"$0.001/msg"</span>{"\n"}
494
+ {"}"});{"\n"}
495
+ {"\n"}
496
+ <span className="text-gray-500">{"// APIClaw returns ranked matches"}</span>{"\n"}
497
+ <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"}
498
+ <span className="text-gray-500">{"// ["}</span>{"\n"}
499
+ <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"}
500
+ <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"}
501
+ <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"}
502
+ <span className="text-gray-500">{"// ]"}</span>{"\n"}
503
+ {"\n"}
504
+ <span className="text-gray-500">{"// Get full spec for the best match"}</span>{"\n"}
505
+ <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"}
506
+ {" "}<span className="text-red-400">action</span>: <span className="text-green-400">"get_spec"</span>,{"\n"}
507
+ {" "}<span className="text-red-400">api</span>: <span className="text-blue-400">result</span>.<span className="text-red-400">bestMatch</span>{"\n"}
508
+ {"}"});{"\n"}
509
+ {"\n"}
510
+ <span className="text-gray-500">{"// spec includes: auth, endpoints, examples, rate limits"}</span>{"\n"}
511
+ <span className="text-gray-500">{"// Your agent can now integrate dynamically! 🚀"}</span>
512
+ </pre>
299
513
  </div>
300
514
  </div>
301
515
  </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
516
  </div>
315
517
  </section>
316
518
 
317
- <div className="divider" />
318
-
319
- {/* Features */}
320
- <section id="features" className="py-24 px-6 bg-surface/30">
519
+ {/* For Providers */}
520
+ <section id="for-providers" className="py-24 px-6">
321
521
  <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>
522
+ <div className="grid lg:grid-cols-2 gap-16 items-center">
523
+ <div className="order-2 lg:order-1">
524
+ <div className="gradient-border p-8">
525
+ <div className="flex items-center gap-4 mb-6">
526
+ <div className="w-16 h-16 rounded-2xl bg-accent/20 flex items-center justify-center text-3xl">
527
+ 🚀
528
+ </div>
529
+ <div>
530
+ <h4 className="font-bold text-lg">Your API</h4>
531
+ <p className="text-text-muted text-sm">Ready for the agentic era</p>
532
+ </div>
533
+ </div>
534
+
535
+ <div className="space-y-4 mb-6">
536
+ <div className="flex items-center gap-3 text-text-secondary">
537
+ <Check className="w-5 h-5 text-accent" />
538
+ <span>{statsData.apiCount.toLocaleString()}+ APIs indexed and growing</span>
539
+ </div>
540
+ <div className="flex items-center gap-3 text-text-secondary">
541
+ <Check className="w-5 h-5 text-accent" />
542
+ <span>Structured for instant integration</span>
543
+ </div>
544
+ <div className="flex items-center gap-3 text-text-secondary">
545
+ <Check className="w-5 h-5 text-accent" />
546
+ <span>Ranked by capability match</span>
547
+ </div>
548
+ <div className="flex items-center gap-3 text-text-secondary">
549
+ <Check className="w-5 h-5 text-accent" />
550
+ <span>Zero ongoing maintenance</span>
551
+ </div>
552
+ </div>
326
553
 
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" />
554
+ <div className="flex items-center justify-between pt-6 border-t border-border">
555
+ <div>
556
+ <p className="font-semibold">Free Listing</p>
557
+ <p className="text-text-muted text-sm">For all API providers</p>
558
+ </div>
559
+ <div className="flex gap-2">
560
+ <a href="/providers/dashboard" className="btn-ghost !py-2.5 !px-4 text-sm">
561
+ Dashboard
562
+ </a>
563
+ <a href="/providers" className="btn-primary !py-2.5 !px-5 text-sm">
564
+ List Your API
565
+ </a>
566
+ </div>
332
567
  </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
568
  </div>
336
- ))}
337
- </div>
338
- </div>
339
- </section>
569
+ </div>
340
570
 
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>
571
+ <div className="order-1 lg:order-2">
572
+ <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">
573
+ <Building2 className="w-4 h-4" />
574
+ For API Providers
575
+ </div>
576
+
577
+ <h2 className="text-3xl md:text-4xl font-bold tracking-tight mb-6">
578
+ Reach the agent economy
579
+ </h2>
580
+
581
+ <p className="text-text-secondary text-lg mb-8 leading-relaxed">
582
+ AI agents are the new developers. They don't browse landing pages—
583
+ they query capabilities. Get your API in front of them.
584
+ </p>
349
585
 
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>
586
+ <div className="space-y-6">
587
+ {providerBenefits.map((benefit, i) => (
588
+ <div key={i} className="flex items-start gap-4">
589
+ <div className="w-10 h-10 rounded-xl bg-accent/10 flex items-center justify-center flex-shrink-0">
590
+ <benefit.icon className="w-5 h-5 text-accent" />
591
+ </div>
592
+ <div>
593
+ <h4 className="font-semibold mb-1">{benefit.title}</h4>
594
+ <p className="text-text-secondary text-sm">{benefit.description}</p>
595
+ </div>
596
+ </div>
597
+ ))}
363
598
  </div>
364
- ))}
599
+ </div>
365
600
  </div>
366
601
  </div>
367
602
  </section>
368
603
 
369
604
  <div className="divider" />
370
605
 
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
606
  {/* Pricing */}
406
- <section id="pricing" className="py-24 px-6">
407
- <div className="max-w-5xl mx-auto">
607
+ <section id="pricing" className="py-24 px-6 bg-surface/30">
608
+ <div className="max-w-4xl mx-auto">
408
609
  <div className="text-center mb-16">
409
610
  <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>
611
+ <h2 className="text-3xl md:text-4xl font-bold mt-4 tracking-tight">
612
+ Simple. Free. Forever.
613
+ </h2>
614
+ <p className="text-text-secondary text-lg mt-4">
615
+ API discovery should be free. We're building the infrastructure for agent commerce.
616
+ </p>
412
617
  </div>
413
618
 
414
619
  <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>
620
+ {/* Free tier */}
621
+ <div className="rounded-2xl bg-surface-elevated border-2 border-accent p-8 relative glow">
622
+ <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">
623
+ Available Now
624
+ </div>
625
+ <h3 className="text-2xl font-bold mb-2">Discovery</h3>
626
+ <p className="text-text-secondary mb-6">Full API discovery and evaluation</p>
627
+ <div className="text-5xl font-black mb-6">
628
+ $0<span className="text-lg text-text-muted font-normal">/forever</span>
422
629
  </div>
423
- <ul className="space-y-3 mb-8">
630
+ <ul className="space-y-4 mb-8">
424
631
  <li className="flex items-center gap-3 text-text-secondary">
425
632
  <Check className="w-5 h-5 text-accent flex-shrink-0" />
426
- Full API discovery
633
+ Search {statsData.apiCount.toLocaleString()}+ APIs by capability
427
634
  </li>
428
635
  <li className="flex items-center gap-3 text-text-secondary">
429
636
  <Check className="w-5 h-5 text-accent flex-shrink-0" />
430
- MCP integration
637
+ Full pricing & feature comparison
431
638
  </li>
432
639
  <li className="flex items-center gap-3 text-text-secondary">
433
640
  <Check className="w-5 h-5 text-accent flex-shrink-0" />
434
- Pricing & capability comparison
641
+ Structured JSON responses
435
642
  </li>
436
643
  <li className="flex items-center gap-3 text-text-secondary">
437
644
  <Check className="w-5 h-5 text-accent flex-shrink-0" />
438
- Community support
645
+ MCP integration
646
+ </li>
647
+ <li className="flex items-center gap-3 text-text-secondary">
648
+ <Check className="w-5 h-5 text-accent flex-shrink-0" />
649
+ Unlimited queries
439
650
  </li>
440
651
  </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
652
+ <a href="https://github.com/nordsym/apiclaw" className="btn-primary w-full justify-center">
653
+ Get Started Free
448
654
  </a>
449
655
  </div>
450
656
 
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>
657
+ {/* Coming soon tier */}
658
+ <div className="rounded-2xl bg-surface-elevated border border-border p-8 relative">
659
+ <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">
660
+ Coming Q2 2026
472
661
  </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>
662
+ <h3 className="text-2xl font-bold mb-2">Provisioning</h3>
663
+ <p className="text-text-secondary mb-6">Agent-native credential management</p>
664
+ <div className="text-5xl font-black mb-6 text-text-muted">
665
+ TBD
510
666
  </div>
667
+ <ul className="space-y-4 mb-8">
668
+ <li className="flex items-center gap-3 text-text-muted">
669
+ <Check className="w-5 h-5 flex-shrink-0" />
670
+ OAuth broker for major APIs
671
+ </li>
672
+ <li className="flex items-center gap-3 text-text-muted">
673
+ <Check className="w-5 h-5 flex-shrink-0" />
674
+ Instant API key provisioning
675
+ </li>
676
+ <li className="flex items-center gap-3 text-text-muted">
677
+ <Check className="w-5 h-5 flex-shrink-0" />
678
+ Usage tracking & analytics
679
+ </li>
680
+ <li className="flex items-center gap-3 text-text-muted">
681
+ <Check className="w-5 h-5 flex-shrink-0" />
682
+ Agent-native payments
683
+ </li>
684
+ <li className="flex items-center gap-3 text-text-muted">
685
+ <Check className="w-5 h-5 flex-shrink-0" />
686
+ Unified billing
687
+ </li>
688
+ </ul>
689
+ <button className="btn-secondary w-full justify-center opacity-50 cursor-not-allowed" disabled>
690
+ Join Waitlist
691
+ </button>
511
692
  </div>
512
693
  </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
694
  </div>
565
695
  </section>
566
696
 
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
697
  {/* 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>
698
+ <section id="contact" className="py-24 px-6">
699
+ <div className="max-w-3xl mx-auto">
700
+ <div className="gradient-border p-12 text-center">
701
+ <div className="w-20 h-20 rounded-2xl bg-accent/20 flex items-center justify-center text-4xl mx-auto mb-6 logo-float">
702
+ 🦞
703
+ </div>
704
+ <h2 className="text-3xl md:text-4xl font-bold mb-4 tracking-tight">
705
+ Ready to go agent-native?
706
+ </h2>
707
+ <p className="text-text-secondary text-lg mb-8 max-w-lg mx-auto">
708
+ Join thousands of agents already discovering APIs through APIClaw.
709
+ Get started in under a minute.
710
+ </p>
711
+ <div className="flex flex-col sm:flex-row items-center justify-center gap-4">
712
+ <a
713
+ href="https://github.com/nordsym/apiclaw"
714
+ target="_blank"
715
+ rel="noopener noreferrer"
716
+ className="btn-primary"
717
+ >
718
+ <Terminal className="w-5 h-5" />
719
+ npx @nordsym/apiclaw
720
+ </a>
721
+ <a
722
+ href="https://github.com/nordsym/apiclaw"
723
+ target="_blank"
724
+ rel="noopener noreferrer"
725
+ className="btn-secondary"
726
+ >
727
+ <Star className="w-5 h-5" />
728
+ Star on GitHub
729
+ </a>
730
+ </div>
646
731
  </div>
647
732
  </div>
648
733
  </section>
649
734
 
650
735
  {/* Footer */}
651
- <footer className="border-t border-border py-16 px-6">
736
+ <footer className="border-t border-border py-16 px-6 bg-surface/30">
652
737
  <div className="max-w-6xl mx-auto">
653
738
  <div className="grid md:grid-cols-4 gap-12 mb-12">
654
739
  {/* Brand */}
655
740
  <div className="md:col-span-2">
656
741
  <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>
742
+ <div className="w-10 h-10 rounded-xl bg-accent/20 flex items-center justify-center text-2xl">
743
+ 🦞
659
744
  </div>
660
- <span className="font-bold text-lg tracking-tight">APIClaw</span>
745
+ <span className="font-bold text-xl tracking-tight">APIClaw</span>
661
746
  </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.
747
+ <p className="text-text-muted mb-6 max-w-sm leading-relaxed">
748
+ The API discovery layer for autonomous agents.
749
+ Find, evaluate, and integrate APIs in milliseconds.
664
750
  </p>
665
- <div className="flex items-center gap-4">
751
+ <div className="flex items-center gap-3">
666
752
  <a
667
753
  href="https://github.com/nordsym/apiclaw"
668
754
  target="_blank"
669
755
  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"
756
+ 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
757
  >
672
758
  <Github className="w-5 h-5" />
673
759
  </a>
@@ -675,7 +761,7 @@ export default function Home() {
675
761
  href="https://twitter.com/nordsym"
676
762
  target="_blank"
677
763
  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"
764
+ 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
765
  >
680
766
  <Twitter className="w-5 h-5" />
681
767
  </a>
@@ -686,9 +772,11 @@ export default function Home() {
686
772
  <div>
687
773
  <h4 className="font-semibold mb-4">Product</h4>
688
774
  <ul className="space-y-3 text-text-muted">
689
- <li><a href="#features" className="hover:text-text-primary transition">Features</a></li>
775
+ <li><a href="#how-it-works" className="hover:text-text-primary transition">How It Works</a></li>
776
+ <li><a href="#for-agents" className="hover:text-text-primary transition">For Agents</a></li>
777
+ <li><a href="#for-providers" className="hover:text-text-primary transition">For Providers</a></li>
778
+ <li><a href="/providers/dashboard" className="hover:text-text-primary transition">Provider Dashboard</a></li>
690
779
  <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
780
  <li><a href="https://github.com/nordsym/apiclaw#installation" target="_blank" rel="noopener noreferrer" className="hover:text-text-primary transition">Documentation</a></li>
693
781
  </ul>
694
782
  </div>
@@ -696,58 +784,45 @@ export default function Home() {
696
784
  <div>
697
785
  <h4 className="font-semibold mb-4">Company</h4>
698
786
  <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>
787
+ <li><a href="https://nordsym.com" target="_blank" rel="noopener noreferrer" className="hover:text-text-primary transition">NordSym</a></li>
700
788
  <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>
789
+ <li><a href="https://twitter.com/nordsym" target="_blank" rel="noopener noreferrer" className="hover:text-text-primary transition">Twitter / X</a></li>
702
790
  </ul>
703
791
  </div>
704
792
  </div>
705
793
 
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.
794
+ <div className="pt-8 border-t border-border flex flex-col md:flex-row items-center justify-between gap-4">
795
+ <p className="text-text-muted text-sm">
796
+ © 2026 NordSym. Building infrastructure for agent commerce.
724
797
  </p>
798
+ <div className="flex items-center gap-4">
799
+ <div className="badge">
800
+ <Shield className="w-3 h-3" />
801
+ MCP Compatible
802
+ </div>
803
+ <div className="badge badge-live">
804
+ Live
805
+ </div>
806
+ </div>
725
807
  </div>
726
808
  </div>
727
809
  </footer>
728
810
 
729
- {/* Floating Chat Button */}
811
+ {/* Telegram Chat Bubble */}
730
812
  <a
731
813
  href="https://t.me/SymbotAPI_bot"
732
814
  target="_blank"
733
815
  rel="noopener noreferrer"
734
- className="fixed bottom-6 right-6 z-50 group flex items-center gap-3"
816
+ className="fixed bottom-6 right-6 z-50 group"
735
817
  >
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>
818
+ <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">
819
+ <span className="text-xl">🦞</span>
820
+ <span className="font-medium text-sm hidden sm:inline">Chat with the bot</span>
740
821
  </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>
822
+ <div className="absolute bottom-full right-0 mb-2 px-3 py-2 bg-surface-elevated border border-border rounded-lg text-xs whitespace-nowrap shadow-lg">
823
+ <span className="text-text-primary font-medium">Talk to the Clawdbot building this</span>
748
824
  </div>
749
825
  </a>
750
-
751
826
  </main>
752
827
  );
753
828
  }