Bitrail

Public test streams for players and CDNs

Deterministic synthetic video in progressive MP4 and HLS, served over plain HTTPS with range support. Point your player, packager, cache or CI job at it and get the same bytes every time.

Frame counter, 720p, 30 fps, H.264 + AAC. Plays natively in every current browser โ€” this page ships no JavaScript.

No account, no rate limit HTTP range requests SHA-256 for every file CC0 content

Why synthetic

Test material taken from real footage is a licensing problem and a reproducibility problem: it gets replaced, re-encoded, or pulled. Everything here is generated from deterministic sources, so a stream you validated against last year is byte-identical today, and there is nothing to license.

The patterns are chosen to make failure visible rather than to look pleasant. A frame counter exposes dropped frames and A/V drift. Smooth gradients expose banding introduced by an over-aggressive transcode. A 60 fps high-motion source exposes an encoder or a network that cannot keep up.

What is here

StreamRenditionsPurpose
timecode360p / 720p / 1080pFrame counter and colour bars for A/V sync and dropped-frame checks
gradient360p / 720p / 1080pSmooth gradients for banding and colour-depth checks
motion360p / 720p / 1080p60 fps high-motion source for encoder and throughput stress
sustained1080pLong single file for sustained-transfer and resume testing

Each stream is available as a progressive MP4 per rendition and as an HLS ladder with fragmented-MP4 segments and a master playlist.

# progressive, resumable
curl -O https://t1.nodavpn.org/media/timecode/timecode-1080p.mp4

# HLS ladder
ffplay https://t1.nodavpn.org/media/timecode/hls/master.m3u8

# verify what you received
curl -s https://t1.nodavpn.org/media/SHA256SUMS | sha256sum -c --ignore-missing

Fair use of the bandwidth

There is no rate limit and no sign-up, because adding either would defeat the point of a test endpoint. In exchange: if you are running a sustained benchmark, pull the sustained asset once and loop it locally rather than re-fetching it, and set a sensible concurrency in CI.

Caching is deliberate. Media carries a one-year immutable cache header and the filenames never change contents, so a CDN or proxy in front of this origin will behave the way you expect it to in production.

Full catalogue with encoder settings is on the streams page; usage notes and CI examples are in the documentation.