Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 2 additions & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -23,8 +23,9 @@ If you are evaluating an agency, this is the format you actually want: real URLs
| Client | Industry | Live site | Framework | Hosting region | Delivery |
|---|---|---|---|---|---|
| [Perfect Prep](sites/perfect-prep.md) | Halal meal prep & catering (Yorkshire & Teesside) | [getperfectprep.com](https://getperfectprep.com) | Astro (static) | London (`lhr1`) | Cloudflare in front of Vercel |
| [Hydra Restore](sites/hydra-restore.md) | Exterior cleaning (Leeds & West Yorkshire) | [www.hydrarestore.co.uk](https://www.hydrarestore.co.uk) | Astro (static) | Vercel | Vercel edge network |

> This is the starting entry. New live client sites are added over time as their owners are happy to be listed publicly. Each row links to a per-site fact sheet in [`sites/`](sites/) with the full stack breakdown.
> New live client sites are added over time as their owners are happy to be listed publicly. Each row links to a per-site fact sheet in [`sites/`](sites/) with the full stack breakdown.

Machine-readable versions of every entry live alongside the markdown fact sheets in [`sites/`](sites/) as JSON, so this gallery can be consumed by tooling as well as read by people.

Expand Down
29 changes: 29 additions & 0 deletions sites/hydra-restore.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
{
"$schema": "../site.schema.json",
"slug": "hydra-restore",
"name": "Hydra Restore",
"industry": "Exterior cleaning (pressure & soft washing)",
"region": "Leeds & West Yorkshire, UK",
"url": "https://www.hydrarestore.co.uk",
"builtBy": "UK Web Marketing",
"builtByUrl": "https://ukwebmarketing.com",
"public": true,
"stack": {
"framework": "Astro",
"rendering": "static",
"clientJavaScript": "minimal, progressive (menu, before/after sliders, forms); pages work without it",
"hosting": "Vercel",
"delivery": "Vercel edge network",
"fonts": "self-hosted woff2 via Fontsource (Space Grotesk, Inter)",
"icons": "hand-inlined SVG, no icon runtime",
"images": "optimised at build with astro:assets (Sharp)",
"analytics": "Plausible (cookieless), config-gated"
},
"accessibility": [
"visible focus states and a skip link on every page",
"keyboard-accessible before/after sliders (native range input)",
"off-screen mobile menu inert with managed focus",
"prefers-reduced-motion respected",
"WCAG-AA contrast on interactive elements"
]
}
44 changes: 44 additions & 0 deletions sites/hydra-restore.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,44 @@
# Hydra Restore

**Industry:** Exterior cleaning (pressure & soft washing)
**Live site:** [www.hydrarestore.co.uk](https://www.hydrarestore.co.uk)
**Built by:** [UK Web Marketing](https://ukwebmarketing.com)

Checkatrade-approved exterior-cleaning team covering Leeds & West Yorkshire — driveways, patios, render soft washing, gutters and tarmac restoration. The site is a local-search engine for a trade business: a three-layer architecture of service pages, genuinely-local town pages and curated service-in-town landing pages (128 pages total, all generated from one data layer), with real before/after photo sliders, documented case studies, long-form care guides and a WhatsApp-first photo-quote flow.

## Stack

| Layer | What we used |
|---|---|
| Framework | Astro, static output |
| Client JavaScript | Minimal and progressive — menu, before/after comparison sliders, form handling; every page works without it |
| Hosting | Vercel (fully static output, no serverless functions) |
| Fonts | Self-hosted `woff2` via Fontsource (Space Grotesk, Inter), no font CDN |
| Icons | Hand-inlined SVG, no icon runtime |
| Images | Optimised at build with `astro:assets` (Sharp) — responsive widths, modern formats, lazy-loaded |
| Analytics | Plausible (cookieless), config-gated — the one third-party script the site loads |

## SEO and structure

- Three-layer local-SEO architecture: 8 service pages, 20 town pages with genuinely local copy, and 66 curated service-in-town pages (deliberately not a blanket matrix — each combo exists only where that service is genuinely relevant locally, with unique copy per page)
- JSON-LD `@graph` on every page: a single `LocalBusiness` entity referenced site-wide, plus town-scoped `Service`, `FAQPage`, `BreadcrumbList`, `Article`/`BlogPosting` nodes
- Canonical URLs, Open Graph and Twitter card metadata on every page
- Sitemap with genuine per-content `lastmod` dates from frontmatter
- 10 advice articles + 5 long-form care guides, cross-linked into the service pages

## Accessibility

- Visible focus states and a skip link on every page
- Keyboard-accessible before/after sliders (native range input under the pointer surface)
- Off-screen mobile menu kept out of the tab order with `inert`, with managed focus
- `prefers-reduced-motion` respected for reveal animations and slider transitions
- WCAG-AA contrast on interactive elements (audited)

## Verify it yourself

- Open [www.hydrarestore.co.uk](https://www.hydrarestore.co.uk) and view source: static HTML, self-hosted fonts, one optional analytics script.
- Run `node scripts/check-links.mjs` from the repo root to confirm the URL resolves.

---

Built by [UK Web Marketing](https://ukwebmarketing.com). Site and brand © Hydra Restore.
Loading