All projects

Stream-processing service

Springfield

A service for on-demand live-stream repackaging, process lifecycle management, and playback readiness.

I designed and built this project independently, using my own resources.

Explore the project

Public repository

Technical documentation

Self-hosted stream service. Setup and API examples are in the repository.

Technologies

  • NestJS
  • FFmpeg
  • HLS
  • MySQL

01 / Context

The problem behind the project

Repackaging live streams requires more than launching FFmpeg: processes, output files, readiness, and cleanup need a lifecycle.

Springfield makes live-stream repackaging an application operation with a bounded lifecycle. Starting FFmpeg is only the beginning: the service has to know when playback is actually available, prevent unlimited resource growth, and remove dead processes and expired output.

02 / Implementation

Design and implementation

I built the stream-management service and its orchestration around repackaging jobs.

I built the NestJS service around FFmpeg, nginx-rtmp, and a MySQL stream model. Start creates an operation with an expiry, the service tracks the process and output, and cleanup reconciles database rows, processes, and files.

The retained design bounds concurrent jobs and gives them a finite lifetime. HLS readiness is checked through HTTP rather than by looking for a local playlist file, which would be wrong when the serving process is in another container.

03 / Approach

Engineering decisions

Manage the job lifecycle

The service tracks stream work, limits concurrent processes, and cleans up expired processes and output.

Readiness is observable

Playback readiness is checked through HTTP rather than assuming that a started process has produced usable HLS.

04 / Evidence

Evidence and outcomes

The public README and stream-service implementation document on-demand repackaging, centralized cleanup, a ten-stream concurrency boundary, and a five-minute default lifetime. These are implementation limits, not a measured throughput result.

GTT Player includes a consumer path for listing and starting Springfield jobs, connecting server-side repackaging with a native playback experiment.

Source and technical notes

05 / Current scope

Where it stands

Retained recovery source. Automatic deployment is disabled pending verified recovery.

The project remains earlier stream-infrastructure work. Real capacity depends on media profiles, process cost, and the serving environment; a configured concurrency limit does not establish a load-test result.