Capture any public webpage and preview it, on a job queue that survives the slow ones.
The challenge
Capturing a live page properly means running a real browser, and a real browser is slow, memory-hungry and occasionally hangs. Doing that inside a web request is how the whole service goes down.
What we built
Outcomes
How we shipped it
Browsers belong on a queue
Every capture is a job on BullMQ rather than work done inside the request. A page that takes thirty seconds, or never finishes, costs one worker instead of the whole API.
A schema for something unstructured
Captured pages are messy by nature. Prisma over PostgreSQL keeps the metadata — jobs, versions, assets — in a typed schema so the unstructured part stays contained.
Split front end and API
The Next.js App Router front end talks to a TypeScript Express service, which means the capture workers scale on their own without dragging the web tier along with them.
Stack
Aprojectlikethis?
One-page brief, two-week sprint, real exit ramps.
next kickoff · week 34
