How I Built 10 Developer APIs on One Platform (and What I Learned)
Source: Dev.to
Overview
I spent the last few weeks building a suite of developer APIs under one roof: grabshot.dev. The goal was to solve specific developer pain points with a simple, low‑cost infrastructure.
API Suite
| API | Description |
|---|---|
| GrabShot | Website screenshots with AI cleanup (removes cookie banners, popups) and device frames (iPhone, MacBook). |
| PDFMagic | HTML to pixel‑perfect PDF conversion, supporting headers, footers, margins, and page breaks. |
| MetaPeek | Extract Open Graph, Twitter Cards, and meta tags from any URL. |
| ColorPeek | Pull dominant colors and full palettes from any website. |
| CronPing | Dead‑man’s switch for cron jobs – know when scheduled tasks stop running. |
| MailForge | Test HTML emails before sending; includes CSS inlining and rendering validation. |
| FontSpy | Detect every font on any webpage (families, weights, loading method). |
| LinkCheck | Find broken links across entire sites with recursive crawling. |
| DiffShot | Visual regression testing – compare screenshots and get pixel‑level diffs. |
| PageAudit | SEO and performance audits (meta tags, headings, Core Web Vitals). |
- Free tier: 25–50 requests/month per API.
- Docs & playground: Live interactive docs for each endpoint.
Infrastructure
| Component | Technology |
|---|---|
| Runtime | Node.js + Express |
| Browser automation | Puppeteer (headless Chrome) |
| Image processing | Sharp |
| Database | SQLite (one per app) |
| Process manager | PM2 |
| Reverse proxy | Caddy (auto SSL, wildcard subdomain routing) |
| Billing | Stripe Checkout |
| Hosting | Single VPS (≈ $15/month) |
Deployment Flow
- Write the app.
- Add a Caddy block (≈ 5 lines).
pm2 start app.js --name myapp.- SSL is provisioned automatically.
All subdomains (*.grabshot.dev) point to one IP in Cloudflare; Caddy handles TLS certificates per subdomain.
Architecture Details
- Each API runs its own Express server on a distinct port, with its own SQLite DB, API‑key auth, Stripe integration, and landing page.
- No shared services except the front‑facing Caddy proxy.
- PM2 auto‑restarts any process that crashes.
- Puppeteer powers GrabShot, ColorPeek, FontSpy, DiffShot, and PageAudit. Because headless Chrome is memory‑hungry, each process is capped at 150 MB; PM2 restarts on spikes.
Key Insights & Lessons Learned
1. Start Small
Build one product first (GrabShot) and expand only after validating demand. Breadth without users leads to wasted effort.
2. SEO from Day One
Write blog posts targeting developer keywords and set up Google Search Console before publishing. Unindexed content is invisible.
3. Test Payments Early
Stripe integration broke in 6 of the 10 apps just before launch. Verify the full checkout flow early to avoid revenue loss.
4. Memory Management
Puppeteer processes can exhaust RAM. Enforce memory limits and let PM2 handle restarts.
5. Simplicity Wins
A single VPS, SQLite, and Caddy are sufficient at this scale. No need for Kubernetes, micro‑service meshes, or managed databases.
Current Metrics
- MRR: $0 (just launched)
- Users: ~25 (mostly testers)
- Blog posts: 13
- Monthly hosting cost: ≈ $15
Next Steps
- Drive traffic to the free tiers.
- Gather feedback to prioritize new features.
- Explore additional distribution channels (e.g., developer newsletters, marketplaces).
Useful Links
- Suite overview: suite.grabshot.dev
- Screenshots demo: grabshot.dev
- All products: Links on the suite page
If you build developer tools or have thoughts on this approach, I’d love to hear your feedback. What would you use? What’s missing?