# video-hosting-bench: measurement plan (round 1) Fixed before the first measurement. Timestamp: OpenTimestamps (original only). Deviations: DEVIATIONS.md. > Published copy. The internal name and commit of the client project are withheld ([withheld]); only the withheld > passages and the reference to the timestamp file are changed or reworded. The timestamp covers the unaltered > original, which stays private, so it cannot be checked against this copy. ## Question What does it cost to deliver video yourself instead of using Vimeo, YouTube, Bunny Stream or Cloudflare Stream, from which size on does it pay off, and what does one get besides the price (page weight, third parties, load time)? ## Inputs (pinned) - Clips: configs/clips.lock (13 Terra X originals from Wikimedia Commons, CC BY 4.0 / CC BY-SA 4.0, sha256). - Encoding ladder: configs/ladder.toml = settings of the client project [withheld] (libx264 high, preset medium, CRF 23/22/22/22, maxrate 0.8/1.6/2.8/5 Mbit/s, bufsize 2x, AAC 96/128/128/128 kbit/s, keyframe every 2 s, HLS fMP4 6 s, cap = min(rung, max(source video bitrate, 300k))). ffmpeg 8.0.1-3ubuntu2, enforced. - Scenarios and assumptions: configs/scenarios.toml (S/M/L; watched share 0.5, band 0.25-1.0; mix 20/30/25/25 %, also all-1080p; new uploads 5 %/month; peak = 10x monthly mean concurrency; encoding <= 25 % of a server's hours). Hetzner included traffic is 20 TiB (21.99 TB); all sizes are decimal (1 MB = 10^6 bytes). - Prices: configs/prices.toml (net, source and check date per price; USD at the ECB reference rate of the check date). - Player variants: configs/players.toml. Load test: configs/loadtest.toml. ## Measurements 1. Encoding (vhb encode): every clip with and without the cap; bytes per rung (init + segments + playlist), MB per minute (10^6 bytes), ratio top rung / original; wall time per clip with taskset to 4 CPUs (indicative). 2. Cap on the project (vhb project cap): local mirror of 2026-09-24; top rung with cap from the mirror for all videos; without cap re-encoded for a seeded sample (<= 60, seed 20261012) of the videos where the cap was active. Aggregates only. 3. Project figures (vhb project stats): count, hours, top-rung distribution, storage per rung and originals, encode time per minute from the state files. Aggregates only. 4. Players (vhb player): 8 variants on one local test page each; before click: bytes, requests, third-party hosts, cookies, local/session storage, IndexedDB; after click (10 s): new hosts; Lighthouse 13.5.0 mobile and desktop, 5 runs, median. 5. Load test (vhb loadtest): Hetzner cloud targets from configs/loadtest.toml with Caddy serving the HLS output of (1); k6 generator in the same location; stages of 180 s after 60 s warm-up; capacity = last stage before p95 segment time > 3000 ms or errors > 1 %; generator CPU < 80 % for a valid stage. Two stage series per target: the quality mix of configs/scenarios.toml and all viewers at 1080p (worst case). The cost model uses the capacity under the mix. Servers are deleted right after the run. 6. Costs (vhb costs): model of spec ยง4 with the inputs above. ## Not part of round 1 Codec comparison, speech recognition, the access-log cross-check of the project (planned [withheld]).