@nordsym/apiclaw 1.5.16 → 1.5.18

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 (172) hide show
  1. package/convex/http.js +196 -0
  2. package/convex/http.js.map +1 -1
  3. package/convex/http.ts +201 -0
  4. package/convex/http.ts.bak +934 -0
  5. package/dist/analytics.d.ts +0 -4
  6. package/dist/analytics.d.ts.map +1 -1
  7. package/dist/analytics.js +0 -1
  8. package/dist/analytics.js.map +1 -1
  9. package/dist/bin.js +1 -1
  10. package/dist/cli/commands/mcp-install.d.ts.map +1 -1
  11. package/dist/cli/commands/mcp-install.js +8 -87
  12. package/dist/cli/commands/mcp-install.js.map +1 -1
  13. package/dist/cli/index.js +0 -7
  14. package/dist/credentials.d.ts.map +1 -1
  15. package/dist/credentials.js +0 -128
  16. package/dist/credentials.js.map +1 -1
  17. package/dist/discovery.d.ts.map +1 -1
  18. package/dist/discovery.js +82 -191
  19. package/dist/discovery.js.map +1 -1
  20. package/dist/http-api.d.ts.map +1 -1
  21. package/dist/http-api.js +33 -17
  22. package/dist/http-api.js.map +1 -1
  23. package/dist/proxy.js +1 -1
  24. package/dist/proxy.js.map +1 -1
  25. package/landing/next-env.d.ts +0 -1
  26. package/landing/src/app/api/auth/magic-link/route.ts +1 -1
  27. package/landing/src/app/auth/verify/page.tsx +0 -6
  28. package/landing/src/app/dashboard/verify/page.tsx +0 -6
  29. package/landing/src/app/join/page.tsx +0 -6
  30. package/landing/src/app/layout.tsx +2 -2
  31. package/landing/src/app/login/page.tsx +1 -1
  32. package/landing/src/app/mou/[partnerId]/page.tsx +0 -6
  33. package/landing/src/app/page.tsx +18 -39
  34. package/landing/src/app/providers/dashboard/[apiId]/actions/[actionId]/edit/page.tsx +0 -6
  35. package/landing/src/app/providers/dashboard/[apiId]/actions/new/page.tsx +0 -5
  36. package/landing/src/app/providers/dashboard/[apiId]/actions/page.tsx +0 -5
  37. package/landing/src/app/providers/dashboard/[apiId]/direct-call/page.tsx +1 -6
  38. package/landing/src/app/providers/dashboard/[apiId]/page.tsx +0 -5
  39. package/landing/src/app/providers/dashboard/[apiId]/test/page.tsx +0 -5
  40. package/landing/src/app/providers/dashboard/layout.tsx +6 -6
  41. package/landing/src/app/providers/dashboard/login/page.tsx +1 -1
  42. package/landing/src/app/providers/dashboard/page.tsx +1 -1
  43. package/landing/src/app/providers/dashboard/verify/page.tsx +0 -6
  44. package/landing/src/app/providers/layout.tsx +1 -1
  45. package/landing/src/app/upgrade/page.tsx +0 -6
  46. package/landing/src/app/workspace/page.tsx +0 -6
  47. package/landing/src/components/HeroTabs.tsx +2 -2
  48. package/landing/src/components/{Workspace.tsx → ProviderDashboard.tsx} +2 -2
  49. package/landing/src/components/VideoDemo.tsx +10 -21
  50. package/landing/src/lib/mock-data.ts +1 -1
  51. package/landing/src/lib/stats.json +1 -1
  52. package/package.json +4 -6
  53. package/src/analytics.ts +0 -5
  54. package/src/bin.ts +1 -1
  55. package/src/cli/commands/mcp-install.ts +8 -90
  56. package/src/cli/index.ts +0 -8
  57. package/src/credentials.ts +0 -136
  58. package/src/discovery.ts +82 -191
  59. package/src/http-api.ts +34 -18
  60. package/src/proxy.ts +1 -1
  61. package/APILAYER_STATUS_2026-03-24.md +0 -38
  62. package/CHANGELOG-WHITELIST-V2.md +0 -269
  63. package/HIVR-WHITELIST-STATUS.md +0 -205
  64. package/HIVR-WHITELIST.md +0 -148
  65. package/TERMINOLOGY-AUDIT.md +0 -99
  66. package/TERMINOLOGY-FIXED.md +0 -74
  67. package/VIDEO-DEMO-GUIDE.md +0 -82
  68. package/WHITELIST-ARCHITECTURE.md +0 -379
  69. package/api/discover.ts +0 -71
  70. package/api/health.ts +0 -20
  71. package/direct-test.mjs +0 -51
  72. package/dist/access-control.d.ts +0 -45
  73. package/dist/access-control.d.ts.map +0 -1
  74. package/dist/access-control.js +0 -142
  75. package/dist/access-control.js.map +0 -1
  76. package/dist/chain-types.d.ts +0 -187
  77. package/dist/chain-types.d.ts.map +0 -1
  78. package/dist/chain-types.js +0 -33
  79. package/dist/chain-types.js.map +0 -1
  80. package/dist/convex/adminActivate.js +0 -46
  81. package/dist/convex/adminStats.js +0 -41
  82. package/dist/convex/agents.js +0 -498
  83. package/dist/convex/analytics.js +0 -165
  84. package/dist/convex/billing.js +0 -654
  85. package/dist/convex/capabilities.js +0 -144
  86. package/dist/convex/chains.js +0 -1041
  87. package/dist/convex/credits.js +0 -185
  88. package/dist/convex/crons.js +0 -16
  89. package/dist/convex/directCall.js +0 -626
  90. package/dist/convex/earnProgress.js +0 -648
  91. package/dist/convex/email.js +0 -299
  92. package/dist/convex/feedback.js +0 -226
  93. package/dist/convex/http.js +0 -909
  94. package/dist/convex/logs.js +0 -486
  95. package/dist/convex/mou.js +0 -81
  96. package/dist/convex/providerKeys.js +0 -256
  97. package/dist/convex/providers.js +0 -755
  98. package/dist/convex/purchases.js +0 -156
  99. package/dist/convex/ratelimit.js +0 -90
  100. package/dist/convex/schema.js +0 -709
  101. package/dist/convex/searchLogs.js +0 -128
  102. package/dist/convex/spendAlerts.js +0 -379
  103. package/dist/convex/stripeActions.js +0 -410
  104. package/dist/convex/teams.js +0 -214
  105. package/dist/convex/telemetry.js +0 -73
  106. package/dist/convex/usage.js +0 -228
  107. package/dist/convex/waitlist.js +0 -48
  108. package/dist/convex/webhooks.js +0 -409
  109. package/dist/convex/workspaces.js +0 -879
  110. package/dist/hivr-whitelist.d.ts +0 -18
  111. package/dist/hivr-whitelist.d.ts.map +0 -1
  112. package/dist/hivr-whitelist.js +0 -95
  113. package/dist/hivr-whitelist.js.map +0 -1
  114. package/dist/http-server-minimal.d.ts +0 -7
  115. package/dist/http-server-minimal.d.ts.map +0 -1
  116. package/dist/http-server-minimal.js +0 -126
  117. package/dist/http-server-minimal.js.map +0 -1
  118. package/dist/product-whitelist.d.ts +0 -37
  119. package/dist/product-whitelist.d.ts.map +0 -1
  120. package/dist/product-whitelist.js +0 -203
  121. package/dist/product-whitelist.js.map +0 -1
  122. package/dist/src/analytics.js +0 -129
  123. package/dist/src/bin.js +0 -17
  124. package/dist/src/capability-router.js +0 -240
  125. package/dist/src/chainExecutor.js +0 -451
  126. package/dist/src/chainResolver.js +0 -518
  127. package/dist/src/cli/commands/doctor.js +0 -324
  128. package/dist/src/cli/commands/mcp-install.js +0 -255
  129. package/dist/src/cli/commands/restore.js +0 -259
  130. package/dist/src/cli/commands/setup.js +0 -205
  131. package/dist/src/cli/commands/uninstall.js +0 -188
  132. package/dist/src/cli/index.js +0 -111
  133. package/dist/src/cli.js +0 -302
  134. package/dist/src/confirmation.js +0 -240
  135. package/dist/src/credentials.js +0 -357
  136. package/dist/src/credits.js +0 -260
  137. package/dist/src/crypto.js +0 -66
  138. package/dist/src/discovery.js +0 -504
  139. package/dist/src/enterprise/env.js +0 -123
  140. package/dist/src/enterprise/script-generator.js +0 -460
  141. package/dist/src/execute-dynamic.js +0 -473
  142. package/dist/src/execute.js +0 -1727
  143. package/dist/src/index.js +0 -2062
  144. package/dist/src/metered.js +0 -80
  145. package/dist/src/open-apis.js +0 -276
  146. package/dist/src/proxy.js +0 -28
  147. package/dist/src/session.js +0 -86
  148. package/dist/src/stripe.js +0 -407
  149. package/dist/src/telemetry.js +0 -49
  150. package/dist/src/types.js +0 -2
  151. package/dist/src/utils/backup.js +0 -181
  152. package/dist/src/utils/config.js +0 -220
  153. package/dist/src/utils/os.js +0 -105
  154. package/dist/src/utils/paths.js +0 -159
  155. package/landing/pages/api/discover.ts +0 -43
  156. package/landing/pages/api/health.ts +0 -20
  157. package/scripts/test-whitelist-v2.sh +0 -128
  158. package/src/access-control.ts +0 -174
  159. package/src/hivr-whitelist.ts +0 -110
  160. package/src/http-server-minimal.ts +0 -154
  161. package/src/product-whitelist.ts +0 -246
  162. package/test-actual-handlers.ts +0 -92
  163. package/test-apilayer-all-14.ts +0 -249
  164. package/test-apilayer-fixed.ts +0 -248
  165. package/test-direct-endpoints.ts +0 -174
  166. package/test-exact-endpoints.ts +0 -144
  167. package/test-final.ts +0 -83
  168. package/test-full-routing.ts +0 -100
  169. package/test-handlers-correct.ts +0 -217
  170. package/test-numverify-key.ts +0 -41
  171. package/test-via-handlers.ts +0 -92
  172. package/test-worldnews.mjs +0 -26
package/HIVR-WHITELIST.md DELETED
@@ -1,148 +0,0 @@
1
- # Hivr Auto-Whitelist System
2
-
3
- **Problem:** Manually updating hardcoded whitelist every time new bee is added = fragile + easy to forget.
4
-
5
- **Solution:** APIClaw dynamically fetches active agents from Hivr's Convex deployment.
6
-
7
- ---
8
-
9
- ## How It Works
10
-
11
- 1. **Hivr Convex Deployment:** `sensible-quail-275` (PROD)
12
- 2. **APIClaw queries:** `agents:list` from Hivr
13
- 3. **Cache:** 5 minutes (performance)
14
- 4. **Fallback:** Static whitelist if Convex unreachable
15
-
16
- ---
17
-
18
- ## Files
19
-
20
- | File | Purpose |
21
- |------|---------|
22
- | `src/hivr-whitelist.ts` | Dynamic whitelist module |
23
- | `src/http-api.ts` | Uses `isAuthorized()` from hivr-whitelist |
24
-
25
- ---
26
-
27
- ## Usage
28
-
29
- ### In Code
30
- ```typescript
31
- import { isAuthorized, invalidateCache } from './hivr-whitelist.js';
32
-
33
- // Check if agent is whitelisted
34
- const authorized = await isAuthorized('bytebee'); // true
35
-
36
- // Force refresh (after adding new bee)
37
- invalidateCache();
38
- ```
39
-
40
- ### Adding New Bee (Automatic!)
41
- 1. Add agent in Hivr (hivr.online admin)
42
- 2. APIClaw will auto-discover within 5 minutes
43
- 3. **No code changes needed!**
44
-
45
- ---
46
-
47
- ## Manual Override (Emergency)
48
-
49
- If Hivr Convex is down, edit static fallback:
50
-
51
- **File:** `src/hivr-whitelist.ts`
52
- **Line:** 10-23
53
-
54
- ```typescript
55
- const STATIC_WHITELIST = [
56
- 'bytebee',
57
- 'symbot',
58
- // Add emergency agents here
59
- ];
60
- ```
61
-
62
- Then rebuild:
63
- ```bash
64
- npm run build
65
- ```
66
-
67
- ---
68
-
69
- ## Testing
70
-
71
- ### Local Test
72
- ```bash
73
- # Start APIClaw HTTP API
74
- npm run start:http
75
-
76
- # Test authorization
77
- curl "http://localhost:3000/api/discover?query=web&agentId=bytebee"
78
- # Should return 200 (authorized)
79
-
80
- curl "http://localhost:3000/api/discover?query=web&agentId=unauthorized"
81
- # Should return 403 (unauthorized)
82
- ```
83
-
84
- ### Check Whitelist Cache
85
- APIClaw logs when fetching whitelist:
86
- ```
87
- [Hivr Whitelist] Fetched 12 agents from Hivr
88
- ```
89
-
90
- ---
91
-
92
- ## Troubleshooting
93
-
94
- **Problem:** New bee not authorized immediately
95
- **Solution:** Wait 5 minutes (cache) or restart APIClaw server
96
-
97
- **Problem:** "Failed to fetch from Hivr Convex"
98
- **Solution:** Check Hivr Convex URL in `hivr-whitelist.ts`, fallback to static
99
-
100
- **Problem:** All bees unauthorized
101
- **Solution:** Check Hivr agents table has `agentId` field
102
-
103
- ---
104
-
105
- ## Architecture
106
-
107
- ```
108
- ┌─────────────────────────────────────────────┐
109
- │ Hivr.online (sensible-quail-275) │
110
- │ ┌───────────────────────────────────────┐ │
111
- │ │ agents table │ │
112
- │ │ { agentId: "bytebee", ... } │ │
113
- │ └───────────────────────────────────────┘ │
114
- └─────────────────────────────────────────────┘
115
-
116
- │ Query agents:list
117
- │ (every 5 min)
118
-
119
- ┌─────────────────────────────────────────────┐
120
- │ APIClaw HTTP API │
121
- │ ┌───────────────────────────────────────┐ │
122
- │ │ hivr-whitelist.ts │ │
123
- │ │ - Cached whitelist │ │
124
- │ │ - Auto-refresh every 5 min │ │
125
- │ │ - Fallback to static list │ │
126
- │ └───────────────────────────────────────┘ │
127
- │ │ │
128
- │ ┌───────────────────────────────────────┐ │
129
- │ │ http-api.ts │ │
130
- │ │ - /api/discover │ │
131
- │ │ - /api/call_api │ │
132
- │ │ - Calls isAuthorized(agentId) │ │
133
- │ └───────────────────────────────────────┘ │
134
- └─────────────────────────────────────────────┘
135
- ```
136
-
137
- ---
138
-
139
- ## Future Improvements
140
-
141
- - [ ] Webhook from Hivr when new agent added (instant refresh)
142
- - [ ] Admin endpoint to manually refresh: `GET /api/admin/refresh-whitelist`
143
- - [ ] Whitelist per-API (some bees only get certain providers)
144
- - [ ] Usage quotas per bee (track in Convex)
145
-
146
- ---
147
-
148
- **TL;DR:** Add agent in Hivr → APIClaw auto-whitelists within 5 min. Zero manual code changes.
@@ -1,99 +0,0 @@
1
- # 🔍 APIClaw Terminology Audit - "Provider Dashboard" → "Workspace"
2
-
3
- **Goal:** Unify all dashboard terminology to "Workspace" regardless of user role.
4
-
5
- **Principle:** ONE dashboard for ALL users. Same name: **Workspace**. Different data based on role.
6
-
7
- ---
8
-
9
- ## ❌ Current Issues
10
-
11
- **Problem:** Multiple terms for the same concept:
12
- - "Provider Dashboard" (for API providers like APILayer)
13
- - "Workspace" (for regular users)
14
- - Routes: `/providers/dashboard` vs `/workspace`
15
-
16
- **Confusion:** Users/AI don't know if these are different things or the same.
17
-
18
- ---
19
-
20
- ## 📋 Files to Update
21
-
22
- ### **1. Component Rename**
23
-
24
- **File:** `src/components/ProviderDashboard.tsx`
25
- - Rename to: `Workspace.tsx`
26
- - Export: `ProviderDashboard` → `Workspace`
27
-
28
- ### **2. Route Structure**
29
-
30
- **Current:** `/providers/dashboard/*`
31
- **Decision needed:**
32
- - Option A: Rename to `/providers/workspace/*` (keeps separation)
33
- - Option B: Merge into `/workspace` (unified, role-based views)
34
-
35
- **Recommendation:** Option B - One workspace, role-based content.
36
-
37
- ### **3. UI Text Changes (9 files)**
38
-
39
- | File | Line | Current | Replace With |
40
- |------|------|---------|--------------|
41
- | `src/app/api/auth/magic-link/route.ts` | 54 | "provider dashboard" | "workspace" |
42
- | `src/app/login/page.tsx` | 202 | "Provider Dashboard" | "Workspace" |
43
- | `src/app/providers/dashboard/[apiId]/direct-call/page.tsx` | 448 | "provider dashboard" | "workspace" |
44
- | `src/app/providers/dashboard/login/page.tsx` | 112 | "Provider Dashboard" | "Workspace" |
45
- | `src/app/providers/dashboard/page.tsx` | 7 | `ProviderDashboardRedirect` | `WorkspaceRedirect` |
46
- | `src/app/providers/layout.tsx` | 4 | "Provider Dashboard" | "Workspace" |
47
- | `src/components/ProviderDashboard.tsx` | 79 | "Provider Dashboard" | "Workspace" |
48
- | `src/lib/mock-data.ts` | 1 | "provider dashboard demo" | "workspace demo" |
49
-
50
- ---
51
-
52
- ## ✅ Acceptable "Provider" Usage
53
-
54
- **These are OK (not confusing):**
55
- - "API provider" (describes what someone IS, not a UI element)
56
- - "Direct Call provider" (describes a service type)
57
- - Technical variable names like `providerId`, `providerName` (code internals)
58
- - "Provider" in list contexts ("Browse providers")
59
-
60
- **Rule:** "Provider" OK when describing a ROLE or TYPE. NOT OK when naming UI elements.
61
-
62
- ---
63
-
64
- ## 🎯 Proposed Changes
65
-
66
- ### Phase 1: UI Text (Quick Win)
67
- Replace all "Provider Dashboard" → "Workspace" in user-facing text.
68
-
69
- ### Phase 2: Component Rename
70
- `ProviderDashboard.tsx` → `Workspace.tsx`
71
-
72
- ### Phase 3: Route Consolidation (Optional)
73
- Merge `/providers/dashboard` into `/workspace` with role-based rendering.
74
-
75
- ---
76
-
77
- ## 📝 Implementation Script
78
-
79
- ```bash
80
- # Find all instances (for verification)
81
- cd ~/Projects/apiclaw/landing
82
- grep -rn "Provider Dashboard" src/ --include="*.tsx" --include="*.ts"
83
-
84
- # Replace in files (do manually or scripted)
85
- # See detailed file list above
86
- ```
87
-
88
- ---
89
-
90
- ## 🚀 Next Steps
91
-
92
- 1. Review this audit
93
- 2. Confirm approach (Phase 1-3 vs all at once)
94
- 3. Execute changes
95
- 4. Test routes still work
96
- 5. Deploy
97
-
98
- **Created:** 2026-03-24
99
- **Status:** Ready for implementation
@@ -1,74 +0,0 @@
1
- # ✅ Terminology Fixed - "Provider Dashboard" → "Workspace"
2
-
3
- **Completed:** 2026-03-24 16:39
4
-
5
- ---
6
-
7
- ## Changes Made
8
-
9
- ### 1. Component Renamed ✅
10
- - `src/components/ProviderDashboard.tsx` → `Workspace.tsx`
11
- - Export function: `ProviderDashboard()` → `Workspace()`
12
- - Internal h1: "Provider Dashboard" → "Workspace"
13
-
14
- ### 2. All UI Text Updated ✅
15
-
16
- | File | Old | New |
17
- |------|-----|-----|
18
- | `src/app/api/auth/magic-link/route.ts` | "provider dashboard" | "workspace" |
19
- | `src/app/login/page.tsx` | "Provider Dashboard" | "Workspace" |
20
- | `src/app/providers/dashboard/[apiId]/direct-call/page.tsx` | "provider dashboard" | "workspace" |
21
- | `src/app/providers/dashboard/login/page.tsx` | "Provider Dashboard" | "Workspace" |
22
- | `src/app/providers/dashboard/page.tsx` | `ProviderDashboardRedirect` | `WorkspaceRedirect` |
23
- | `src/app/providers/layout.tsx` | "Provider Dashboard" | "Workspace" |
24
- | `src/lib/mock-data.ts` | "provider dashboard demo" | "workspace demo" |
25
-
26
- ### 3. Verification ✅
27
- ```bash
28
- grep -rn "Provider Dashboard\|ProviderDashboard" src/
29
- # Result: No matches found ✓
30
- ```
31
-
32
- ---
33
-
34
- ## Result
35
-
36
- **Before:**
37
- - "Provider Dashboard" for API providers
38
- - "Workspace" for regular users
39
- - **Confusing:** Are these different things?
40
-
41
- **After:**
42
- - **"Workspace"** for EVERYONE
43
- - Same name, different data based on role
44
- - **Clear:** One unified dashboard concept
45
-
46
- ---
47
-
48
- ## Next Steps
49
-
50
- **When ready to deploy:**
51
- ```bash
52
- cd ~/Projects/apiclaw/landing
53
- npm install # if needed
54
- npm run build
55
- npx vercel --prod --yes
56
- ```
57
-
58
- **Routes still work:**
59
- - `/workspace` → User workspace
60
- - `/providers/dashboard` → Still routes to workspace (URL unchanged for now)
61
- - Both show "Workspace" in UI
62
-
63
- ---
64
-
65
- ## No More Confusion
66
-
67
- ✅ Users see: "Workspace"
68
- ✅ API providers see: "Workspace"
69
- ✅ Pratham will see: "Workspace"
70
- ✅ AI/bots see: "Workspace"
71
-
72
- **One term. Clear meaning. No confusion.**
73
-
74
- 🎯 **Done.**
@@ -1,82 +0,0 @@
1
- # 🎬 Video Demo Setup Guide
2
-
3
- ## ✅ What's Ready
4
-
5
- **Component created:** `landing/src/components/VideoDemo.tsx`
6
- **Integrated:** Landing page (`landing/src/app/page.tsx`)
7
- **Position:** Floating bubble, bottom-right corner
8
- **Animation:** Pulse effect + hover expand
9
-
10
- ## 📹 Tomorrow Morning - Steps
11
-
12
- ### 1. Record with Tella
13
- - Open Tella on Mac
14
- - Record 2-minute demo:
15
- - Install: `npx @nordsym/apiclaw mcp-install`
16
- - Show workspace
17
- - Make an API call
18
- - Show it working
19
- - Upload to Tella & get embed URL
20
-
21
- ### 2. Update Component
22
-
23
- Open: `landing/src/components/VideoDemo.tsx`
24
-
25
- **Line 14** - Replace:
26
- ```tsx
27
- videoUrl = "PASTE_TELLA_URL_HERE"
28
- ```
29
-
30
- With your Tella embed URL (format: `https://www.tella.tv/video/...`)
31
-
32
- ### 3. Deploy
33
-
34
- ```bash
35
- cd ~/Projects/apiclaw/landing
36
- npm run build
37
- npx vercel --prod --yes
38
- ```
39
-
40
- ## 🎨 Styling
41
-
42
- **Already styled to match APIClaw design:**
43
- - Red accent (#ef4444)
44
- - Pulse animation
45
- - Clean modal
46
- - Mobile responsive
47
- - Dark mode compatible
48
-
49
- ## 📝 Video Content Suggestion
50
-
51
- **0:00-0:20** - "I'm going to show you how to use APIClaw in 2 minutes"
52
- **0:20-0:40** - Install command + MCP setup
53
- **0:40-1:20** - Open workspace, discover APIs, make call
54
- **1:20-1:40** - Show response, explain Direct Call
55
- **1:40-2:00** - "That's it. No API keys needed. Go to apiclaw.cloud"
56
-
57
- ## 🔧 Optional Customization
58
-
59
- **Change button text:**
60
- ```tsx
61
- // In VideoDemo.tsx, line 28
62
- <span>Watch Demo</span> // Change this
63
- ```
64
-
65
- **Change video title:**
66
- ```tsx
67
- // In VideoDemo.tsx, line 65
68
- <h3>🦞 APIClaw Quick Start</h3> // Change this
69
- ```
70
-
71
- ## ✨ Features
72
-
73
- - ✅ Floating button (always visible while scrolling)
74
- - ✅ Click to open full-screen modal
75
- - ✅ Click outside to close
76
- - ✅ ESC key support
77
- - ✅ Responsive (works on mobile)
78
- - ✅ Smooth animations
79
-
80
- ## 🚀 Ready to Go!
81
-
82
- Just record the video and paste the URL. Everything else is done.