Skip to content
← Projects & client work

EasyCaptions

From a video upload to editable subtitles and export: a web product spanning the interface, API, background processing and delivery pipeline.

  • Next.js
  • Fastify
  • PostgreSQL
  • BullMQ
  • FFmpeg
Live website video-captions.com

The problem

Preparing subtitles involves more than transcription. A useful workflow also needs editing and export formats that fit different publishing tools.

My contribution

I designed and implemented the full-stack solution: the user interface, API, video-processing logic and the deployment pipeline. The project brings these responsibilities together in one product.

Implementation scope

The web interface is built with Next.js and the API with Fastify, on PostgreSQL through Prisma. BullMQ queues the background work, FFmpeg burns subtitles into video and Stripe handles billing. The stack reflects a workflow that includes processing work beyond a simple page request.

Transcription pipeline

The transcription provider is a field on the queued job. A self-hosted Whisper worker is the default, with Deepgram and Gladia available as alternative providers, and Gladia also handling subtitle translation. Each provider has its own worker module.

Testing and delivery

GitHub Actions runs web lint, API and web typechecks, API tests, a production build and Playwright end-to-end tests, backed by 41 Vitest and 12 Playwright spec files. The VPS deployment waits for CI to pass on the same commit.

Delivered functionality

The released service supports generating and editing subtitles, plus SRT, VTT and burned-in video exports. The image below shows the public product landing page; the live site provides the product entry point.

EasyCaptions public landing page with subtitle generation and export options
Public product landing page
Live website Let’s talk