Case Study · 2026

Vertglows.

Client
An old school friend, founding a garden landscaping business
Location
South London & Kent
Scope
Brand direction, Design, Build, SEO
Year
2026
vertglows.vercel.app
Vertglows homepage hero — 'Vertglows' wordmark and 'South London · Kent · Est. 2025' eyebrow over a full-bleed photograph of a maintained garden with festoon lighting at dusk
The hero. Real client photograph, festoon-lit garden at dusk. The site does not introduce itself; it stands inside the work.
01 — The Brief

An old school friend, a new business,
and twenty-seven phone photographs.

An old school friend rang up. He'd been doing garden work across South London and Kent for years — clearance, lawn care, hedge cutting, ongoing maintenance — and was finally giving the business a name. Vertglows. He had a brand-new Instagram, a phone full of job photographs, and exactly nothing else. No website, no logo, no brand voice, no Google Business Profile. He needed a site that made the work look as good in pixels as it does in the garden, and a brand that read at the level of his actual craft. The trade-tier sector is a sea of identical Wix templates with stock photos of stranger's lawns. The brief: do not make another one of those.

02 — Approach

Stand the trade up
at editorial height.

01 · Forest Glow direction

A dark site for a daylight trade.

Local trade sites are almost always white-with-green. Vertglows runs the opposite: deep forest #0E1812 dominant, warm cream #F1EDE0 body, sage #7A9A6B for eyebrows and links, and a single amber #D9A05A per viewport for emphasis. The garden photography reads brighter inside the dark frame; the brand sits closer to a small wine bar than a man-with-a-van.

02 · Real photography first

Twenty-seven of his actual gardens.

Every photograph on the site is from a real Vertglows job. Hero, four service cards, before-and-after pair, eight-photo carousel, areas section — not a single stock image. Originals were converted to WebP at 1600px and 800px with sharp_yuv encoding, lazy-loaded everywhere except the hero, with explicit width/height to prevent layout shift. The work is the brand.

03 · Editorial typography

Italic accent words on every heading.

Fraunces variable italic at weight 200–300 for headlines and accent words; Inter Tight 300/400/500 for body, eyebrows and microcopy. One italic word per major heading — immaculate, workable, scalped, every visit, photograph. The italic does the work an oversized logo would normally do, and the type carries the brand without any decoration.

Detail 01 · The work carousel

Eight photographs,
looping forever, framed like plates.

The work carousel mid-pause — a horizontal rail of garden photographs with white serif italic captions ('Large lawn · maintained', 'Stripes · summer', 'Summerhouse · trim', 'Scalped · modern') in the bottom-left of each frame, set against the deep forest background
Five plates of the eight-photograph rail, paused mid-loop. Captions sit bottom-left of each frame; the rail edges out beyond the viewport on both sides so it always feels like there's more to see.

A trade site lives or dies on whether a visitor scrolls past the work. The Vertglows carousel is a continuous CSS marquee — eight unique photographs duplicated once for a seamless seam, always moving, pausing only on hover and on touch. Captions in Fraunces italic sit bottom-left of every frame, like wine list plates: Large lawn · maintained, Stripes · summer, Summerhouse · trim, Scalped · modern. The rail intentionally bleeds past the viewport edges on both sides so the visitor always feels there's another photograph just out of frame.

  • Pure CSS marquee, zero JS for motion. @keyframes with translateX(-50%), animation-duration calculated from the duplicated track length. No requestAnimationFrame, no scroll listeners, no GPU thrash.
  • Pauses on hover, touch and offscreen. animation-play-state: paused on :hover and .is-paused. IntersectionObserver pauses when the rail leaves the viewport. prefers-reduced-motion halts the loop entirely — the photographs stay readable as a static grid.
  • Bleeds beyond the container. width: 100vw; margin-left: calc(50% - 50vw) — breaks out of the centred container so the rail edges off both sides of the viewport. No horizontal scroll triggered on the page itself; the rail handles its own overflow.
  • Plate captions in the photograph, not above it. Each caption is positioned absolute inside the frame, bottom-left, in white Fraunces italic with a subtle text-shadow for legibility against the photograph. The plate number (PLATE 01) sits opposite for editorial balance.
  • 16 WebP files, all lazy-loaded. Only the first three frames render eagerly — the rest fetch as the rail scrolls them into view. Total carousel weight on first paint: ~140KB.
/* styles.css · the work carousel */

.work-rail {
  display: flex;
  gap: var(--s-3);
  animation: rail-scroll
    68s linear infinite;
  width: 100vw;
  margin-inline:
    calc(50% - 50vw);
}

.work-rail:hover,
.work-rail.is-paused {
  animation-play-state: paused;
}

@keyframes rail-scroll {
  to {
    transform:
      translateX(-50%);
  }
}

@media (prefers-reduced-motion: reduce) {
  .work-rail { animation: none; }
}
Unique photographs
8 (duplicated to 16)
JS for motion
0 KB
Pause signals
4 (hover, touch, offscreen, reduced-motion)
Carousel weight (first paint)
~140 KB
Loop duration
68 seconds
Caption font
Fraunces 200 italic
Detail 02 · Forest Glow system

A dark site for a daylight trade.
And one amber accent per viewport.

The services section in full — 'Reliable, affordable, high-quality gardening' headline at the top, then two photo-led service cards visible (Garden clearance with a real before-photo, Lawn care & restoration with a striped lawn shot), each with an oversized italic numeral, italic accent word in the title, body copy, and a sage 'GET A FREE QUOTE' link
Two of the four photo-led service cards. Oversized italic numeral, italic accent word in the title, real photograph from a real job, sage link instead of a button. The italic word does the brand work no logo could.

The Forest Glow palette is the whole brand. Dark forest dominant at 60%, warm cream body at 30%, sage and amber sharing the 10% accent slot. Amber appears exactly once per viewport — on the active CTA, on the before/after divider, on the scroll-cue underline. The discipline of "one amber" makes every appearance feel earned. The same restraint runs through type: one italic accent word per heading, never two; Fraunces variable italic at 200 weight for the lightest touch; Inter Tight 400 for everything that has to read at speed on a phone in a parking bay.

  • One amber per viewport. A single amber accent at any scroll position — primary CTA, before/after divider, scroll cue underline, plate divider. Discipline matters more than the colour.
  • Italic accent words. Each major heading carries one italic word (immaculate, real pride, fixed-price, finish). Fraunces italic at 200–300 weight, baseline-aligned to the surrounding upright type. The italic IS the emphasis; no underline, no colour shift, no decoration.
  • Cream on forest at 14:1. Body text #F1EDE0 on background #0E1812 hits 14:1 contrast — almost three times the WCAG AA threshold of 4.5:1. The dark theme reads cleaner than most light sites.
  • Sage links instead of buttons. Service cards end with "GET A FREE QUOTE →" as a sage link, not a button. Buttons would compete with the hero CTA for attention; the sage link feels like a continuation of the photograph.
  • Variable font, two faces. Fraunces variable + Inter Tight, both via Google Fonts at launch (with a swap-to-self-hosted-WOFF2 path queued for the AVIF re-encode pass). Two faces, never three.
  • Page weight under 500KB on first paint. Hero photograph 414KB at 1600px (preloaded), HTML 28KB, CSS 22KB, JS 1.5KB. Everything else is lazy.
/* tokens.css · Forest Glow */

:root {
  /* 60% dominant forest */
  --paper:        #0E1812;
  --paper-deep:   #16241A;
  --paper-bright: #1F3024;

  /* 30% body cream */
  --ink:          #F1EDE0;
  --ink-mute:
    color-mix(in srgb,
      var(--ink), transparent 25%);

  /* 10% accent — ONE amber per view */
  --vert:         #7A9A6B;
  --glow:         #D9A05A;

  /* Type */
  --face-display:
    'Fraunces', Georgia, serif;
  --face-body:
    'Inter Tight',
    -apple-system, sans-serif;
}
Palette tokens
6 (3 forest, 1 cream, 2 accent)
Type families
2 (Fraunces, Inter Tight)
Body contrast
14:1 (WCAG AAA)
Sage contrast
5.8:1 (WCAG AA)
Amber appearances per viewport
Exactly 1
Total CSS
~22 KB (tokens + reset + global)
03 — Outcome

Live, indexed,
and louder than the trade.

27
Real client photographs
0
Stock images, frameworks, templates
26areas
Listed in LocalBusiness schema

The site is live at vertglows.vercel.app while the custom vertglows.com domain is being pointed across. Single-page anchored navigation for v1, with per-service pages and per-area landing pages queued for v2 once the first wave of enquiries is flowing. Full LocalBusiness JSON-LD with 26 areas served, an OfferCatalog across the four core services (clearance, lawn care, hedge cutting, maintenance contracts), FAQPage schema matching every visible Q&A.

The honest part: this is the launch state, not the proof state. Bookings, reviews, ranking screenshots get pinned here as they land. The brand was the first job — getting Vertglows to read at editorial height in a sector that still defaults to clip art and Comic Sans. Take a look.

If you have a trade business across South London or Kent that's outgrowing its Wix template, get in touch. The process is the same. See pricing for the full breakdown — websites starting from £350.

Next

Your business could be
case study 05.

Got a local business, trade, studio, club or clinic that needs a proper website? I'm taking on new projects now. London-wide, based in East Dulwich SE22.

Start a conversation