Announcing Keyframe 0.2.1

Keyframe is an open-source, self-hosted video streaming server for creators and their communities.

Keyframe 0.2.1 has been released, with a new ingest server built on SRT and MPEG-DASH. You can follow the instructions to install it on a NixOS server.

The film Big Buck Bunny is playing on the left, while chat for the stream is open on the right
Screenshot of a Keyframe stream. Big Buck Bunny is copyright 2008, Blender Foundation /


My name is Shell Turner, I'm the developer of Keyframe, and a trans woman currently living in the UK. You can contact me via email or XMPP at

I started working on Keyframe last year in order to stream myself playing video games over the Internet. I didn't want to sign up to one of the streaming services run by Amazon, Google or Facebook – and force my audience to sign up to those services to chat with me while I play – so I put together a simple UI around nginx-rtmp-module, Prosody, and Converse.JS.

On showing this to some people, they were interested in using it and streaming to their own audience outside of walled gardens, so I cleaned it up and released Keyframe 0.1.

I realised over time that the latency I was getting didn't match what I knew was possible, making it difficult to communicate with my audience. There wasn't existing open-source software which could reach that latency, so I started working on Keyframe 0.2.


Keyframe 0.2 contains a standalone component called ingestd, which replaces nginx-rtmp-module. ingestd takes SRT input from sources like OBS, ffmpeg and gstreamer, as well as professional media hardware – and packages it as MPEG-DASH standard media in a low latency configuration. It also contains a custom web server for serving this MPEG-DASH media with minimal latency.

Keyframe uses dash.js to play the stream in the browser, currently configured to a 3 second buffer in the browser, although this is very conservative – I have successfully run Keyframe with 0.5 seconds of buffer, enabling near-real-time conversations with my audience.

ingestd is built on widely available standards and open-source code, and can be used independently of Keyframe.


Keyframe works today – I and others use it regularly to broadcast live video to audiences over the Internet. However, there's still a lot of work to be done.

I intend to work further on ingestd, implementing rescaling so that people with slower Internet connections can view a lower-quality stream while enabling people with faster connections to view the stream in the original broadcast quality.

I also intend to implement iOS support in ingestd and Keyframe, using iOS 14's new low-latency HLS specification.

I would like to enable stream monetisation options – ticketed streams, donations, and the ability to extend the platform further – and discoverability features like integration with social media and ActivityPub, as well as a stream directory.

Finally, I would like to enable easier installation of Keyframe, via a self-contained binary or Docker image that can be deployed on standard Linux distributions.

Between these features, Keyframe could become a serious alternative to existing streaming services and closed-source software for many use cases, enabling creators to build the service they need, without restrictions.


In order to work on Keyframe and ingestd, I need financial support. If you find Keyframe and ingestd interesting or useful, you can set up a donation through my LiberaPay. I am currently aiming to make 100 EUR/week, in order to support myself working on this project.

Donation link

If you're aware of a company that might be interested in using Keyframe or ingestd, I'm also very interested in talking about contracting work or sponsorship.