Skip to content
Built — not deployed New build · Timber decking

Custom Timber Decks

A new build from scratch. 25 pages for a timber decking company in Amberfield, Centurion.

No live URL — not deployed Want something like this?
The Custom Timber Decks website

Local build — not deployed

  • BRAND MEASURED
  • RUST 5.82:1 BOTH
  • SPECIES TABLE
  • NULL NOT ZERO
  • 320-1440 SWEPT
  • NOT DEPLOYED

Custom Timber Decks builds timber decks in Amberfield, Centurion. This one was a new build rather than a revamp. 25 pages, from nothing. I should be straightforward about the status. It is built and it is not deployed. There is no live URL to click.

Before I designed anything I measured the colours. That is the order I work in, always — a colour that fails as text will fail no matter how good the layout is. The rust here is #A8481C. It reads at 5.82:1 as text, and white text sitting on it also reads at 5.82:1. That is unusual and it is worth having: one token that works as a word and as a block of colour, so a button, a heading and a rust-coloured sentence all use the same value. Type is Fraunces and Inter, both self-hosted with the site rather than pulled from a font CDN.

The piece of it I would point at first is the timber species comparison table. Timber gets compared on Janka hardness — a number for how much the board resists denting. Composite decking does not have one, because it is not timber. In the data, Janka is typed as a number or nothing at all. That sounds like a small technical detail. It is the difference between a table that says composite has no Janka rating and a table that prints 0 lbf and tells a customer composite is the softest board on the page. It is not, and the site is not allowed to say it is.

The build is Astro 5, Tailwind CSS 4 and plain JavaScript with no UI framework, which means 25 pages of plain HTML files at the end of it. Images run through astro:assets and sharp. I check the built output rather than the source: headless Chrome opens the finished pages at 320, 390, 768 and 1440 pixels wide, confirms nothing pushes the page sideways, and samples the real rendered pixels to verify contrast instead of trusting what the stylesheet claims.

Judgement

Calls I made

  • 01

    One rust that works as text and as a background

    Most brand colours only work one way round: dark enough to read as a word, or light enough to sit behind one, rarely both. I measured #A8481C at 5.82:1 as text, and white text on that same rust at 5.82:1. So it stayed a single token doing both jobs, instead of the usual split into a fill-only colour plus a separate darker one for any word.

  • 02

    Janka hardness typed as a number or nothing

    Composite decking has no Janka hardness rating, because it is not timber. A missing value quietly becomes 0 once it hits code, and the comparison table would have printed 0 lbf next to composite. I typed the field as number-or-null, which forces every place the table is rendered to deal with the missing value on purpose. A blank is honest. Zero is a lie that makes composite look like the softest board on the page.

  • 03

    25 static pages, no framework, no database

    A decking company does not need a database or a login screen. The Astro 5 build outputs 25 plain HTML pages with vanilla JavaScript and no UI framework, so there is nothing that breaks when a plugin updates and nothing to keep patched. It is files. Whoever ends up hosting it, hosts files.

  • 04

    Verified in the built site, not in the code

    Source code tells you what you intended. The built page tells you what actually happens. I drive headless Chrome over the finished output at 320, 390, 768 and 1440 pixels to confirm nothing scrolls sideways, and I sample the rendered pixels to read contrast off the screen rather than off the stylesheet. A wide species comparison table is exactly the sort of thing that breaks a 320px phone quietly, so it gets checked where it matters.

Outcome

25 pages, built and finished. It is not deployed, so there is no URL to show. Everything ships as static files, so hosting it later is a deployment, not a rebuild.