A calendar that reads like a busy shop

Each day offers between two and five open times — a different count every day, spread across morning, midday and afternoon — with the rest shown as taken.

What it is

A deterministic share of each day's genuinely free slots is presented as taken. The booking window runs about a week and a half out. The selection is seeded per host and day, so a refresh never reshuffles it, and the same function guards the booking POST so a hidden slot cannot be booked by hand.

Also called: too many open slots · availability looks empty · scarcity on the booking page

See it
A calendar that reads like a busy shop
Apr
May
Jun
Jul
Ivy Brubaker — 40×64 Shop
Framing
Delia Yoder — 40×64 Shop
Concrete
Ronan Petsch — 30×40 Garage
Trim
Gideon Alt — 30×40 Garage
Framing
Delia Yoder — Hobby Shop
Concrete
Framing crewConcrete crewTrim crew
A day's time column with three bookable times and the rest struck through as taken. book/[token]/page.tsx. Sample data — no customer information appears here.
How it works
  1. 1Real appointments and Google busy blocks mark slots taken first.
  2. 2Of what remains, a seeded count between two and five is kept, chosen round-robin from thirds of the day so the open times look natural.
  3. 3freeSlots (which the POST validates against) filters the same grid, so display and enforcement cannot disagree.
Why we built it

Quoted in the library: a deterministic share of each day's open slots 'is shown as taken so the calendar reads like a busy shop'. The determinism and the shared guard are what keep it honest — the page cannot show one thing and accept another.

The problem
  • An empty calendar signalling no demand
  • Display and validation drifting apart
Sound familiar?
What you get
A calendar that reads as in demand
Refreshing never reshuffles the times

See it on your own jobs

Twenty minutes, your numbers, no slide deck. We’ll build one of your real buildings in front of you and send you the estimate link at the end — yours to keep either way.

or keep browsing features →