very write-up in our work section has a slot for real screenshots — and for a build that is still in progress, some of those slots are genuinely empty, because the screen does not exist to photograph yet. The easy fix is a stock photo: someone smiling at a laptop, a vague dashboard mockup that looks plausible from six feet away. It fills the space. It also isn't the product, and pretending otherwise for the sake of a tidier-looking page is exactly the kind of small dishonesty that compounds.
So for a while we did the obvious honest thing instead: a dashed frame, the shot's intended caption in mono type, and a small note naming the file the image belonged in — a reminder to ourselves about where it goes. It was truthful. It was also, we eventually admitted, a developer's TODO list rendered at full width on a page meant for clients, three times per project. Truthful and worth showing are not the same test.
Astockphototellsasmallliethesizeoftheboxitfills.Alabeledplaceholdertellsthetruth,atthesamesize—andthesizewastheproblem.
What ships today is the third card. The whole image section on a project page sits behind a check on whether that project has any shots at all — so a build with nothing photographed yet does not show an empty gallery, a placeholder, or a heading promising screens that are not there. It shows the writing, and stops. There is no fallback branch anywhere in the frame: by the time a shot reaches it, the image is guaranteed to exist.
The alt text and the caption still get written before the screenshot exists — that is the note-to-self the dashed frame used to be, kept in the content file where notes to ourselves belong rather than on a page meant for clients. Dropping the image in brings that shot back, and the section reappears with it. Nothing needs rewriting to publish; the page is already waiting for the file.
This post was written about one component. That component is gone — the whole work section was rebuilt afterwards, on different data, with different pages. The rule came through it intact, and got stricter on the way: a shot's image path is now a required field rather than an optional one, so there is no image-less shot left for anything to filter. The old version stopped the empty frame from rendering. The new one stops it from being describable.
We are updating this rather than leaving it, because the drift was ours: for a few days this page described code that no longer existed. But the correction is the interesting part. A rule that survives the rewrite of the thing it was written about is not a preference any more — it is just how the studio builds, and it moved into the type system on its own, because the person doing the rebuild had read the argument and agreed with it.
The first version optimised for not lying, which is the right thing to optimise for and not the only thing. An unfinished page is allowed to be shorter than a finished one — that's what unfinished looks like, and padding it with an honest label is still padding. The discipline that survived isn't the component, which is now a few lines shorter than when it had a fallback. It's the rule underneath: when there's nothing to show, show nothing, and don't reach for something to put in the gap.