Case Study · 2026

Hamlet Podiatry.

Client
Michele Osborne, HCPC-registered Podiatrist
Location
8 Great Spilmans, Dulwich SE22 8SZ
Scope
Design, Build, SEO, Migration
Year
2026
hamletpodiatry.co.uk
Hamlet Podiatry homepage hero — 'Harley Street precision. Dulwich Village warmth.' headline over a full-bleed photograph of the clinic's treatment room
01 — The Brief

A new clinic, launching with the
old template playbook.

Michele Osborne opened Hamlet Podiatry on Great Spilmans in early 2025. She had trained in the Harley Street Medical Quarter and NHS high-risk clinics — no other sole-practitioner podiatrist in South East London could say the same. On the site, that fact lived in the middle of a paragraph, under an Elementor hero in mint-seafoam green. The Cliniko booking widget didn't load. The footer said 8 Great Spilmans. The booking page said 28.

02 — Approach

Lead with the differentiator.
Let the room do the rest.

01 · Positioning

The headline writes itself.

"Harley Street precision. Dulwich Village warmth." Mixed-weight serif, two lines. The tension that took four paragraphs on the old site now lives above the fold in eleven words.

02 · Photographic hero

The clinic is the hero.

Full-bleed photograph of the treatment room: green chair, oak floor, soft pink armchair by the window. No typographic heroes in a single-room clinic. Patients want to see where they're going.

03 · Trust, layered

Credentials where patients look.

HCPC and Royal College registration beside the fold. Twelve verified Google reviews on a deep-green editorial carousel. Dual MedicalBusiness + Physician schema with an AggregateRating block for the search snippet.

Detail 01 · Under the hood

Twelve reviews,
on a loop that knows when to stop.

The deep-green reviews section: 'Trusted across Dulwich' heading, 5.0 aggregate rating, 12 verified Google reviews on an auto-advancing editorial carousel with a progress bar below
What patients see: the reviews carousel, mid-advance.

A proper reviews carousel is three things most local clinic sites get wrong: it advances by itself, but knows when to stop; it's keyboard operable; and it doesn't burn battery when nobody's looking at it. This one is under 2KB of JavaScript. It pauses on hover, on focus, on touch, when the section leaves the viewport, when the tab goes to the background, and for anyone with prefers-reduced-motion set.

  • Auto-advance every 4.5s. Progress bar fills in 120ms ticks. Advance animates the native scrollLeft. No framework, no GSAP.
  • Pauses on every relevant signal. mouseenter, focusin, touchstart, IntersectionObserver exit, visibilitychange, and the reduced-motion media query.
  • Keyboard operable. Arrow keys advance the rail. tabindex="0" on the track. Progress resets after every manual move.
  • Seamless loop. On overshoot, wraps to the start; on under-shoot, wraps to the end. No jarring snap-back.
  • Three reveal safety nets. IntersectionObserver for fresh loads; a requestAnimationFrame rescue for elements already in view; a 5-second forced-reveal fallback for any stuck state.
  • Zero runtime framework. Pure ES5-compatible vanilla JS, IIFE-scoped. Ships in the initial HTML — no module, no deferred bundle.
// index.html · inline script
const INTERVAL = 4500;
const STEP     = 120;
let paused = reducedMotion;
let elapsed = 0;

function tick() {
  if (paused) return;
  elapsed += STEP;
  setProgress((elapsed / INTERVAL) * 100);
  if (elapsed >= INTERVAL) {
    scrollByCards(1);
    elapsed = 0;
  }
}

// Pause on every relevant signal
['mouseenter', 'focusin',
 'touchstart'].forEach(ev =>
  wrap.addEventListener(ev, pause,
    { passive: true })
);

// Stop entirely when offscreen
new IntersectionObserver(entries => {
  entries.forEach(e => {
    if (e.isIntersecting) {
      resume(); start();
    } else { stop(); }
  });
}, { threshold: 0.2 })
  .observe(wrap);
Carousel JS
~2 KB
Pause signals
6
Reveal safety nets
3
Initial HTML
105 KB
CSS
56 KB
Hero image
65 KB WebP
Detail 02 · Structured data

A practitioner
Google can read.

The About Michele section: 'A single practitioner, here to look after your feet properly.' headline, three-paragraph biography, a facts table listing Training, Registration and Approach, and a photograph of Michele Osborne in her clinic
What patients see: the about section, credentials inline.

Google reads a different page. Every credential, every opening hour, every treatment and its fee is typed by hand into a dual MedicalBusiness + Physician block in the <head>. An AggregateRating of 5.0 across twelve verified reviews lights up the search snippet. Eight MedicalProcedure offers with transparent GBP pricing. Opening hours as a structured array, not a sentence.

  • Dual @type: ["MedicalBusiness", "Physician"]. Indexed as both a clinic and a registered practitioner. Harley Street Medical Quarter and NHS high-risk experience surface in the Person subgraph.
  • AggregateRating: 5.0 across 12 reviews. Stars render in the search result without a third-party plugin.
  • 8 MedicalProcedure offers. Routine care, ingrown nails, nail surgery, verruca (Verrutop + needling), athlete's foot, fungal nail, orthotics. Every fee in GBP, every fee matches the on-page price.
  • 13 areaServed entries. Dulwich, East Dulwich, West Dulwich, North Dulwich, Village, Herne Hill, Denmark Hill, Crystal Palace, Forest Hill, Sydenham, Peckham Rye, Camberwell, Tulse Hill.
  • Structured openingHoursSpecification. Tuesday through Friday as discrete entries. Saturday carries a description for "available on request" — no free-text parsing left to the crawler.
  • Zero runtime JavaScript for the schema. Ships static in the first byte. No plugin, no generator, no CMS.
// index.html · head · schema
{
  "@type": ["MedicalBusiness",
           "Physician"],
  "medicalSpecialty": "Podiatric",
  "aggregateRating": {
    "@type": "AggregateRating",
    "ratingValue": "5.0",
    "reviewCount": "12"
  },
  "founder": {
    "@type": "Person",
    "name": "Michele Osborne",
    "description": "HCPC-registered" +
      "…Harley Street…"
  },
  "hasOfferCatalog": {
    "itemListElement": [
      { "itemOffered": {
          "@type": "MedicalProcedure",
          "name": "Nail surgery"
        }, "price": "300",
           "priceCurrency": "GBP"
      }
      // …7 more procedures
    ]
  }
}
Schema @types
MedicalBusiness + Physician
MedicalProcedure offers
8
AggregateRating
5.0 / 12
areaServed
13 entries
Opening hours
5 structured days
Rich Results
Validated
03 — Outcome

Live in under three weeks.

97
Lighthouse, mobile
14days
Brief to live
0
Templates used

The site is live at hamletpodiatry.co.uk. Harley Street sits above the fold. Cliniko booking works. The address says 8 Great Spilmans on every page.

If you run a local business in Dulwich, East Dulwich, Herne Hill, Forest Hill, Peckham, Crystal Palace, or anywhere across South East London and your website isn't doing its job, get in touch. The process is the same. See pricing for the full breakdown.

Next

Your business could be
case study 03.

Got a local practice or studio that needs a proper website? I'm taking on new projects now.

Start a conversation