Someone searching for a barber on their phone wants to know three things: what it costs, whether the shop is any good and when they can come in. A neighbourhood shop rarely needs more than one page to answer that, but the page has to load quickly on mobile data, feel like the shop and make the next step a single tap. Northside Barbers shows how the Starter package handles that job, and deliberately nothing beyond it.
VISUAL SYSTEMDESIGN DIRECTION
Shop light after dark.
The palette comes from the interior photography: charcoal walls, warm bone text and a brass accent like the pendant lamps. Big Shoulders Display gives headings and prices the confidence of a painted price board, while Barlow keeps descriptions, hours and the form easy to read. Dotted price leaders, a single accent colour and real photos keep the page distinctive without leaning on template decoration.
Charcoal #161513
Smoke #201E1B
Bone #F3ECE0
Brass #D6A54B
THE SOLUTION04 KEY DECISIONS
Key decisions in Northside Barbers
01
The Starter package, as sold
One page with five sections, responsive for phones, tablets and desktop, a working contact form, basic SEO and launch setup: the same list as the C$250 Starter package, with one revision round and the owner supplying text and photos. No booking system, CMS or extra pages were added to make the example look bigger than the offer.
02
Prices before questions
Seven services with CAD prices and durations read like the board on the wall, so a visitor can choose before calling. The hours table highlights today in Toronto time, and six photos open in an accessible lightbox.
03
One tap to call or get there
Book a visit and Call sit on the first screen. On phones a fixed bar keeps Call and Directions within reach while scrolling, and a lightweight static map opens Google Maps instead of loading a map widget.
04
Fast, findable and honest
The standalone build scores 100 in all four mobile Lighthouse categories, with no layout shift and about 200 KB on first load. The page ships a title, description, share image and HairSalon structured data. The callback form validates inline, shows success only after Formspree accepts the request, and says plainly that demo requests reach the developer.
USER JOURNEYHOW IT WORKS
From a search on the street to a call back.
Each section answers one question a first-time customer has, in the order they usually ask it.
01
Arrive
The first screen shows the shop, where it is and two ways to act: book a visit or call.
02
Compare
Scan services, prices and durations, then open the gallery to see recent cuts and shaves.
03
Check
Read what regulars say and see whether the shop is open today.
04
Reach out
Call, get directions, or leave a name, number and preferred time for a callback.
Fictional barbershop. Callback requests are sent to the portfolio developer, not a barber, and nobody will call back.
What this demo does not include
Northside Barbers is a fictional business created for this portfolio. The address is a street corner rather than a storefront, the phone number is in the reserved 555-01xx range, and the three reviews are written samples labelled as such. Callback requests really are delivered via Formspree, but to the portfolio developer: no barber receives them and nobody will call back. There is no online booking, availability or payment, which are outside the Starter package. Photos are Unsplash images credited in the project’s CREDITS file, and the map is a static OpenStreetMap image.
UNDER THE HOODTECH
How it is built.
Astro 7 static output, one page, no UI framework
Plain CSS with self-hosted OFL fonts and metric-matched fallbacks
About 3 KB of JavaScript: lightbox, form validation, today’s hours
Responsive AVIF/WebP images from the Astro image pipeline
Native <dialog> lightbox with keyboard paging and focus return
Formspree delivery with pending, accepted and retryable error states
Meta and Open Graph tags plus HairSalon JSON-LD
Mobile Lighthouse 100 in all four categories (standalone build)
Want a website like this for your business?
Tell me what you need and get a fixed quote, with no obligation.