Claude Code ile Premium Randevu Web Sitesi Oluşturun

Bir kuaför salonu, berber veya masaj stüdyosu için gerçek randevular, randevu e-postaları ve işletme sahibi paneli olan benzersiz bir randevu web sitesi oluşturun.

Yol Haritası ve Kaynaklar

Gereksinimler

Claude Desktop

Claude Code web sitenizi masaüstü uygulamasında oluşturur. Tam bir build uzun bir oturumdur, bu yüzden yeterli payı olan ücretli bir Claude paketi kullanın.

Claude Desktop'ı İndirin

https://claude.ai/download

Node.js

LTS sürümünü indirin. Claude web sitenizi oluşturmak ve kontrol etmek için kullanır.

Node.js'i İndirin

https://nodejs.org/en/download

GitHub hesabı

Ücretsiz. Web sitenizin kodu burada durur ve Hostinger buradan yayına alır.

GitHub Hesabı Oluşturun

https://github.com/signup

Supabase hesabı

Ücretsiz paket yeterlidir. İki aktif projeye izin verir — zaten iki projeniz varsa kullanmadığınız birini duraklatın. Hizmetlerinizi, çalışma saatlerinizi, randevularınızı ve panel girişinizi saklar.

Supabase Hesabı Oluşturun

https://supabase.link/r4gdwhi

Resend hesabı

Ücretsiz paket günde 100, ayda 3.000 e-posta gönderir. Her randevu birkaç e-posta gönderir: kod, talebin alındığı bildirimi, size giden uyarı ve onay.

Resend Hesabı Oluşturun

https://resend.com/signup

Kendi alan adınız

Web siteniz bu alan adında yayınlanır ve randevu e-postaları bu alan adından gönderilir. Gmail gibi ücretsiz bir adres bunları gönderemez. Alan adını Hostinger paketinizle mi alıyorsunuz? Paketi 3. Adım'dan önce alın.

Hostinger barındırma

Barındırmaya 5. Adım'da, web siteniz yayına alındığında ihtiyacınız olur.

Bir Hostinger Paketi Seçin

Business (Unlimited) paketini veya bir Cloud paketini kullanın — Node.js Web Apps yalnızca bunlarda çalışır: Business'ta en fazla 5, Cloud'da 10.

Randevu İşletmenizi Seçin

İşletme Türünüzü Seçin

Sizin kısmınız. Booking Engine üçü için de aynıdır — tasarım, metinler ve örnek hizmetler seçtiğiniz işletmeye göre hazırlanır.

Ne tür bir işletme?

Kuaför Salonu

Kesim, boya ve şekillendirme; motorun hazır salon hizmetleriyle.

Build a complete, premium booking website for **{{BUSINESS_NAME}}**, a hair salon in {{CITY}}, in this empty folder. The booking system is an installed package — the **Profit Studio Booking Engine**. It owns availability, bookings, booking emails and the owner's dashboard. You design and build the public website around it, and nothing the engine provides. ## 1. Set up 1. Scaffold a Vite + React + TypeScript app **in the current folder**: `npm create vite@latest . -- --template react-ts --no-interactive`, then `npm install`. create-vite stops without an error when the folder is not empty — a `.DS_Store` or a `.claude/` folder is enough — so check that `package.json` now exists. If it does not, scaffold into a new subfolder the same way, move all of its files (dotfiles included) up into this folder without overwriting or deleting anything already here, and remove the empty subfolder. Remove the template's demo content. 2. `npm install --save-exact @profitstudio/booking-engine@2.0.0-beta.1`, then `npx booking-engine init --preset hair-salon`. 3. Read `node_modules/@profitstudio/booking-engine/docs/BUILD-A-SITE.md` once: it has every file to wire, the booking API and the error table. Open `docs/INTEGRATION.md` only at a section it names, and nothing else in the package. 4. Wire the engine as BUILD-A-SITE §1 shows, with the engine's `hairSalonPreset` as `preview.preset`; in `preview.business` use `{{BUSINESS_NAME}}`, the time zone `{{TIMEZONE}}` and a plausible placeholder `contact` in {{CITY}}. The dashboard on `/admin/` mounts `<BookingAdmin engine={engine} siteUrl="/" content={siteContent} />` and gets only your brand accent (light and dark) in `src/admin-theme.css`. One public page (sections and an in-page booking flow), no client-side routes. No backend yet: no Supabase project, no `supabase` commands, no `.env.local` — the site runs in preview mode with a visible “Preview — sample data, bookings are not saved” banner. ## 2. Design — the creative part Make it feel like a real, distinctive hair salon, not a template: - **Style direction:** {{STYLE_DIRECTION}} - **Audience:** Local clients, mostly 25–55, booking cuts, color and styling — most of them on a phone, often in a hurry. - **Tone:** Confident, warm and expert. Never clinical, never luxury cliché. - **Sections:** - Hero with the salon's personality and one clear “Book an appointment” action - Services and prices loaded from the engine (duration, price, “from” prices), grouped sensibly — with the owner's optional service photos (cut, colour, styling work) shown in the site's own style when a service has one, and a complete typeset menu without them - The team / stylists — placeholder bios and names the owner will edit, clearly marked - The salon space and approach (what makes this salon different) - Testimonials — clearly marked as placeholder examples, never presented as real reviews - Opening hours (from the engine) and location / contact (from the engine's business contact) - The booking flow - Footer with a discreet “Staff login” link to /admin/ - **Booking experience:** - Service first, then the date and time together, then details, then the email code, then confirmation - A real month calendar with month and year navigation that shows each day's status from the engine — open, only a few times left, fully booked, closed or past — loaded with one getAvailability call per visible month (INTEGRATION.md §8 and the calendar helpers in §9); on phones a week strip with the same statuses and a “Month” view - Times grouped as Morning / Afternoon / Evening (a segmented switch with counts when there are many); the chosen time continues inline (“1:30 PM — Continue”), and a “soonest time” shortcut comes from data already loaded - Keep the chosen service, duration, price, date and time visible at every step — a summary beside the calendar on wide screens, a sticky bar on phones - The code step feels like part of the salon's flow: the masked address the code went to, one large code field, “Send a new code”, “Choose another time”, and a reminder to check spam - Designed states, not error dumps: times loading, times that could not load (Try again), a time just taken by someone else (fresh times), a fully booked day (the next available day), a closed day, and online booking switched off (contact details) - Pending wording: “Request received — we'll confirm your appointment shortly.” Confirmed wording: “You're booked.” - **Imagery:** Real, coherent photography is part of the design, not an extra: the hero, the salon space, details of the work (hands, tools, colour, texture) and the storefront, all in one photographic direction. Show hair and craft, never posed stock smiles. Never present a photographed person as one of the salon's stylists: sample team cards show work, not faces, and stay labelled as samples until the owner adds real portraits. Motifs (scissor, comb, hair-texture curves) frame the photos; they do not replace them. Service photos are the owner's (added per service in the dashboard): present them as part of the menu's design, never as stock fillers. - **Avoid:** - A generic SaaS landing page look, purple gradients, glassmorphism everywhere - Invented awards, certifications, review counts or ratings - Medical or clinical styling - Hard-coded services, prices or opening hours (they come from the engine) - **Words:** call customers “clients” and bookings “appointments”. How: - **Identity first.** A short `DESIGN.md`: the concept in one sentence, a display face with character and a readable text face (both self-hosted with `@fontsource`), colour tokens with every text/background pair at 4.5:1 or better, a type and spacing scale, how motion behaves. Every value lives in one CSS file of custom properties. Two businesses in this niche with different style directions must not look like the same layout recoloured. Plain CSS, no UI kit. - **Composition.** Varied rhythm — full-bleed moments, asymmetric grids, one focal point per screen; designed for phones first, from 320 px to wide screens; keyboard-accessible with visible focus; motion of 150–600 ms with a purpose, off under `prefers-reduced-motion`. - **Engine data, never hard-coded:** services, prices, opening hours, contact details and availability (BUILD-A-SITE §3). “Open now” lines come from `getOpeningTimes`. Show each service's optional `image` in your own style when it has one, and make the services section complete with none. - **Owner-editable copy.** Declare the texts, photos, logo, brand colours and heading style the owner may change in `src/content/site.ts` (BUILD-A-SITE §2), with your copy and photos as defaults, render the page from it as text, and bake it in with the Vite plugin. - **Photos.** Free, properly licensed photographs (Unsplash or Pexels licence), at most six, downloaded into `photos/source/` and recorded in `PHOTOS.md` — never hot-linked, never a photographed person presented as staff (sample team cards show the work and say “Sample photo”; content-list images cannot have defaults, so sample cards may be text-only or share one site image). Search terms that work: “hair salon interior”, “hairdresser cutting hair close up”, “hair colour bowl brush”, “salon chair mirror”. Prepare them with `npx booking-engine photos` (BUILD-A-SITE §5): AVIF + WebP at two or three widths, `width`/`height` on every `<img>`, fixed `aspect-ratio` frames with `object-fit: cover`, the hero eager with `fetchpriority="high"`, everything else lazy. When no fitting photo exists, design the frame without one. - **The booking flow** follows BUILD-A-SITE §4 with the calendar helpers: server slots only, the business time zone, the two steps (`requestBooking`, then the code and `verifyBooking`), every error in the table, contact details when online booking is off, success only after `verifyBooking` returned `ok: true`. On a phone: the step's name always visible, the choice and price in view, 44 px targets, the right input types, inline validation, a loading state on the control that waits, a code field that accepts a pasted code, focus on each new step's heading. - **Every “Book” button always answers.** Whatever the booking section is showing — loading, the flow, online booking off, no services, a calendar that failed to load — each Book/CTA button on the page scrolls to the booking section and moves focus to its heading, so the visitor sees that state's message and the shop's contact details. Never route a CTA only through the flow component (it is not on the page in those states), and never leave a click that does nothing. Check it with online booking off as well as on. ## 3. Work efficiently The viewer's Claude plan pays for every step, so keep the session lean: - Read BUILD-A-SITE.md once; don't re-read files you wrote or explore the package. - Photos: start from the leads above or spend at most about ten minutes searching; judge candidates on one contact sheet of small thumbnails, not one by one at full size. - Screenshots: about eight in all — desktop and a 390 px phone (device emulation), downscaled to at most 1280 px wide. Don't capture very long pages at full resolution. - Don't simulate the engine's error answers to see every state: build each state from the error table and check it in the code. - `npm run build` and `npx booking-engine doctor --dist dist` once midway and once at the end; afterwards fix and rerun only what failed. ## 4. Finish - `CLAUDE.md` in the project root: the engine's boundaries (from `BOOKING_ENGINE.md`), where the design lives, and that new booking features need a new engine version, never custom database code. - Done when: `npm run build` and `npx booking-engine doctor --dist dist` pass; every field in `src/content/site.ts` is used and the page looks as designed with the defaults; the key sections show real photos (`PHOTOS.md`, AVIF/WebP with dimensions; `DESIGN.md` matches the tokens); `npm run dev` serves `/` with the preview banner and a booking flow that reaches the code step and the honest preview message, and `/admin/` shows “Connect your backend”. Stop the dev server. - End with a short summary: what you built, the design choices, and anything in the engine's documentation that was unclear or wrong.

Berber

Kesim, fade, sakal bakımı ve tıraş; telefondan hızlıca randevu alınır.

Build a complete, premium booking website for **{{BUSINESS_NAME}}**, a barbershop in {{CITY}}, in this empty folder. The booking system is an installed package — the **Profit Studio Booking Engine**. It owns availability, bookings, booking emails and the owner's dashboard. You design and build the public website around it, and nothing the engine provides. ## 1. Set up 1. Scaffold a Vite + React + TypeScript app **in the current folder**: `npm create vite@latest . -- --template react-ts --no-interactive`, then `npm install`. create-vite stops without an error when the folder is not empty — a `.DS_Store` or a `.claude/` folder is enough — so check that `package.json` now exists. If it does not, scaffold into a new subfolder the same way, move all of its files (dotfiles included) up into this folder without overwriting or deleting anything already here, and remove the empty subfolder. Remove the template's demo content. 2. `npm install --save-exact @profitstudio/booking-engine@2.0.0-beta.1`, then `npx booking-engine init`. 3. Read `node_modules/@profitstudio/booking-engine/docs/BUILD-A-SITE.md` once: it has every file to wire, the booking API and the error table. Open `docs/INTEGRATION.md` only at a section it names, and nothing else in the package. 4. Wire the engine as BUILD-A-SITE §1 shows, with this site's own preset as `preview.preset` — write it in `src/lib/preset.ts` and export it as `sitePreset` (BUILD-A-SITE §1) with the words “clients” and “appointments”; in `preview.business` use `{{BUSINESS_NAME}}`, the time zone `{{TIMEZONE}}` and a plausible placeholder `contact` in {{CITY}}. - Write `sitePreset` from this sample data (prices are US dollars: use the local currency at a plausible local price level; `id` "barbershop", `label` "Barbershop"): - Classic Cut · 30 min (+10 min buffer) · 40 · “Scissor or clipper cut, styled and finished with a neck shave.” - Skin Fade · 45 min (+10 min buffer) · 45 · “Tight fade blended to the skin, shaped on top, sharp line-up.” - Beard Trim & Line-up · 20 min (+5 min buffer) · 25 · “Shape, trim and a hot-towel line-up for the beard.” - Cut & Beard · 60 min (+10 min buffer) · 60 · “A full haircut and beard shape in one sitting.” - Hot Towel Shave · 40 min (+10 min buffer) · 45 · “Straight-razor shave with hot towels and a cool finish.” - Buzz Cut · 20 min (+5 min buffer) · 25 · “One length all over, cleaned up at the neck and ears.” - Kids Cut (under 12) · 30 min (+10 min buffer) · 28 · “A patient, quick cut for younger clients.” - Opening hours: Tuesday to Friday 10:00–19:00, Saturday 09:00–17:00; closed Sunday and Monday - Policies: 15-minute slot interval, at least 1 hour's notice, up to 30 days ahead, the owner confirms each request, a phone number is required; every other policy as in BUILD-A-SITE §1 The dashboard on `/admin/` mounts `<BookingAdmin engine={engine} siteUrl="/" content={siteContent} presets={[sitePreset]} />` and gets only your brand accent (light and dark) in `src/admin-theme.css`. One public page (sections and an in-page booking flow), no client-side routes. No backend yet: no Supabase project, no `supabase` commands, no `.env.local` — the site runs in preview mode with a visible “Preview — sample data, bookings are not saved” banner. ## 2. Design — the creative part Make it feel like a real, distinctive barbershop, not a template: - **Style direction:** {{STYLE_DIRECTION}} - **Audience:** Neighbourhood regulars and newcomers, mostly 18–50, who book a cut every three to five weeks — almost always on a phone, often the same day. - **Tone:** Easygoing, sharp and confident; plain-spoken and welcoming to everyone. No macho bravado, no “gentlemen's club” clichés. - **Sections:** - Hero with the shop's character and one clear “Book a chair” action, plus the soonest open time for the first service on the menu (named) when it is known - The menu: services, durations and prices loaded from the engine, readable at a glance like a board on the wall — with the owner's optional service photos (cuts, fades, beard work) shown in the site's own style when a service has one, and a complete menu without them - The barbers — placeholder names and short bios the owner will edit, clearly marked as samples (portraits come later from the owner) - The shop: the chairs, the music, the routine of a visit — what a first-timer can expect - Kind words — clearly marked as placeholder examples, never presented as real reviews - Opening hours (from the engine) and location / contact (from the engine's business contact), with directions - The booking flow - Footer with a discreet “Staff login” link to /admin/ - **Booking experience:** - Service first, then the date and time together, then details, then the email code, then confirmation — fast enough to finish standing in line for coffee - Make the soonest time obvious: a “Next open: today 4:15 PM” shortcut from data already loaded, and a week view that opens on today — on a closed day, say so and offer the next open time - Short services mean many times: group them Morning / Afternoon / Evening with counts, and keep the list scannable on a phone - There is one shared calendar: never offer “choose your barber” or show staff availability — the engine does not book per barber - Keep the chosen service, duration, price, date and time visible at every step — a summary beside the times on wide screens, a sticky bar on phones - The code step stays in the shop's voice: where the code went (masked), one large code field that accepts a pasted code, “Send a new code”, “Choose another time”, and a reminder to check spam - Designed states: times loading, times that could not load (Try again), a time just taken (fresh times), a fully booked day (the next open day), a closed day, and online booking switched off (call or message the shop) - Pending wording: “Request received — we'll confirm your chair shortly.” Confirmed wording: “You're booked. See you in the chair.” - **Imagery:** Real photography of the craft is part of the design: clippers and straight razors, the chair, the lather, the line-up, a door, window or street at dusk (no other shop's name, no barber pole, no identifiable people; if no such licensed photo exists, a designed frame such as a painted window sign) — one coherent photographic direction. Never present a photographed person as one of the shop's barbers: sample barber cards show tools or work, not faces, and stay labelled as samples until the owner adds real portraits. Graphic motifs (rules, numerals, signage lettering) frame the photos; they do not replace them. Service photos are the owner's (added per service in the dashboard): present them as part of the menu's design, never as stock fillers. - **Avoid:** - Barber-pole stripes, skulls, mustache icons and other stock barbershop clichés - A generic SaaS landing page look, purple gradients, glassmorphism - Invented awards, review counts, ratings or “best in town” claims - A “choose your barber” step or per-barber availability (not supported by the engine) - Hard-coded services, prices or opening hours (they come from the engine) - **Words:** call customers “clients” and bookings “appointments”. How: - **Identity first.** A short `DESIGN.md`: the concept in one sentence, a display face with character and a readable text face (both self-hosted with `@fontsource`), colour tokens with every text/background pair at 4.5:1 or better, a type and spacing scale, how motion behaves. Every value lives in one CSS file of custom properties. Two businesses in this niche with different style directions must not look like the same layout recoloured. Plain CSS, no UI kit. - **Composition.** Varied rhythm — full-bleed moments, asymmetric grids, one focal point per screen; designed for phones first, from 320 px to wide screens; keyboard-accessible with visible focus; motion of 150–600 ms with a purpose, off under `prefers-reduced-motion`. - **Engine data, never hard-coded:** services, prices, opening hours, contact details and availability (BUILD-A-SITE §3). “Open now” lines come from `getOpeningTimes`. Show each service's optional `image` in your own style when it has one, and make the services section complete with none. - **Owner-editable copy.** Declare the texts, photos, logo, brand colours and heading style the owner may change in `src/content/site.ts` (BUILD-A-SITE §2), with your copy and photos as defaults, render the page from it as text, and bake it in with the Vite plugin. - **Photos.** Free, properly licensed photographs (Unsplash or Pexels licence), at most six, downloaded into `photos/source/` and recorded in `PHOTOS.md` — never hot-linked, never a photographed person presented as staff (sample team cards show the work and say “Sample photo”; content-list images cannot have defaults, so sample cards may be text-only or share one site image). Free photos already checked for this niche, to start from (confirm the licence on each page; replace any): https://www.pexels.com/photo/barber-perfecting-a-fade-haircut-close-up-39559270/ (a fade being cut, close up (hero)); https://www.pexels.com/photo/vintage-barber-shop-interior-with-classic-chairs-37764947/ (a row of classic barber chairs); https://www.pexels.com/photo/customer-at-barber-16553361/ (a lathered shave in progress); https://www.pexels.com/photo/tools-at-barbershop-7697712/ (clippers and tools on a counter); https://www.pexels.com/photo/hairdresser-scissors-and-tools-10317439/ (scissors and combs); https://www.pexels.com/photo/gray-hand-tool-1319459/ (a brass shaving bowl and razors). Search terms that work: “barber fade close up”, “barbershop interior chairs”, “straight razor shave”, “barber tools clippers”. Prepare them with `npx booking-engine photos` (BUILD-A-SITE §5): AVIF + WebP at two or three widths, `width`/`height` on every `<img>`, fixed `aspect-ratio` frames with `object-fit: cover`, the hero eager with `fetchpriority="high"`, everything else lazy. When no fitting photo exists, design the frame without one. - **The booking flow** follows BUILD-A-SITE §4 with the calendar helpers: server slots only, the business time zone, the two steps (`requestBooking`, then the code and `verifyBooking`), every error in the table, contact details when online booking is off, success only after `verifyBooking` returned `ok: true`. On a phone: the step's name always visible, the choice and price in view, 44 px targets, the right input types, inline validation, a loading state on the control that waits, a code field that accepts a pasted code, focus on each new step's heading. - **Every “Book” button always answers.** Whatever the booking section is showing — loading, the flow, online booking off, no services, a calendar that failed to load — each Book/CTA button on the page scrolls to the booking section and moves focus to its heading, so the visitor sees that state's message and the shop's contact details. Never route a CTA only through the flow component (it is not on the page in those states), and never leave a click that does nothing. Check it with online booking off as well as on. ## 3. Work efficiently The viewer's Claude plan pays for every step, so keep the session lean: - Read BUILD-A-SITE.md once; don't re-read files you wrote or explore the package. - Photos: start from the leads above or spend at most about ten minutes searching; judge candidates on one contact sheet of small thumbnails, not one by one at full size. - Screenshots: about eight in all — desktop and a 390 px phone (device emulation), downscaled to at most 1280 px wide. Don't capture very long pages at full resolution. - Don't simulate the engine's error answers to see every state: build each state from the error table and check it in the code. - `npm run build` and `npx booking-engine doctor --dist dist` once midway and once at the end; afterwards fix and rerun only what failed. ## 4. Finish - `CLAUDE.md` in the project root: the engine's boundaries (from `BOOKING_ENGINE.md`), where the design lives, and that new booking features need a new engine version, never custom database code. - Done when: `npm run build` and `npx booking-engine doctor --dist dist` pass; every field in `src/content/site.ts` is used and the page looks as designed with the defaults; the key sections show real photos (`PHOTOS.md`, AVIF/WebP with dimensions; `DESIGN.md` matches the tokens); `npm run dev` serves `/` with the preview banner and a booking flow that reaches the code step and the honest preview message, and `/admin/` shows “Connect your backend”. Stop the dev server. - End with a short summary: what you built, the design choices, and anything in the engine's documentation that was unclear or wrong.

Masaj ve Wellness Stüdyosu

Masajlar ve bakımlar, sakin bir randevu deneyimiyle.

Build a complete, premium booking website for **{{BUSINESS_NAME}}**, a massage & wellness studio in {{CITY}}, in this empty folder. The booking system is an installed package — the **Profit Studio Booking Engine**. It owns availability, bookings, booking emails and the owner's dashboard. You design and build the public website around it, and nothing the engine provides. ## 1. Set up 1. Scaffold a Vite + React + TypeScript app **in the current folder**: `npm create vite@latest . -- --template react-ts --no-interactive`, then `npm install`. create-vite stops without an error when the folder is not empty — a `.DS_Store` or a `.claude/` folder is enough — so check that `package.json` now exists. If it does not, scaffold into a new subfolder the same way, move all of its files (dotfiles included) up into this folder without overwriting or deleting anything already here, and remove the empty subfolder. Remove the template's demo content. 2. `npm install --save-exact @profitstudio/booking-engine@2.0.0-beta.1`, then `npx booking-engine init`. 3. Read `node_modules/@profitstudio/booking-engine/docs/BUILD-A-SITE.md` once: it has every file to wire, the booking API and the error table. Open `docs/INTEGRATION.md` only at a section it names, and nothing else in the package. 4. Wire the engine as BUILD-A-SITE §1 shows, with this site's own preset as `preview.preset` — write it in `src/lib/preset.ts` and export it as `sitePreset` (BUILD-A-SITE §1) with the words “guests” and “sessions”; in `preview.business` use `{{BUSINESS_NAME}}`, the time zone `{{TIMEZONE}}` and a plausible placeholder `contact` in {{CITY}}. - Write `sitePreset` from this sample data (prices are US dollars: use the local currency at a plausible local price level; `id` "massage-studio", `label` "Massage & Wellness Studio"): - Swedish Massage — 60 min · 60 min (+15 min buffer) · 95 · “Long, flowing strokes to ease tension and settle the mind.” - Swedish Massage — 90 min · 90 min (+15 min buffer) · 135 · “The full-body Swedish session with time for slower, deeper work.” - Deep Tissue — 60 min · 60 min (+15 min buffer) · 105 · “Firm, focused pressure for tight shoulders, back and legs.” - Deep Tissue — 90 min · 90 min (+15 min buffer) · 150 · “Unhurried deep work on the areas you choose.” - Hot Stone — 75 min · 75 min (+20 min buffer) · 125 · “Warm basalt stones and long strokes to release and soften.” - Pregnancy Massage — 60 min · 60 min (+15 min buffer) · 100 · “Side-lying comfort and gentle pressure, from the second trimester.” - Reflexology — 45 min · 45 min (+15 min buffer) · 70 · “Pressure-point work on the feet in a reclined chair.” - Opening hours: Monday to Friday 10:00–20:00, Saturday 09:00–17:00, Sunday 10:00–16:00 - Policies: 15-minute slot interval, at least 4 hours' notice, up to 60 days ahead, the owner confirms each request, a phone number is required; every other policy as in BUILD-A-SITE §1 The dashboard on `/admin/` mounts `<BookingAdmin engine={engine} siteUrl="/" content={siteContent} presets={[sitePreset]} />` and gets only your brand accent (light and dark) in `src/admin-theme.css`. One public page (sections and an in-page booking flow), no client-side routes. No backend yet: no Supabase project, no `supabase` commands, no `.env.local` — the site runs in preview mode with a visible “Preview — sample data, bookings are not saved” banner. ## 2. Design — the creative part Make it feel like a real, distinctive massage & wellness studio, not a template: - **Style direction:** {{STYLE_DIRECTION}} - **Audience:** Adults 25–65 looking for relief from everyday tension or simply an hour of quiet — often booking in the evening on a phone, sometimes for the first time. - **Tone:** Calm, warm and reassuring; clear and practical. Never clinical, never mystical, and never promise health outcomes. - **Sections:** - Hero that slows the visitor down, with one clear “Book a session” action - Treatments loaded from the engine — each length is its own service (e.g. 60 and 90 minutes), shown as a calm, readable list with durations and prices — with the owner's optional service photos in the site's own style when a service has one, and complete without them - What to expect: arriving, the room, comfort and pressure, privacy — written for a first-timer - The therapists — placeholder names and short bios the owner will edit, clearly marked as samples - Questions (what to wear, arriving early, cancelling) as plain text the owner can edit - Opening hours (from the engine) and location / contact (from the engine's business contact) - The booking flow - Footer with a discreet “Staff login” link to /admin/ - **Booking experience:** - Treatment and length first, then the date and time together, then details, then the email code, then confirmation - A calm calendar: the next open days first, times grouped Morning / Afternoon / Evening; never a countdown or scarcity pressure - There is one shared calendar: never offer “choose your therapist” or show per-therapist availability - The note field is optional and invites preferences (pressure, areas to avoid) — never ask for medical history or health details in the form - Keep the chosen treatment, length, price, date and time visible at every step - The code step is gentle and clear: where the code went (masked), one large code field that accepts a pasted code, “Send a new code”, “Choose another time”, a reminder to check spam - Designed states: loading, could not load (Try again), a time just taken, a fully booked day (the next open day), a closed day, online booking switched off (call or email the studio) - Pending wording: “Request received — we'll confirm your session shortly.” Confirmed wording: “Your session is booked.” - **Imagery:** Quiet, tactile photography: hands at work, linen, warm stones, oil, soft light across a treatment room — one coherent direction, little colour, lots of air. Never present a photographed person as one of the studio's therapists: sample therapist cards show the room or hands, not faces, and stay labelled as samples. No before/after imagery. Service photos are the owner's (added per service in the dashboard): present them as part of the design, never as stock fillers. - **Avoid:** - Spa clichés: orchids, Buddha statues, stacked stones, lotus icons - Medical claims, diagnoses, “cures” or before/after promises - Countdown timers, scarcity pressure or pushy upsells - A “choose your therapist” step or per-therapist availability (not supported by the engine) - Hard-coded services, prices or opening hours (they come from the engine) - **Words:** call customers “guests” and bookings “sessions”. How: - **Identity first.** A short `DESIGN.md`: the concept in one sentence, a display face with character and a readable text face (both self-hosted with `@fontsource`), colour tokens with every text/background pair at 4.5:1 or better, a type and spacing scale, how motion behaves. Every value lives in one CSS file of custom properties. Two businesses in this niche with different style directions must not look like the same layout recoloured. Plain CSS, no UI kit. - **Composition.** Varied rhythm — full-bleed moments, asymmetric grids, one focal point per screen; designed for phones first, from 320 px to wide screens; keyboard-accessible with visible focus; motion of 150–600 ms with a purpose, off under `prefers-reduced-motion`. - **Engine data, never hard-coded:** services, prices, opening hours, contact details and availability (BUILD-A-SITE §3). “Open now” lines come from `getOpeningTimes`. Show each service's optional `image` in your own style when it has one, and make the services section complete with none. - **Owner-editable copy.** Declare the texts, photos, logo, brand colours and heading style the owner may change in `src/content/site.ts` (BUILD-A-SITE §2), with your copy and photos as defaults, render the page from it as text, and bake it in with the Vite plugin. - **Photos.** Free, properly licensed photographs (Unsplash or Pexels licence), at most six, downloaded into `photos/source/` and recorded in `PHOTOS.md` — never hot-linked, never a photographed person presented as staff (sample team cards show the work and say “Sample photo”; content-list images cannot have defaults, so sample cards may be text-only or share one site image). Free photos already checked for this niche, to start from (confirm the licence on each page; replace any): https://unsplash.com/photos/massage-on-leg-with-white-towel-yBLLzNcA6GU (hands at work over a white towel (hero)); https://www.pexels.com/photo/settee-by-the-window-6628520/ (a treatment table by a tall window); https://unsplash.com/photos/hands-massaging-a-persons-forearm-with-gentle-pressure-YBfzGCJjLuI (hands working on a forearm). Search terms that work: “massage hands towel”, “treatment room window”, “spa linen stones”. Prepare them with `npx booking-engine photos` (BUILD-A-SITE §5): AVIF + WebP at two or three widths, `width`/`height` on every `<img>`, fixed `aspect-ratio` frames with `object-fit: cover`, the hero eager with `fetchpriority="high"`, everything else lazy. When no fitting photo exists, design the frame without one. - **The booking flow** follows BUILD-A-SITE §4 with the calendar helpers: server slots only, the business time zone, the two steps (`requestBooking`, then the code and `verifyBooking`), every error in the table, contact details when online booking is off, success only after `verifyBooking` returned `ok: true`. On a phone: the step's name always visible, the choice and price in view, 44 px targets, the right input types, inline validation, a loading state on the control that waits, a code field that accepts a pasted code, focus on each new step's heading. - **Every “Book” button always answers.** Whatever the booking section is showing — loading, the flow, online booking off, no services, a calendar that failed to load — each Book/CTA button on the page scrolls to the booking section and moves focus to its heading, so the visitor sees that state's message and the shop's contact details. Never route a CTA only through the flow component (it is not on the page in those states), and never leave a click that does nothing. Check it with online booking off as well as on. ## 3. Work efficiently The viewer's Claude plan pays for every step, so keep the session lean: - Read BUILD-A-SITE.md once; don't re-read files you wrote or explore the package. - Photos: start from the leads above or spend at most about ten minutes searching; judge candidates on one contact sheet of small thumbnails, not one by one at full size. - Screenshots: about eight in all — desktop and a 390 px phone (device emulation), downscaled to at most 1280 px wide. Don't capture very long pages at full resolution. - Don't simulate the engine's error answers to see every state: build each state from the error table and check it in the code. - `npm run build` and `npx booking-engine doctor --dist dist` once midway and once at the end; afterwards fix and rerun only what failed. ## 4. Finish - `CLAUDE.md` in the project root: the engine's boundaries (from `BOOKING_ENGINE.md`), where the design lives, and that new booking features need a new engine version, never custom database code. - Done when: `npm run build` and `npx booking-engine doctor --dist dist` pass; every field in `src/content/site.ts` is used and the page looks as designed with the defaults; the key sections show real photos (`PHOTOS.md`, AVIF/WebP with dimensions; `DESIGN.md` matches the tokens); `npm run dev` serves `/` with the preview banner and a booking flow that reaches the code step and the honest preview message, and `/admin/` shows “Connect your backend”. Stop the dev server. - End with a short summary: what you built, the design choices, and anything in the engine's documentation that was unclear or wrong.

Prompt'unuzu Özelleştirin ve Kopyalayın

Sizin kısmınız.

Yukarıdaki prompt'ta Customize Prompt'u açın İşletmenizin adını ve şehrini girin — saat dilimi başta sizinkidir, bu yüzden yalnızca işletme başka bir yerdeyse değiştirin Bir tarz yönü seçin — her biri web sitenize farklı bir görünüm verir Prompt'u kopyalayın — 2. Adım'da Claude'a gönderirsiniz

Warm editorial — espresso, bakır ve krem, zarif bir serif yazı tipi ve dergi tarzı düzenler

Modern minimal — kırık beyaz ve kömür grisi, tek bir iddialı vurgu rengi ve katı bir ızgara

Bold urban — koyu siyah, beton grileri ve tek bir elektrik vurgu rengi, güçlü kontrastla

Soft natural — adaçayı yeşili, kum ve pudra pembesi, yuvarlak yazı tipi, sakin ve ferah

Heritage modern — sıcak kâğıt üzerinde şişe yeşili, öküz kanı ve pirinç; klasik ama asla abartılı değil

Industrial clean — siyah, çelik ve beton grileri, tek bir sinyal rengi ve büyük rakamlar

Neighbourhood warm — krem, terrakota ve mürekkep, samimi yazı tipi ve rahat boşluklar

Quiet Nordic — sıcak beyaz üzerinde yulaf, taş ve yumuşak adaçayı yeşili, geniş kenar boşlukları ve hafif hareketler

Warm earth — kil, terrakota ve koyu zeytin yeşili, yuvarlak başlıklar ve organik şekiller

Night calm — koyu mürekkep mavisi ve sıcak mum tonları, loş ve samimi

Prompt, Booking Engine'i tam olarak 2.0.0-beta.1 sürümüyle kurar; bu rehber bu sürümle test edildi. Bunu latest olarak değiştirmeyin.

Web Sitenizi Claude Code ile Oluşturun

Boş Bir Klasör Açın

Sizin kısmınız.

Claude Desktop Code Local

Web siteniz için yeni, boş bir klasör oluşturun, örneğin Belgeler içinde Bir Local oturumu başlatın ve o klasörü seçin Claude Desktop sorarsa klasöre güvenin

Prompt'unuzu Gönderin

Claude Code'un kısmı — siz işlemlerini onaylar ve beklersiniz.

1. Adım'da kopyaladığınız prompt'u yapıştırın ve gönderin Claude bir komut çalıştırmak istediğinde Allow'a tıklayın Çalışmasına izin verin — tam bir build uzun bir oturumdur, bu yüzden oturumu açık tutun

Web sitesi projesini oluşturur ve Booking Engine'i kurar

Siteyi tasarlar: işletmeniz için yazı tipleri, renkler, düzen ve metinler

Ücretsiz, lisanslı fotoğraflar bulur ve web için hazırlar

Randevu akışını ve işletme sahibi paneli sayfasını oluşturur

Her şeyi npm run build ve npx booking-engine doctor ile kontrol eder

Claude bir kullanım limitine ulaştığınız için durursa, limit sıfırlanana kadar bekleyin, ardından aynı oturumda continue yazın.

Web Sitenize Göz Atın

Claude Code'un kısmı, ardından sizinki — o önizlemeyi başlatır, siz bakarsınız.

Web Sitemi Göster

Web sitenizi bilgisayarınızda başlatır ve size adresini verir.

Start the website's dev server with npm run dev and open it in the Browser pane. Then give me its local address. Don't change any files.

Önizlemeye Claude Desktop'taki Browser pane'den bakın ya da Claude'un verdiği adresi tarayıcınızda açın Tasarımı geniş ve dar bir pencerede kontrol edin Bir Book butonuna tıklayın: randevu akışı açılır ve e-posta kodu isteyen adıma ulaşır /admin/ sayfasını açın — adrese ekleyin ya da Claude'dan açmasını isteyin: Connect your backend görünür

Üstteki banner Preview diyor: bunlar örnek veriler ve henüz hiçbir randevu kaydedilmiyor. Değişiklik mi istiyorsunuz? Devam etmeden önce aynı oturumda Claude'dan isteyin.

Supabase ve Resend'i Bağlayın

Supabase Projenizi Oluşturun

Sizin kısmınız — Supabase hesabınızda.

Bu adımın üç kısmı var: Supabase, ardından e-posta, ardından her şeyi bağlayan tek bir prompt. Girdiğiniz değerler bu rehberde kaydedilir ve 5. Adım'da yeniden kullanılır, böylece her birini yalnızca bir kez yazarsınız.

Supabase Dashboard'u Açın

https://supabase.com/dashboard

New project'e tıklayın, işletmenize yakın bir bölge ve Free paketini seçin Veritabanı şifresini şifre yöneticinize kaydedin — asla Claude'a göndermeyin Proje hazır olduğunda Connect'e tıklayın ve Project URL ile Publishable key'i aşağıya yapıştırın

Panel Girişinizi Oluşturun

Sizin kısmınız — Supabase hesabınızda.

Supabase Authentication Users

Add user'a, ardından Create new user'a tıklayın E-postanızı ve güçlü bir şifre girin Auto Confirm User işaretli kalsın ve kullanıcıyı oluşturun

Supabase Authentication Sign In / Providers

Allow new users to sign up'ı kapatın ve kaydedin — panele yalnızca siz giriş yaparsınız

Supabase CLI'a Giriş Yapın

Sizin kısmınız — bir kez, bağlanmadan önce.

Oturumunuzun başlık çubuğundaki Terminal'e tıklayın Aşağıdaki komutu çalıştırın Açılan tarayıcı penceresinde girişi onaylayın

npx supabase@2 login

Claude projeyi kendiniz bağlamanızı isterse, verdiği komutu burada çalıştırın ve veritabanı şifrenizi Terminal'e yazın — asla sohbete değil.

Gönderim Alan Adınızı Doğrulayın

Sizin kısmınız — Resend'de ve alan adınızın DNS'inde.

Randevu e-postaları kendi alan adınızdan gönderilir — web sitenizin 5. Adım'da kullanacağı alan adının aynısından. Henüz alan adınız yok mu? Hostinger'dan bir tane satın alın, sonra geri dönün:

Hostinger Domains

Resend Domains'i Açın

https://resend.com/domains

Add domain'e tıklayın ve yukarıda gösterilen gönderim alan adını girin Müşterilerinize en yakın bölgeyi seçin DNS kayıtlarının olduğu sayfayı açık tutun

Hostinger Domains DNS / Nameservers

Alan adınızı seçin ve Resend'in gösterdiği her kaydı aynı tür ve değerle ekleyin Resend'e dönüp Verify DNS records'a tıklayın

Doğrulama genellikle 15 dakikadan kısa sürer ve 72 saate kadar uzayabilir. Beklerken sonraki adımlara devam edin. Alan adınız başka bir yerde mi yönetiliyor? Aynı kayıtları orada ekleyin ve mevcut e-posta kayıtlarınızı koruyun.

E-posta Secret'larınızı Supabase'e Ekleyin

Sizin kısmınız — anahtar yalnızca Supabase'e girer, asla sohbete girmez.

Resend'de API Keys'i açın ve Create API key'e tıklayın Sending access'i ve doğrulanmış alan adınızı seçin, ardından anahtarı kopyalayın — Resend onu yalnızca bir kez gösterir Supabase'de Edge Functions'ı, ardından Secrets'ı açın ve bu ikisini ekleyin

RESEND_API_KEY

Resend anahtarını gizli tutun

Onu yalnızca Supabase'in Edge Function secret'larına yapıştırın. Asla Claude'a göndermeyin, asla bir web sitesi dosyasına veya prompt'a koymayın ve asla Hostinger'a eklemeyin.

Claude'dan Her Şeyi Bağlamasını İsteyin

Claude Code'un kısmı — size düşen bir iş olduğunda durur.

Aynı Claude oturumunda bu prompt'u kopyalayın ve gönderin:

Claude her işlemden önce sorar — Allow'a tıklayın. Sıra size geldiğinde durur.

Claude Connected dediğinde işiniz biter. Randevu e-postaları, Resend alan adınızı Verified olarak gösterdiğinde başlar — 4. Adım'daki test e-postası bunu doğrular.

Panelinizi Kurun ve Bir Randevuyu Test Edin

Panelinizi Açın

Claude Code'un kısmı, ardından sizinki — o web sitesini başlatır, siz giriş yaparsınız.

Bağlı Web Sitemi Başlat

Artık Supabase'e bağlı olan web sitenizi başlatır ve size sitenin ve panelin adreslerini verir.

Stop any dev server that is still running, so the new .env.local is read. Then start the website with npm run dev, open /admin/ in the Browser pane, and give me two addresses: the website and its /admin/ dashboard. Don't change any files.

Paneli açın ve 3. Adım'da oluşturduğunuz giriş bilgileriyle oturum açın. Web siteniz hâlâ bilgisayarınızda çalışıyor, ancak buradaki her şey zaten gerçek: panel, randevular ve e-postalar Supabase projenizi kullanır ve 5. Adım'daki canlı web siteniz de aynı verileri kullanır.

Kurulumu Tamamlayın

Sizin kısmınız — panelde.

Önce yeni talep bildirimlerinin nereye gideceğini seçin

Bildirim adresi olmadan yeni taleplerden kimse haberdar olmaz ve online randevu açılamaz.

Panelin üstündeki Finish setting up adımlarını izleyin — işletme bilgileriniz, hizmetleriniz, çalışma saatleriniz ve e-postanız boyunca size yol gösterir Email & online booking bölümünde Send new-request alerts to alanını kendi gelen kutunuz olarak ayarlayın, ardından Send test email'e tıklayın ve ulaştığını kontrol edin

Randevuları açmadan önce web sitenizdeki her Book butonuna tıklayın: randevu bölümüne atlamalı ve iletişim bilgilerinizi göstermelidir. Hiçbir şey yapmayan bir buton bir hatadır — Claude'dan düzeltmesini isteyin.

Online randevuyu açın

Test Randevusu Alın

Sizin kısmınız — önce müşteri, sonra işletme sahibi olarak.

Web sitenizde kendi e-posta adresinizle bir hizmet için randevu alın. Ardından her birini gerçekleştiğini gördükçe işaretleyin:

6 haneli kod geldi ve site talebinizin alındığını söyledi

Yeni talep bildirimi bildirim adresinize ulaştı

Panelde Confirm request'e tıkladınız ve onay e-postası geldi

Aynı saat artık web sitenizde sunulmuyor

E-posta yok mu? Önce spam klasörünü kontrol edin, ardından paneldeki Email & online booking bölümünü açın: her e-postanın durumunu ve neyin düzeltilmesi gerektiğini gösterir.

Web Sitenizin Metinlerini ve Fotoğraflarını Değiştirin

Sizin kısmınız — panelde, kod yok.

Panelde Website'ı açın Ana başlığı veya ana fotoğrafı değiştirin Kontrol etmek için Preview'a, ardından Publish'e tıklayın Web sitenizi yenileyin — değişiklik orada

Siteyi Claude tasarladı; panel, Claude'un düzenlenebilir yaptığı metinleri, fotoğrafları ve marka renklerini düzenler. Yeni bir bölüm veya farklı bir düzen için Claude'a sorun.

Hostinger'a Dağıtın

Özel Bir GitHub Deposu Oluşturun

Sizin kısmınız — GitHub hesabınızda.

Web siteniz bilgisayarınızda çalışıyor. Şimdi yayına çıkıyor: GitHub kodu saklar, Hostinger ise onu build eder ve yayınlar — az önce test ettiğiniz aynı Supabase verileriyle.

GitHub Deposu Oluşturun

https://github.com/new

İşletmenizin adını verin ve Private'ı seçin README, .gitignore ve license seçeneklerini kapalı bırakın, böylece depo boş olur Create repository'ye tıklayın ve adresini kopyalayın

Web Sitenizi GitHub'a Push Edin

Claude Code'un kısmı — push'u siz onaylarsınız.

Web Sitemi GitHub'a Push Et

Hiçbir secret'ın dahil olmadığını kontrol eder, web sitenizi commit eder ve yeni deponuza push eder.

Put this website on GitHub at {{REPOSITORY_URL}}, on the main branch. Stop the dev server first. Before committing, check that .gitignore keeps node_modules, dist, .env, .env.local and supabase/.temp/ out of Git, and run npx booking-engine doctor. Show me the list of files you will commit and make sure no secret, key or password is in any of them. Then initialise Git if needed, commit everything with a clear message and push it to main. Never push to any other repository. If GitHub needs me to sign in, tell me exactly what to do, and never ask me to paste a password or token into the chat. When it's done, tell me the commit you pushed.

Deponuzun adresi

https://github.com/your-name/your-booking-website

Web App'inizi Oluşturun

Sizin kısmınız — Hostinger'da. Henüz barındırmanız yok mu? Gereksinimler bölümünden bir paket alın.

Hostinger Websites Create site Web App

Hostinger alan adı seçimi sunarsa kendi alan adınızı seçin — aksi halde uygulamanız geçici bir alan adında başlar Import Git Repository'yi seçin GitHub'ı yetkilendirin ve Claude'un az önce push ettiği depoyu seçin

Yapılandırın ve Dağıtın

Sizin kısmınız — Hostinger'da.

Hostinger'ın algıladığı Vite ayarlarını koruyun Node.js 22 veya daha yenisini seçin Build komutunun npm run build ve çıktı dizininin dist olduğundan emin olun

Dağıtmadan önce Review build settings altında Environment variables'ı bulun, Edit'e tıklayın ve bu ikisini ekleyin — 3. Adım'daki değerleriniz, kopyalanmaya hazır. Web sitesine gömülürler, bu yüzden birini sonradan değiştirmek yeniden dağıtım gerektirir.

Yalnızca herkese açık değerler

Supabase Secret key'i veya Resend anahtarını asla buraya eklemeyin. VITE_ ile başlayan her şey tarayıcıda görünür ve e-posta secret'larınız Supabase'de kalır.

Finish'e, ardından Deploy'a tıklayın ve build'in bitmesini bekleyin

Build durur ve bir değişkenin adını verirse, o değişkenin değerini Hostinger'da düzeltin ve yeniden dağıtın.

Canlı Adresinizi Sahip Bildirimlerine Ekleyin

Claude Code'un kısmı.

Canlı Web Sitenizi Doğrulayın

Sizin kısmınız.

Alan adınızı açın — kilit simgesi görünür ve Preview banner'ı yoktur Hizmetlerinizi, fiyatlarınızı ve çalışma saatlerinizi kontrol edin Telefonunuzdan bir test randevusu alın ve kodu girin Canlı sitenizde /admin/ adresini açın, giriş yapın ve talebi onaylayın Hem bildirimin hem de onay e-postasının ulaştığını kontrol edin

Bundan sonra hizmetleri, fiyatları, saatleri ve web sitenizin metinlerini ve fotoğraflarını panelde değiştirin — anında yayına girer. Tasarım veya kod değişiklikleri için Claude'a sorun ve push'u onaylayın: Hostinger, main'e yapılan her push'ta sitenizi yeniden build eder. Arama motorları yeni bir sayfa başlığını veya açıklamasını bir sonraki build'den sonra görür.