Build an Interactive Sushi Restaurant Website with AI
Build a sushi restaurant website with an interactive conveyor belt, pickup ordering, and an admin dashboard. View live demo (opens in a new tab)
Roadmap & resources
Requirements
Claude Desktop
Use Claude Code in the desktop app to set up and customize your restaurant website.
Download Claude Desktop
https://claude.ai/download
GitHub account
Free. Your own copy of KAITEN lives here, and Hostinger deploys from it.
Create GitHub Account
https://github.com/signup
Node.js
Download the LTS release. Claude uses it to install and check your store.
Download Node.js
https://nodejs.org/en/download
Supabase account
The free plan is enough. It holds your menu, photos, opening hours, orders and admin sign-in.
Create Supabase Account
https://supabase.link/r4gdwhi
Hostinger hosting
You need hosting in Step 5, when your store goes live.
Choose a Hostinger Plan
Use the Unlimited plan or a Cloud plan — KAITEN deploys as a Node.js Web App, not a static website.
Get the KAITEN Starter
Create Your Own Copy
Open KAITEN on GitHub
https://github.com/salhiworks/kaiten-sushi-store
Click Use this template, then Create a new repository Name it and choose Public or Private Click Create repository and copy its address
Set Up Supabase
Create a Supabase Project
Open Supabase Dashboard
https://supabase.com/dashboard
Click New project — any region and the Free plan are fine Save the database password somewhere safe — Claude never needs it When the project is ready, copy its Project ID
Supabase Project Settings General
The Project ID is the only project detail Claude needs. You don't create any tables or write any SQL: Claude sets up the database in Step 3.
Connect Your Store with Claude Desktop
Bring It to Claude Desktop
Claude Desktop Code Local
Start a Local session in a folder such as Documents, add your repository's address below, and send:
Clone Your Copy
Downloads your own KAITEN repository into a new subfolder and checks that Claude can update it.
Clone {{REPOSITORY_URL}} into a NEW subfolder inside the folder I selected, named after the repository. Never clone directly into the selected folder and never overwrite existing files. If Git is missing, tell me exactly how to install it. Then check that you can push to this repository with git push --dry-run. 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 is done, tell me which new folder to open in my next Claude Desktop Local session.
Your repository's address
https://github.com/your-name/my-sushi-restaurant
Open Your KAITEN Folder
Start a new Local session Open the folder Claude just created — the one with README.md inside If Claude Desktop asks, trust the folder
Ask Claude to Connect Your Store
In your KAITEN session, add your Project ID below and send:
Connect KAITEN to Supabase
Claude applies the starter's three migrations and starting menu with the Supabase CLI, checks security and storage, then gives you the two public values for Hostinger.
Connect this KAITEN restaurant to my Supabase project {{PROJECT_REF}}. Work only on that project and never touch any other. Read README.md (step 2, "Make it a real store with Supabase") and docs/SUPABASE.md first, and follow docs/SUPABASE.md's Supabase CLI steps. Use only the SQL this project already has. Don't write new tables, policies or setup SQL, and don't change the store's code. Use only this project's own pinned Supabase CLI, through npx supabase after npm install — never a global supabase command — always on my hosted project. Never run supabase db reset, supabase migration repair or any command that deletes data, never use --include-seed, and never start a local database or Docker. Never ask me for a password, an access token or a Secret key, and never use --reveal. Do these yourself, and tell me what each one does before you run it: 1. Check that Node.js 22 or newer is installed (if it isn't, stop and tell me how to install it), then run npm install and check that npx supabase --version shows 2.122.0. If it doesn't, stop and tell me. 2. Check that I'm signed in to the Supabase CLI. If I'm not, stop and tell me to run npx supabase login in the Terminal myself, and continue when I say I'm signed in. 3. Link this folder with npx supabase link --project-ref {{PROJECT_REF}}, then show me the project's name and URL and ask me to confirm it's the right one. 4. Show me the project's migration history (npx supabase migration list --linked). If it has migrations that aren't in supabase/migrations, stop and explain what you see. If the history is empty but the table public.dishes already exists, the setup was already run by hand: stop and tell me, and push nothing, because these files must not run twice. 5. Show me what the push would apply (npx supabase db push --linked --dry-run). It must be exactly the three files in supabase/migrations, in order: kaiten_schema, kaiten_seed, kaiten_private_helpers. Then apply them with npx supabase db push --linked, so they are recorded in the project's migration history. They create the tables, the Row Level Security policies, the dish-images storage bucket and the starting menu. There is no separate seed step. 6. Verify the setup with npx supabase db query --linked: Row Level Security is on for all seven tables in public, the public dish-images bucket exists, and there are 5 plate tiers, 4 categories and 8 dishes. Fix nothing by hand: tell me what's wrong. 7. Show me my Project URL and Publishable key (sb_publishable_...) as NEXT_PUBLIC_SUPABASE_URL and NEXT_PUBLIC_SUPABASE_PUBLISHABLE_KEY, ready to copy into Hostinger, using npx supabase projects api-keys --project-ref {{PROJECT_REF}}. If no Publishable key is listed, tell me to copy it from Connect in the Supabase Dashboard. Never read, use or write the Secret key or service_role key, and don't create .env.local. Then stop and tell me to create my admin user in the Supabase Dashboard. When I give you my admin email, never my password, add that user to public.admin_users with the SQL in docs/SUPABASE.md ("Your admin account"), through npx supabase db query --linked, and check that the row exists. Finally, tell me in plain words what passed and what is still left to do.
Your Supabase Project ID
abcdefghijklmnopqrst
Claude asks before each action — click Allow. It stops when it's your turn.
Sign In to the Supabase CLI
When Claude asks, run this once yourself — it opens your browser:
Click Terminal in your session's title bar Run the command below Approve the sign-in in the browser window that opens Tell Claude you're signed in
npx supabase login
Create Your Admin Account
Supabase Authentication Users
Click Add user, then Create new user Enter your email and a strong password Leave Auto Confirm User ticked and create the user Tell Claude your admin email — never your password
Supabase Authentication Sign In / Providers
Turn off Allow new users to sign up and save — the store has no customer accounts
Claude adds your email to the store's administrator list. You sign in at /admin on your live store in Step 5.
Supabase CLI Not Working? Set It Up by Hand
In your Supabase project, open SQL Editor. Run these three files from your KAITEN folder, once each and in this order. For each one, open it, copy everything, paste it into a new query and click Run.
supabase/migrations/20261102200000_kaiten_schema.sql
supabase/migrations/20261102200100_kaiten_seed.sql
supabase/migrations/20261102200200_kaiten_private_helpers.sql
Copy your Project URL and Publishable key from Connect — you add them to Hostinger in Step 5. After creating your admin user above, add your email below and run this in the SQL Editor:
Make Me an Administrator
insert into public.admin_users (user_id) select id from auth.users where email = '{{ADMIN_EMAIL}}';
Your admin email
you@example.com
Customize Your Sushi Restaurant
Describe Your Restaurant to Claude
Fill in what you know — leave the rest blank and Claude keeps KAITEN's version. Then send it in your KAITEN session:
Customize My Sushi Restaurant
Rebrands the name, copy and look, keeps the conveyor belt and ordering exactly as they are, and pushes the changes to your own GitHub repository.
This folder is my own copy of the KAITEN sushi restaurant. Before you change anything, read README.md ("How it works"), AGENTS.md and docs/ASSETS.md. AGENTS.md matters: this version of Next.js differs from what you may know. Customize the website for my restaurant. Restaurant name: {{RESTAURANT_NAME}} Our concept and story: {{RESTAURANT_STORY}} Visual identity: {{VISUAL_STYLE}} Where each change belongs: - The brand mark and its default name: src/components/site/brand-mark.tsx - Homepage and about copy: src/components/home/ and src/app/(store)/about/page.tsx - Colours and fonts: src/app/globals.css and src/app/layout.tsx The restaurant name guests see in the header, footer and page titles, plus the address, phone, opening hours, dishes, photos and plate prices, come from the database. Don't hard-code them: I'll set them in the admin after launch. Tell me which name to enter there. Keep these exactly as they are: - The sushi conveyor belt in src/components/ui/sushi-conveyor-menu.tsx: dragging, flicking, lifting a plate, the plate stack and every animation, timing and hit area - The menu, the order and checkout, pickup ordering, the admin, the Supabase migrations, KAITEN_MODE and the other environment variables - The dependencies: don't add new ones First show me a short plan: every file you will change, and what changes in it. Wait for my approval. Then make the changes, and run npm install, npm run lint and npm run typecheck so the build can't break. Fix anything they report. Don't start a local server. Then summarize what you changed and wait. I may ask for more changes. Only when I say it's ready: make sure .env.local and any other secrets are not committed, commit everything with a clear message and push it to the main branch of my own GitHub repository. Never push to any other repository. If GitHub needs me to sign in, tell me exactly what to do. When it is done, tell me the commit you pushed.
Restaurant name
Sushi Nami
Your restaurant's concept or story
A family-run kaiten counter in Lyon since 2009, with fish from the morning market and rice cooked every hour.
Visual identity
Claude changes the brand, design and code. Your dishes, photos, plate prices, categories, opening hours, pickup details and orders are managed in the admin after launch, in Step 5. Review Claude's changes, ask for more in the same session, and tell Claude when it's ready: it pushes once to your GitHub repository, which Step 5 deploys.
Deploy & Launch on Hostinger
Create Your Web App
No hosting yet? Get a plan in Requirements.
Hostinger Websites Create site Web App
If Hostinger offers a domain choice, pick your own domain — otherwise your app starts on a temporary domain Select Import Git Repository Authorize GitHub and select your own copy of KAITEN, with the changes Claude pushed in Step 4
Domain registered somewhere else? Add the DNS records Hostinger shows at your registrar, and keep your existing email records.
Configure & Deploy
Keep the Next.js settings Hostinger detects — it builds and starts the store itself Choose Node.js 22 or newer Make sure the build command is npm run build and the start command npm start — never npm run build:demo, which builds the locked demo
Before you deploy, open Environment variables, click Edit and add these three. KAITEN_MODE turns on real ordering and the admin — without it, your site is built as the demo. The two Supabase values are the ones Claude showed you in Step 3. They're built into the store, so changing one later needs a redeploy.
KAITEN_MODE NEXT_PUBLIC_SUPABASE_URL NEXT_PUBLIC_SUPABASE_PUBLISHABLE_KEY
KAITEN_MODE
The word live, in lowercase
NEXT_PUBLIC_SUPABASE_URL
Supabase Project URL
NEXT_PUBLIC_SUPABASE_PUBLISHABLE_KEY
Supabase Publishable key
The Supabase values are in Connect.
Open Connect
https://supabase.com/dashboard/project/_?showConnect=true
Public values only
Never add the Supabase Secret key or service_role key here. Anything starting with NEXT_PUBLIC_ is visible in the browser.
Click Finish, then Deploy, and wait for the build to finish
Running on a Temporary Domain?
To switch to your own domain, open your Web App in Hostinger and connect the domain there, adding any DNS records it shows at your registrar. KAITEN doesn't store its own address, so there's nothing to change and no redeploy needed.
Set Up Your Restaurant
Open /admin on your live store and sign in with your admin email. Everything you save in the admin goes straight to your database — no code changes.
In Restaurant, choose your time zone under Hours are in first, then set your Restaurant name, pickup address, phone and opening hours, and click Save restaurant details In Plates & prices, set the price of each plate colour and click Save plate prices — every dish on that plate follows In Menu, click Edit on a dish, change its details, use Replace photo for your own photo and click Save changes. Use Add dish for new ones Turn off On menu for dishes you don't serve, and In stock when one sells out for the day In Categories, rename, reorder or add the sections of your menu
Replace the starting photos before you open
The eight starting dish photos come from the original component's demo, and their rights are unverified. Use photos you own or have licensed.
What Your Dish Photos Need
Square, at least 800 × 800 px
Taken from above, with the plate filling the frame
A transparent background (PNG or WebP), so the belt shows around the plate
Up to 5 MB
Verify & Launch
Open your domain — the padlock shows, the belt turns and the header shows your opening status Lift a few plates onto your order, click Review order, then Checkout for pickup Enter a name and phone number and click Place pickup order In the admin, open Orders, find the order and click Start preparing On the order's confirmation page, click Refresh status: it now shows Preparing
The store takes orders only during your opening hours and while Taking orders is on, at the top of every admin page. Guests pay when they collect: there are no online card payments.
Later, change dishes, photos, prices and hours in the admin — they're live straight away. For design or code changes, ask Claude and approve the push: Hostinger rebuilds your store on every push to main.