05 — Coworking / Booking / 2026

WORXMT.FUJI

The site for Kikkodo (worx mt.fuji), a coworking space in Yoshiwara, Fuji. Alongside the space and its prices, it takes bookings without an account, gives each customer a page for their bookings without a password, and gives the staff a dashboard to run them.

2026
Yoshiwara, Fuji, Shizuoka
CLIENT
Kikkodo, Kondo Pharmacy — 橘香堂(近藤薬局)
SECTOR
Coworking / Booking
ROLE
Design, development, booking system, admin, SEO, operation
YEAR
2026
LIVE
worxmtfuji.com ↗

01 / PROJECT

WHAT THE
PROJECT IS.

Kikkodo is a coworking space in Yoshiwara, Fuji, seating 80 and holding 150 standing. It is used by the hour, by monthly members, as a meeting room and as a registered business address, and it is hired out for events or for a whole day. The site covers the space and its equipment, prices, access and common questions, with a page for each way of using it.

Booking takes four steps — the kind of use, a free day and time on the calendar, contact details, a final check — and needs no account. The confirmation email carries a link to that booking, where it can be checked and cancelled until 17:00 the day before. Every booking made with one email address is gathered on a customer page, opened through a sign-in link sent by email.

The staff side is a booking dashboard. It opens on today, the next seven days and what is awaiting confirmation, and covers search by name or phone number, confirming and cancelling, entering bookings taken by phone, moving a date or time, and a note the customer never sees. I handled it end to end: design, implementation, the booking system, the admin, SEO, deployment to Cloudflare and operation.

02 / HOW IT WORKS

THE DECISIONS
UNDER IT.

FROM THE IMPLEMENTATION

01
One slot, one booking

What counts as a clash follows how the space is used: visitors and coworking share the floor and never block each other, meeting rooms clash only when their hours overlap, and a day hired out whole blocks everything. The calendar shows only free slots, but a slot can fill between opening the calendar and pressing send, so the server checks again before writing. Two requests arriving together would both pass that check, so after inserting, each reads the day again and backs out if an earlier booking now overlaps it. Earlier means created first, with the ID breaking a tie, so both sides rank the pair the same way and never both back out. The one that loses is removed before any email is sent.

02
Staff are warned, not stopped

When staff enter or move a booking that overlaps another, they are warned and can save knowing it is there. After saving, the server checks again, since a web booking or a second member of staff may have taken the slot between the check and the save. Confirming and cancelling only apply to a booking still in the state they expect, so a customer cancelling at the same moment is not overwritten by a confirmation — the staff member is told it has already changed. A customer's cancellation works the same way, and emails go out only when a row actually changed, so a double click does not send two. A cancelled booking cannot be reinstated, because its slot may have gone to someone else; it is entered again instead.

03
No account, and nothing to store

The link in a confirmation email is the booking's ID with an HMAC signature, so only its recipient can open or cancel it, and nothing is stored to make that work. The cancellation deadline, 17:00 the day before, is computed in Japan time whatever clock the server runs on, across the end of a month or a year. The customer page signs in by email: a 15-minute link, then a 30-day httpOnly cookie, and the two are signed for different purposes so one cannot stand in for the other. The sign-in form gives the same answer whether or not an address has bookings, and sends the email after responding, so not even the response time gives it away.

04
The admin checks its own gate

The dashboard sits behind Cloudflare Access, which sends a one-time code to approved addresses. The app does not take that on trust: every admin action verifies the token Access signs — issuer, audience, algorithm and an email on the allow-list — so a policy left misconfigured, or a request sent straight to the workers.dev address, still gets no booking data. With the settings missing it refuses rather than opens. In the database, row-level security is on with no policies and the public roles hold no grants, so names, emails and phone numbers are reachable only from server code with the service key, in modules marked server-only.

05
Pages stay static; data comes through actions

It runs on Cloudflare Workers' free plan, which allows 10 ms of CPU per request. With no incremental cache configured, even the pages generated at build time were being rendered again on every request, and past that limit the site answered with Error 1102. Built pages are now served from the static-asset cache without passing through Next.js at all. What depends on the visitor — the customer page, a booking's page, the admin — is read in the browser and fetched through server actions, so the page itself stays static.

03 / DELIVERED

WHAT WAS
BUILT.

  1. 01

    Pages for the space, prices, access and common questions, with four more for each way of using it

  2. 02

    Four-step booking with live availability, a start-to-end range for meeting rooms and whole-day hire, no account required

  3. 03

    A confirmation email with a signed link to each booking, and cancellation online until 17:00 the day before

  4. 04

    A customer page reached by an emailed sign-in link: upcoming and past bookings, cancellation, and a booking form that opens with the email, name and phone already in

  5. 05

    A booking dashboard: today, seven-day and awaiting counts, five views, search, confirm and cancel with an optional email, phone bookings, date changes with an overlap warning, and a staff note

  6. 06

    A contact form with six enquiry types, a notice to the space and a copy to the sender

  7. 07

    Drawing-style figures of the facilities that draw themselves in and loop in CSS alone, and hold still for anyone who prefers reduced motion

  8. 08

    Bot checks on every public form, a limit on sign-in emails, LocalBusiness structured data, per-page titles and share cards, and redirects onto one canonical domain

04 / TECHNOLOGY

THE STACK
BEHIND IT.

  • Next.js
  • React
  • TypeScript
  • Cloudflare Workers
  • Cloudflare Access
  • Supabase
  • Resend
  • Turnstile
  • Tailwind CSS
  • Jest
NEXT — 06Jurakuen→ALL WORKS ↗