# The clip bench `/browse//clip/`. "How much context does this clip need" used to be a loop of hand-editing JSON, re-running two CLIs and watching an mp4. This is that loop in one place. ## One screen, from `lg` up Walking a cut is sixty clips in a row, and the bench used to stack two 16:9 players and three paragraphs of prose — so the attribution fields, the point of the walk, were below the fold on every one of them and "did I check that" became a scroll position. The bench is now exactly the space the page has left: a header line (where you are, the neighbours, and the renderer's own line, live), then a two-column grid sized to the viewport. Nothing outside a column scrolls. The player takes whatever height is left (`object-contain`, not an aspect ratio), its window readout and buttons are one row under it, and the **second** player — looked at once per clip, after a render — folds into a `
` strip with the `resolve-windows` locks. The warnings stay unfolded and one line each: a warning behind a summary is a warning nobody reads. Below `lg` it is a single scrolling column; a phone cannot hold this and pretending otherwise would cost the desk case something. ## Absolute source seconds, everywhere The manifest's numbers, the cue file's, the QR's. The cached file's own start (`fetchStart`) is the **only** relative number in the component, and it exists solely to set `video.currentTime`. The moment those two are allowed to mix is the moment a window is off by the pad and nobody can see why. ## The preview is the cached file, served whole `out/clips-raw/