@nordsym/apiclaw 1.3.6 → 1.3.8
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +422 -169
- package/convex/_generated/api.d.ts +16 -0
- package/convex/agents.ts +403 -0
- package/convex/billing.ts +651 -216
- package/convex/crons.ts +17 -0
- package/convex/directCall.ts +80 -0
- package/convex/earnProgress.ts +753 -0
- package/convex/email.ts +135 -82
- package/convex/feedback.ts +265 -0
- package/convex/http.ts +80 -4
- package/convex/logs.ts +304 -0
- package/convex/providerKeys.ts +289 -0
- package/convex/providers.ts +18 -0
- package/convex/schema.ts +185 -1
- package/convex/stripeActions.ts +512 -0
- package/convex/webhooks.ts +494 -0
- package/convex/workspaces.ts +158 -3
- package/dist/adapters/base.d.ts +112 -0
- package/dist/adapters/base.d.ts.map +1 -0
- package/dist/adapters/base.js +247 -0
- package/dist/adapters/base.js.map +1 -0
- package/dist/adapters/claude-desktop.d.ts +12 -0
- package/dist/adapters/claude-desktop.d.ts.map +1 -0
- package/dist/adapters/claude-desktop.js +36 -0
- package/dist/adapters/claude-desktop.js.map +1 -0
- package/dist/adapters/cline.d.ts +20 -0
- package/dist/adapters/cline.d.ts.map +1 -0
- package/dist/adapters/cline.js +77 -0
- package/dist/adapters/cline.js.map +1 -0
- package/dist/adapters/continue.d.ts +26 -0
- package/dist/adapters/continue.d.ts.map +1 -0
- package/dist/adapters/continue.js +68 -0
- package/dist/adapters/continue.js.map +1 -0
- package/dist/adapters/cursor.d.ts +12 -0
- package/dist/adapters/cursor.d.ts.map +1 -0
- package/dist/adapters/cursor.js +38 -0
- package/dist/adapters/cursor.js.map +1 -0
- package/dist/adapters/custom.d.ts +47 -0
- package/dist/adapters/custom.d.ts.map +1 -0
- package/dist/adapters/custom.js +146 -0
- package/dist/adapters/custom.js.map +1 -0
- package/dist/adapters/detect.d.ts +69 -0
- package/dist/adapters/detect.d.ts.map +1 -0
- package/dist/adapters/detect.js +158 -0
- package/dist/adapters/detect.js.map +1 -0
- package/dist/adapters/index.d.ts +21 -0
- package/dist/adapters/index.d.ts.map +1 -0
- package/dist/adapters/index.js +23 -0
- package/dist/adapters/index.js.map +1 -0
- package/dist/adapters/windsurf.d.ts +12 -0
- package/dist/adapters/windsurf.d.ts.map +1 -0
- package/dist/adapters/windsurf.js +39 -0
- package/dist/adapters/windsurf.js.map +1 -0
- package/dist/bin.d.ts +9 -0
- package/dist/bin.d.ts.map +1 -0
- package/dist/bin.js +19 -0
- package/dist/bin.js.map +1 -0
- package/dist/cli/commands/doctor.d.ts +34 -0
- package/dist/cli/commands/doctor.d.ts.map +1 -0
- package/dist/cli/commands/doctor.js +312 -0
- package/dist/cli/commands/doctor.js.map +1 -0
- package/dist/cli/commands/index.d.ts +9 -0
- package/dist/cli/commands/index.d.ts.map +1 -0
- package/dist/cli/commands/index.js +9 -0
- package/dist/cli/commands/index.js.map +1 -0
- package/dist/cli/commands/restore.d.ts +50 -0
- package/dist/cli/commands/restore.d.ts.map +1 -0
- package/dist/cli/commands/restore.js +260 -0
- package/dist/cli/commands/restore.js.map +1 -0
- package/dist/cli/commands/setup.d.ts +19 -0
- package/dist/cli/commands/setup.d.ts.map +1 -0
- package/dist/cli/commands/setup.js +206 -0
- package/dist/cli/commands/setup.js.map +1 -0
- package/dist/cli/commands/uninstall.d.ts +37 -0
- package/dist/cli/commands/uninstall.d.ts.map +1 -0
- package/dist/cli/commands/uninstall.js +189 -0
- package/dist/cli/commands/uninstall.js.map +1 -0
- package/dist/cli/index.d.ts +7 -0
- package/dist/cli/index.d.ts.map +1 -0
- package/dist/cli/index.js +97 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/discovery.d.ts +6 -2
- package/dist/discovery.d.ts.map +1 -1
- package/dist/discovery.js +296 -2
- package/dist/discovery.js.map +1 -1
- package/dist/enterprise/env.d.ts +56 -0
- package/dist/enterprise/env.d.ts.map +1 -0
- package/dist/enterprise/env.js +124 -0
- package/dist/enterprise/env.js.map +1 -0
- package/dist/enterprise/index.d.ts +7 -0
- package/dist/enterprise/index.d.ts.map +1 -0
- package/dist/enterprise/index.js +7 -0
- package/dist/enterprise/index.js.map +1 -0
- package/dist/enterprise/script-generator.d.ts +32 -0
- package/dist/enterprise/script-generator.d.ts.map +1 -0
- package/dist/enterprise/script-generator.js +461 -0
- package/dist/enterprise/script-generator.js.map +1 -0
- package/dist/execute.d.ts +21 -0
- package/dist/execute.d.ts.map +1 -1
- package/dist/execute.js +231 -0
- package/dist/execute.js.map +1 -1
- package/dist/index.js +257 -7
- package/dist/index.js.map +1 -1
- package/dist/metered.d.ts +62 -0
- package/dist/metered.d.ts.map +1 -0
- package/dist/metered.js +81 -0
- package/dist/metered.js.map +1 -0
- package/dist/stripe.d.ts +62 -0
- package/dist/stripe.d.ts.map +1 -1
- package/dist/stripe.js +212 -0
- package/dist/stripe.js.map +1 -1
- package/dist/types.d.ts +29 -0
- package/dist/types.d.ts.map +1 -1
- package/dist/ui/colors.d.ts +111 -0
- package/dist/ui/colors.d.ts.map +1 -0
- package/dist/ui/colors.js +185 -0
- package/dist/ui/colors.js.map +1 -0
- package/dist/ui/errors.d.ts +69 -0
- package/dist/ui/errors.d.ts.map +1 -0
- package/dist/ui/errors.js +334 -0
- package/dist/ui/errors.js.map +1 -0
- package/dist/ui/index.d.ts +10 -0
- package/dist/ui/index.d.ts.map +1 -0
- package/dist/ui/index.js +14 -0
- package/dist/ui/index.js.map +1 -0
- package/dist/ui/prompts.d.ts +88 -0
- package/dist/ui/prompts.d.ts.map +1 -0
- package/dist/ui/prompts.js +295 -0
- package/dist/ui/prompts.js.map +1 -0
- package/dist/ui/spinner.d.ts +112 -0
- package/dist/ui/spinner.d.ts.map +1 -0
- package/dist/ui/spinner.js +229 -0
- package/dist/ui/spinner.js.map +1 -0
- package/dist/utils/backup.d.ts +48 -0
- package/dist/utils/backup.d.ts.map +1 -0
- package/dist/utils/backup.js +182 -0
- package/dist/utils/backup.js.map +1 -0
- package/dist/utils/config.d.ts +80 -0
- package/dist/utils/config.d.ts.map +1 -0
- package/dist/utils/config.js +221 -0
- package/dist/utils/config.js.map +1 -0
- package/dist/utils/os.d.ts +45 -0
- package/dist/utils/os.d.ts.map +1 -0
- package/dist/utils/os.js +106 -0
- package/dist/utils/os.js.map +1 -0
- package/dist/utils/paths.d.ts +38 -0
- package/dist/utils/paths.d.ts.map +1 -0
- package/dist/utils/paths.js +160 -0
- package/dist/utils/paths.js.map +1 -0
- package/docs/PRD-BILLING.md +226 -0
- package/docs/PRD-EARN-SYSTEM.md +261 -0
- package/docs/PRD-MCP-AUTO-SETUP.md +623 -0
- package/docs/PRD-final-polish.md +117 -0
- package/docs/PRD-mobile-responsive.md +56 -0
- package/docs/PRD-navigation-expansion.md +295 -0
- package/docs/PRD-stripe-billing.md +312 -0
- package/docs/PRD-workspace-cleanup.md +200 -0
- package/docs/enterprise-deployment.md +728 -0
- package/landing/next.config.mjs +14 -0
- package/landing/public/stats.json +4 -2
- package/landing/scripts/generate-stats.js +12 -0
- package/landing/src/app/api/billing/checkout/route.ts +109 -0
- package/landing/src/app/api/billing/payment-method/route.ts +118 -0
- package/landing/src/app/api/billing/portal/route.ts +64 -0
- package/landing/src/app/api/workspace-auth/magic-link/route.ts +6 -3
- package/landing/src/app/auth/verify/page.tsx +31 -9
- package/landing/src/app/docs/page.tsx +1 -1
- package/landing/src/app/earn/page.tsx +6 -6
- package/landing/src/app/join/page.tsx +49 -0
- package/landing/src/app/login/page.tsx +8 -2
- package/landing/src/app/page.tsx +81 -96
- package/landing/src/app/providers/dashboard/page.tsx +1 -1
- package/landing/src/app/providers/register/page.tsx +1 -1
- package/landing/src/app/workspace/page.tsx +3269 -534
- package/landing/src/components/CheckoutButton.tsx +188 -0
- package/landing/src/components/EarnCreditsTab.tsx +842 -0
- package/landing/src/components/Toast.tsx +84 -0
- package/landing/src/lib/stats.json +3 -1
- package/package.json +9 -2
- package/src/adapters/base.ts +363 -0
- package/src/adapters/claude-desktop.ts +41 -0
- package/src/adapters/cline.ts +88 -0
- package/src/adapters/continue.ts +91 -0
- package/src/adapters/cursor.ts +43 -0
- package/src/adapters/custom.ts +188 -0
- package/src/adapters/detect.ts +202 -0
- package/src/adapters/index.ts +47 -0
- package/src/adapters/windsurf.ts +44 -0
- package/src/bin.ts +19 -0
- package/src/cli/commands/doctor.ts +367 -0
- package/src/cli/commands/index.ts +9 -0
- package/src/cli/commands/restore.ts +333 -0
- package/src/cli/commands/setup.ts +276 -0
- package/src/cli/commands/uninstall.ts +240 -0
- package/src/cli/index.ts +107 -0
- package/src/discovery.ts +328 -3
- package/src/enterprise/env.ts +156 -0
- package/src/enterprise/index.ts +7 -0
- package/src/enterprise/script-generator.ts +481 -0
- package/src/execute.ts +256 -0
- package/src/index.ts +290 -7
- package/src/metered.ts +149 -0
- package/src/stripe.ts +253 -0
- package/src/types.ts +32 -0
- package/src/ui/colors.ts +219 -0
- package/src/ui/errors.ts +394 -0
- package/src/ui/index.ts +17 -0
- package/src/ui/prompts.ts +390 -0
- package/src/ui/spinner.ts +325 -0
- package/src/utils/backup.ts +224 -0
- package/src/utils/config.ts +315 -0
- package/src/utils/os.ts +124 -0
- package/src/utils/paths.ts +203 -0
- package/landing/tsconfig.tsbuildinfo +0 -1
|
@@ -0,0 +1,226 @@
|
|
|
1
|
+
# PRD: APIClaw Billing System
|
|
2
|
+
|
|
3
|
+
**Status:** Draft
|
|
4
|
+
**Datum:** 2026-02-28
|
|
5
|
+
**Författare:** Symbot + Gustav
|
|
6
|
+
|
|
7
|
+
---
|
|
8
|
+
|
|
9
|
+
## Sammanfattning
|
|
10
|
+
|
|
11
|
+
Två betalningsmodeller för APIClaw:
|
|
12
|
+
1. **Pay-per-usage** — Lägg in kort, betala per API-anrop
|
|
13
|
+
2. **Backer** — $99 one-time, free usage 2026, VIP-status
|
|
14
|
+
|
|
15
|
+
---
|
|
16
|
+
|
|
17
|
+
## Modell 1: Pay-per-usage
|
|
18
|
+
|
|
19
|
+
### Användarflöde
|
|
20
|
+
1. Användare skapar konto (magic link)
|
|
21
|
+
2. Klickar "Add payment method" i dashboard
|
|
22
|
+
3. Stripe Checkout → sparar kort
|
|
23
|
+
4. Varje API-anrop drar: **provider-kostnad + 4% fee**
|
|
24
|
+
5. Faktureras månadsvis (Stripe invoicing)
|
|
25
|
+
|
|
26
|
+
### Teknisk implementation
|
|
27
|
+
|
|
28
|
+
**Stripe-komponenter:**
|
|
29
|
+
- Meter: `api_call` (redan skapad)
|
|
30
|
+
- Customer: skapas vid signup
|
|
31
|
+
- Subscription: skapas vid "add payment method" (usage-based)
|
|
32
|
+
|
|
33
|
+
**execute.ts integration:**
|
|
34
|
+
```typescript
|
|
35
|
+
// Efter lyckat API-anrop
|
|
36
|
+
await stripe.billing.meterEvents.create({
|
|
37
|
+
event_name: 'api_call',
|
|
38
|
+
payload: {
|
|
39
|
+
stripe_customer_id: user.stripeCustomerId,
|
|
40
|
+
value: String(costInCents) // Provider cost + 4%
|
|
41
|
+
}
|
|
42
|
+
});
|
|
43
|
+
```
|
|
44
|
+
|
|
45
|
+
**Prissättning per provider:**
|
|
46
|
+
|
|
47
|
+
| Provider | Ungefärlig kostnad | Med 4% fee |
|
|
48
|
+
|----------|-------------------|------------|
|
|
49
|
+
| Brave Search | $0.005/sökning | $0.0052 |
|
|
50
|
+
| OpenRouter | Varierar (token-based) | +4% |
|
|
51
|
+
| 46elks SMS | ~$0.035/SMS | $0.0364 |
|
|
52
|
+
| ElevenLabs | ~$0.001/tecken | +4% |
|
|
53
|
+
| Resend | $0.001/email | $0.00104 |
|
|
54
|
+
|
|
55
|
+
**Krav:**
|
|
56
|
+
- [ ] Stripe Customer skapas vid signup
|
|
57
|
+
- [ ] "Add payment method" knapp i dashboard
|
|
58
|
+
- [ ] Stripe Checkout Session för kort-setup
|
|
59
|
+
- [ ] Meter event logging i execute.ts
|
|
60
|
+
- [ ] Usage-dashboard (visa förbrukning)
|
|
61
|
+
- [ ] Provider-kostnad lookup per API
|
|
62
|
+
|
|
63
|
+
---
|
|
64
|
+
|
|
65
|
+
## Modell 2: Backer ($99)
|
|
66
|
+
|
|
67
|
+
### Erbjudande
|
|
68
|
+
- **Pris:** $99 USD one-time
|
|
69
|
+
- **Inkluderar:** Free API usage t.o.m. 2026-12-31
|
|
70
|
+
- **VIP-perks:**
|
|
71
|
+
- Newsletter (insider updates)
|
|
72
|
+
- Direkt kontakt med founders
|
|
73
|
+
- Badge i systemet
|
|
74
|
+
- Prioriterad support
|
|
75
|
+
- **Efter 2026:** Övergår till pay-per-usage
|
|
76
|
+
|
|
77
|
+
### Användarflöde
|
|
78
|
+
1. Användare ser "Become a Backer" CTA
|
|
79
|
+
2. Klickar → Stripe Checkout ($99 one-time)
|
|
80
|
+
3. Betalning genomförd → `backer: true` + `backerUntil: 2026-12-31`
|
|
81
|
+
4. Dashboard visar "Backer" badge
|
|
82
|
+
5. Alla API-anrop = gratis (skippa metering)
|
|
83
|
+
6. 2027-01-01: Automatiskt övergång till pay-per-usage
|
|
84
|
+
|
|
85
|
+
### Teknisk implementation
|
|
86
|
+
|
|
87
|
+
**Stripe-komponenter:**
|
|
88
|
+
- Produkt: "APIClaw Backer" (skapa ny, arkivera Pro)
|
|
89
|
+
- Price: $99 one-time (inte recurring)
|
|
90
|
+
- Checkout Session: mode=payment
|
|
91
|
+
|
|
92
|
+
**Databas (Convex):**
|
|
93
|
+
```typescript
|
|
94
|
+
// users table
|
|
95
|
+
{
|
|
96
|
+
email: string,
|
|
97
|
+
stripeCustomerId: string,
|
|
98
|
+
backer: boolean, // true om betalat
|
|
99
|
+
backerUntil: number, // timestamp 2026-12-31 23:59:59
|
|
100
|
+
// ...
|
|
101
|
+
}
|
|
102
|
+
```
|
|
103
|
+
|
|
104
|
+
**execute.ts logic:**
|
|
105
|
+
```typescript
|
|
106
|
+
// Innan metering
|
|
107
|
+
if (user.backer && Date.now() < user.backerUntil) {
|
|
108
|
+
// Skip metering, free call
|
|
109
|
+
return executeApiCall();
|
|
110
|
+
}
|
|
111
|
+
// Annars: logga till meter
|
|
112
|
+
```
|
|
113
|
+
|
|
114
|
+
**Krav:**
|
|
115
|
+
- [ ] Stripe produkt "APIClaw Backer" ($99 one-time)
|
|
116
|
+
- [ ] "Become a Backer" CTA på landing + dashboard
|
|
117
|
+
- [ ] Checkout flow för one-time payment
|
|
118
|
+
- [ ] Webhook: `checkout.session.completed` → sätt backer=true
|
|
119
|
+
- [ ] Backer-badge i UI
|
|
120
|
+
- [ ] Conditional metering i execute.ts
|
|
121
|
+
- [ ] Övergångslogik 2027-01-01
|
|
122
|
+
|
|
123
|
+
---
|
|
124
|
+
|
|
125
|
+
## UI/UX
|
|
126
|
+
|
|
127
|
+
### Landing Page
|
|
128
|
+
- Sektion: "Support APIClaw" eller "Become a Backer"
|
|
129
|
+
- Tydlig value prop: "$99 → Free API calls all of 2026"
|
|
130
|
+
- Lista VIP-perks
|
|
131
|
+
|
|
132
|
+
### Dashboard (inloggad)
|
|
133
|
+
- **Backer:** Badge, "Free until Dec 31, 2026", usage stats (för kul)
|
|
134
|
+
- **Pay-per-usage:** "Add payment method", current balance, usage
|
|
135
|
+
|
|
136
|
+
### Pricing Page (om separat)
|
|
137
|
+
```
|
|
138
|
+
┌─────────────────────┬─────────────────────┐
|
|
139
|
+
│ PAY AS YOU GO │ BACKER │
|
|
140
|
+
├─────────────────────┼─────────────────────┤
|
|
141
|
+
│ Free to start │ $99 │
|
|
142
|
+
│ Pay per API call │ one-time │
|
|
143
|
+
│ (cost + 4%) │ │
|
|
144
|
+
│ │ ✓ Free calls 2026 │
|
|
145
|
+
│ │ ✓ VIP newsletter │
|
|
146
|
+
│ │ ✓ Founder access │
|
|
147
|
+
│ │ ✓ Priority support │
|
|
148
|
+
├─────────────────────┼─────────────────────┤
|
|
149
|
+
│ [Add Card] │ [Become a Backer] │
|
|
150
|
+
└─────────────────────┴─────────────────────┘
|
|
151
|
+
```
|
|
152
|
+
|
|
153
|
+
---
|
|
154
|
+
|
|
155
|
+
## Webhook Events
|
|
156
|
+
|
|
157
|
+
| Event | Action |
|
|
158
|
+
|-------|--------|
|
|
159
|
+
| `checkout.session.completed` (backer) | Set user.backer=true, backerUntil |
|
|
160
|
+
| `checkout.session.completed` (card setup) | Create usage subscription |
|
|
161
|
+
| `invoice.payment_failed` | Notify user, pause access? |
|
|
162
|
+
| `customer.subscription.deleted` | Revoke access |
|
|
163
|
+
|
|
164
|
+
---
|
|
165
|
+
|
|
166
|
+
## Milstolpar
|
|
167
|
+
|
|
168
|
+
### Fas 1: Backer (ship first)
|
|
169
|
+
- [ ] Stripe produkt + price
|
|
170
|
+
- [ ] Checkout flow
|
|
171
|
+
- [ ] Webhook handler
|
|
172
|
+
- [ ] Backer flag i DB
|
|
173
|
+
- [ ] Badge i UI
|
|
174
|
+
- [ ] Skip metering för backers
|
|
175
|
+
|
|
176
|
+
### Fas 2: Pay-per-usage
|
|
177
|
+
- [ ] Fix meter price ($0.002 base eller dynamic)
|
|
178
|
+
- [ ] Metering i execute.ts
|
|
179
|
+
- [ ] "Add payment method" flow
|
|
180
|
+
- [ ] Usage dashboard
|
|
181
|
+
- [ ] Provider cost lookup
|
|
182
|
+
|
|
183
|
+
### Fas 3: Polish
|
|
184
|
+
- [ ] Email kvitto (Backer welcome)
|
|
185
|
+
- [ ] Transition email (Dec 2026 → pay-per-usage)
|
|
186
|
+
- [ ] Referral? ("Get 1 month free")
|
|
187
|
+
|
|
188
|
+
---
|
|
189
|
+
|
|
190
|
+
## Free Tier
|
|
191
|
+
|
|
192
|
+
**Alla användare får:**
|
|
193
|
+
- 50 API calls/månad (baseline)
|
|
194
|
+
- +50 bonus calls (one-time) via "Earn"-tasks
|
|
195
|
+
|
|
196
|
+
**Earn-tasks (one-time bonus):**
|
|
197
|
+
| Task | Bonus |
|
|
198
|
+
|------|-------|
|
|
199
|
+
| Verifiera email | +10 |
|
|
200
|
+
| Koppla första API | +15 |
|
|
201
|
+
| Gör första anrop | +10 |
|
|
202
|
+
| Dela på X/LinkedIn | +15 |
|
|
203
|
+
| **Total** | **+50** |
|
|
204
|
+
|
|
205
|
+
**Struktur:**
|
|
206
|
+
```
|
|
207
|
+
Free user startar: 50/månad
|
|
208
|
+
Gör alla earn-tasks: +50 bonus (total 100 första månaden)
|
|
209
|
+
Månad 2: 50/månad (bonus är one-time)
|
|
210
|
+
```
|
|
211
|
+
|
|
212
|
+
---
|
|
213
|
+
|
|
214
|
+
## Öppna frågor
|
|
215
|
+
|
|
216
|
+
1. **Provider cost tracking:** Hårdkoda per provider eller dynamiskt?
|
|
217
|
+
2. **Minimum balance?** Kan man gå minus och faktureras efteråt?
|
|
218
|
+
3. **Backer limit?** Max 100 backers? Eller obegränsat?
|
|
219
|
+
|
|
220
|
+
---
|
|
221
|
+
|
|
222
|
+
## Success Metrics
|
|
223
|
+
|
|
224
|
+
- **Backers:** 10 första månaden, 50 till EOY
|
|
225
|
+
- **Pay-per-usage conversion:** 20% av free users
|
|
226
|
+
- **Revenue target:** $5k MRR EOY 2026
|
|
@@ -0,0 +1,261 @@
|
|
|
1
|
+
# PRD: APIClaw Earn System
|
|
2
|
+
|
|
3
|
+
**Status:** Draft
|
|
4
|
+
**Datum:** 2026-02-28
|
|
5
|
+
**Författare:** Symbot + Gustav
|
|
6
|
+
|
|
7
|
+
---
|
|
8
|
+
|
|
9
|
+
## Sammanfattning
|
|
10
|
+
|
|
11
|
+
Gamifierat earn-system där användare tjänar API calls genom att slutföra tasks. Två kategorier: **Usage tasks** (driver aha-moment) och **Growth tasks** (driver tillväxt).
|
|
12
|
+
|
|
13
|
+
---
|
|
14
|
+
|
|
15
|
+
## Earn Tasks
|
|
16
|
+
|
|
17
|
+
### Usage Tasks (driver aha-moment)
|
|
18
|
+
|
|
19
|
+
| Task | Calls | Trigger |
|
|
20
|
+
|------|-------|---------|
|
|
21
|
+
| Gör första Direct Call | +15 | API-anrop loggas i system |
|
|
22
|
+
| Testa 3 olika APIs | +10 | 3 unika API endpoints anropade |
|
|
23
|
+
| Lista din Agent | +10 | Agent publicerad i marketplace |
|
|
24
|
+
| Lista ditt API | +10 | API publicerad som provider |
|
|
25
|
+
| Sätt upp Direct Call (BYOK) | +5 | Minst 1 API key sparad |
|
|
26
|
+
|
|
27
|
+
### Growth Tasks (driver tillväxt)
|
|
28
|
+
|
|
29
|
+
| Task | Calls | Trigger |
|
|
30
|
+
|------|-------|---------|
|
|
31
|
+
| Star on GitHub | +10 | OAuth-verifierad eller manuell claim |
|
|
32
|
+
| Follow @NordSym | +5 | OAuth-verifierad eller manuell claim |
|
|
33
|
+
| Invite Friends | +10/referral | Referral-kod använd vid signup |
|
|
34
|
+
|
|
35
|
+
### Totalt
|
|
36
|
+
|
|
37
|
+
- **One-time max:** 65 calls (exkl. referrals)
|
|
38
|
+
- **Referrals:** Obegränsat (+10 per signup)
|
|
39
|
+
|
|
40
|
+
---
|
|
41
|
+
|
|
42
|
+
## UX Specification
|
|
43
|
+
|
|
44
|
+
### Progress Section (top of Earn tab)
|
|
45
|
+
|
|
46
|
+
```
|
|
47
|
+
┌─────────────────────────────────────────────────────────────┐
|
|
48
|
+
│ │
|
|
49
|
+
│ [Target icon] Earn Progress │
|
|
50
|
+
│ │
|
|
51
|
+
│ [████████████░░░░░░░░░░░░] 35/65 calls earned │
|
|
52
|
+
│ │
|
|
53
|
+
│ USAGE │
|
|
54
|
+
│ ┌─────────────────────────────────────────────────────┐ │
|
|
55
|
+
│ │ [Check icon] First Direct Call +15 CLAIMED │ │
|
|
56
|
+
│ │ [Circle icon] Test 3 APIs +10 1/3 │ │
|
|
57
|
+
│ │ [Circle icon] List your Agent +10 [DO IT] │ │
|
|
58
|
+
│ │ [Circle icon] List your API +10 [DO IT] │ │
|
|
59
|
+
│ │ [Circle icon] Set up Direct Call +5 [DO IT] │ │
|
|
60
|
+
│ └─────────────────────────────────────────────────────┘ │
|
|
61
|
+
│ │
|
|
62
|
+
│ GROWTH │
|
|
63
|
+
│ ┌─────────────────────────────────────────────────────┐ │
|
|
64
|
+
│ │ [Check icon] Star on GitHub +10 CLAIMED │ │
|
|
65
|
+
│ │ [Circle icon] Follow @NordSym +5 [DO IT] │ │
|
|
66
|
+
│ │ [Users icon] Invite Friends +10 [COPY] │ │
|
|
67
|
+
│ │ 3 friends joined │ │
|
|
68
|
+
│ └─────────────────────────────────────────────────────┘ │
|
|
69
|
+
│ │
|
|
70
|
+
└─────────────────────────────────────────────────────────────┘
|
|
71
|
+
```
|
|
72
|
+
|
|
73
|
+
### Visual States
|
|
74
|
+
|
|
75
|
+
| State | Icon | Style |
|
|
76
|
+
|-------|------|-------|
|
|
77
|
+
| Not started | Circle (outline) | Gray text |
|
|
78
|
+
| In progress | Circle with partial fill | Blue text, "1/3" counter |
|
|
79
|
+
| Completed | CheckCircle (filled) | Green, "CLAIMED" badge |
|
|
80
|
+
| Action available | Button | Red accent, "[DO IT]" |
|
|
81
|
+
|
|
82
|
+
### Icons (Lucide)
|
|
83
|
+
|
|
84
|
+
| Element | Icon |
|
|
85
|
+
|---------|------|
|
|
86
|
+
| Progress header | Target |
|
|
87
|
+
| Completed task | CheckCircle |
|
|
88
|
+
| Open task | Circle |
|
|
89
|
+
| Referral | Users |
|
|
90
|
+
| Direct Call | Zap |
|
|
91
|
+
| Agent | Bot |
|
|
92
|
+
| API | Code |
|
|
93
|
+
| GitHub | Github |
|
|
94
|
+
| Twitter/X | Twitter |
|
|
95
|
+
|
|
96
|
+
### Animations
|
|
97
|
+
|
|
98
|
+
1. **On claim:** Checkmark animation (scale in + color change)
|
|
99
|
+
2. **Progress bar:** Smooth fill animation on update
|
|
100
|
+
3. **Confetti:** Optional, on major milestone (50%, 100%)
|
|
101
|
+
|
|
102
|
+
### Toast Notifications
|
|
103
|
+
|
|
104
|
+
| Event | Message |
|
|
105
|
+
|-------|---------|
|
|
106
|
+
| Task completed | "+15 calls earned! First Direct Call complete." |
|
|
107
|
+
| Milestone | "Halfway there! 32/65 calls earned." |
|
|
108
|
+
| Referral | "+10 calls! [Name] joined with your link." |
|
|
109
|
+
|
|
110
|
+
---
|
|
111
|
+
|
|
112
|
+
## Data Model
|
|
113
|
+
|
|
114
|
+
### Convex Schema
|
|
115
|
+
|
|
116
|
+
```typescript
|
|
117
|
+
// earnProgress table
|
|
118
|
+
{
|
|
119
|
+
userId: Id<"users">,
|
|
120
|
+
|
|
121
|
+
// Usage tasks
|
|
122
|
+
firstDirectCall: boolean,
|
|
123
|
+
firstDirectCallAt: number | null,
|
|
124
|
+
|
|
125
|
+
apisUsed: string[], // Track unique APIs
|
|
126
|
+
apisUsedComplete: boolean,
|
|
127
|
+
|
|
128
|
+
agentListed: boolean,
|
|
129
|
+
agentListedAt: number | null,
|
|
130
|
+
|
|
131
|
+
apiListed: boolean,
|
|
132
|
+
apiListedAt: number | null,
|
|
133
|
+
|
|
134
|
+
byokSetup: boolean,
|
|
135
|
+
byokSetupAt: number | null,
|
|
136
|
+
|
|
137
|
+
// Growth tasks
|
|
138
|
+
githubStarred: boolean,
|
|
139
|
+
githubStarredAt: number | null,
|
|
140
|
+
|
|
141
|
+
twitterFollowed: boolean,
|
|
142
|
+
twitterFollowedAt: number | null,
|
|
143
|
+
|
|
144
|
+
// Referrals (tracked separately)
|
|
145
|
+
referralCount: number,
|
|
146
|
+
|
|
147
|
+
// Calculated
|
|
148
|
+
totalEarned: number,
|
|
149
|
+
}
|
|
150
|
+
```
|
|
151
|
+
|
|
152
|
+
### API Endpoints
|
|
153
|
+
|
|
154
|
+
| Endpoint | Purpose |
|
|
155
|
+
|----------|---------|
|
|
156
|
+
| `earnProgress:get` | Get user's earn progress |
|
|
157
|
+
| `earnProgress:claimGithub` | Mark GitHub star as claimed |
|
|
158
|
+
| `earnProgress:claimTwitter` | Mark Twitter follow as claimed |
|
|
159
|
+
| `earnProgress:checkProgress` | Recalculate based on actual usage |
|
|
160
|
+
|
|
161
|
+
### Automatic Triggers
|
|
162
|
+
|
|
163
|
+
| Action | Updates |
|
|
164
|
+
|--------|---------|
|
|
165
|
+
| API call logged | Check firstDirectCall, apisUsed |
|
|
166
|
+
| Agent published | Set agentListed |
|
|
167
|
+
| API published | Set apiListed |
|
|
168
|
+
| BYOK key saved | Set byokSetup |
|
|
169
|
+
| Referral signup | Increment referralCount |
|
|
170
|
+
|
|
171
|
+
---
|
|
172
|
+
|
|
173
|
+
## Integration Points
|
|
174
|
+
|
|
175
|
+
### execute.ts
|
|
176
|
+
|
|
177
|
+
```typescript
|
|
178
|
+
// After successful API call
|
|
179
|
+
if (!user.earnProgress.firstDirectCall) {
|
|
180
|
+
await ctx.runMutation(api.earnProgress.markFirstDirectCall, { userId });
|
|
181
|
+
}
|
|
182
|
+
|
|
183
|
+
// Track unique APIs
|
|
184
|
+
await ctx.runMutation(api.earnProgress.trackApiUsed, {
|
|
185
|
+
userId,
|
|
186
|
+
apiId: request.apiId
|
|
187
|
+
});
|
|
188
|
+
```
|
|
189
|
+
|
|
190
|
+
### Agent/API Publish Flow
|
|
191
|
+
|
|
192
|
+
```typescript
|
|
193
|
+
// On agent publish
|
|
194
|
+
await ctx.runMutation(api.earnProgress.markAgentListed, { userId });
|
|
195
|
+
|
|
196
|
+
// On API publish
|
|
197
|
+
await ctx.runMutation(api.earnProgress.markApiListed, { userId });
|
|
198
|
+
```
|
|
199
|
+
|
|
200
|
+
### BYOK Settings
|
|
201
|
+
|
|
202
|
+
```typescript
|
|
203
|
+
// On first API key saved
|
|
204
|
+
await ctx.runMutation(api.earnProgress.markByokSetup, { userId });
|
|
205
|
+
```
|
|
206
|
+
|
|
207
|
+
---
|
|
208
|
+
|
|
209
|
+
## Free Tier Interaction
|
|
210
|
+
|
|
211
|
+
| Source | Calls |
|
|
212
|
+
|--------|-------|
|
|
213
|
+
| Monthly free | 50 |
|
|
214
|
+
| Earn bonus (max) | 65 |
|
|
215
|
+
| Referrals | Unlimited |
|
|
216
|
+
| **Total potential** | 115+ first month |
|
|
217
|
+
|
|
218
|
+
Earn bonus is **one-time**. Monthly free refreshes.
|
|
219
|
+
|
|
220
|
+
---
|
|
221
|
+
|
|
222
|
+
## Implementation Plan
|
|
223
|
+
|
|
224
|
+
### Agents Required: 3
|
|
225
|
+
|
|
226
|
+
**Agent 1: Backend (Convex)**
|
|
227
|
+
- Create earnProgress table
|
|
228
|
+
- Mutations: markFirstDirectCall, trackApiUsed, markAgentListed, markApiListed, markByokSetup, claimGithub, claimTwitter
|
|
229
|
+
- Query: getEarnProgress
|
|
230
|
+
- Integration hooks in execute.ts, agent publish, API publish, BYOK save
|
|
231
|
+
|
|
232
|
+
**Agent 2: Frontend (Earn Tab)**
|
|
233
|
+
- Redesign Earn Credits tab with progress bar
|
|
234
|
+
- Task cards with states (open, in-progress, claimed)
|
|
235
|
+
- Toast notifications on completion
|
|
236
|
+
- Animations (checkmark, progress fill)
|
|
237
|
+
- Replace current earn/page.tsx content
|
|
238
|
+
|
|
239
|
+
**Agent 3: Referral System**
|
|
240
|
+
- Generate unique referral codes
|
|
241
|
+
- Track referral signups
|
|
242
|
+
- Credit referrer on successful signup
|
|
243
|
+
- Referral leaderboard (optional)
|
|
244
|
+
|
|
245
|
+
---
|
|
246
|
+
|
|
247
|
+
## Success Metrics
|
|
248
|
+
|
|
249
|
+
- Earn completion rate (% users completing all tasks)
|
|
250
|
+
- First Direct Call within 24h of signup
|
|
251
|
+
- Referral conversion rate
|
|
252
|
+
- Correlation: earn completion vs. paid conversion
|
|
253
|
+
|
|
254
|
+
---
|
|
255
|
+
|
|
256
|
+
## Open Questions
|
|
257
|
+
|
|
258
|
+
1. **Manual claim vs. auto-detect:** GitHub/Twitter require OAuth or trust user?
|
|
259
|
+
2. **Referral cap:** Unlimited or max 50 referrals?
|
|
260
|
+
3. **Expiration:** Do earned calls expire or persist?
|
|
261
|
+
4. **Existing users:** Retroactive credit for already-completed actions?
|