Accra, Ghana ·
All work
Case StudyOpen-source image infrastructure · 2026

RenditionKit.

A Node.js toolkit for processing images outside the request path. One original becomes responsive AVIF and WebP renditions while the application keeps control of its queue, storage, and asset records.

RenditionKit
Role
Creator & Software Engineer
Year
2026
Stack
TypeScript · Node.js · Sharp
Status
Live
The constraint

Image uploads often grow into a tangle of validation, resizing, format conversion, retries, object storage, and database updates. Doing that work in the request path slows uploads; hiding it in application-specific jobs makes the pipeline hard to reuse or reason about.

The approach

Built a queue-neutral processing core with small repository and storage contracts. A Sharp engine validates and transforms images into width-specific AVIF and WebP files. The included BullMQ worker handles retries and dead letters, while S3-compatible storage and PostgreSQL adapters provide a ready-to-use stack without forcing it on every application.

Key decisions
Keep jobs small
The queue carries an asset ID. The worker loads current source details from a durable repository, so mutable asset data and image bytes are not frozen into the job payload.
Make retries safe
Rendition keys include namespace, asset ID, and rendition version. A retry writes the same keys rather than scattering duplicate files across storage.
Separate the variable parts
The processing core depends on repository and storage interfaces. Applications can use the provided PostgreSQL and S3-compatible adapters or implement their own.
Outcome
4 widths
default image ladder: 400, 800, 1600, 2400px
2 formats
AVIF and WebP by default
BullMQ
deduplicated jobs, retries, and dead letters
S3 API
storage adapter for S3, R2, and MinIO
Tech stack
TypeScriptNode.jsSharpBullMQRedisPostgreSQLS3