The page this skill built from examples/linnet, working in your browser. Opens in a new tab. Also: .
16.5-second example rendered by this skill from examples/linnet · 1280×720
What you get
- A self-contained booking page and a paste-in embed from one booking.json
- Free times worked out from hours, shifts, buffers, bookings, notice and horizon
- The shop's and the visitor's time on every slot, correct across clock changes
- Designed states for holds, taken times, failed sends, empty weeks and email requests
- An add-to-calendar .ics file and an email fallback with every field
- A property test, checks at 4 widths and reduced motion, and a frame-by-frame recorder
- Two finished examples: a light physiotherapy clinic and a dark barber
- Open-source licenses for every part it builds on
Good fit
- A physiotherapy clinic or dental practice whose practitioners keep different shifts and offer treatments of different lengths.
- A barber or salon that wants visitors from abroad to see both their own time and the shop's time.
- A repair shop or studio that takes requests by email today and wants a clear request flow first.
Not for
- Taking deposits or card payments at booking
- Group classes with seat counts
- Multi-day rentals or hotel stays
- Storing bookings: it needs your endpoint or email
About this skill
The appointment booking section of a clinic, salon, barber or repair shop, built from one config. Visitors pick a service, its length drawn to scale, then a person if they like, a day and a start time. Every free time is worked out in the page from opening hours, shifts, service lengths plus clean-up buffers, existing bookings, closed days, notice and horizon, in the shop's time zone, with the visitor's own time under each slot when it differs. The week shows as seven day columns on one time scale, so busy days look busy without any scarcity counters, and a day track shows where the chosen block fits. Holds, a taken time, a failed send, a week with nothing free and booking by email all have designed states, and a booked card offers a calendar file.
Example request
Use booking-slots-kit to build the booking section for my physiotherapy clinic: three physios with their own shifts, four treatments with clean-up time, our current bookings, 2 h notice, bookings up to 28 days ahead, and a hold while people type their details.
How it works
Your agent
- 1
Collect the diary
From the person or their current booking tool.
- 2
Write booking.json
Copy
examples/linnet/booking.jsonorexamples/lantern/booking.jsonand replace every value. - 3
Build
It lists every problem at once and writes nothing until they are fixed: lengths and colours, contrast pairs, hours that do not parse or overlap, a shift outside the opening hours, a service done by nobody or too long for every shift it is offered in, a booking for a person who does not exist, an unknown time zone or currency, and pressure copy.
- 4
Test and check
test.mjsmakes 160 random shops (seed 7;--runsand--seedto change), many in a week with a clock change, and compares every start the engine offers or holds back for notice with a separate minute-by-minute reference, for each person and for "anyone", plus every start's label in the visitor's zone. - 5
Look at it
Open the address it prints.
- 6
Put it on the site
out/booking-embed.htmlis the whole section: a fonts link, one<style>, the<section class="bk">and one<script>. - 7
Record a preview (optional)
Writes
out/preview.mp4(1920×1080, 30 fps, 16.5 s, the script inpreview.script) andout/poster.pngfrom the held stretch.
- 1
You get
- out/booking-embed.html
- out/preview.mp4
- out/poster.png


What you need
- Node.js 18 or newer. Nothing to install.
- Chrome, Chromium or Edge for the check and the recorder (found automatically; set
CHROME_PATHotherwise). - ffmpeg, only for the video (
brew install ffmpeg,winget install ffmpeg,apt install ffmpeg; or setFFMPEG_PATH). - From the person: their services (name, length, clean-up time, price, who does them), opening hours, each person's shifts and days away, closed days, how much notice they need, how far ahead they take bookings, their time zone, and where requests go: an https endpoint that books (and, if it can, one that holds a time), or an email address.
Last checked Nov 9, 2026: the package’s own build and render commands ran and passed.
If something goes wrong
"people[1] (tom).shifts: sat 09:00-14:00 is outside the opening hours"
A shift must sit inside the shop's hours that day. Change the shift or the hours; the page never offers time the shop is shut.
"services[3] (pelvic): 60 minutes does not fit in any shift"
The service is longer than every shift of the people who do it. Add a person or a longer shift, or shorten the service.
"reads as "only N left" pressure" (or urgency, invented demand)
The build refuses copy the page cannot back up. Say what is true: "Every time below is actually free."
What’s in the download
- SKILL.md19.3 KB
- examples/
- examples/lantern/19.9 KB1 file
- examples/linnet/15.3 KB1 file
- kit/
- kit/booking.css19.0 KBthe section's styles, every class starting with
bk- - kit/engine.js9.48 KBthe availability rules, shared by the page and the test, no dependencies
- kit/runtime.js48.6 KBthe browser runtime (rendering, the hold, the endpoint, the calendar file, the email fallback), no dependencies
- scripts/
- scripts/kit/
- scripts/kit/build.mjs14.1 KB
- scripts/kit/cdp.mjs4.93 KB
- scripts/kit/check.mjs34.2 KB
- scripts/kit/record.mjs8.06 KB
- scripts/kit/schema.mjs14.5 KBevery field, its limits, the hours format, the colour and copy rules
- scripts/kit/serve.mjs2.50 KB
- scripts/kit/test.mjs11.2 KB
- scripts/build.mjs141 Bvalidates booking.json (every problem listed at once) and writes
index.htmlandbooking-embed.html - scripts/check.mjs141 Bopens the built page at 390, 768, 1024 and 1440 px and with reduced motion, and runs the slot-time, booking-flow, email, diary-failure and no-free-time checks
- scripts/chrome.mjs3.63 KB
- scripts/record.mjs143 Brecords the page's fixed script to
preview.mp4andposter.png, takes single stills (any designed state), and prints the settled stretches - scripts/serve.mjs141 Bserves a built folder on localhost to look at
- scripts/test.mjs139 Bthe property test: random shops in 12 time zones, compared minute by minute with an independent reference
- NOTICE.md1.62 KB
- TESTED.json444 B
21 files · 227 KB · installs to ~/.claude/skills/booking-slots-kit for Claude Code and ~/.agents/skills/booking-slots-kit for other agents
Credits and licenses: NOTICE.md plus any LICENSE files inside the ZIP.
Similar Skills
View allDetails
- Output
- page kit · booking section · page + embed · 1080p video
- Needs
- Node.js 18+, Chrome (or Chromium/Edge), and ffmpeg for the video
- Series
- Page Kits · 29 skills
- Updated
- Nov 9, 2026
- Checked
- Nov 9, 2026: its own commands ran and passed. That is a working check, not a security audit.
Written for
See all 31 agents that read skill folders.
Install guides
For your agent
Generates with
Installed it? Tell others how it went. Reviews come from people who installed this skill.
Write a reviewFAQ
How does it know which times are free?
It works them out in the page from your opening hours, each person's shifts and days away, service lengths plus clean-up buffers, your existing bookings, closed days, notice and horizon, in your time zone. A property test compares these rules with a minute-by-minute reference over 160 random shops, including weeks with a clock change.
What happens if two people want the same time?
With a hold endpoint the first visitor's time is held for the minutes you set, with a real countdown. If your endpoint answers that the time was taken, the page marks it taken, selects the next free start and keeps the details already typed.
Can it work without a booking system?
Yes. Without an endpoint the button says Request this time and opens the visitor's email app with every field filled in. The card is stamped Requested, never Booked, and says the time is not reserved until you reply.
Which agents is Booking Slots written for?
Any agent that reads SKILL.md folders, including Claude Code, Codex, Cursor, GitHub Copilot, Gemini CLI and OpenCode.
Do I own what I make with it?
Yes. Everything your agent makes with this skill is yours, including for client and commercial work.
What if it doesn’t work for me?
Email support@lookbk.dev within 7 days of buying and we’ll fix it or refund you.
Credits and licensesWritten by Lookbk
Lookbk wrote this package, its availability engine and its runtime with no third-party code; the fonts load from Google Fonts under the SIL Open Font License 1.1. Written by Lookbk, no third-party code.
Credits and licenses for the open-source software and fonts it uses are in NOTICE.md inside the download.