@@ -8,6 +8,7 @@ import { Container } from "@/components/ui/Container";
88import { getMarketingPage , START_HREF } from "@/lib/marketing-pages" ;
99import { pageMetadata } from "@/lib/seo" ;
1010import { breadcrumbLd , webPageLd } from "@/lib/structured-data" ;
11+ import europeLocal from "@/public/benchmarks/providers/europe-local.json" ;
1112import latest from "@/public/benchmarks/providers/latest.json" ;
1213
1314const page = getMarketingPage ( "/benchmarks" ) ;
@@ -26,57 +27,103 @@ const breadcrumbs = [
2627// Pulled straight from the published artifact so the page never drifts from the run.
2728const rend = latest . summary . providers . rend ;
2829const mux = latest . summary . providers . mux ;
30+ const europeRend = europeLocal . summary . providers . rend ;
31+ const europeMux = europeLocal . summary . providers . mux ;
2932
3033const runDate = new Date ( latest . generatedAt ) . toLocaleDateString ( "en-GB" , {
3134 day : "numeric" ,
3235 month : "long" ,
3336 year : "numeric" ,
3437} ) ;
38+ const europeRunDate = new Date ( europeLocal . generatedAt ) . toLocaleDateString ( "en-GB" , {
39+ day : "numeric" ,
40+ month : "long" ,
41+ year : "numeric" ,
42+ } ) ;
3543const durationSeconds = Math . round ( latest . source . verification . observed . rend . durationMedianSeconds ) ;
3644
3745const ms = ( n : number ) => `${ Math . round ( n ) . toLocaleString ( "en-US" ) } ms` ;
3846const resOf = ( rendition : string ) => `${ rendition . split ( "x" ) [ 1 ] } p (${ rendition . replace ( "x" , " × " ) } )` ;
3947const pctSooner = Math . round ( ( 1 - rend . metrics . timeToFirstFrameMs . median / mux . metrics . timeToFirstFrameMs . median ) * 100 ) ;
48+ const europePctSooner = Math . round (
49+ ( 1 - europeRend . metrics . timeToFirstFrameMs . median / europeMux . metrics . timeToFirstFrameMs . median ) * 100 ,
50+ ) ;
51+ const browserLabel = `${ latest . environment . browser . automation } ${ latest . environment . browser . version } ` ;
52+ const europeBrowserLabel = `${ europeLocal . environment . browser . automation } ${ europeLocal . environment . browser . version } ` ;
4053
4154const results = [
4255 {
43- id : "rend" ,
56+ id : "us-rend" ,
57+ region : "US" ,
4458 name : "Rend" ,
4559 firstFrame : ms ( rend . metrics . timeToFirstFrameMs . median ) ,
4660 played : `${ rend . successfulSamples } / ${ rend . sampleCount } ` ,
4761 stalls : rend . metrics . stallCount . max ,
4862 resolution : resOf ( rend . observed . selectedRendition ) ,
4963 } ,
5064 {
51- id : "mux" ,
65+ id : "us-mux" ,
66+ region : "US" ,
5267 name : "Mux" ,
5368 firstFrame : ms ( mux . metrics . timeToFirstFrameMs . median ) ,
5469 played : `${ mux . successfulSamples } / ${ mux . sampleCount } ` ,
5570 stalls : mux . metrics . stallCount . max ,
5671 resolution : resOf ( mux . observed . selectedRendition ) ,
5772 } ,
73+ {
74+ id : "europe-rend" ,
75+ region : "Europe" ,
76+ name : "Rend" ,
77+ firstFrame : ms ( europeRend . metrics . timeToFirstFrameMs . median ) ,
78+ played : `${ europeRend . successfulSamples } / ${ europeRend . sampleCount } ` ,
79+ stalls : europeRend . metrics . stallCount . max ,
80+ resolution : resOf ( europeRend . observed . selectedRendition ) ,
81+ } ,
82+ {
83+ id : "europe-mux" ,
84+ region : "Europe" ,
85+ name : "Mux" ,
86+ firstFrame : ms ( europeMux . metrics . timeToFirstFrameMs . median ) ,
87+ played : `${ europeMux . successfulSamples } / ${ europeMux . sampleCount } ` ,
88+ stalls : europeMux . metrics . stallCount . max ,
89+ resolution : resOf ( europeMux . observed . selectedRendition ) ,
90+ } ,
5891] ;
5992
6093const spread = [
61- { label : "Fastest sample" , rend : rend . metrics . timeToFirstFrameMs . min , mux : mux . metrics . timeToFirstFrameMs . min } ,
62- { label : "Median" , rend : rend . metrics . timeToFirstFrameMs . median , mux : mux . metrics . timeToFirstFrameMs . median } ,
63- { label : "95th percentile" , rend : rend . metrics . timeToFirstFrameMs . p95 , mux : mux . metrics . timeToFirstFrameMs . p95 } ,
64- { label : "Slowest sample" , rend : rend . metrics . timeToFirstFrameMs . max , mux : mux . metrics . timeToFirstFrameMs . max } ,
94+ { region : "US" , label : "Fastest sample" , rend : rend . metrics . timeToFirstFrameMs . min , mux : mux . metrics . timeToFirstFrameMs . min } ,
95+ { region : "US" , label : "Median" , rend : rend . metrics . timeToFirstFrameMs . median , mux : mux . metrics . timeToFirstFrameMs . median } ,
96+ {
97+ region : "Europe" ,
98+ label : "Fastest sample" ,
99+ rend : europeRend . metrics . timeToFirstFrameMs . min ,
100+ mux : europeMux . metrics . timeToFirstFrameMs . min ,
101+ } ,
102+ {
103+ region : "Europe" ,
104+ label : "Median" ,
105+ rend : europeRend . metrics . timeToFirstFrameMs . median ,
106+ mux : europeMux . metrics . timeToFirstFrameMs . median ,
107+ } ,
65108] ;
66109
67110const method = [
68111 `The same source video, ${ durationSeconds } seconds long, uploaded to both Rend and Mux.` ,
69- `${ latest . run . sampleCountTarget } samples per provider, with provider order randomized each round.` ,
112+ `${ latest . run . sampleCountTarget } samples per provider in each region , with provider order randomized each round.` ,
70113 "A fresh browser context for every sample: no cookies, no stored state, and the cache disabled." ,
71114 `A ${ Math . round ( latest . run . watchWindowMs / 1000 ) } second watch window per sample, timing the first painted frame and counting any stalls.` ,
72- `Playwright driven Chrome ${ latest . environment . browser . version } , run on a Daytona sandbox with the region set to US (Daytona picks a specific US region), the same machine for both providers.` ,
115+ `${ browserLabel } , run on a Daytona sandbox with the region set to US for the US results.` ,
116+ `${ europeBrowserLabel } , run on a local Europe machine for the Europe results.` ,
117+ "Rend is measured on its fastest production setup for this asset: the native-HLS /watch path with playback assigned from the initial page." ,
73118] ;
74119
75120const caveats = [
76121 "This is one video, one region, one browser profile, and one run. It is not a universal claim about either service." ,
77122 "We did not purge or warm any CDN. Mux serves from its own network and Rend from ours, each in whatever cache state it happened to be in." ,
78123 "Encoders, packaging and player implementations differ between the two providers." ,
79- "Rend currently serves a single 1080p rendition for this asset rather than a full adaptive ladder, and Mux selected 720p. Source file identity is not independently verified beyond matching duration and metadata." ,
124+ "This is the fastest real Rend playback path, not a forced-resolution run. Rend selected 1080p and Mux selected 720p in the benchmark viewport." ,
125+ "The Europe run used a local machine rather than a Daytona Europe sandbox because Europe containers were not available to this Daytona organization." ,
126+ "Source file identity is not independently verified beyond matching duration and observable metadata." ,
80127] ;
81128
82129const headCell = "border-b border-line pb-2.5 text-[13px] font-medium text-muted" ;
@@ -125,17 +172,19 @@ export default function BenchmarksPage() {
125172 </ p >
126173 </ div >
127174
128- { /* Latest results */ }
129- < h2 className = "mt-16 font-head text-[22px] leading-snug" > Latest results</ h2 >
175+ { /* Regional results */ }
176+ < h2 className = "mt-16 font-head text-[22px] leading-snug" > Regional results</ h2 >
130177 < p className = "mt-2 max-w-[680px] text-[15px] leading-[1.6] text-muted" >
131- Time to first frame, median of { latest . run . sampleCountTarget } samples each. Last run { runDate } { " " }
132- on a Daytona sandbox with the region set to US.
178+ Time to first frame, median of { latest . run . sampleCountTarget } samples per provider. The US run
179+ was on { runDate } in a Daytona sandbox. The Europe run was on { europeRunDate } from a local
180+ machine in Europe. Both use Rend's fastest production playback path.
133181 </ p >
134182
135- < div className = "mt-6 max-w-[760px ] overflow-x-auto" >
136- < table className = "w-full min-w-[560px ] border-collapse text-left text-[15px]" >
183+ < div className = "mt-6 max-w-[860px ] overflow-x-auto" >
184+ < table className = "w-full min-w-[680px ] border-collapse text-left text-[15px]" >
137185 < thead >
138186 < tr >
187+ < th scope = "col" className = { headCell } > Region</ th >
139188 < th scope = "col" className = { headCell } > Provider</ th >
140189 < th scope = "col" className = { headCell } > First frame (median)</ th >
141190 < th scope = "col" className = { headCell } > Played</ th >
@@ -146,6 +195,7 @@ export default function BenchmarksPage() {
146195 < tbody >
147196 { results . map ( ( row ) => (
148197 < tr key = { row . id } className = "border-b border-line-soft last:border-0" >
198+ < td className = "py-4 pr-4 text-ink-soft" > { row . region } </ td >
149199 < th scope = "row" className = "py-4 pr-4 font-medium text-ink" >
150200 { row . name }
151201 </ th >
@@ -160,11 +210,12 @@ export default function BenchmarksPage() {
160210 </ div >
161211
162212 < p className = "mt-5 max-w-[680px] text-[14px] leading-[1.6] text-muted" >
163- Same source video ({ durationSeconds } seconds). Rend served full { resOf ( rend . observed . selectedRendition ) } { " " }
164- while Mux selected { resOf ( mux . observed . selectedRendition ) } , so Rend moved more pixels and still
165- reached the first frame about { pctSooner } % sooner. Mux had one slow outlier near 6.8 seconds,
166- shown below, which lifted its median. Rend's five samples stayed between{ " " }
167- { ms ( rend . metrics . timeToFirstFrameMs . min ) } and { ms ( rend . metrics . timeToFirstFrameMs . max ) } .
213+ Same source video ({ durationSeconds } seconds). Rend selected native HLS at{ " " }
214+ { resOf ( rend . observed . selectedRendition ) } while Mux selected{ " " }
215+ { resOf ( mux . observed . selectedRendition ) } in both regional runs. In the US run, Rend reached the
216+ first frame about { pctSooner } % sooner on median. In the Europe run, Rend reached it about{ " " }
217+ { europePctSooner } % sooner on median. Rend had zero stalls and zero browser network errors in
218+ both regions.
168219 </ p >
169220
170221 { /* Sample spread */ }
@@ -173,18 +224,20 @@ export default function BenchmarksPage() {
173224 Time to first frame across every sample, fastest to slowest.
174225 </ p >
175226
176- < div className = "mt-6 max-w-[560px ] overflow-x-auto" >
177- < table className = "w-full min-w-[420px ] border-collapse text-left text-[15px]" >
227+ < div className = "mt-6 max-w-[680px ] overflow-x-auto" >
228+ < table className = "w-full min-w-[560px ] border-collapse text-left text-[15px]" >
178229 < thead >
179230 < tr >
231+ < th scope = "col" className = { headCell } > Region</ th >
180232 < th scope = "col" className = { headCell } > Time to first frame</ th >
181233 < th scope = "col" className = { headCell } > Rend</ th >
182234 < th scope = "col" className = { headCell } > Mux</ th >
183235 </ tr >
184236 </ thead >
185237 < tbody >
186238 { spread . map ( ( s ) => (
187- < tr key = { s . label } className = "border-b border-line-soft last:border-0" >
239+ < tr key = { `${ s . region } -${ s . label } ` } className = "border-b border-line-soft last:border-0" >
240+ < td className = "py-3.5 pr-4 text-ink-soft" > { s . region } </ td >
188241 < th scope = "row" className = "py-3.5 pr-4 font-medium text-ink-soft" > { s . label } </ th >
189242 < td className = "py-3.5 pr-4 tabular-nums text-ink" > { ms ( s . rend ) } </ td >
190243 < td className = "py-3.5 tabular-nums text-muted" > { ms ( s . mux ) } </ td >
@@ -231,10 +284,26 @@ export default function BenchmarksPage() {
231284 </ p >
232285 < p className = "mt-3 flex flex-wrap gap-x-6 gap-y-2 text-[15px]" >
233286 < a href = { latest . artifacts . machineReadableUrl } target = "_blank" rel = "noopener noreferrer" className = { linkClass } >
234- Summary JSON
287+ US summary JSON
235288 </ a >
236289 < a href = { latest . artifacts . rawSamplesUrl } target = "_blank" rel = "noopener noreferrer" className = { linkClass } >
237- Every raw sample
290+ US raw samples
291+ </ a >
292+ < a
293+ href = { europeLocal . artifacts . machineReadableUrl }
294+ target = "_blank"
295+ rel = "noopener noreferrer"
296+ className = { linkClass }
297+ >
298+ Europe summary JSON
299+ </ a >
300+ < a
301+ href = { europeLocal . artifacts . rawSamplesUrl }
302+ target = "_blank"
303+ rel = "noopener noreferrer"
304+ className = { linkClass }
305+ >
306+ Europe raw samples
238307 </ a >
239308 </ p >
240309 </ Container >
0 commit comments