External storefronts

Give an LLM the Salon storefront skill to adapt the built-in experience or create a separate client.

To create a custom Salon storefront, copy the skill and give it to your LLM. The skill will explain how features/storefront and the customer-facing app routes implement Salon's current experience.

After that source orientation, it will ask what you dislike, what should stay, what workflows and users matter, and what the replacement should look and feel like. It then traces the exact routes, feature slices, GraphQL calls, schema, access rules, sessions, and provider boundaries in the supplied Salon codebase before proposing work.

Current storefront routes

Route files live in app/(storefront)/(main)/**. Screens are in features/storefront/screens. The shared layout is MainLayout.

RouteScreenWhat it does
/HomePageFeatured services and stylists
/servicesServicesPageService menu by category
/services/[id]ServiceDetailPageService detail, stylists who offer it, reviews
/teamTeamPageStylist list
/team/[id]StylistDetailPageStylist profile and reviews
/stylists—Redirects to /team
/bookBookingPageServer / BookingPagePick service, stylist, location, and time; accept the booking policy; book. Takes ?service= and ?stylist=. Offers the waitlist on a day with no open times (signed-in clients)
/booking/[id]BookingConfirmationPageBooking confirmation
/accountAccountPageClient portal: upcoming and past visits, cancel, reschedule, consultation forms, receipts, reviews, memberships, packages, points, gift cards
/account/signinAccountSignInPageClient sign-in
/account/signupAccountSignUpPageClient sign-up
/appointments—Redirects to /account
/membershipsMembershipsPageActive membership plans and packages
/gift-cardsGiftCardsPageBalance check by code. Purchase is in-salon only
/galleryGalleryPagePublic salon images
/reviewsReviewsPageApproved reviews
/contactContactPageLocation, hours, contact details

The app/(storefront)/(booking) route group exists but is empty. features/storefront/middleware.ts passes every request through.

Named operations

AreaFileOperations (root field)
Brandlib/data/brand.tsPublicStorefrontSettings (publicStorefrontSettings)
Serviceslib/data/services.tsGetAllServices, GetFeaturedServices, GetServiceById, GetServicesByCategory, GetStorefrontCategoryOrder
Stylistslib/data/stylists.tsGetAllStorefrontStylists, GetFeaturedStorefrontStylists, GetStorefrontStylist, GetStorefrontStylistsForService (storefrontStylists, storefrontStylist)
Bookinglib/data/booking-context.ts, availability.ts, appointments.tsBookingContext, CheckAvailability (checkAvailability), BookAppointment (bookAppointment), GetAppointment
Waitlistlib/data/waitlist.tsJoinWaitlistAsClient (joinWaitlistAsClient)
Benefitslib/data/benefits.tsStorefrontBenefits (storefrontBenefits), GiftCardBalance (giftCardBalance)
Contentlib/data/gallery.ts, reviews.tsGetStorefrontGalleryImages, GetApprovedReviews, GetServiceReviews, GetStylistReviews
Accountaccount/actions.tsPortalSignIn (authenticateUserWithPassword), RegisterSalonCustomer (registerSalonCustomer), VerifyPortalIdentity, ClientPortal (clientPortal), PortalCancel (transitionAppointment), PortalReschedule (scheduleAppointmentSegments), PortalReview (submitAppointmentReview), PortalConsultation (submitConsultation)

lib/data/appointments.ts also defines GetClientAppointments, GetClientAppointmentsByEmail, and GetStylistAppointments. No current screen calls them.

Sessions and rules

  • Sign-in uses Keystone's keystonejs-session cookie. Sign-out calls endSession and deletes the cookie.
  • registerSalonCustomer creates a new user and an empty client profile. It never links an existing guest booking or user by email. It fails until the first dashboard user exists. Passwords must be 12 to 128 characters.
  • Guests can book with name, email, and phone. Clients must accept the current booking policy version (CLIENT_BOOKING_POLICY_VERSION).
  • Online cancel and reschedule are allowed only before the notice window (CLIENT_CANCELLATION_NOTICE_MINUTES, CLIENT_RESCHEDULE_NOTICE_MINUTES, default 24 hours).
  • clientPortal returns data only for the signed-in user. Benefits, points, and gift cards use owner filters.
  • With more than one active location, pass locationId to booking and availability.
  • The GraphQL endpoint is NEXT_PUBLIC_BACKEND_URL + /api/graphql, or the current origin.

On this page