11-Jun-2026 — PDF conversion moved to the integration worker, so big documents cannot crash the site ref #281

build 687commit ed1219e


In plain English

The technical detail

Why this was needed

Converting a PDF on a production environment could kill the app: the EKWG machine (shared-cpu-1x, 512MB) was OOM-killed (exit 137) converting a photo-heavy meeting-notes PDF, and the Fly proxy showed the death as a 502. The conversion pipeline is memory-hungry by design: pdfjs loads the document, image extraction renders every page's embedded images to PNG buffers, and table-page detection renders whole pages to high-resolution screenshots. All of that ran in-process on top of the web app's baseline.

How it works now

Document conversion runs on the integration worker (1024MB, runtime-scalable via the uploadWorker config), using the same delegation pattern as the legacy-redirect scraper, Flickr album scraping and migration scrapes:

Deployment and verification

The worker has its own manual workflow (Build and Deploy Ramblers Upload Worker) and must be dispatched with the new image tag before it serves the endpoint; until then, the main apps fall back to in-process conversion exactly as today. 773 server tests pass, lint and TypeScript checks are clean, and the round trip was verified against a real photo-and-table-heavy walks PDF: eleven images collected, eleven placed, no leftover placeholders.