A · read
Nobody could read it.
The hero was a scroll film. 300 frames of ink, the best-looking thing on the site, and the reason nothing legible sat above the fold. A cold visitor couldn't answer "do I care" without committing first.
Case Study 01
The site you're reading right now. Even the hero behind this text is a sketch. Every claim on this page is checkable with dev tools.
Start a project →This one is my own site. You're reading it right now.
That means you can check every claim on this page with dev tools.
Most portfolios ask you to take the work on faith. This one doesn't.
I built a site that looked good and did nothing. Three things were broken. All three looked finished, threw no errors, and quietly failed.
A · read
The hero was a scroll film. 300 frames of ink, the best-looking thing on the site, and the reason nothing legible sat above the fold. A cold visitor couldn't answer "do I care" without committing first.
B · found
I searched the live HTML for "inkwork.studio", "sydwebdesigns", and "syd". Zero matches. The site never said its own name.
C · contact
The form was a mailto: handoff (a link that opens the visitor's email app). No mail client means the click does nothing, silently. The lead evaporates and neither of us finds out.
Underneath, a second bug: pressing Enter submitted a form with no action. Page reload, everything typed gone.
Three ways a site can look finished and still not work.
One self-contained HTML page. No React, no build step, no CMS. GSAP and Lenis from a CDN. Deployed by git push.
Static hero: one still, no scroll mechanic. Film engine deleted.
Full search rebuild. Title, single H1, canonical, Open Graph, Twitter cards, JSON-LD ProfessionalService (search markup), robots.txt, sitemap.xml, lang="en-AU" (the language tag).
Real form endpoint, with a fallback and the keyboard bug fixed.
GA4 (Google Analytics, the visitor counter), so the next version of this page has numbers in it.
Anyone can list what they built. What you're paying for is how someone decides.
The film wasn't slow. I measured it: 95% of frames rendered within 17.7ms, the worst at 44.3ms, against a 50ms ceiling. It passed. I removed it anyway.
A hero has one job: let someone decide if they care without scrolling. Keeping the film meant choosing what I was proud of over what works.
Deleting it removed the whole failure surface. The replacement is a still. The strip below is what got cut.
300 frames to choose from. The obvious pick was frame 66: impact, ink hitting paper, splashing. The quiet pick was frame 100: a small settled pool, low in frame, most of the canvas empty cream.
The film went. The composition stayed. The hero as shipped is a generated still: a pen writing "Hello" in blue ink on cream, subject right, cream left. The final form of the quiet frame, not the frame itself. One image instead of 300 frames.
Impact grabs. Restraint reads as confidence. Quiet was the choice, not the fallback. The hero keeps the upper left empty for the headline and button, just like frame 100 did. The composition reason and the engineering reason agreed. That's usually the sign of a correct call.
The search problem: the page never said "inkwork.studio". The reflex is to jam the brand into the biggest heading.
I didn't: the H1 stayed as the line that sells, and the brand went into the title, the eyebrow, the chrome, the footer and the JSON-LD. Nine mentions, none costing the one sentence a human reads first.
Search engines and visitors want different things from that element. Serve both by being deliberate about which signal goes where.
The form posts to a real endpoint. The mailto: survives only as the fallback, and the button says so.
An enquiry always has a route, and if something breaks the visitor gets told.
A silent failure on a lead form is the worst bug a small business site can have. The business never finds out.
Going to 4K meant doubling the pixel ratio cap. I didn't assume it would hold: I tested at DPR 2 (double pixel density) against the 1080p baseline. The 95% figure held. The worst case went 21.3ms to 44.3ms, still under the ceiling.
I wrote the rollback down in advance: if a later change eats the headroom, step the cap to 1.5 before reverting.
Decisions with a documented way back are cheaper than decisions defended by memory.
Honest version: this launched on 2 August 2026. There's no traffic data yet. Analytics went in on day one so the next version of this page has real numbers instead of adjectives.
Before
Nobody could read it. Headline, proof and button were locked behind scroll.
After
The headline sits above the fold. The replacement is one image.
Before
Nobody could find it. The site never said its own name.
After
The site says its own name in nine places, with a single H1 and a clean search setup.
Before
Nobody could contact you. The lead evaporated and nobody found out.
After
The form routes to a real inbox, with a fallback when something breaks.
What's verifiable today, checked against production as Googlebot:
| Metric | Before | After |
|---|---|---|
| Brand mentions on page | 0 | 9 |
| <h1> | none | 1 |
| robots.txt | 404 | 200 |
| sitemap.xml | 404 | 200 |
| Canonical tag | none | present |
| Open Graph / Twitter | none | present |
| Structured data | none | valid ProfessionalService |
| Hero asset | 404 | 200 |
| Form failure mode | silent | routed, with fallback |
| Analytics | none | GA4 |
Indexing takes days to weeks on a domain this new no matter how clean the markup is. That part is waiting, not work.
Start a project →The bottom line
SD · 2026 · web design for real businesses