PixelQueue
A single-host image-processing service with a separate Fastify API and BullMQ worker. It accepts JPG, PNG, and WebP uploads up to 20 MiB and produces bounded WebP output.
Problem
Image processing needs validation, bounded resource usage, reliable retries, and safe output handling without blocking the API request.
Solution
The API validates and stores uploads, queues jobs in Redis/BullMQ, and returns an immediate 202 response. A separate Sharp worker processes jobs with retries and atomic output publication.
My Role
Full Stack Developer responsible for the React web app, Fastify API, BullMQ worker, security controls, tests, CI, Docker deployment, and operations documentation.
Technical Architecture
Nginx serves the React web app and proxies the Fastify API. The API stores uploads and queues BullMQ jobs in Redis; a separate Sharp worker writes output to shared storage.
Result
Demonstrates a documented, production-hardened single-host processing flow with separate API and worker responsibilities.
Status
Source Code Available — Run locally with Docker Compose
Key Features
- JPG, PNG, and WebP upload
- 202 job acknowledgement
- Job status polling
- EXIF rotation
- WebP output
- Retries with exponential backoff
- Rate limiting
- Health and readiness checks
Engineering Challenges
- Bounding upload, pixel, dimension, and page limits
- Publishing output atomically while preserving retry safety
- Keeping cleanup singleton with a Redis lock
Technical Decisions
- Nginx serves the React web app and proxies the Fastify API. The API stores uploads and queues BullMQ jobs in Redis; a separate Sharp worker writes output to shared storage.
Tech Stack
- React
- TypeScript
- Fastify
- BullMQ
- Redis
- Sharp
- Nginx
- Docker