Skip to content

Local Service

Deep teal, for a business people let into their house. A booking widget above the fold, every price published, and a compliance footer with the registrations a regulated trade has to show.

4 routes4 pages · 14 blocks29 files · 3,530 lineslucide-reactAdded 2 Sept 2026

What's included

  • app/blog/[slug]/page.tsx
  • app/blog/page.tsx
  • app/globals.css
  • app/layout.tsx
  • app/not-found.tsx
  • app/page.tsx
  • and 8 more files
  • 4 pages it is built from, installed with it
  • Needs lucide-react

Works with

  • React
  • Next.js
  • Tailwind CSS
  • TypeScript

npx hoverlab init local-service ./my-app

Or over MCP, from your editor's agent — no account needed.

License

Free to read, copy and install, for personal and non-commercial projects. Shipping it in client work or a paid product needs Pro ($79 once). The source lands in your repo and stops being ours — no attribution, nothing to upgrade.

Was this useful?

Every screen

Stockbridge, Edinburgh — NHS and private

A dentist you can get into this week

Same dentist every visit, prices on the wall, and an appointment that starts when it says it does. Taking new NHS patients as of this month.

Average wait for a first appointment: 2 days

Pick a day

Free to cancel up to 24 hours before.

2004
practising on this street since
Same building, third generation
4.9
from 612 Google reviews
We answer the bad ones too
48 hrs
typical wait for a check-up
Same day for anything painful
Yes
taking NHS patients
Checked and updated every Monday

What are you coming in for?

Most people arrive for one of these four. Prices are on the next section, in full, including the ones nobody likes quoting.

A check-up

You are overdue and slightly embarrassed about it

  • Nobody will comment on how long it has been
  • Examination, X-rays if needed, and a written plan
  • From £29 on the NHS band 1
Book a check-up

Something hurts

You need to be seen today, not in a fortnight

  • Emergency slots held back every morning and afternoon
  • Ring before 9am and you will be seen the same day
  • Registered or not — we will not turn you away in pain
Call the practice

You are nervous

The last time went badly and you have avoided it since

  • A first appointment where nothing happens but talking
  • Sedation available, and a stop signal that we actually stop for
  • Two of our dentists are specifically trained for this
Read how it works

Straightening or whitening

You have been looking at this for a while

  • Clear aligners, veneers and whitening, quoted before we start
  • A free 15-minute consultation with no obligation
  • Finance over 12 months at 0%
See prices

What people round here say

Pulled from our Google reviews, with permission and without editing.

“I had not been to a dentist in eleven years and had worked myself into a state about it. They gave me an appointment where they just talked me through it and did nothing else. Went back a fortnight later and got it all done.”
Alison M.Comely Bank
“Rang at 8:40 with a broken filling and was in the chair by 11. No fuss about not being registered, and the price was what they said on the phone.”
Tomasz K.Stockbridge
“Third generation of my family to use them. My gran went to the current dentist’s grandfather. They are not the cheapest and they have never once tried to sell me something I did not need.”
Fiona R.Dean Village
“The aligners came in about £400 over the first estimate because I needed extra refinements. They flagged it before doing the work rather than on the invoice, which is the only reason this is still five stars.”
Dan H.New Town
“Parking is genuinely a nightmare and they tell you so on the phone rather than letting you find out. Use the Raeburn Place car park.”
Priya S.Inverleith
“They ran 25 minutes late once in four years and the receptionist rang me before I left the house.”
George W.Canonmills

Every price, on the page

Including the ones practices normally make you ring for. NHS bands are set nationally and change each April; the private column is ours.

Every price, on the page — features by plan
FeatureNHS Band 1NHS Band 2PopularPrivate
Examination and diagnosis£29.00IncludedFrom £95
X-rays, where clinically neededIncludedIncludedIncluded
Scale and polishIf requiredIncludedFrom £75
FillingsNot included£78.00From £145
Root canal treatmentNot included£78.00From £420
ExtractionNot included£78.00From £180
Emergency appointment£29.00£29.00£110
WhiteningNot includedNot includedFrom £320
Veneers, per toothNot includedNot includedFrom £480
Clear aligners, full courseNot includedNot included£1,900–£3,400
Written quote before treatment startsIncludedIncludedIncluded
0% finance over 12 months, above £500Not includedNot includedIncluded
Free if under 18, pregnant, or on qualifying benefitsIncludedIncludedNot included

Visiting us

The things people ring up to ask

Getting here

Where do I park?

Honestly: not easily. Raeburn Place has a pay-and-display two minutes away and is your best bet. There is no practice car park and the residents’ bays are enforced. Give yourself ten minutes more than you think.

Is the practice accessible?

Ground floor, step-free from the street, and one surgery with a wheelchair-accessible chair. The upstairs surgeries have no lift — tell us when booking and we will put you downstairs.

Cost and payment

Am I entitled to free NHS treatment?

Under 18, under 19 and in full-time education, pregnant or having had a baby in the last 12 months, or on qualifying benefits. Bring the evidence to the first appointment — claiming without it and being checked later means paying the full charge plus a penalty.

Will I be told the price before you start?

Always, in writing, and we do not begin until you have said yes to it. If something changes mid-treatment we stop and tell you rather than adding it to the bill.

If you are nervous

Can I come in without having anything done?

Yes, and a fair number of people do. Fifteen minutes, sitting up, nothing in your mouth. Two of our dentists have specific training in dental anxiety and it is not treated as an unusual request.

What sedation do you offer?

Inhalation sedation for most anxious patients and intravenous sedation for longer or more difficult work. Both need a chat first, and IV sedation needs someone to take you home.

Out of hours

What do I do at the weekend?

Ring the practice number and the message gives you the NHS 24 dental line. For anything involving facial swelling, difficulty swallowing or uncontrolled bleeding, go to A&E rather than waiting for Monday.

Or just ask us something

A real person reads these during practice hours and answers the same day. If it is urgent, ring instead — we will always pick up faster than we type.

Weekdays 8am–6pm, Saturdays 9am–1pm. Closed Sundays and bank holidays.

Live components in your current theme — switch routes, or the phone icon to check the mobile layout. Colours are this template’s Harbour palette, which ships in app/globals.css. Deep teal on a cool near-white. Calm and clinical without going grey — the register a business you let into your house wants.

Get it

29 files · .zip · nothing to configure · Pro

then

cd local-service
npm install
npm run dev

The archive contains the whole project — routes, blocks, theme tokens, Tailwind and PostCSS config, tsconfig and a .gitignore. One runtime dependency, and no Hoverlab dependency at all: it is your code from the moment it unzips.

For AI

The component, its props, the design tokens it expects and the command that installs it — as one prompt. Paste it into Claude, Cursor, v0 or ChatGPT and what they build around it will match the rest of the catalog instead of inventing its own system.

See the prompt

Routes

PathPageFile
/Local Service Landing Pageapp/page.tsx
/blogBlog Indexapp/blog/page.tsx
/blog/[slug]Article Pageapp/blog/[slug]/page.tsx
404404 Pageapp/not-found.tsx

What you get

project root(8 files)

  • GETTING-STARTED.md
  • gitignore
  • next.config.ts
  • package.json
  • postcss.config.mjs
  • README.md
  • tailwind.config.ts
  • tsconfig.json

app/(6 files)

  • blog/[slug]/page.tsx
  • blog/page.tsx
  • globals.css
  • layout.tsx
  • not-found.tsx
  • page.tsx

components/(15 files)

  • article-header.tsx
  • blog-post-grid.tsx
  • comparison-table.tsx
  • contact-form-split.tsx
  • faq-categorized.tsx
  • footer-compliance.tsx
  • footer-minimal.tsx
  • hero-booking.tsx
  • navbar-simple.tsx
  • newsletter-signup.tsx
  • not-found-404.tsx
  • persona-cards.tsx
  • stats-band.tsx
  • testimonial-grid.tsx
  • theme-provider.tsx

Every file is listed. The 14 files in components/ are the blocks the pages import — each one has its own page if you want to read it on its own.

Project files

Everything except the blocks. Opens on app/globals.css — the file that makes the rest look right, since every block styles itself with bg-card and text-muted-foreground rather than literal colours.

app/globals.css
@tailwind base;
@tailwind components;
@tailwind utilities;

/**
 * Design tokens — the Harbour palette.
 *
 * Deep teal on a cool near-white. Calm and clinical without going grey — the register a business you let into your house wants.
 *
 * This file is the reason a pasted block looks right. Every block and page
 * styles itself with semantic classes — `bg-card`, `text-muted-foreground`,
 * `border-border` — rather than literal colours, so they inherit whatever
 * you define here instead of fighting it. Change a value below and every
 * section in the project moves with it. Change the hue on `--primary` and
 * `--ring` together and you have rebranded the site.
 *
 * Values are bare HSL channels, not `hsl(...)` calls. That is what lets
 * Tailwind compose them with an alpha suffix: `bg-primary/10` expands to
 * `hsl(var(--primary) / 0.1)`, which is impossible if the variable already
 * carries its own function wrapper.
 *
 * Every foreground/background pair below clears WCAG AA (4.5:1) in both
 * themes. If you retune one, check the pair rather than trusting the eye —
 * mid-lightness accents are the ones that fail.
 */

@layer base {
  :root {
    --background: 190 40% 99%;
    --foreground: 200 40% 9%;
    --card: 0 0% 100%;
    --card-foreground: 200 40% 9%;
    --popover: 0 0% 100%;
    --popover-foreground: 200 40% 9%;
    --primary: 192 88% 26%;
    --primary-foreground: 0 0% 100%;
    --secondary: 190 35% 95%;
    --secondary-foreground: 200 40% 18%;
    --muted: 190 28% 95%;
    --muted-foreground: 200 12% 40%;
    --accent: 172 50% 92%;
    --accent-foreground: 180 60% 15%;
    --destructive: 0 72% 47%;
    --destructive-foreground: 0 0% 100%;
    --border: 190 22% 88%;
    --input: 190 22% 88%;
    --ring: 192 88% 26%;

    --radius: 0.625rem;
  }

  .dark {
    --background: 200 38% 5%;
    --foreground: 190 15% 97%;
    --card: 200 30% 8%;
    --card-foreground: 190 15% 97%;
    --popover: 200 30% 8%;
    --popover-foreground: 190 15% 97%;
    --primary: 188 75% 55%;
    --primary-foreground: 200 45% 6%;
    --secondary: 200 22% 14%;
    --secondary-foreground: 190 15% 97%;
    --muted: 200 22% 14%;
    --muted-foreground: 195 10% 66%;
    --accent: 172 30% 17%;
    --accent-foreground: 172 50% 85%;
    --destructive: 0 62% 52%;
    --destructive-foreground: 0 0% 100%;
    --border: 200 18% 18%;
    --input: 200 18% 18%;
    --ring: 188 75% 55%;
  }
}

@layer base {
  * {
    @apply border-border;
  }

  body {
    @apply bg-background text-foreground antialiased;
  }

  /**
   * Global motion opt-out.
   *
   * Blocks guard their own animations with Tailwind's `motion-safe:`, but
   * third-party CSS and anything you add later will not. This is the
   * backstop: it neutralises every animation and transition on the page
   * for users who have asked the OS for reduced motion, rather than
   * relying on each author to remember.
   */
  @media (prefers-reduced-motion: reduce) {
    *,
    *::before,
    *::after {
      animation-duration: 0.01ms !important;
      animation-iteration-count: 1 !important;
      transition-duration: 0.01ms !important;
      scroll-behavior: auto !important;
    }
  }
}

More Landing Pages

Open the full page for this template

Startup Waitlist

The waitlist hero with the count on it

A pre-launch site in violet: one email field, a blog to keep the list warm, and no pricing to be held to. The smallest honest thing to put in front of a product that does not exist yet.

4 routes4 pages13 blocksUltraviolet
Pro
Open the full page for this template

Developer Tool

The terminal hero, typing the install

Near-black buttons, square corners and a terminal-green accent. Install command above the fold, real code before any prose, docs and changelog behind it.

5 routes5 pages17 blocksGraphite
Pro
Open the full page for this template

Mobile App

The store-badge download hero

Emerald and 16px corners, built around one conversion: the store install. Badges and the App Store rating above the fold, a single price, and an account area for the subscription.

5 routes5 pages18 blocksSignal
Pro
Open the full page for this template

Agency Studio

Case studies that name the constraint

Terracotta on warm paper, with no blue in it anywhere. Full-bleed hero, client list, the actual team, a journal and a careers page — and no pricing, on purpose.

5 routes5 pages15 blocksSandstone
Pro
Open the full page for this template

Marketplace

Both sides of the market on one page

Dark olive on warm off-white, built for two audiences at once: search and real listings for buyers, the seller economics below the fold, and a browse route behind it.

5 routes5 pages19 blocksMoss
Pro
Open the full page for this template

Enterprise

The security posture band

Burgundy and square corners — the register of things bought in a boardroom. Numbers in the hero, a comparison table that concedes rows, and published prices instead of a sales wall.

5 routes5 pages18 blocksClaret
Pro
Open the full page for this template

Integration Platform

The integration grid, sorted by depth

High-chroma blue. The connector names in the hero, a catalogue with honest live/beta/planned status, four SDK languages and a dated roadmap for everyone who is not on the list.

4 routes4 pages14 blocksCobalt
Pro
Open the full page for this template

Creator Course

The curriculum, module by module

Magenta-plum with the softest corners in the set, for one person selling one thing. A student testimonial as the hero, a long instructor section, one price and the refund policy on the page.

5 routes5 pages15 blocksPlum
Open the full page for this template

Newsletter

The archive, above the testimonials

One decision, made from the archive: a hero with the field in it, the back issues as the actual argument, and the three worries about handing over an address answered as content.

6 routes6 pages22 blocksTideline