Hamlet Podiatry.
hamletpodiatry.co.uk
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.
Lead with the differentiator.
Let the room do the rest.
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.
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.
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.
Twelve reviews,
on a loop that knows when to stop.
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,IntersectionObserverexit,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
requestAnimationFramerescue 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
A practitioner
Google can read.
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
MedicalProcedureoffers. 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
areaServedentries. 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 adescriptionfor "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
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.
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