@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
@@ -4,16 +4,19 @@
4
4
  "private": true,
5
5
  "scripts": {
6
6
  "dev": "next dev",
7
+ "prebuild": "node scripts/generate-stats.js",
7
8
  "build": "next build",
8
9
  "start": "next start",
9
10
  "lint": "next lint"
10
11
  },
11
12
  "dependencies": {
12
13
  "@vercel/analytics": "^1.6.1",
14
+ "@vercel/og": "^0.8.6",
13
15
  "lucide-react": "^0.350.0",
14
16
  "next": "^14.2.0",
15
17
  "react": "^18.2.0",
16
- "react-dom": "^18.2.0"
18
+ "react-dom": "^18.2.0",
19
+ "recharts": "^3.7.0"
17
20
  },
18
21
  "devDependencies": {
19
22
  "@types/node": "^20",
@@ -21,6 +24,7 @@
21
24
  "@types/react-dom": "^18",
22
25
  "autoprefixer": "^10",
23
26
  "postcss": "^8",
27
+ "sharp": "^0.34.5",
24
28
  "tailwindcss": "^3.4.1",
25
29
  "typescript": "^5"
26
30
  }
Binary file
Binary file
Binary file
Binary file
Binary file
@@ -0,0 +1,3 @@
1
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 100 100">
2
+ <text y=".9em" font-size="90">🦞</text>
3
+ </svg>
@@ -0,0 +1,47 @@
1
+ <?xml version="1.0" encoding="UTF-8"?>
2
+ <svg width="512" height="512" viewBox="0 0 512 512" fill="none" xmlns="http://www.w3.org/2000/svg">
3
+ <!-- APIClaw App Icon - with background -->
4
+ <defs>
5
+ <linearGradient id="icon-gradient" x1="0%" y1="0%" x2="100%" y2="100%">
6
+ <stop offset="0%" stop-color="#f87171"/>
7
+ <stop offset="100%" stop-color="#dc2626"/>
8
+ </linearGradient>
9
+ <linearGradient id="bg-gradient" x1="0%" y1="0%" x2="100%" y2="100%">
10
+ <stop offset="0%" stop-color="#171717"/>
11
+ <stop offset="100%" stop-color="#0a0a0a"/>
12
+ </linearGradient>
13
+ </defs>
14
+
15
+ <!-- Background with subtle gradient -->
16
+ <rect width="512" height="512" rx="96" fill="url(#bg-gradient)"/>
17
+
18
+ <!-- Claw centered and scaled -->
19
+ <g transform="translate(56, 56) scale(0.78)">
20
+ <g fill="url(#icon-gradient)">
21
+ <path d="M144 320
22
+ C104 264 104 192 144 136
23
+ C184 80 256 56 328 80
24
+ C352 88 376 104 392 128
25
+ L344 176
26
+ C332 160 316 148 296 144
27
+ C248 132 200 152 176 192
28
+ C152 232 160 280 192 312
29
+ Z"/>
30
+ <path d="M192 312
31
+ C224 344 272 360 320 352
32
+ C368 344 408 312 424 264
33
+ L368 240
34
+ C360 268 336 292 304 300
35
+ C272 308 240 300 216 280
36
+ L192 312
37
+ Z"/>
38
+ <path d="M392 128
39
+ L424 184
40
+ C440 216 440 256 424 264
41
+ L368 240
42
+ C376 216 368 192 352 176
43
+ L344 176
44
+ Z"/>
45
+ </g>
46
+ </g>
47
+ </svg>
@@ -0,0 +1,37 @@
1
+ <?xml version="1.0" encoding="UTF-8"?>
2
+ <svg width="512" height="512" viewBox="0 0 512 512" fill="none" xmlns="http://www.w3.org/2000/svg">
3
+ <!-- APIClaw Logo - Monochrome version -->
4
+ <!-- Uses currentColor for maximum flexibility -->
5
+
6
+ <g fill="currentColor">
7
+ <!-- Upper pincer arm -->
8
+ <path d="M144 320
9
+ C104 264 104 192 144 136
10
+ C184 80 256 56 328 80
11
+ C352 88 376 104 392 128
12
+ L344 176
13
+ C332 160 316 148 296 144
14
+ C248 132 200 152 176 192
15
+ C152 232 160 280 192 312
16
+ Z"/>
17
+
18
+ <!-- Lower pincer arm -->
19
+ <path d="M192 312
20
+ C224 344 272 360 320 352
21
+ C368 344 408 312 424 264
22
+ L368 240
23
+ C360 268 336 292 304 300
24
+ C272 308 240 300 216 280
25
+ L192 312
26
+ Z"/>
27
+
28
+ <!-- Sharp tip accent -->
29
+ <path d="M392 128
30
+ L424 184
31
+ C440 216 440 256 424 264
32
+ L368 240
33
+ C376 216 368 192 352 176
34
+ L344 176
35
+ Z"/>
36
+ </g>
37
+ </svg>
@@ -0,0 +1,45 @@
1
+ <?xml version="1.0" encoding="UTF-8"?>
2
+ <svg width="512" height="512" viewBox="0 0 512 512" fill="none" xmlns="http://www.w3.org/2000/svg">
3
+ <!-- APIClaw Logo - Ultra Minimalist Claw Mark -->
4
+ <!-- Single color, works everywhere -->
5
+
6
+ <defs>
7
+ <linearGradient id="brand-gradient" x1="0%" y1="0%" x2="100%" y2="100%">
8
+ <stop offset="0%" stop-color="#f87171"/>
9
+ <stop offset="100%" stop-color="#dc2626"/>
10
+ </linearGradient>
11
+ </defs>
12
+
13
+ <!-- Abstract claw pincer - clean, geometric, memorable -->
14
+ <g fill="url(#brand-gradient)">
15
+ <!-- Upper pincer arm -->
16
+ <path d="M144 320
17
+ C104 264 104 192 144 136
18
+ C184 80 256 56 328 80
19
+ C352 88 376 104 392 128
20
+ L344 176
21
+ C332 160 316 148 296 144
22
+ C248 132 200 152 176 192
23
+ C152 232 160 280 192 312
24
+ Z"/>
25
+
26
+ <!-- Lower pincer arm -->
27
+ <path d="M192 312
28
+ C224 344 272 360 320 352
29
+ C368 344 408 312 424 264
30
+ L368 240
31
+ C360 268 336 292 304 300
32
+ C272 308 240 300 216 280
33
+ L192 312
34
+ Z"/>
35
+
36
+ <!-- Sharp tip accent -->
37
+ <path d="M392 128
38
+ L424 184
39
+ C440 216 440 256 424 264
40
+ L368 240
41
+ C376 216 368 192 352 176
42
+ L344 176
43
+ Z"/>
44
+ </g>
45
+ </svg>
@@ -0,0 +1,84 @@
1
+ <?xml version="1.0" encoding="UTF-8"?>
2
+ <svg width="512" height="512" viewBox="0 0 512 512" fill="none" xmlns="http://www.w3.org/2000/svg">
3
+ <!-- APIClaw Lobster Claw Logo - Minimalist -->
4
+ <!-- Works on both light and dark backgrounds via currentColor -->
5
+
6
+ <defs>
7
+ <linearGradient id="claw-gradient" x1="0%" y1="0%" x2="100%" y2="100%">
8
+ <stop offset="0%" stop-color="#ef4444"/>
9
+ <stop offset="50%" stop-color="#dc2626"/>
10
+ <stop offset="100%" stop-color="#b91c1c"/>
11
+ </linearGradient>
12
+
13
+ <linearGradient id="claw-gradient-dark" x1="0%" y1="0%" x2="100%" y2="100%">
14
+ <stop offset="0%" stop-color="#f87171"/>
15
+ <stop offset="50%" stop-color="#ef4444"/>
16
+ <stop offset="100%" stop-color="#dc2626"/>
17
+ </linearGradient>
18
+ </defs>
19
+
20
+ <g id="claw">
21
+ <!-- Main claw body - curved organic shape -->
22
+ <path
23
+ d="M128 384
24
+ C96 352 80 288 96 224
25
+ C112 160 160 112 224 96
26
+ C256 88 288 96 320 112
27
+ L280 168
28
+ C256 156 232 156 208 168
29
+ C168 188 144 232 152 280
30
+ C156 312 176 344 200 360
31
+ Z"
32
+ fill="url(#claw-gradient)"
33
+ />
34
+
35
+ <!-- Upper pincer -->
36
+ <path
37
+ d="M320 112
38
+ C368 136 400 176 416 232
39
+ C432 288 424 352 392 400
40
+ L336 360
41
+ C356 328 364 288 352 248
42
+ C340 208 312 176 280 168
43
+ Z"
44
+ fill="url(#claw-gradient)"
45
+ />
46
+
47
+ <!-- Lower pincer - pointing down and in -->
48
+ <path
49
+ d="M200 360
50
+ C232 384 272 392 312 384
51
+ C352 376 384 352 392 400
52
+ L384 416
53
+ C344 440 296 448 248 432
54
+ C200 416 160 384 128 384
55
+ Z"
56
+ fill="url(#claw-gradient)"
57
+ />
58
+
59
+ <!-- Inner claw detail - the gap between pincers -->
60
+ <path
61
+ d="M280 200
62
+ C304 216 320 248 316 280
63
+ C312 312 292 340 264 352
64
+ L248 320
65
+ C264 312 276 292 276 272
66
+ C276 252 264 232 248 224
67
+ Z"
68
+ fill="#0a0a0a"
69
+ fill-opacity="0.3"
70
+ />
71
+
72
+ <!-- Highlight on upper curve -->
73
+ <path
74
+ d="M160 200
75
+ C176 152 216 120 264 112
76
+ C248 128 224 152 208 184
77
+ C192 216 184 248 176 264
78
+ C168 240 160 216 160 200
79
+ Z"
80
+ fill="white"
81
+ fill-opacity="0.2"
82
+ />
83
+ </g>
84
+ </svg>
@@ -0,0 +1,184 @@
1
+
2
+ <!DOCTYPE html>
3
+ <html>
4
+ <head>
5
+ <meta charset="UTF-8">
6
+ <style>
7
+ @import url('https://fonts.googleapis.com/css2?family=Inter:wght@400;600;800&display=swap');
8
+
9
+ * { margin: 0; padding: 0; box-sizing: border-box; }
10
+
11
+ body {
12
+ width: 1200px;
13
+ height: 630px;
14
+ background: linear-gradient(135deg, #0a0a0a 0%, #171717 100%);
15
+ font-family: 'Inter', system-ui, sans-serif;
16
+ display: flex;
17
+ flex-direction: column;
18
+ justify-content: center;
19
+ padding: 80px;
20
+ position: relative;
21
+ overflow: hidden;
22
+ }
23
+
24
+ /* Background pattern */
25
+ .pattern {
26
+ position: absolute;
27
+ top: 0;
28
+ left: 0;
29
+ right: 0;
30
+ bottom: 0;
31
+ background-image:
32
+ radial-gradient(circle at 20% 80%, rgba(239, 68, 68, 0.15) 0%, transparent 50%),
33
+ radial-gradient(circle at 80% 20%, rgba(239, 68, 68, 0.1) 0%, transparent 40%);
34
+ pointer-events: none;
35
+ }
36
+
37
+ /* Grid lines */
38
+ .grid {
39
+ position: absolute;
40
+ top: 0;
41
+ left: 0;
42
+ right: 0;
43
+ bottom: 0;
44
+ background-image:
45
+ linear-gradient(rgba(255,255,255,0.02) 1px, transparent 1px),
46
+ linear-gradient(90deg, rgba(255,255,255,0.02) 1px, transparent 1px);
47
+ background-size: 60px 60px;
48
+ pointer-events: none;
49
+ }
50
+
51
+ .content {
52
+ position: relative;
53
+ z-index: 1;
54
+ }
55
+
56
+ .logo-row {
57
+ display: flex;
58
+ align-items: center;
59
+ gap: 24px;
60
+ margin-bottom: 40px;
61
+ }
62
+
63
+ .logo {
64
+ width: 80px;
65
+ height: 80px;
66
+ background: linear-gradient(135deg, #f87171 0%, #dc2626 100%);
67
+ border-radius: 20px;
68
+ display: flex;
69
+ align-items: center;
70
+ justify-content: center;
71
+ font-size: 48px;
72
+ }
73
+
74
+ .brand {
75
+ font-size: 48px;
76
+ font-weight: 800;
77
+ color: #fafafa;
78
+ letter-spacing: -0.02em;
79
+ }
80
+
81
+ .tagline {
82
+ font-size: 56px;
83
+ font-weight: 800;
84
+ line-height: 1.2;
85
+ letter-spacing: -0.03em;
86
+ margin-bottom: 32px;
87
+ }
88
+
89
+ .tagline .gradient {
90
+ background: linear-gradient(135deg, #f87171 0%, #ef4444 50%, #fca5a5 100%);
91
+ -webkit-background-clip: text;
92
+ -webkit-text-fill-color: transparent;
93
+ background-clip: text;
94
+ }
95
+
96
+ .tagline .white {
97
+ color: #fafafa;
98
+ }
99
+
100
+ .subtitle {
101
+ font-size: 24px;
102
+ color: #a3a3a3;
103
+ max-width: 700px;
104
+ line-height: 1.5;
105
+ }
106
+
107
+ .footer {
108
+ position: absolute;
109
+ bottom: 60px;
110
+ left: 80px;
111
+ right: 80px;
112
+ display: flex;
113
+ justify-content: space-between;
114
+ align-items: center;
115
+ }
116
+
117
+ .stats {
118
+ display: flex;
119
+ gap: 48px;
120
+ }
121
+
122
+ .stat {
123
+ text-align: left;
124
+ }
125
+
126
+ .stat-value {
127
+ font-size: 32px;
128
+ font-weight: 800;
129
+ color: #ef4444;
130
+ }
131
+
132
+ .stat-label {
133
+ font-size: 14px;
134
+ color: #737373;
135
+ text-transform: uppercase;
136
+ letter-spacing: 0.1em;
137
+ }
138
+
139
+ .url {
140
+ font-size: 20px;
141
+ color: #525252;
142
+ font-weight: 500;
143
+ }
144
+ </style>
145
+ </head>
146
+ <body>
147
+ <div class="pattern"></div>
148
+ <div class="grid"></div>
149
+
150
+ <div class="content">
151
+ <div class="logo-row">
152
+ <div class="logo">🦞</div>
153
+ <div class="brand">APIClaw</div>
154
+ </div>
155
+
156
+ <h1 class="tagline">
157
+ <span class="gradient">The API layer</span><br>
158
+ <span class="white">for AI agents</span>
159
+ </h1>
160
+
161
+ <p class="subtitle">
162
+ Agents discover and evaluate APIs via MCP. Structured data. Ranked results. No more googling.
163
+ </p>
164
+ </div>
165
+
166
+ <div class="footer">
167
+ <div class="stats">
168
+ <div class="stat">
169
+ <div class="stat-value">1,400+</div>
170
+ <div class="stat-label">APIs</div>
171
+ </div>
172
+ <div class="stat">
173
+ <div class="stat-value">52</div>
174
+ <div class="stat-label">Categories</div>
175
+ </div>
176
+ <div class="stat">
177
+ <div class="stat-value">MCP</div>
178
+ <div class="stat-label">Native</div>
179
+ </div>
180
+ </div>
181
+ <div class="url">apiclaw.com</div>
182
+ </div>
183
+ </body>
184
+ </html>
@@ -0,0 +1,31 @@
1
+ {
2
+ "name": "APIClaw",
3
+ "short_name": "APIClaw",
4
+ "description": "The API layer for AI agents",
5
+ "start_url": "/",
6
+ "display": "standalone",
7
+ "background_color": "#0a0a0a",
8
+ "theme_color": "#ef4444",
9
+ "icons": [
10
+ {
11
+ "src": "/favicon-16x16.png",
12
+ "sizes": "16x16",
13
+ "type": "image/png"
14
+ },
15
+ {
16
+ "src": "/favicon-32x32.png",
17
+ "sizes": "32x32",
18
+ "type": "image/png"
19
+ },
20
+ {
21
+ "src": "/android-chrome-192x192.png",
22
+ "sizes": "192x192",
23
+ "type": "image/png"
24
+ },
25
+ {
26
+ "src": "/android-chrome-512x512.png",
27
+ "sizes": "512x512",
28
+ "type": "image/png"
29
+ }
30
+ ]
31
+ }