Build an Interactive Lighting Store with AI (Supabase + Hostinger)

Launch a lighting store where shoppers brush along a brass rail to switch the lamps on, then dim and buy them. View live demo (opens in a new tab)

Roadmap & resources

Requirements

Claude Desktop

Claude Code runs inside it and customizes your store. It needs a paid Claude plan.

Download Claude Desktop

https://claude.ai/download

GitHub account

Free. Your own copy of LUMIÈRE lives here, and Hostinger deploys from it.

Create GitHub Account

https://github.com/signup

Hostinger hosting

Your live store runs here. You choose a plan in Step 2.

You don't need Node.js, a code editor or a terminal. Hostinger builds and runs your store, and Claude does the editing.

Get Your Lighting Store Starter

Preview and Copy LUMIÈRE

Try the finished store first: brush along the brass rail to switch the pendants on, drag them, and click one to open its dimmer. The demo has no admin and no checkout.

Open the LUMIÈRE Live Demo

The finished storefront, running in your browser.

https://lumiere-lighting-store.vercel.app/

Open LUMIÈRE on GitHub

https://github.com/salhiworks/lumiere-lighting-store

Click Use this template, then Create a new repository Name it and choose Public or Private Click Create repository

Confirm It's Your Own Copy

The repository's address starts with github.com/ and your own username

Under its name, GitHub says it was generated from salhiworks/lumiere-lighting-store

From here on, you only use your own repository. Hostinger deploys it in Step 2, and Claude Desktop edits it in Step 3. The original starter is never changed.

Deploy on Hostinger

Get Node.js Hosting

Publish first, customize second: in a few minutes your store is a real website, and every later change shows up on it.

Choose a Hostinger Plan

Use the Unlimited plan or a Cloud plan — LUMIÈRE deploys as a Node.js Web App, not a static website.

Import Your Repository

Hostinger Websites Create site Web App

Choose a temporary domain to start — you connect your own in Step 5 Select Import Git Repository Authorize GitHub and select your own copy of LUMIÈRE, the one you created in Step 1 — not the original starter

Configure & Deploy

Keep the Next.js settings Hostinger detects — it builds and starts the store itself Choose Node.js 22 Make sure the build script is build — never build:demo, which builds the locked demo

Before you deploy, add your site's address as an environment variable: the temporary address you just chose. You don't need your final domain yet — Step 5 switches it and redeploys.

NEXT_PUBLIC_SITE_URL

NEXT_PUBLIC_SITE_URL

Your temporary address, starting with https://

That's all the store needs. Supabase and Stripe are both optional, so leave them for later.

Click Deploy and wait for the build to finish Open your temporary address

See Your Store Live

Your temporary address opens your LUMIÈRE store

Brushing the rail lights the lamps, and every photo loads

The shop and a product page open

Your store is live. From now on, every change pushed to the main branch of your repository is rebuilt and published by Hostinger automatically.

Customize with Claude Desktop

Open Your Project in 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 LUMIÈRE 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-lighting-store

Open Your LUMIÈRE 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

Claude changes this copy of your store and sends the changes to your own GitHub repository. Hostinger then updates your live website.

Describe Your Store to Claude

Fill in what you know — leave the rest blank and Claude keeps LUMIÈRE's version. Then send it in your LUMIÈRE session:

Customize My Lighting Store

Rebrands the name, products, copy and look, and keeps the lamp animations and photo pairs exactly as they are.

This folder is my own copy of the LUMIÈRE lighting store. Before you change anything, read README.md, AGENTS.md, docs/ARCHITECTURE.md and docs/ASSETS.md. AGENTS.md matters: this version of Next.js differs from what you may know. Customize the store for my business. Store name: {{STORE_NAME}} What makes us different: {{STORE_STORY}} Visual identity: {{VISUAL_STYLE}} Products: {{PRODUCTS}} Photos: {{PHOTOS}} Where each change belongs: - Name, description and navigation: lib/site.ts and the wordmark in components/layout/wordmark.tsx - Products and collections: lib/catalog/demo-data.ts. Make the same changes in supabase/seed.sql, so a database I connect later starts with the same catalog. - Homepage and studio copy: components/home/ - Colours and fonts: app/globals.css and app/layout.tsx Keep these exactly as they are: - The Pendant Lamp Rail in components/ui/pendant-lamp-rail.tsx: brushing the rail to switch lamps on, dragging, the detail view with its dimmer, and every animation, timing and hit area - The paired photos: every product keeps one OFF and one ON photo of the same size, at /lamps/<product-id>-off.webp and /lamps/<product-id>-on.webp, following the rules in docs/ASSETS.md - The admin, checkout, Supabase migrations and environment variables - The dependencies: don't add new ones Prices are in cents, as the catalog already stores them ($240 = 24000). The store uses one currency, USD by default. 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 and don't push anything yet: I'll ask you to publish when I'm ready.

Store name

Atelier Nord

What makes your lighting studio different?

Small-batch ceramic and brass pendants, made by hand in Lisbon and shipped across Europe.

Visual identity

Your lamps — one per line: name, finish, price

Ceramic dome, Sand, $240 Brass cone, Brushed, $310

Lamp photos

Read the plan before you approve it. Ask Claude for more changes in the same session until the store feels like yours.

Use Your Own Lamp Photos

Replace the demo photos before you sell

The 16 demo lamp photos come from the original component's demo, and their rights are unverified. Use photos you own or have licensed for a real store.

Each lamp needs two photos: one unlit and one lit. The rail switches a lamp on by crossfading them, so they must line up exactly:

Same camera, position and scale — only the light changes

Transparent background, with no shadow baked in

The cord comes from the top edge, centred

Portrait, the same canvas for every photo — the demo uses 557 × 900 px

Without Supabase, put each pair in this folder of your project, named after the product — for example dome-enamel-off.webp and dome-enamel-on.webp — then ask Claude to use them and publish. With Supabase, you upload pairs in the admin instead, and it checks them for you.

public/lamps/

Publish Your Changes

Claude sends your customized store to your own GitHub repository, and Hostinger rebuilds your live website from it. When you're happy with the changes, send:

Publish My Changes

Checks the store, then commits your changes and pushes them to the main branch of your repository.

Publish my customized store. 1. Make sure npm run lint, npm run typecheck and npm run build all pass, and fix anything that fails. 2. Make sure .env.local and any other secrets are not committed. 3. Commit all my changes with a clear message and push them 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.

See Your Changes Live

Wait a few minutes for Hostinger to rebuild your store Reload your live address Brush along the rail — every lamp lights up and its cord meets the track Click a lamp and move its dimmer — nothing but the light changes Open the shop and a product page, and add a lamp to the cart

Nothing changed after a few minutes? Open Settings & Redeploy in your Web App and redeploy. Something looks off? Describe it to Claude in the same session, ask it to fix it without touching the lamp rail, then publish again.

Want to Preview on Your Computer? (Optional)

You never have to. If you'd like to see changes before you publish them, ask Claude in your session: install the dependencies, start the development server with npm run dev, and give me the local address. It needs Node.js 22 or newer, and Claude tells you if it's missing. Your live store never depends on it.

Connect Supabase & Admin (Optional)

Create a Supabase Project

Your live store already works without Supabase — skip to Step 5 if that's all you need. Connect it to manage products, photos, stock and orders in your own admin at /admin.

Create Supabase Account

https://supabase.link/r4gdwhi

Click New project — any region and the Free plan are fine Save the database password somewhere safe When the project is ready, copy its Project ID

Supabase Project Settings General

Let Claude Reach Your Project

This lets Claude set up your database for you. In your LUMIÈRE session in Claude Desktop:

Open Customize in the sidebar, then Connectors, and add Supabase — or click + next to the prompt box and select Add connectors Click Connect and approve the access in your browser, choosing the organization that holds your project Start a new Local session in the same folder, so Claude picks up the connection

You sign in through Supabase in your browser — no key or password goes into a prompt. The connection can see every project in the organization you approve, so the next prompt limits Claude to your LUMIÈRE project.

Can't find the Supabase connector, or would rather not use one? Skip the next prompt and use the manual setup at the end of Step 4: the same three SQL files, no connector needed.

Ask Claude to Set Up the Database

Set Up LUMIÈRE on Supabase

Claude applies the starter's migrations and products, checks security and storage, then gives you the two public values for Hostinger.

Connect this LUMIÈRE store to my Supabase project {{PROJECT_REF}}. Work only on that project and never touch any other. Read README.md ("Connect Supabase"), docs/SUPABASE.md and docs/ADMIN.md first, and follow them. 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. How to reach Supabase: - Use the Supabase connection in this session if it is connected. - Otherwise, use the Supabase CLI if I'm signed in, with the commands in docs/SUPABASE.md. - If neither works, stop and tell me exactly what to do. Never ask me for a password, an access token or a Secret key. Tell me what each step does before you run it: 1. Apply supabase/migrations/20261101120000_catalog_and_admin.sql, then supabase/migrations/20261101150000_orders_checkout.sql, in that order. They create the tables, the Row Level Security policies and the lamp-photos storage bucket. 2. Run supabase/seed.sql to add the three collections and the eight pendants. 3. Verify the setup: Row Level Security is on for every table, the lamp-photos bucket exists, there are 8 products and 3 collections, and Supabase's security advisor shows no warnings. Fix nothing by hand: tell me what's wrong. 4. Read my Project URL and Publishable key from the project, and show them to me as NEXT_PUBLIC_SUPABASE_URL and NEXT_PUBLIC_SUPABASE_PUBLISHABLE_KEY, ready to copy into Hostinger. 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/ADMIN.md, check that the row exists, and tell me to sign in at /admin on my live store.

Your Supabase Project ID

abcdefghijklmnopqrst

Claude asks before each action — read it, then allow it. It stops when it's your turn.

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

No Supabase Connection? Set It Up by Hand

In your Supabase project, open SQL Editor. Run these three files from your LUMIÈRE folder, in this order. For each one, open it, copy everything, paste it into a new query and click Run. Each is safe to run again.

supabase/migrations/20261101120000_catalog_and_admin.sql

supabase/migrations/20261101150000_orders_checkout.sql

supabase/seed.sql

Copy your Project URL and Publishable key from Connect into Hostinger, as shown in the next step. 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

Add the Supabase Variables on Hostinger

Your live store reads Supabase through two public values. In your Web App's dashboard, open Environment Variables and add:

NEXT_PUBLIC_SUPABASE_URL NEXT_PUBLIC_SUPABASE_PUBLISHABLE_KEY

NEXT_PUBLIC_SUPABASE_URL

Supabase Project URL

NEXT_PUBLIC_SUPABASE_PUBLISHABLE_KEY

Supabase Publishable key

Claude gave you both values. They're also 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.

Save the variables — Hostinger rebuilds your store with them Not rebuilt? Redeploy from Settings & Redeploy Open /admin on your live address and sign in with your admin email

In the admin you add and edit products, upload OFF/ON photo pairs, and manage stock and orders. Every save updates the rail, the shop and the product pages.

Connect Your Domain & Launch

Connect Your Domain

Hostinger Your Web App Connect domain

Enter your domain and follow the connection steps Domain registered somewhere else? Add the DNS records Hostinger shows at your registrar Keep any existing email records Wait until the domain shows as connected and SSL is active

DNS changes can take a few hours to reach everyone — up to 24 hours.

Connect a Custom Domain to Your Website or Web App

The full walkthrough, including domains registered elsewhere.

/video/connect-a-custom-domain-to-your-website-or-web-app

Switch to Your Domain and Redeploy

Your store builds its links, sitemap and the admin's secure sign-in from this one address. In your Web App's dashboard, open Environment Variables and change it to your domain:

NEXT_PUBLIC_SITE_URL

NEXT_PUBLIC_SITE_URL

Your domain, starting with https://

Save the variable Redeploy from Settings & Redeploy, so the new address is built in Wait for the build to finish

Test Your Live Store

Open your domain and check:

The address starts with https:// and the padlock shows

Brushing the rail lights the lamps, and every photo loads

The shop and a product page open, and a lamp goes into the cart

With Supabase: you can sign in at /admin

A made-up address, such as /shop/no-such-lamp, shows the not-found page

Your lighting store is live on your own domain. To change it later, edit products in the admin — or ask Claude for code changes and to publish them: Hostinger rebuilds your store on every push to main.