All work

Case 07of 08

Lumen Row A performance budget, agreed before the design

A Series A hardware company whose site opened with a 4.2 MB autoplay video, took 6.4 seconds to paint on 4G, and lost 71% of mobile visitors before it finished. Most of that traffic came from QR codes on a conference stand.

WebsiteWebsitePerformanceBuild · 5 weeks2023
ClientLumen Row
Series A, grid-scale storage
EngagementSprint + Build
Duration1 week scope
5 weeks build
StackAstro, CSS, SVG,
no framework runtime
OutcomeLCP 6.4s → 0.8s

The rebuilt homepage — 310 KB, budget enforced in CIFig. 01

01 — Chapter

The problem

Lumen Row make grid-scale heat batteries. Their site opened with a drone video of a wind farm, shot properly and expensively, that took 4.2 MB and four seconds to become visible.

The detail that decided the project: 62% of their traffic was mobile, most of it arriving from QR codes on a trade-stand banner — which means someone standing in a conference hall on congested 4G, giving the site about eight seconds of patience. Seventy-one percent of them left.

  • 4.9 MB homepage, 4.2 MB of it a single autoplay video
  • 6.4s largest contentful paint on throttled 4G
  • 71% mobile bounce, against 38% on desktop
  • 62% of sessions from mobile, concentrated around three trade shows a year
  • Eleven third-party scripts, four of them on the critical path

Before and after

The hero
lumenrow.com · 4.9 MB
Autoplay video · 4.2 MB
Loading…
Before · 6.4s to first paint on 4G
lumenrow.com · 310 KB
CSS and SVG · 11 KB
Book a demo
After · 0.8s, same idea, no video
310 KB

Total homepage weight, down from 4.9 MB. The company still looks expensive; it just does not cost the visitor anything to find that out.

02 — Chapter

Budget before design

We agreed a performance budget in week one, before a single layout: 180 KB of JavaScript, 120 KB of images per view, LCP under 1.2 seconds on a throttled connection. Signed off by the founder, wired into CI, and treated as a design constraint rather than an optimisation phase.

That is the whole project. Every subsequent decision — no framework runtime, system fonts subset to Latin, analytics after first interaction, and the video cut — follows from a number agreed before anybody had anything to defend.

  • Budget agreed and signed in week one, before any design work
  • Enforced in CI: a commit that breaks it fails, it is not a warning
  • No framework runtime shipped; 41 KB of JS against a 180 KB allowance
  • Analytics and chat deferred until after first interaction
  • Every image budgeted per template, not per page, so regressions are visible

From QR code to demo

Eight seconds of patience
1ScanConference hall, congested 4G, phone in one hand. The site has about eight seconds before it is closed.0.0s
2PaintHero renders on first paint. No spinner, no video, no layout shift as fonts arrive.0.8s
3ReadOne sentence explaining what the company makes, then the specification. Nothing loads on scroll that was not already there.~20s
4BookDemo form, three fields, no chat widget interrupting. Analytics fires after this point, not before.
Page weight by sectionBefore and after, kilobytes BeforeAfter
4.2 MB → 11 KBHero
340 → 38 KBFonts
410 → 128 KBImages
290 → 41 KBScripts
4.9 MB → 310 KBTotal

Measured on the homepage at 1440px, cache empty, after compression. Bars are proportional to the largest single item rather than to each other, so the hero does not flatten the rest into invisibility. Third-party scripts that now load after interaction are excluded from the after figure, which is the point of deferring them, but they are 84 KB if you count them.

03 — Chapter

Replacing the video

The hero video had to go, and the founder had paid for it eight weeks earlier. That conversation was the hardest part of the project and we handled it badly by having it in week two instead of week zero.

What replaced it is 11 KB of CSS and SVG: a slow thermal gradient moving through a cutaway of the battery core, which says what the company does more directly than aerial footage of somebody else’s wind farm. It starts instantly, respects reduced-motion, and costs 0.3% of the video.

  • 4.2 MB video replaced by 11 KB of CSS and inline SVG
  • Animation pauses under prefers-reduced-motion, not just dims
  • Video kept, cut to 40 seconds, on a page people choose to open
  • Hero renders on the first paint with no layout shift — CLS 0.31 → 0.01
  • Same asset reused on the stand itself, looping on a screen

The budget

Enforced, not aspired to
Largest contentful paint 0.8s
0sGood < 2.5s5s+
Cumulative layout shift 0.01
0Good < 0.10.4+
Interaction to next paint 64ms
0msGood < 200ms500ms+
180 KBJavaScript budget per view, agreed in week one. The site ships 41 KB.
120 KBImage budget per view, after compression, enforced at build time.
1.2sLCP ceiling on throttled 4G. Any commit that breaks it fails CI.
0Third-party scripts on the critical path. Analytics loads after interaction.
11 KBThe hero animation that replaced a 4.2 MB video, in CSS and SVG.
62%Of traffic is mobile, mostly from conference QR codes, which is why any of this matters.

Results

Each with its method
6.4s → 0.8sLargest contentful paintThrottled 4G, Moto G4, median of five runs
71% → 34%Mobile bounce rateSame three-month window, year over year
4.9 → 0.31MBPage weightHomepage, empty cache, after compression
2.9×Demo requestsFirst quarter after launch, including one trade show
They deleted a video I had just paid for and were right to. I would rather have had that conversation before the shoot, and so would they.
Tomas WexlerFounder, Lumen Row

LogWeek by week

The build log

Six weeks, including one uncomfortable meeting that should have happened earlier.

Week 0

Paid discovery. Analytics read properly for the first time; the mobile and trade-show finding came out of it. Performance budget drafted and signed.

Week 1

Budget wired into CI before any design. A failing build on day three proved it worked, which mattered more than it sounds.

Week 2

The video conversation. Badly timed, honestly argued, and settled by building the CSS alternative and putting it next to the video on staging.

Week 3

Hero animation and the specification pages. Content model designed so images are budgeted per template and a regression is obvious in review.

Week 4

Everything else, inside the budget. Fonts subset, analytics deferred, chat widget removed entirely at the founder’s suggestion.

Week 5

Launch, two weeks before their largest trade show. Stand QR codes pointed at a page built for a conference hall, not a desk.

After

Budget still enforced in CI eighteen months later, and still passing, which is the part we are most pleased about.

What shipped

Six deliverables
01Marketing siteAstro, no framework runtime, 310 KB, 0.8s LCP on throttled 4G.
02Hero animation11 KB of CSS and SVG, reduced-motion aware, reused on the trade stand.
03Performance budgetAgreed in week one, enforced in CI, documented for whoever comes next.
04Content modelImages budgeted per template so regressions surface in review, not in production.
05Specification pagesThe technical detail their buyers actually read, finally legible on a phone.
06HandoverSource, budget documentation, and a note on what to do when someone asks for a video.
The part a portfolio leaves out

What we would do differently

We should have shown the budget arithmetic in week zero, before the video was commissioned, not in week two after it was delivered. The maths was not difficult and the founder would have made the same call earlier and more cheaply. We now put a performance budget in the discovery output for every marketing site, whether or not anyone has asked about performance, precisely so that this conversation happens before money is spent rather than after.

Who did it

Credits
max

Performance budget, design, build, hero animation. One person, five weeks.

Lumen Row

Founder who signed the budget and then lived with it; an engineer who cut the specification content down by half without being asked.

Note

The original video was made by a film company we had nothing to do with and is a good film. It just belonged somewhere other than the critical path.

Two build slots openNext start: March

Tell us what you’re building and we’ll scope it

Two working daysA reply from the person who would do the work
One paid weekDiscovery, written scope, fixed price
Yours either wayThe scope document, whether or not you continue
Start a projectStart a project