@adityanair98/api-oracle 0.5.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +216 -0
- package/dist/cli.d.ts +11 -0
- package/dist/cli.js +74 -0
- package/dist/dashboard/public/app.js +1004 -0
- package/dist/dashboard/public/index.html +142 -0
- package/dist/dashboard/public/public/app.js +1004 -0
- package/dist/dashboard/public/public/index.html +142 -0
- package/dist/dashboard/public/public/styles.css +1464 -0
- package/dist/dashboard/public/styles.css +1464 -0
- package/dist/dashboard/routes/api.d.ts +7 -0
- package/dist/dashboard/routes/api.js +245 -0
- package/dist/dashboard/server.d.ts +9 -0
- package/dist/dashboard/server.js +45 -0
- package/dist/index.d.ts +5 -0
- package/dist/index.js +23 -0
- package/dist/knowledge/db.d.ts +22 -0
- package/dist/knowledge/db.js +182 -0
- package/dist/knowledge/schema.d.ts +275 -0
- package/dist/knowledge/schema.js +135 -0
- package/dist/knowledge/scorer.d.ts +63 -0
- package/dist/knowledge/scorer.js +314 -0
- package/dist/knowledge/search.d.ts +37 -0
- package/dist/knowledge/search.js +111 -0
- package/dist/knowledge/synonyms.d.ts +36 -0
- package/dist/knowledge/synonyms.js +523 -0
- package/dist/knowledge/tfidf.d.ts +42 -0
- package/dist/knowledge/tfidf.js +138 -0
- package/dist/server.d.ts +9 -0
- package/dist/server.js +40 -0
- package/dist/tools/check-freshness.d.ts +9 -0
- package/dist/tools/check-freshness.js +95 -0
- package/dist/tools/compare-apis.d.ts +8 -0
- package/dist/tools/compare-apis.js +149 -0
- package/dist/tools/find-api.d.ts +9 -0
- package/dist/tools/find-api.js +120 -0
- package/dist/tools/get-setup-guide.d.ts +8 -0
- package/dist/tools/get-setup-guide.js +127 -0
- package/dist/updater/linter.d.ts +31 -0
- package/dist/updater/linter.js +219 -0
- package/dist/updater/report.d.ts +29 -0
- package/dist/updater/report.js +96 -0
- package/dist/updater/staleness.d.ts +39 -0
- package/dist/updater/staleness.js +66 -0
- package/dist/updater/version-tracker.d.ts +28 -0
- package/dist/updater/version-tracker.js +50 -0
- package/dist/utils/config.d.ts +11 -0
- package/dist/utils/config.js +13 -0
- package/dist/utils/logger.d.ts +20 -0
- package/dist/utils/logger.js +32 -0
- package/package.json +56 -0
- package/src/entries/ai/anthropic.json +95 -0
- package/src/entries/ai/eleven-labs.json +90 -0
- package/src/entries/ai/openai.json +95 -0
- package/src/entries/ai/replicate.json +87 -0
- package/src/entries/ai/resemble-ai.json +88 -0
- package/src/entries/ai/stability-ai.json +89 -0
- package/src/entries/analytics/posthog.json +88 -0
- package/src/entries/analytics/sentry.json +84 -0
- package/src/entries/auth/auth0.json +90 -0
- package/src/entries/auth/clerk.json +95 -0
- package/src/entries/cms/contentful.json +92 -0
- package/src/entries/cms/sanity.json +92 -0
- package/src/entries/cms/strapi.json +93 -0
- package/src/entries/commerce/medusa.json +91 -0
- package/src/entries/commerce/shopify-api.json +91 -0
- package/src/entries/communication/sendbird.json +85 -0
- package/src/entries/communication/stream-chat.json +94 -0
- package/src/entries/database/firebase.json +88 -0
- package/src/entries/database/neon.json +94 -0
- package/src/entries/database/planetscale.json +95 -0
- package/src/entries/database/supabase.json +94 -0
- package/src/entries/database/upstash.json +94 -0
- package/src/entries/devops/fly-io.json +90 -0
- package/src/entries/devops/netlify.json +90 -0
- package/src/entries/devops/railway.json +90 -0
- package/src/entries/devops/vercel.json +90 -0
- package/src/entries/email/mailgun.json +91 -0
- package/src/entries/email/postmark.json +91 -0
- package/src/entries/email/resend.json +89 -0
- package/src/entries/email/sendgrid.json +90 -0
- package/src/entries/forms/formspark.json +85 -0
- package/src/entries/forms/typeform.json +98 -0
- package/src/entries/infrastructure/aws-s3.json +104 -0
- package/src/entries/infrastructure/cloudflare-r2.json +92 -0
- package/src/entries/infrastructure/cloudflare-workers.json +92 -0
- package/src/entries/infrastructure/digital-ocean-spaces.json +87 -0
- package/src/entries/integration/nango.json +90 -0
- package/src/entries/integration/zapier.json +92 -0
- package/src/entries/maps/google-maps.json +89 -0
- package/src/entries/maps/mapbox.json +87 -0
- package/src/entries/media/deepgram.json +84 -0
- package/src/entries/media/imgix.json +84 -0
- package/src/entries/media/mux.json +94 -0
- package/src/entries/messaging/ably.json +94 -0
- package/src/entries/messaging/pusher.json +94 -0
- package/src/entries/messaging/twilio.json +94 -0
- package/src/entries/messaging/vonage.json +89 -0
- package/src/entries/notifications/knock.json +84 -0
- package/src/entries/notifications/novu.json +84 -0
- package/src/entries/notifications/onesignal.json +84 -0
- package/src/entries/payments/lemonsqueezy.json +91 -0
- package/src/entries/payments/paddle.json +90 -0
- package/src/entries/payments/paypal.json +91 -0
- package/src/entries/payments/razorpay.json +85 -0
- package/src/entries/payments/square.json +91 -0
- package/src/entries/payments/stripe.json +96 -0
- package/src/entries/scheduling/cal-com.json +90 -0
- package/src/entries/scheduling/calendly.json +90 -0
- package/src/entries/search/algolia.json +96 -0
- package/src/entries/security/arcjet.json +89 -0
- package/src/entries/security/snyk.json +90 -0
- package/src/entries/storage/cloudinary.json +93 -0
- package/src/entries/storage/uploadthing.json +90 -0
- package/src/entries/testing/browserstack.json +86 -0
- package/src/entries/testing/checkly.json +89 -0
- package/src/entries/workflow/inngest.json +88 -0
- package/src/entries/workflow/temporal.json +90 -0
- package/src/entries/workflow/trigger-dev.json +89 -0
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "Deepgram",
|
|
3
|
+
"slug": "deepgram",
|
|
4
|
+
"category": "media",
|
|
5
|
+
"subcategory": "speech-to-text",
|
|
6
|
+
"website": "https://deepgram.com",
|
|
7
|
+
"description": "Deepgram is a speech-to-text AI platform providing real-time and batch audio transcription with industry-leading accuracy, low latency, and competitive pricing. It supports 30+ languages, speaker diarization, punctuation, and custom vocabulary — making it the preferred choice over OpenAI Whisper for production audio transcription.",
|
|
8
|
+
"useCases": [
|
|
9
|
+
{
|
|
10
|
+
"task": "Transcribe audio and video files to text",
|
|
11
|
+
"fit": "perfect"
|
|
12
|
+
},
|
|
13
|
+
{
|
|
14
|
+
"task": "Add real-time speech-to-text to a voice application",
|
|
15
|
+
"fit": "perfect"
|
|
16
|
+
},
|
|
17
|
+
{
|
|
18
|
+
"task": "Transcribe meeting recordings with speaker identification",
|
|
19
|
+
"fit": "perfect"
|
|
20
|
+
},
|
|
21
|
+
{
|
|
22
|
+
"task": "Add voice commands to a web or mobile application",
|
|
23
|
+
"fit": "good"
|
|
24
|
+
}
|
|
25
|
+
],
|
|
26
|
+
"auth": {
|
|
27
|
+
"method": "api_key",
|
|
28
|
+
"setupSteps": [
|
|
29
|
+
"Sign up at deepgram.com",
|
|
30
|
+
"Go to the console and create a new API Key",
|
|
31
|
+
"Set the permissions (Member access is sufficient for most use cases)",
|
|
32
|
+
"Copy the API key immediately (it is only shown once)",
|
|
33
|
+
"Set DEEPGRAM_API_KEY environment variable"
|
|
34
|
+
],
|
|
35
|
+
"envVarName": "DEEPGRAM_API_KEY",
|
|
36
|
+
"codeSnippet": "import { createClient } from '@deepgram/sdk';\nconst deepgram = createClient(process.env.DEEPGRAM_API_KEY!);"
|
|
37
|
+
},
|
|
38
|
+
"pricing": {
|
|
39
|
+
"model": "usage_based",
|
|
40
|
+
"freeTier": "$200 in free credits on signup (no expiry on Nova models)",
|
|
41
|
+
"startingPrice": "$0.0043 per minute (Nova-2 model, pre-recorded)",
|
|
42
|
+
"costPer": "$0.0043/min pre-recorded; $0.0059/min real-time streaming; whisper model at $0.0048/min",
|
|
43
|
+
"pricingUrl": "https://deepgram.com/pricing"
|
|
44
|
+
},
|
|
45
|
+
"rateLimits": {
|
|
46
|
+
"tier": "default",
|
|
47
|
+
"limit": "100 concurrent connections; 100 requests/minute for pre-recorded",
|
|
48
|
+
"notes": "Rate limits are generous for most applications. Real-time connections count against concurrent limit. Contact support for higher limits.",
|
|
49
|
+
"retryStrategy": "Implement exponential backoff for 429 responses. For long audio files, consider chunking into segments if timeouts occur."
|
|
50
|
+
},
|
|
51
|
+
"sdk": {
|
|
52
|
+
"primaryLanguage": "typescript",
|
|
53
|
+
"installCommand": "npm install --save-exact @deepgram/sdk",
|
|
54
|
+
"importStatement": "import { createClient } from '@deepgram/sdk';",
|
|
55
|
+
"otherLanguages": ["python", "go", "dotnet", "rust"]
|
|
56
|
+
},
|
|
57
|
+
"codeExamples": [
|
|
58
|
+
{
|
|
59
|
+
"title": "Transcribe an audio file",
|
|
60
|
+
"language": "typescript",
|
|
61
|
+
"code": "import { createClient } from '@deepgram/sdk';\nimport { readFileSync } from 'fs';\n\nconst deepgram = createClient(process.env.DEEPGRAM_API_KEY!);\n\n// Transcribe from a URL\nconst { result, error } = await deepgram.listen.prerecorded.transcribeUrl(\n { url: 'https://example.com/meeting.mp3' },\n {\n model: 'nova-2',\n smart_format: true, // Add punctuation and capitalization\n diarize: true, // Identify different speakers\n paragraphs: true, // Group sentences into paragraphs\n language: 'en',\n }\n);\n\nif (error) throw new Error(error.message);\n\nconst transcript = result.results.channels[0]?.alternatives[0]?.transcript;\nconsole.log('Transcript:', transcript);\n\n// Speaker-labeled output\nfor (const word of result.results.channels[0]?.alternatives[0]?.words ?? []) {\n console.log(`[Speaker ${word.speaker}] ${word.word}`);\n}",
|
|
62
|
+
"notes": "Use 'nova-2' model for best accuracy. smart_format adds punctuation automatically. diarize splits transcript by speaker — useful for meeting notes."
|
|
63
|
+
}
|
|
64
|
+
],
|
|
65
|
+
"gotchas": [
|
|
66
|
+
"API keys are shown only once at creation. If you lose it, you must create a new one. Always save it to your password manager immediately after creation.",
|
|
67
|
+
"Audio files must be accessible via URL or uploaded as binary. Files on localhost are not accessible — use a public URL or the transcribeFile() method with a Buffer for local files.",
|
|
68
|
+
"The diarize option (speaker identification) adds latency to responses. For real-time transcription, skip diarization unless you specifically need it.",
|
|
69
|
+
"Deepgram's WebSocket real-time API requires careful connection management — you must keep the connection alive with KeepAlive messages and handle reconnection logic."
|
|
70
|
+
],
|
|
71
|
+
"reliability": {
|
|
72
|
+
"uptimeGuarantee": "99.9% uptime SLA on paid plans",
|
|
73
|
+
"statusPageUrl": "https://status.deepgram.com",
|
|
74
|
+
"notes": "Deepgram processes billions of minutes of audio. Global infrastructure with low latency. Significantly faster than batch-only alternatives."
|
|
75
|
+
},
|
|
76
|
+
"qualityScore": 8,
|
|
77
|
+
"qualityJustification": "Best speech-to-text API for production use with better accuracy than OpenAI Whisper at lower latency and competitive pricing. Excellent TypeScript SDK. $200 free credit is genuinely useful. Slightly less mainstream than Whisper, so fewer community examples.",
|
|
78
|
+
"alternatives": ["openai"],
|
|
79
|
+
"complementary": ["openai", "anthropic", "mux", "replicate"],
|
|
80
|
+
"bestFor": "Production speech-to-text transcription with speaker diarization, real-time streaming, and better accuracy than Whisper at competitive prices",
|
|
81
|
+
"lastVerified": "2026-02-25",
|
|
82
|
+
"entryVersion": 1,
|
|
83
|
+
"addedBy": "claude-code-session-2"
|
|
84
|
+
}
|
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "imgix",
|
|
3
|
+
"slug": "imgix",
|
|
4
|
+
"category": "media",
|
|
5
|
+
"subcategory": "image-processing",
|
|
6
|
+
"website": "https://imgix.com",
|
|
7
|
+
"description": "imgix is an image processing and CDN service that transforms, optimizes, and delivers images on-the-fly via URL parameters. Unlike Cloudinary, imgix works with your existing S3, GCS, or any origin server — it is a pure transformation and delivery layer, not a storage service.",
|
|
8
|
+
"useCases": [
|
|
9
|
+
{
|
|
10
|
+
"task": "Resize and transform images from S3 or existing storage on-the-fly",
|
|
11
|
+
"fit": "perfect"
|
|
12
|
+
},
|
|
13
|
+
{
|
|
14
|
+
"task": "Automatically convert images to WebP or AVIF for web performance",
|
|
15
|
+
"fit": "perfect"
|
|
16
|
+
},
|
|
17
|
+
{
|
|
18
|
+
"task": "Serve responsive images with srcset and different sizes",
|
|
19
|
+
"fit": "perfect"
|
|
20
|
+
},
|
|
21
|
+
{
|
|
22
|
+
"task": "Upload and store images with built-in management",
|
|
23
|
+
"fit": "partial"
|
|
24
|
+
}
|
|
25
|
+
],
|
|
26
|
+
"auth": {
|
|
27
|
+
"method": "api_key",
|
|
28
|
+
"setupSteps": [
|
|
29
|
+
"Sign up at imgix.com",
|
|
30
|
+
"Create a new Source pointing to your S3 bucket or storage origin",
|
|
31
|
+
"Note your subdomain (e.g., your-company.imgix.net)",
|
|
32
|
+
"For secure URLs, find your API Key in Settings",
|
|
33
|
+
"Set IMGIX_TOKEN and IMGIX_DOMAIN environment variables"
|
|
34
|
+
],
|
|
35
|
+
"envVarName": "IMGIX_TOKEN",
|
|
36
|
+
"codeSnippet": "import ImgixClient from '@imgix/js-core';\nconst client = new ImgixClient({\n domain: process.env.IMGIX_DOMAIN!,\n secureURLToken: process.env.IMGIX_TOKEN,\n});"
|
|
37
|
+
},
|
|
38
|
+
"pricing": {
|
|
39
|
+
"model": "freemium",
|
|
40
|
+
"freeTier": "1,000 master images, 25GB bandwidth/month",
|
|
41
|
+
"startingPrice": "$100/month (Starter plan)",
|
|
42
|
+
"costPer": "Starter: up to 100GB bandwidth; Growth: $300/month for 500GB; Enterprise custom",
|
|
43
|
+
"pricingUrl": "https://imgix.com/pricing"
|
|
44
|
+
},
|
|
45
|
+
"rateLimits": {
|
|
46
|
+
"tier": "all tiers",
|
|
47
|
+
"limit": "No rate limit on image delivery (CDN); Management API has standard limits",
|
|
48
|
+
"notes": "Image transformations are cached at the CDN edge. No per-transformation charge — only bandwidth counts.",
|
|
49
|
+
"retryStrategy": "CDN delivery is highly available. Implement fallback to source URL if imgix is unavailable."
|
|
50
|
+
},
|
|
51
|
+
"sdk": {
|
|
52
|
+
"primaryLanguage": "typescript",
|
|
53
|
+
"installCommand": "npm install --save-exact @imgix/js-core",
|
|
54
|
+
"importStatement": "import ImgixClient from '@imgix/js-core';",
|
|
55
|
+
"otherLanguages": ["python", "ruby", "php", "java", "go"]
|
|
56
|
+
},
|
|
57
|
+
"codeExamples": [
|
|
58
|
+
{
|
|
59
|
+
"title": "Generate a transformed image URL",
|
|
60
|
+
"language": "typescript",
|
|
61
|
+
"code": "import ImgixClient from '@imgix/js-core';\n\nconst client = new ImgixClient({\n domain: 'your-company.imgix.net',\n secureURLToken: process.env.IMGIX_TOKEN,\n});\n\n// Generate URL for a 800x600 WebP image\nconst url = client.buildURL('path/to/image.jpg', {\n w: 800,\n h: 600,\n fit: 'crop',\n auto: 'format,compress', // Auto WebP/AVIF + compression\n q: 80,\n});\n\nconsole.log('Transformed URL:', url);\n// https://your-company.imgix.net/path/to/image.jpg?w=800&h=600&fit=crop&auto=format%2Ccompress&q=80&s=...\n\n// Generate a srcset for responsive images\nconst srcSet = client.buildSrcSet('path/to/image.jpg', {\n auto: 'format,compress',\n fit: 'max',\n});\nconsole.log('srcSet:', srcSet);",
|
|
62
|
+
"notes": "The secureURLToken signs URLs to prevent unauthorized transformations. Always use signed URLs in production. auto=format serves WebP to browsers that support it, AVIF where available."
|
|
63
|
+
}
|
|
64
|
+
],
|
|
65
|
+
"gotchas": [
|
|
66
|
+
"imgix is a transformation and delivery layer, not storage. You must already have your images stored somewhere (S3, GCS, a URL) — imgix points to your origin and transforms images on the way out. This means setup requires configuring your storage first.",
|
|
67
|
+
"imgix pricing starts at $100/month — significantly higher than Cloudinary's free tier. For small projects or prototypes, Cloudinary is much more accessible.",
|
|
68
|
+
"Unsigned URLs can be tampered with by anyone to request any transformation at your bandwidth cost. Always enable URL signing (secureURLToken) in production.",
|
|
69
|
+
"The free trial has a 'master image' limit — each unique source image path counts as one master. If you have more than 1,000 unique images, you'll exceed the trial."
|
|
70
|
+
],
|
|
71
|
+
"reliability": {
|
|
72
|
+
"uptimeGuarantee": "99.9% SLA on all paid plans",
|
|
73
|
+
"statusPageUrl": "https://status.imgix.com",
|
|
74
|
+
"notes": "imgix uses a global CDN with 280+ PoPs. Images are cached at edge nodes after first transformation. Very high reliability for production use."
|
|
75
|
+
},
|
|
76
|
+
"qualityScore": 7,
|
|
77
|
+
"qualityJustification": "Excellent image processing quality with powerful URL-based transformations and a reliable CDN. Works with your existing storage (no lock-in). However, pricing starts at $100/month with no meaningful free tier, making it inaccessible for small teams. Cloudinary is better for most use cases due to the free tier.",
|
|
78
|
+
"alternatives": ["cloudinary"],
|
|
79
|
+
"complementary": ["cloudinary", "uploadthing", "supabase", "mux"],
|
|
80
|
+
"bestFor": "Image transformation and CDN delivery for teams already using S3 or GCS who need URL-based transformations without migrating storage",
|
|
81
|
+
"lastVerified": "2026-02-25",
|
|
82
|
+
"entryVersion": 1,
|
|
83
|
+
"addedBy": "claude-code-session-2"
|
|
84
|
+
}
|
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "Mux",
|
|
3
|
+
"slug": "mux",
|
|
4
|
+
"category": "media",
|
|
5
|
+
"subcategory": "video-streaming",
|
|
6
|
+
"website": "https://www.mux.com",
|
|
7
|
+
"description": "Mux is a developer-first video API platform for uploading, storing, encoding, and streaming video. It handles adaptive bitrate streaming (HLS), video-on-demand, live streaming, and real-time video — making it the standard choice for course platforms, social video, and any application that needs reliable video delivery at scale.",
|
|
8
|
+
"useCases": [
|
|
9
|
+
{
|
|
10
|
+
"task": "Stream video-on-demand content to users globally",
|
|
11
|
+
"fit": "perfect"
|
|
12
|
+
},
|
|
13
|
+
{
|
|
14
|
+
"task": "Build a course platform with video lessons",
|
|
15
|
+
"fit": "perfect"
|
|
16
|
+
},
|
|
17
|
+
{
|
|
18
|
+
"task": "Upload and process user-generated video content",
|
|
19
|
+
"fit": "perfect"
|
|
20
|
+
},
|
|
21
|
+
{
|
|
22
|
+
"task": "Add live streaming to an application",
|
|
23
|
+
"fit": "perfect"
|
|
24
|
+
},
|
|
25
|
+
{
|
|
26
|
+
"task": "Generate video thumbnails and previews",
|
|
27
|
+
"fit": "good"
|
|
28
|
+
}
|
|
29
|
+
],
|
|
30
|
+
"auth": {
|
|
31
|
+
"method": "basic_auth",
|
|
32
|
+
"setupSteps": [
|
|
33
|
+
"Sign up at mux.com",
|
|
34
|
+
"Go to Settings > Access Tokens",
|
|
35
|
+
"Create a new access token with Full Access or Environment-specific permissions",
|
|
36
|
+
"Copy the Token ID and Token Secret",
|
|
37
|
+
"Set MUX_TOKEN_ID and MUX_TOKEN_SECRET environment variables"
|
|
38
|
+
],
|
|
39
|
+
"envVarName": "MUX_TOKEN_SECRET",
|
|
40
|
+
"codeSnippet": "import Mux from '@mux/mux-node';\nconst mux = new Mux({\n tokenId: process.env.MUX_TOKEN_ID!,\n tokenSecret: process.env.MUX_TOKEN_SECRET!,\n});"
|
|
41
|
+
},
|
|
42
|
+
"pricing": {
|
|
43
|
+
"model": "usage_based",
|
|
44
|
+
"freeTier": "No permanent free tier; $20 free credit on signup",
|
|
45
|
+
"startingPrice": "$0.015 per minute of video stored; $0.005 per minute delivered",
|
|
46
|
+
"costPer": "Storage: $0.015/min/month; Delivery: $0.005/min; Encoding: $0.015/min input",
|
|
47
|
+
"pricingUrl": "https://www.mux.com/pricing"
|
|
48
|
+
},
|
|
49
|
+
"rateLimits": {
|
|
50
|
+
"tier": "all tiers",
|
|
51
|
+
"limit": "No documented hard rate limits for uploads/delivery",
|
|
52
|
+
"notes": "Mux uses a CDN for delivery — no rate limits on video streaming. API rate limits for management operations are generous. Contact support for high-volume upload scenarios.",
|
|
53
|
+
"retryStrategy": "Implement retry with exponential backoff for API calls. For upload failures, resume uploads using Mux's direct upload URL (valid for 24 hours)."
|
|
54
|
+
},
|
|
55
|
+
"sdk": {
|
|
56
|
+
"primaryLanguage": "typescript",
|
|
57
|
+
"installCommand": "npm install --save-exact @mux/mux-node @mux/mux-player-react",
|
|
58
|
+
"importStatement": "import Mux from '@mux/mux-node';\nimport MuxPlayer from '@mux/mux-player-react';",
|
|
59
|
+
"otherLanguages": ["python", "ruby", "go", "php"]
|
|
60
|
+
},
|
|
61
|
+
"codeExamples": [
|
|
62
|
+
{
|
|
63
|
+
"title": "Create an asset from a URL and get playback ID",
|
|
64
|
+
"language": "typescript",
|
|
65
|
+
"code": "import Mux from '@mux/mux-node';\n\nconst mux = new Mux({\n tokenId: process.env.MUX_TOKEN_ID!,\n tokenSecret: process.env.MUX_TOKEN_SECRET!,\n});\n\n// Create an asset by providing a video URL\nconst asset = await mux.video.assets.create({\n input: [{ url: 'https://example.com/video.mp4' }],\n playback_policy: ['public'],\n video_quality: 'basic',\n});\n\nconsole.log('Asset ID:', asset.id);\nconsole.log('Status:', asset.status); // 'preparing' initially\n\n// Playback ID for streaming (available once status is 'ready')\nconst playbackId = asset.playback_ids?.[0]?.id;\nconsole.log('Playback URL:', `https://stream.mux.com/${playbackId}.m3u8`);",
|
|
66
|
+
"notes": "Assets take time to process (encoding). Listen for the 'video.asset.ready' webhook to know when it's ready for playback. Use the playback_ids[0].id for the player URL."
|
|
67
|
+
},
|
|
68
|
+
{
|
|
69
|
+
"title": "Embed Mux Player in React",
|
|
70
|
+
"language": "typescript",
|
|
71
|
+
"code": "import MuxPlayer from '@mux/mux-player-react';\n\nexport function VideoPlayer({ playbackId }: { playbackId: string }) {\n return (\n <MuxPlayer\n playbackId={playbackId}\n metadata={{\n video_id: playbackId,\n video_title: 'My Video',\n viewer_user_id: 'user-123',\n }}\n accentColor=\"#7c3aed\"\n autoPlay={false}\n style={{ width: '100%', aspectRatio: '16/9' }}\n />\n );\n}",
|
|
72
|
+
"notes": "MuxPlayer is a customizable React video player that handles HLS streaming, quality selection, and analytics automatically. The metadata fields feed into Mux Data (real-time analytics)."
|
|
73
|
+
}
|
|
74
|
+
],
|
|
75
|
+
"gotchas": [
|
|
76
|
+
"Video assets go through a 'preparing' state after upload. You cannot stream a video until it reaches 'ready' status. Always implement webhook handling for 'video.asset.ready' events rather than polling.",
|
|
77
|
+
"Mux pricing is based on minutes of video — both stored and delivered. A 10-hour course with 1,000 students watching = 600,000 minutes/month. Calculate expected costs carefully before launch.",
|
|
78
|
+
"Direct uploads (client-side) require a two-step process: first create a direct upload URL from your server, then upload the file directly from the browser to that URL. Never proxy large video uploads through your server.",
|
|
79
|
+
"Signed playback URLs are required for private content. If you set playback_policy to 'signed', viewers need a JWT token to play the video. Set up signed URL generation on your server before going to production with private content."
|
|
80
|
+
],
|
|
81
|
+
"reliability": {
|
|
82
|
+
"uptimeGuarantee": "99.9% uptime SLA",
|
|
83
|
+
"statusPageUrl": "https://status.mux.com",
|
|
84
|
+
"notes": "Mux uses a global CDN for video delivery. Video encoding is handled asynchronously with webhook notifications. Used by Substack, Linear, and Beehiiv."
|
|
85
|
+
},
|
|
86
|
+
"qualityScore": 9,
|
|
87
|
+
"qualityJustification": "Best-in-class video API with excellent TypeScript SDK, pre-built React player component, and real-time analytics. The developer experience is exceptional — upload a URL, get a streaming URL in minutes. No permanent free tier is the main barrier for prototyping.",
|
|
88
|
+
"alternatives": ["cloudinary"],
|
|
89
|
+
"complementary": ["cloudinary", "uploadthing", "stripe", "imgix"],
|
|
90
|
+
"bestFor": "Video streaming for course platforms, social video apps, and any application requiring reliable adaptive bitrate video delivery",
|
|
91
|
+
"lastVerified": "2026-02-25",
|
|
92
|
+
"entryVersion": 1,
|
|
93
|
+
"addedBy": "claude-code-session-2"
|
|
94
|
+
}
|
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "Ably",
|
|
3
|
+
"slug": "ably",
|
|
4
|
+
"category": "messaging",
|
|
5
|
+
"subcategory": "realtime-messaging",
|
|
6
|
+
"website": "https://ably.com",
|
|
7
|
+
"description": "Ably is a real-time messaging platform built for mission-critical applications. Unlike simpler WebSocket services, Ably provides guaranteed message delivery, message history, fan-out at scale, and a pub/sub infrastructure with ordering guarantees — making it suitable for financial data, collaborative tools, and live commerce.",
|
|
8
|
+
"useCases": [
|
|
9
|
+
{
|
|
10
|
+
"task": "Build real-time collaborative features with guaranteed message delivery",
|
|
11
|
+
"fit": "perfect"
|
|
12
|
+
},
|
|
13
|
+
{
|
|
14
|
+
"task": "Stream live data feeds (stock prices, sports scores, IoT)",
|
|
15
|
+
"fit": "perfect"
|
|
16
|
+
},
|
|
17
|
+
{
|
|
18
|
+
"task": "Add real-time notifications with message history",
|
|
19
|
+
"fit": "perfect"
|
|
20
|
+
},
|
|
21
|
+
{
|
|
22
|
+
"task": "Build presence systems showing who is online",
|
|
23
|
+
"fit": "perfect"
|
|
24
|
+
},
|
|
25
|
+
{
|
|
26
|
+
"task": "Simple real-time notifications for a small app",
|
|
27
|
+
"fit": "good"
|
|
28
|
+
}
|
|
29
|
+
],
|
|
30
|
+
"auth": {
|
|
31
|
+
"method": "api_key",
|
|
32
|
+
"setupSteps": [
|
|
33
|
+
"Sign up at ably.com",
|
|
34
|
+
"Create an app in the Ably dashboard",
|
|
35
|
+
"Go to the API Keys section of your app",
|
|
36
|
+
"Copy the default API key (or create a new scoped key)",
|
|
37
|
+
"Set ABLY_API_KEY environment variable"
|
|
38
|
+
],
|
|
39
|
+
"envVarName": "ABLY_API_KEY",
|
|
40
|
+
"codeSnippet": "import Ably from 'ably';\nconst client = new Ably.Realtime({ key: process.env.ABLY_API_KEY! });"
|
|
41
|
+
},
|
|
42
|
+
"pricing": {
|
|
43
|
+
"model": "freemium",
|
|
44
|
+
"freeTier": "200 concurrent connections, 6M messages/month",
|
|
45
|
+
"startingPrice": "$29/month for 500 connections, 30M messages/month",
|
|
46
|
+
"costPer": "Overage: $2.50 per million additional messages",
|
|
47
|
+
"pricingUrl": "https://ably.com/pricing"
|
|
48
|
+
},
|
|
49
|
+
"rateLimits": {
|
|
50
|
+
"tier": "free tier",
|
|
51
|
+
"limit": "200 concurrent connections, 6M messages/month",
|
|
52
|
+
"notes": "Ably enforces rate limits per channel and per connection. Message size limit is 64KB. History retention varies by plan.",
|
|
53
|
+
"retryStrategy": "Ably SDK handles reconnection and message continuity automatically. It resumes subscriptions after reconnection and can replay missed messages from history."
|
|
54
|
+
},
|
|
55
|
+
"sdk": {
|
|
56
|
+
"primaryLanguage": "typescript",
|
|
57
|
+
"installCommand": "npm install --save-exact ably",
|
|
58
|
+
"importStatement": "import Ably from 'ably';",
|
|
59
|
+
"otherLanguages": ["python", "java", "ruby", "php", "go", "swift", "android", "dotnet"]
|
|
60
|
+
},
|
|
61
|
+
"codeExamples": [
|
|
62
|
+
{
|
|
63
|
+
"title": "Publish and subscribe to a channel",
|
|
64
|
+
"language": "typescript",
|
|
65
|
+
"code": "import Ably from 'ably';\n\nconst client = new Ably.Realtime({ key: process.env.ABLY_API_KEY! });\n\n// Subscribe to a channel\nconst channel = client.channels.get('live-scores');\n\nawait channel.subscribe('score-update', (message) => {\n const data = message.data as { team: string; score: number };\n console.log(`${data.team}: ${data.score}`);\n});\n\n// Publish an event\nawait channel.publish('score-update', {\n team: 'Team A',\n score: 3,\n});\n\nconsole.log('Subscribed and published');",
|
|
66
|
+
"notes": "Ably channels are created on first use. The same API key can be used for both publishing and subscribing. For production, use token authentication instead of API keys in client code."
|
|
67
|
+
},
|
|
68
|
+
{
|
|
69
|
+
"title": "Retrieve message history",
|
|
70
|
+
"language": "typescript",
|
|
71
|
+
"code": "import Ably from 'ably';\n\nconst client = new Ably.Realtime({ key: process.env.ABLY_API_KEY! });\nconst channel = client.channels.get('live-scores');\n\n// Get last 50 messages from history\nconst historyPage = await channel.history({ limit: 50 });\n\nfor (const message of historyPage.items) {\n console.log(`[${message.timestamp}] ${message.name}:`, message.data);\n}\n\n// Check if there are more pages\nif (historyPage.hasNext()) {\n const nextPage = await historyPage.next();\n console.log('More messages:', nextPage?.items.length);\n}",
|
|
72
|
+
"notes": "Message history retention depends on your plan. Free tier retains 2 minutes; paid plans can retain up to 72 hours. History is key for catching up after reconnection."
|
|
73
|
+
}
|
|
74
|
+
],
|
|
75
|
+
"gotchas": [
|
|
76
|
+
"Never embed API keys in client-side code for production apps. API keys have full publish/subscribe permissions. Use Ably Token Authentication: your server generates short-lived tokens that the client uses instead.",
|
|
77
|
+
"Message ordering is guaranteed per channel, but only within a single connection. If you have multiple publishers, messages may interleave. Use sequence numbers or vector clocks if strict ordering across publishers matters.",
|
|
78
|
+
"Ably's free tier (6M messages/month) sounds generous but a busy real-time app can exhaust this quickly. 1 user checking a live feed every 5 seconds = ~500k messages/month.",
|
|
79
|
+
"Connection state changes (connected, disconnected, suspended) must be handled explicitly. The SDK emits state change events — listen to them and update your UI accordingly."
|
|
80
|
+
],
|
|
81
|
+
"reliability": {
|
|
82
|
+
"uptimeGuarantee": "99.999% uptime SLA",
|
|
83
|
+
"statusPageUrl": "https://status.ably.com",
|
|
84
|
+
"notes": "Ably provides global message ordering guarantees and exactly-once delivery semantics. Built for financial and mission-critical workloads. 15+ global data centers."
|
|
85
|
+
},
|
|
86
|
+
"qualityScore": 8,
|
|
87
|
+
"qualityJustification": "The most feature-complete real-time messaging platform with genuine delivery guarantees and message history. More complex than Pusher but offers stronger reliability primitives. Excellent TypeScript SDK. Free tier is the most generous in the category. Slightly higher complexity ceiling than Pusher.",
|
|
88
|
+
"alternatives": ["pusher", "stream-chat"],
|
|
89
|
+
"complementary": ["supabase", "clerk", "stream-chat"],
|
|
90
|
+
"bestFor": "Mission-critical real-time messaging with guaranteed delivery, message history, and presence — where dropped messages are unacceptable",
|
|
91
|
+
"lastVerified": "2026-02-25",
|
|
92
|
+
"entryVersion": 1,
|
|
93
|
+
"addedBy": "claude-code-session-2"
|
|
94
|
+
}
|
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "Pusher Channels",
|
|
3
|
+
"slug": "pusher",
|
|
4
|
+
"category": "messaging",
|
|
5
|
+
"subcategory": "realtime-websockets",
|
|
6
|
+
"website": "https://pusher.com/channels",
|
|
7
|
+
"description": "Pusher Channels is a hosted WebSocket service that enables real-time bidirectional communication between servers and clients. It abstracts away WebSocket infrastructure complexity, making it trivial to add live updates, notifications, collaborative features, and real-time dashboards to any web or mobile application.",
|
|
8
|
+
"useCases": [
|
|
9
|
+
{
|
|
10
|
+
"task": "Add real-time notifications to a web application",
|
|
11
|
+
"fit": "perfect"
|
|
12
|
+
},
|
|
13
|
+
{
|
|
14
|
+
"task": "Build a live chat feature in a web app",
|
|
15
|
+
"fit": "perfect"
|
|
16
|
+
},
|
|
17
|
+
{
|
|
18
|
+
"task": "Push live dashboard updates without polling",
|
|
19
|
+
"fit": "perfect"
|
|
20
|
+
},
|
|
21
|
+
{
|
|
22
|
+
"task": "Add collaborative editing or presence indicators",
|
|
23
|
+
"fit": "good"
|
|
24
|
+
},
|
|
25
|
+
{
|
|
26
|
+
"task": "Full-featured chat application with history",
|
|
27
|
+
"fit": "partial"
|
|
28
|
+
}
|
|
29
|
+
],
|
|
30
|
+
"auth": {
|
|
31
|
+
"method": "api_key",
|
|
32
|
+
"setupSteps": [
|
|
33
|
+
"Sign up at pusher.com",
|
|
34
|
+
"Create a new Channels app in the dashboard",
|
|
35
|
+
"Select your cluster (region closest to your users)",
|
|
36
|
+
"Copy App ID, Key, Secret, and Cluster from the app's API Keys tab",
|
|
37
|
+
"Set PUSHER_APP_ID, PUSHER_KEY, PUSHER_SECRET, PUSHER_CLUSTER environment variables"
|
|
38
|
+
],
|
|
39
|
+
"envVarName": "PUSHER_SECRET",
|
|
40
|
+
"codeSnippet": "import Pusher from 'pusher';\nconst pusher = new Pusher({\n appId: process.env.PUSHER_APP_ID!,\n key: process.env.PUSHER_KEY!,\n secret: process.env.PUSHER_SECRET!,\n cluster: process.env.PUSHER_CLUSTER!,\n useTLS: true,\n});"
|
|
41
|
+
},
|
|
42
|
+
"pricing": {
|
|
43
|
+
"model": "freemium",
|
|
44
|
+
"freeTier": "200 max connections, 200k messages/day, unlimited channels",
|
|
45
|
+
"startingPrice": "$49/month for 500 connections, 3M messages/day",
|
|
46
|
+
"costPer": "Varies by plan; no per-message charge within plan limits",
|
|
47
|
+
"pricingUrl": "https://pusher.com/channels/pricing"
|
|
48
|
+
},
|
|
49
|
+
"rateLimits": {
|
|
50
|
+
"tier": "free tier",
|
|
51
|
+
"limit": "200 concurrent connections, 200,000 messages/day, 100 channels per connection",
|
|
52
|
+
"notes": "Message size limit is 10KB. Exceeding limits causes messages to be dropped. Monitor usage in the dashboard.",
|
|
53
|
+
"retryStrategy": "Pusher client SDK handles reconnection automatically with exponential backoff. Server-side publishing failures should be retried with backoff."
|
|
54
|
+
},
|
|
55
|
+
"sdk": {
|
|
56
|
+
"primaryLanguage": "typescript",
|
|
57
|
+
"installCommand": "npm install --save-exact pusher pusher-js",
|
|
58
|
+
"importStatement": "import Pusher from 'pusher'; // Server\nimport PusherClient from 'pusher-js'; // Client (browser)",
|
|
59
|
+
"otherLanguages": ["python", "ruby", "php", "java", "go", "swift", "android"]
|
|
60
|
+
},
|
|
61
|
+
"codeExamples": [
|
|
62
|
+
{
|
|
63
|
+
"title": "Trigger an event from the server",
|
|
64
|
+
"language": "typescript",
|
|
65
|
+
"code": "// Server-side: trigger an event\nimport Pusher from 'pusher';\n\nconst pusher = new Pusher({\n appId: process.env.PUSHER_APP_ID!,\n key: process.env.PUSHER_KEY!,\n secret: process.env.PUSHER_SECRET!,\n cluster: process.env.PUSHER_CLUSTER!,\n useTLS: true,\n});\n\n// Trigger 'new-order' event on 'orders' channel\nawait pusher.trigger('orders', 'new-order', {\n orderId: 'order_123',\n customerName: 'Jane Smith',\n amount: 49.99,\n});\n\nconsole.log('Event triggered');",
|
|
66
|
+
"notes": "Channel names can be anything. Event names are arbitrary strings. Both server and client must use the same channel name and event name."
|
|
67
|
+
},
|
|
68
|
+
{
|
|
69
|
+
"title": "Subscribe and receive events in the browser",
|
|
70
|
+
"language": "typescript",
|
|
71
|
+
"code": "// Client-side (browser/React)\nimport PusherClient from 'pusher-js';\n\nconst pusher = new PusherClient(process.env.NEXT_PUBLIC_PUSHER_KEY!, {\n cluster: process.env.NEXT_PUBLIC_PUSHER_CLUSTER!,\n});\n\nconst channel = pusher.subscribe('orders');\n\nchannel.bind('new-order', (data: { orderId: string; customerName: string; amount: number }) => {\n console.log('New order received:', data);\n // Update UI in real-time\n});\n\n// Clean up on component unmount\nreturn () => {\n channel.unbind_all();\n pusher.unsubscribe('orders');\n};",
|
|
72
|
+
"notes": "Use NEXT_PUBLIC_ prefix for Pusher Key and Cluster in Next.js (they're safe to expose client-side). Never expose your Pusher Secret in the browser."
|
|
73
|
+
}
|
|
74
|
+
],
|
|
75
|
+
"gotchas": [
|
|
76
|
+
"The Pusher Key (public) is safe to expose in the browser, but the Pusher Secret must stay server-side only. A common mistake is exposing the Secret in Next.js client components via NEXT_PUBLIC_ env vars.",
|
|
77
|
+
"Message size is limited to 10KB. If you need to send large payloads (e.g., full documents), send an event with a reference ID and have the client fetch the full data from your API.",
|
|
78
|
+
"Pusher does not persist messages. If a client is disconnected when a message is triggered, they miss it. For guaranteed delivery, implement a separate persistence layer (database) and allow clients to catch up on reconnection.",
|
|
79
|
+
"The free tier's 200 concurrent connection limit is per-app, not per-user. A single user with multiple browser tabs counts as multiple connections."
|
|
80
|
+
],
|
|
81
|
+
"reliability": {
|
|
82
|
+
"uptimeGuarantee": "99.999% uptime SLA on paid plans",
|
|
83
|
+
"statusPageUrl": "https://status.pusher.com",
|
|
84
|
+
"notes": "Pusher has multiple global clusters (us-east, eu-west, ap-southeast, etc.). Choose the cluster nearest to your users for lowest latency."
|
|
85
|
+
},
|
|
86
|
+
"qualityScore": 8,
|
|
87
|
+
"qualityJustification": "Best-in-class ease of use for real-time WebSocket messaging. Setup takes minutes, documentation is excellent, and the free tier is generous for prototyping. Primary limitation is lack of message persistence. For full-featured chat, Stream or Ably may be better choices.",
|
|
88
|
+
"alternatives": ["ably"],
|
|
89
|
+
"complementary": ["supabase", "clerk", "resend"],
|
|
90
|
+
"bestFor": "Adding real-time events and live updates to web apps without managing WebSocket infrastructure",
|
|
91
|
+
"lastVerified": "2026-02-25",
|
|
92
|
+
"entryVersion": 1,
|
|
93
|
+
"addedBy": "claude-code-session-2"
|
|
94
|
+
}
|
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "Twilio",
|
|
3
|
+
"slug": "twilio",
|
|
4
|
+
"category": "messaging",
|
|
5
|
+
"subcategory": "sms-voice-whatsapp",
|
|
6
|
+
"website": "https://www.twilio.com",
|
|
7
|
+
"description": "Twilio is the leading cloud communications platform, providing APIs for SMS, voice calls, WhatsApp, email (via SendGrid), and video. It is the industry standard for programmatic communications and powers messaging features for millions of applications worldwide.",
|
|
8
|
+
"useCases": [
|
|
9
|
+
{
|
|
10
|
+
"task": "Send SMS notifications and alerts to users",
|
|
11
|
+
"fit": "perfect"
|
|
12
|
+
},
|
|
13
|
+
{
|
|
14
|
+
"task": "Implement two-factor authentication via SMS",
|
|
15
|
+
"fit": "perfect"
|
|
16
|
+
},
|
|
17
|
+
{
|
|
18
|
+
"task": "Send WhatsApp messages programmatically",
|
|
19
|
+
"fit": "perfect"
|
|
20
|
+
},
|
|
21
|
+
{
|
|
22
|
+
"task": "Build voice call systems and IVR menus",
|
|
23
|
+
"fit": "perfect"
|
|
24
|
+
},
|
|
25
|
+
{
|
|
26
|
+
"task": "Send transactional emails",
|
|
27
|
+
"fit": "partial"
|
|
28
|
+
}
|
|
29
|
+
],
|
|
30
|
+
"auth": {
|
|
31
|
+
"method": "basic_auth",
|
|
32
|
+
"setupSteps": [
|
|
33
|
+
"Sign up at twilio.com",
|
|
34
|
+
"Verify your phone number",
|
|
35
|
+
"Go to the Console Dashboard to find your Account SID and Auth Token",
|
|
36
|
+
"Purchase a phone number from the Twilio Console (required for sending SMS)",
|
|
37
|
+
"Set TWILIO_ACCOUNT_SID, TWILIO_AUTH_TOKEN, and TWILIO_PHONE_NUMBER environment variables"
|
|
38
|
+
],
|
|
39
|
+
"envVarName": "TWILIO_AUTH_TOKEN",
|
|
40
|
+
"codeSnippet": "import twilio from 'twilio';\nconst client = twilio(process.env.TWILIO_ACCOUNT_SID!, process.env.TWILIO_AUTH_TOKEN!);"
|
|
41
|
+
},
|
|
42
|
+
"pricing": {
|
|
43
|
+
"model": "usage_based",
|
|
44
|
+
"freeTier": "Free trial with $15 credit (unverified numbers only)",
|
|
45
|
+
"startingPrice": "$0.0079 per SMS (US); phone number $1.15/month",
|
|
46
|
+
"costPer": "$0.0079/SMS outbound (US); $0.0085 inbound; voice $0.014/min",
|
|
47
|
+
"pricingUrl": "https://www.twilio.com/en-us/sms/pricing/us"
|
|
48
|
+
},
|
|
49
|
+
"rateLimits": {
|
|
50
|
+
"tier": "default",
|
|
51
|
+
"limit": "1 SMS/second per long code number; 100 SMS/second with short codes",
|
|
52
|
+
"notes": "Long code numbers (regular phone numbers) are rate-limited. For high-volume campaigns, use short codes or Twilio Messaging Services with multiple numbers.",
|
|
53
|
+
"retryStrategy": "Use Twilio Messaging Services for automatic throughput scaling; implement exponential backoff for 429 responses"
|
|
54
|
+
},
|
|
55
|
+
"sdk": {
|
|
56
|
+
"primaryLanguage": "typescript",
|
|
57
|
+
"installCommand": "npm install --save-exact twilio",
|
|
58
|
+
"importStatement": "import twilio from 'twilio';",
|
|
59
|
+
"otherLanguages": ["python", "java", "ruby", "php", "csharp", "go"]
|
|
60
|
+
},
|
|
61
|
+
"codeExamples": [
|
|
62
|
+
{
|
|
63
|
+
"title": "Send an SMS",
|
|
64
|
+
"language": "typescript",
|
|
65
|
+
"code": "import twilio from 'twilio';\n\nconst client = twilio(\n process.env.TWILIO_ACCOUNT_SID!,\n process.env.TWILIO_AUTH_TOKEN!\n);\n\nconst message = await client.messages.create({\n body: 'Your verification code is: 847291',\n from: process.env.TWILIO_PHONE_NUMBER!, // Your Twilio number\n to: '+14155551234', // Recipient number (E.164 format)\n});\n\nconsole.log('Message SID:', message.sid);\nconsole.log('Status:', message.status);",
|
|
66
|
+
"notes": "Phone numbers must be in E.164 format (+[country code][number]). During trial, you can only send to verified phone numbers."
|
|
67
|
+
},
|
|
68
|
+
{
|
|
69
|
+
"title": "Send a WhatsApp message",
|
|
70
|
+
"language": "typescript",
|
|
71
|
+
"code": "import twilio from 'twilio';\n\nconst client = twilio(\n process.env.TWILIO_ACCOUNT_SID!,\n process.env.TWILIO_AUTH_TOKEN!\n);\n\nconst message = await client.messages.create({\n body: 'Hello from WhatsApp! Your order #1234 has shipped.',\n from: 'whatsapp:+14155238886', // Twilio WhatsApp sandbox number\n to: 'whatsapp:+14155551234',\n});\n\nconsole.log('WhatsApp message SID:', message.sid);",
|
|
72
|
+
"notes": "Use the Twilio Sandbox for WhatsApp during development. For production, submit a WhatsApp Business Application through Twilio. Recipients must opt-in first for business-initiated messages."
|
|
73
|
+
}
|
|
74
|
+
],
|
|
75
|
+
"gotchas": [
|
|
76
|
+
"Trial accounts can only send SMS/calls to verified phone numbers. You must verify each recipient's number in the console before testing — this trips up every developer during initial setup.",
|
|
77
|
+
"US long-code numbers require A2P 10DLC registration for application-to-person messaging. Without registration, messages may be filtered or blocked by carriers. This process takes 1-2 weeks.",
|
|
78
|
+
"WhatsApp business-initiated messages require pre-approved message templates. You cannot send free-form messages to users who haven't messaged you in the last 24 hours.",
|
|
79
|
+
"Twilio costs add up quickly at scale. SMS prices vary significantly by country. Always calculate your expected monthly cost before committing."
|
|
80
|
+
],
|
|
81
|
+
"reliability": {
|
|
82
|
+
"uptimeGuarantee": "99.95% uptime SLA",
|
|
83
|
+
"statusPageUrl": "https://status.twilio.com",
|
|
84
|
+
"notes": "Twilio has global carrier relationships for high deliverability. They provide delivery receipts and status webhooks for every message."
|
|
85
|
+
},
|
|
86
|
+
"qualityScore": 9,
|
|
87
|
+
"qualityJustification": "The gold standard for programmatic communications. Excellent TypeScript SDK, comprehensive documentation, and unmatched feature breadth (SMS, voice, WhatsApp, video). The regulatory requirements (10DLC, WhatsApp templates) are industry-wide, not Twilio-specific. Slight deduction for pricing complexity.",
|
|
88
|
+
"alternatives": ["vonage"],
|
|
89
|
+
"complementary": ["resend", "stripe", "clerk"],
|
|
90
|
+
"bestFor": "Programmatic SMS, voice, and WhatsApp messaging with global carrier reach and the most mature communications API",
|
|
91
|
+
"lastVerified": "2026-02-25",
|
|
92
|
+
"entryVersion": 1,
|
|
93
|
+
"addedBy": "claude-code-session-2"
|
|
94
|
+
}
|