Put a label on your sample data
ยท Brandon Crenshaw
I wanted my portfolio to stop describing products and start showing them. So this week I put recorded demos on every project card I could. Some were easy. The live sites just needed a browser, a script and a few seconds of scrolling.
The mobile apps were harder, and not for the reason I expected.
The recording was the easy part
Two of the apps I am building have no public URL yet. GLOWUP is an Expo app. ROAM has an Expo client and a Next.js web build. Neither one has a store listing I can link to.
So the recorder builds the app for the web, serves it locally, puts it inside a phone frame and taps through a script. Onboarding, consent, the selfie step, the results, the main tabs. It writes a small video, a poster frame and a still for the card. When the app changes, I run one command and the clip matches the code again.
That took an afternoon. Deciding what each clip was allowed to say took longer.
Every demo makes a claim
A card that plays a smooth clip of an app ranking travel destinations says, without a single word, that the app ranks travel destinations. A viewer does not read the repo. They watch eight seconds and believe what they saw.
ROAM is the clearest case. Its web build is deployed and it looks finished. The opportunity cards on the home screen show a score, a price, a flight time and a reason to go now. They are also hardcoded. The ranking API behind them answers every request with an error, because it has no database yet.
The whole point of ROAM is that the model never makes up a number. Engines compute every score and every fact, and the model is only allowed to explain them. Putting a clip of invented numbers on my site, with no label, would break the one rule the product is built on.
So the card says Sample data, right on the video. The case study says it again in the first paragraph.
Some screens should not be in the clip at all
GLOWUP had a different problem. The prototype has a results screen that shows your photo next to a "potential" photo. In the prototype, that second photo is a different stock model. It is placeholder art. On a public page it reads as a before and after of two different people, which is the exact thing the app is designed never to do.
I did not want to cut the whole flow, and I did not want to fake the screen. The recorder has a curtain now. It covers the phone for about a second while the script taps through those two screens, then lifts. The clip is honest about what it skipped, and the storyboard has a comment saying why.
The card for GLOWUP says Prototype data. The backend that will produce real results is built and tested. It is not wired to the app yet, and the label says so.
Numbers that go stale are worse than no numbers
The same week I found three other places my site was claiming things it could not back up.
A section on the homepage showed live counters for my lead generation system. The counter said zero leads this week. A zero on a live counter does more damage than an empty space, so the section is gone.
Every project card used to carry a Live badge that someone typed by hand. One of those products was down for days while its card still said Live. The badge now comes from a daily check that actually opens each site.
The homepage was also loading a font from another company's server. That server had started refusing the request, so every visitor was already seeing the fallback font and every page load was paying for a failed request. Nobody noticed because nothing looked broken.
None of these were big bugs. All of them were small lies a visitor could catch.
What I do now
A few rules came out of this, and they are in the code rather than in my head.
1. Anything filmed from a build that is not running on real data gets a label on the media itself. Sample data, prototype data, whatever is true.
2. Placeholder screens get skipped with a visible cut, never faked, and the reason is written next to the skip.
3. Status comes from a check, not from a string someone typed.
4. A metric that can read zero does not go on a public page until it has a reason not to.
5. Every case study ends with what is not proven yet.
The fifth one matters most to me. Each write up on my site has a section that says what the numbers do not show. For ROAM it says nothing has ranked a real traveler yet. For GLOWUP it says there are no users and the safety tests are three automated checks, not a reviewed evaluation set.
Why bother
Because the people reading a portfolio are deciding whether to trust you with something real. A founder hiring for an AI build, or an engineering lead reading between interviews, is looking for one thing. Can this person tell the difference between a demo and a product, and will they tell me which one I am looking at.
A label costs nothing. A viewer who finds the thing you did not label costs you the rest of the page.
If you are putting demos on your own site this month, try one pass where you ask of every clip, badge and number: what does this claim, and could a stranger check it. Most of mine could not, and fixing that took less time than recording them.