I needed screenshots for a side project and balked at the pricing — Urlbox starts at $29/mo for 5K, ScreenshotOne at $79/mo for 10K. So I built my own on a single VPS. Free tier is 500/mo, paid starts at $19/mo.
Stack: Fastify + Playwright + Sharp + BullMQ + Redis, deployed on OVH with Dokploy. No serverless, no cold starts.
I'm based in Colombia where Stripe doesn't work for merchants, so I used Creem.io as a Merchant of Record — not something I expected to spend time on.
Happy to answer questions about the architecture or pricing.
juanjosegongi•1h ago
- Playwright uses about half the RAM of Puppeteer for the same browser pool, which matters on a small VPS
- Playwright only outputs PNG and JPEG natively — getting WebP required piping through Sharp
- SSRF protection is non-trivial. Private IPs, localhost, link-local ranges, and cloud metadata endpoints (169.254.169.254) all need to be blocked. DNS rebinding is a separate problem
- Cache keys need to be fully deterministic — a hash of the entire request params (URL + viewport + format + scale + CSS), not just the URL
The API is one endpoint:
It also generates OG images (1200x630) from structured data. Source isn't open yet but happy to go into detail on any of this.