Independent product · Backend API
Platefy
Turning recipe captions into structured data
A TypeScript API that handles recipe extraction in the background and exposes progress, usage limits and structured results to a mobile application.
System overview
Mobile request
Authenticated recipe import
API & job queue
Fastify · Redis · BullMQ · extraction
Structured recipe
PostgreSQL · progress & result
Context
A recipe caption is unstructured input. Extracting usable ingredients and instructions involves external services whose response times and output can vary. The mobile application needs to submit an import, follow its progress and receive a predictable result.
My contribution
- Built the Node.js/Fastify API for extracting structured recipes from social-media captions using a language model.
- Used BullMQ and Redis for background import jobs, progress tracking and usage limits.
- Implemented authentication, PostgreSQL models with Drizzle, and OpenAPI documentation generated from Zod schemas.
Engineering decisions
Move extraction into background jobs
Imports run through BullMQ rather than making the initial request wait for every processing step. This allows the client to track progress, at the cost of managing a queue and explicit job states.
Share the API contract
Zod schemas define the expected data and feed OpenAPI documentation. Keeping validation and documentation connected reduces the number of separate definitions to maintain as the API evolves.
Test application behaviour with controlled providers
Mocked external providers make import tests repeatable. They establish how the API handles known responses; live provider behaviour remains a separate integration concern.
Validation
- Import tests use mocked external providers to exercise the processing workflow.
- Schema validation checks the shape of API inputs and structured results.
- Authentication and usage limits form part of the API’s request handling.
Outcome
Delivered an API that converts recipe captions into records the mobile application can use, with asynchronous processing and visible job progress. The case study focuses on my backend contribution.
Discuss the project
Get in touch about the work or a full-stack role.