Build and Deploy an Online Directory With Claude Code

Build a searchable online directory with real listings, filters, submissions, and an admin dashboard, then deploy it live on Hostinger.

Roadmap & Resources

Plan & Build Your Directory

Choose Your Directory Setup

Open an empty folder — or your existing project — in Claude Code. Pick your directory type first: the listing details and filters then suggest what fits it.

Build Your Directory Interface

Choose your niche, what each listing shows, the filters and who can add listings, and Claude Code builds the whole directory interface with realistic sample listings.

Build the interface for an online directory. This task builds the screens only, with realistic sample listings. Real data comes later. Directory type: {{DIRECTORY_TYPE}} Directory name: {{DIRECTORY_NAME}} What each listing shows: {{LISTING_FIELDS}} Extra listing details: {{EXTRA_FIELDS}} What visitors can filter by: {{FILTERS}} Who can add listings: {{SUBMISSIONS}} Visual style: {{DIRECTORY_STYLE}} 1. INSPECT FIRST Inspect this folder before changing anything. - If it is empty, create a new React + Vite + TypeScript project here, with client-side routing and a simple, well-organised structure. - If a project already exists, keep its framework, styling and components, and add the directory to it. Do not rebuild, rename or restructure working code, and do not touch unrelated pages. Tell me which case applies, then continue. 2. SAVE THE DIRECTORY SCOPE Add a "Directory" section to CLAUDE.md in the project root — create the file if it does not exist. Record the directory type, the name, the listing fields and which of them appear on cards, the filters, the categories you choose, who can add listings and the visual style. Every later task reads this section, so keep it short and accurate. Never write keys or passwords into it. 3. A DIRECTORY, NOT A MARKETPLACE The job is to help visitors discover and compare listings: browse → search → filter → open a listing. Do not add a cart, checkout, payments, buyer–seller messaging, bookings, a reviews platform or visitor accounts. Build only the fields and filters above. If one does not make sense for this directory type, tell me and leave it out. 4. PUBLIC PAGES - a directory home to browse listings, with the search box and the filters - category pages or a category filter — whichever fits this directory better - a page for each listing at its own clean address, for example /tools/claude, with richer details and the main action for this niche — such as Visit website, Contact, Get directions or Open resource - a Submit a Listing page — ONLY if visitors can submit listings Every button must do something real; leave out any action a listing has no data for. Add an About page only if it genuinely helps. No marketing pages. 5. LISTING CARDS Show only what matters at a glance — for example the name, the category and one key detail such as the pricing or the city. Do not pack every field into the card. 6. SEARCH AND FILTERS Build the search box, the filters above, removable active-filter chips, a Clear filters action, a result count and a helpful empty state, such as "No tools found — try removing a filter". They can work on the sample listings for now. No fake rankings: never label listings Best, Top or Most popular. 7. ADMIN AREA Build a separate owner area: a listing list with Draft and Published states (plus Pending if visitors can submit), a listing form with the fields above, a categories screen, and — only if visitors can submit — a review queue. The forms can stay local for now. Never pretend that something was saved. 8. CATEGORIES AND SAMPLE LISTINGS Choose 5 to 8 categories that fit this directory, and create 12 to 20 realistic sample listings across them. Prefer believable fictional names, use placeholder links such as example.com, and never invent contact details for real businesses. No lorem ipsum. Keep all sample listings in ONE clearly named module, shaped like real data, so a database can replace it later. 9. COMPONENTS Build the listing card, the filters and the listing page as reusable components. 10. DESIGN Apply the visual style and the directory name. Mobile browsing must be excellent: a search box within easy reach, filters in a drawer or sheet on phones, and cards readable at a glance. Keep it calm: no decorative gradients or glows, and no fake statistics. 11. RUN IT Start the development server and give me the local address. When finished, report: - whether you created a new project or extended an existing one - the public pages and the admin screens - the categories, and which fields appear on cards - where the sample listings live - anything you left out, and why

What kind of directory are you building?

Directory name

ToolScout

Who can add listings?

Directory style

What should each listing show?

Any extra details? (optional)

Free trial, launch date, languages...

What should visitors filter by?

Claude Code saves your choices in the project's CLAUDE.md file, so every later prompt builds only what you picked.

Check the Directory Interface

Open the local address Claude Code gives you:

The directory shows the sample listings as cards

Cards show only the key details at a glance

The search box and your filters are there

A listing page opens at its own address with its main action

The admin screens show the listings, the listing form and categories

Submit a Listing exists only if you chose visitor submissions

Browsing works well at phone width

Ask Claude Code for any change now — the interface is easiest to adjust before real data arrives.

Expected result

You should now have a polished directory interface with realistic sample listings, search/filter UI, listing pages, and the appropriate owner/submission screens.

Add Real Listings & Admin Management

Connect Supabase

If this project is already connected to the right Supabase project, reuse it — don't create a second one.

Open Supabase

https://supabase.link/r4gdwhi

Create a new project if you don't have one Open the project's Connect panel Copy the Project URL and the Publishable key Ask Claude Code which environment variable names this project uses, then add both values locally

IMPORTANT

The browser app only needs the Project URL and the Publishable key. A Secret key belongs only in a trusted server environment, and only where one is genuinely needed — never in browser code and never committed to GitHub.

Create Your Admin Account

Visitors never need accounts — only you sign in. Create two accounts: one for you with your real email address, which becomes the admin, and one test account that proves signing in alone grants nothing.

Supabase Authentication Users

Click Add user, then Create new user Enter the email address and a password Keep Auto Confirm User on, then create the user Repeat for the test account

Then turn off public sign-ups

Nobody else needs an account. Turn off Allow new users to sign up and save.

Supabase Authentication Sign In / Providers

Store Your Listings in Supabase

Use this prompt in Claude Code. It gives you one SQL block to review and run.

Store the Directory Listings

Create the listing and category data for your niche, add the owner's sign-in, and keep drafts private from the start.

Turn the directory into a real database-backed directory with Supabase. This task stores the listings and adds the owner's sign-in; the admin dashboard comes next. Read the "Directory" section of CLAUDE.md first. It records the listing fields, the filters and who can add listings — build only what it lists. Inspect the project first. If it is already connected to Supabase, reuse that project and its client — do not create a second one. Use the current Supabase terms: the Project URL and the Publishable key. Never put a Secret or service-role key in browser code, and never print secret values. 1. ENVIRONMENT Read the Project URL and the Publishable key from environment variables, using this framework's naming. Tell me the exact names, list them in .env.example without values, and make sure .env is git-ignored. 2. OWNER SIGN-IN Visitors never need accounts. Add email and password sign-in for the admin area only — no public sign-up page — and protect every admin route. - Store who is the admin in the database, for example a profiles table with a role or an admins table keyed by the auth user id. Nobody can make themselves admin. Never decide it from user_metadata, local storage, the URL or anything else the browser controls. - Make MY account the admin with ONE reviewed SQL statement. - Being signed in is not the same as being the admin: my test account must get nothing. 3. DATA MODEL Build the tables around the fields in CLAUDE.md — do not force a generic schema: - listings: the chosen fields as real columns, plus id, slug, status, created_at and updated_at - categories: a name and a slug. One category per listing, unless this directory genuinely needs several — then a listing-category table - tags only if the fields include them - status: draft or published — plus pending if visitors can submit - only if visitors can submit: the submitter's name and email in a separate private table that only the admin can read — never on the public listing row Use generated ids as the identity. Create nothing unrelated. 4. SLUGS Every listing gets a clean, unique slug for its address. Generate it from the name when the listing is created, keep it stable when the name changes, and handle duplicates — for example acme-2. 5. IMAGES — only if the fields include a logo, photo or cover Create a Storage bucket for listing images that the public can read and only the admin can write to. Allow image types only, with a sensible size limit. 6. WHO CAN READ WHAT Turn on Row Level Security on every table immediately. - Anyone can read PUBLISHED listings, their categories and tags. Drafts and pending listings are visible only to the admin — the database enforces this, not a frontend filter. - Only the admin can create, change or delete listings and categories. Use one trusted database check for "is this account the admin". 7. REAL DATA Replace the sample listings with real queries, and remove the sample module. Listing pages load by slug; an unknown or unpublished slug shows a clear "not found" page. Give me ONE reviewed SQL seed that recreates the categories and sample listings in Supabase — mostly published, plus one draft — so the directory keeps working while I add real listings. Ask me for the two accounts' email addresses — never their passwords. Show loading, empty and error states, and never show raw database errors. Give me: 1. The environment variable names 2. The tables and what each holds 3. How the admin is stored and protected 4. The read and write rules, table by table 5. ONE reviewed SQL block to run in the Supabase SQL Editor: the tables, the rules, the image bucket if needed, the admin statement and the seed 6. Anything that blocks the next step Do not use destructive DROP statements. If a table with the same name already exists, warn me instead of replacing it. Do not build the admin forms yet — they come next.

Review the SQL, then run it in your Supabase project. It creates the directory tables, makes your account the admin and adds the sample listings.

Supabase SQL Editor

Visitor: the directory shows the published sample listings

Visitor: the draft listing doesn't appear, even by its address

Visitor: a listing page opens at its own address

Admin: sign in and reach the admin area

Test account: the admin area is refused

Build the Admin Dashboard

Build the Admin Dashboard

Create, preview, publish and delete listings, manage categories and upload images from your own dashboard instead of Supabase.

Build the admin dashboard, so I run the whole directory inside the app. I must never need the Supabase dashboard for daily work. Read the "Directory" section of CLAUDE.md first, and build only for the fields it lists. Reuse the admin screens you already built. Every write goes through the database rules, which allow admin actions only. No Secret or service-role key in the app. 1. ADMIN ONLY Only the admin account reaches the admin area. Signed-out visitors and my test account see the sign-in screen or a "no access" page, and the database refuses their requests anyway. 2. LISTINGS - a list of every listing with its status, and a quick way to find one - create and edit a listing with the chosen fields - Preview: see a draft exactly as its public page will look - Publish and Unpublish - Delete, only after a clear confirmation — this also removes its images 3. CATEGORIES Create, rename and delete categories. Never delete a category that still has listings without asking me what should happen to them. 4. IMAGES — only if the fields include them Upload or replace a listing's images from its form, with a preview, and remove the old file when an image is replaced. 5. SAFE CONTENT Accept only http and https links. Show every text field as plain text — never render HTML from a listing. Validate required fields and sensible lengths. 6. FORMS Prevent double submission, show clear success and error messages, and never show raw database errors. Keep every screen usable on a tablet and a phone. Give me ONE reviewed SQL block for any new rules, to run in the Supabase SQL Editor. Never drop tables, columns or data. When finished, report: - the admin routes - how the admin check works in the app and in the database - what Preview shows - what deleting a listing removes

Run any SQL it gives you in the SQL Editor. Then, as the admin:

Create a listing and preview it

Publish it — it appears in the public directory

Edit it — the public page updates

Unpublish it — it disappears publicly

Add a category and use it

Delete a test listing — you're asked to confirm first

Expected result

The owner can now create and publish a real listing through the directory's admin dashboard, and it appears publicly.

Make Search & Filters Actually Useful

Build Search and Filters

Make Search and Filters Work

Search the right fields, combine your filters, keep them in the address bar, and show related listings on every listing page.

Make search and filters genuinely useful. Read the "Directory" section of CLAUDE.md first, and build only the filters it lists. Search and filter in the database with focused queries and sensible limits — never download every listing to filter it in the browser. Do not add Algolia, Elasticsearch or any other search service. 1. SEARCH Search the fields that make sense for this directory — for example the name, the short description, the category and the tags. Never search internal fields such as the status. Make it case-insensitive and tolerant of extra spaces, using the simplest reliable approach for this size: a case-insensitive match across those fields, or Postgres full-text search with an index if the directory will grow large. An empty search shows every published listing. 2. FILTERS Implement exactly the filters in CLAUDE.md. Different filters narrow the results together; picking two values of the same filter widens it — for example Free or Freemium. Offer only values that published listings actually have. 3. ADDRESS BAR Keep the search and the filters in the URL — for example ?q=writing&category=design&pricing=free — so a search can be shared, survives a refresh, and Back returns to the previous results. Use the router's normal query handling, not a new state library. 4. RESULTS Show the result count, the active filters with a way to remove each one, a Clear filters action, and a helpful empty state — for example "No tools found. Try removing a filter or searching for something else." Once there are more than a few dozen results, show them in pages or with Load more. 5. SORTING — only if it helps this directory At most Newest and Name. Never invent Best, Top or Most popular rankings without real data behind them. 6. RELATED LISTINGS On each listing page, show up to four related published listings that share its category first, then its tags or location. Never the listing itself, never random entries, and hide the section when nothing is related. Give me ONE reviewed SQL block for any index or search function this needs, to run in the Supabase SQL Editor. When finished, report: - which fields search covers, and how - how the filters combine - what the URL looks like for a filtered search - how related listings are chosen

Run any SQL it gives you in the SQL Editor.

Test Search and Filters

Browse as a signed-out visitor:

Search for a word from a listing's name — it appears

The same search in different upper and lower case gives the same results

Combine two filters — the results narrow correctly

Refresh — the search and filters stay

Press Back — the previous results return

Clear filters brings every listing back

A search with no matches shows a helpful empty state

A listing page shows related listings that genuinely match

Expected result

Visitors can now search, filter, open listings, and discover related entries using real directory data.

Add Listing Submissions & Moderation

Set Up Your Listing Workflow

The prompt follows your Step 1 choice: a moderated Submit a Listing flow, or a polished owner-only workflow.

Finish the Listing Workflow

Add moderated visitor submissions if you chose them, or tighten your owner-only admin workflow if you didn't.

Finish the listing workflow. Read the "Directory" section of CLAUDE.md first — it records who can add listings. Follow ONLY the part below that matches. IF ONLY I ADD LISTINGS Do not build any public submission form, route or database path. Instead, walk through my admin workflow end to end — create, preview, edit, publish, unpublish and delete — and fix whatever gets in the way. Keep the changes small. IF VISITORS CAN SUBMIT LISTINGS FOR APPROVAL 1. SUBMIT A LISTING Add a public Submit a Listing page with the listing fields from CLAUDE.md, plus the submitter's name and email for follow-up. Visitors do not need an account. Never show internal fields such as the status. 2. PENDING REVIEW Every submission is saved as Pending and never appears publicly until I approve it. Use the smallest secure path the architecture supports — for example one trusted database function that validates the input and forces the Pending status. Do not give anonymous visitors broad table permissions: they cannot read, list, change or delete any submission, including their own. 3. REVIEW QUEUE Show pending submissions in the admin dashboard, newest first. Let me review one, correct any field, approve it (which publishes it) or reject it. Rejecting either deletes the submission or keeps it hidden as rejected — choose the simpler one and tell me. 4. BASIC ABUSE PROTECTION Check required fields, sensible lengths and http or https links on the trusted path — not only in the browser. Store and show everything as plain text; never render submitted HTML. If the fields include an image, accept one image of an allowed type and size into a private area only I can see until approval. Add a hidden honeypot field, or a simple per-visitor limit if the architecture supports it. No CAPTCHA service. 5. DUPLICATES Flag obvious duplicates for me in the review queue — for example the same website or the same name as an existing listing. Do not claim perfect detection. 6. CONFIRMATION After submitting, show a clear "Thanks — your listing is waiting for review" message. Never suggest it is already live. Give me ONE reviewed SQL block for any new tables, rules or functions, to run in the Supabase SQL Editor. Never drop tables, columns or data. When finished, report which part you followed, and: - for owner only: what you fixed in the admin workflow - for submissions: the submission path, what a visitor can and cannot do, and how approval and rejection work

Run any SQL it gives you in the SQL Editor.

Check Your Listing Workflow

Run the checks for the setup you chose:

Owner only: create, preview, edit and publish a listing

Owner only: unpublish it, then delete it

Submissions: submit a listing while signed out

Submissions: it doesn't appear publicly

Submissions: it waits as Pending in your review queue

Submissions: approve it — it goes live

Submissions: reject another — it stays private

Submissions: a submission with a bad link is refused

Expected result

With submissions: new submissions enter a review queue and become public only after you approve them. Owner only: you fully manage the directory through the protected admin area.

Test the Directory & Prepare It for Discovery

Test Browsing, Search and Filters

Browse as a signed-out visitor:

Published listings appear

Draft listings stay hidden

Listing cards show the right details

Listing pages load correctly

A wrong listing address shows a helpful not-found page

Common searches return the right listings

Search ignores upper and lower case

An empty search shows every listing

A search with no matches shows the empty state

Each filter works on its own

Filters combine correctly

Clear filters works

Filters survive a refresh

Back returns to the previous results

Test the Admin, Submissions and Images

Skip any check for a feature your directory doesn't have.

Signed out or as the test account: the admin area is refused

Admin: create a listing

Admin: edit it

Admin: publish and unpublish it

Admin: deleting asks for confirmation

Admin: categories work

Submissions: a visitor can submit a valid listing

Submissions: it doesn't appear publicly yet

Submissions: the admin sees it as Pending

Submissions: approving publishes it

Submissions: rejecting keeps it private

Submissions: bad links and oversized text are refused

Images: a valid image uploads and shows

Images: a file that isn't an image is rejected

Images: a listing without an image shows a clean placeholder

Test on a Phone and Fix What Failed

Check the phone experience, then let Claude Code check the database directly:

Phone: search and filters are easy to use

Phone: listing cards are easy to read

Phone: listing pages fit the screen

Phone or tablet: the admin area is usable

Verify and Fix the Directory

Prove the access rules directly in the database as a signed-out visitor and a non-admin account, then fix only the checks that failed.

Verify this directory at the database level, then fix what failed. Read the "Directory" section of CLAUDE.md first, and test only the features it records. These manual checks failed: {{FAILED_CHECKS}} 1. DATABASE CHECK Use a temporary LOCAL-ONLY script with the project's normal Supabase client and the Publishable key. Do NOT use the Secret or service-role key: it skips every access rule, so the test would prove nothing. Ask me to put the test account's password in local, uncommitted environment variables. Never commit passwords, never put them in source code and never print them. As a SIGNED-OUT visitor, try to: - read draft or pending listings, including by their exact slug or id - read submitters' names or emails - create, change or delete a listing or a category — except through the submission path, if submissions are on - use the submission path to publish directly, set a status or save a link that is not http or https - upload, replace or delete listing images As the TEST ACCOUNT, signed in but not the admin: try the same admin actions. Expected: refused — an error, no rows returned or zero rows changed. Re-read afterwards to confirm nothing changed. As the ADMIN: create, edit, publish and delete a test listing. Expected: it works. Remove it afterwards. 2. SECRETS Search the source code and the built files. Only the Supabase Project URL and Publishable key may appear. 3. FIX Find the real cause of each failed check — mine and yours — and fix it at its source. Keep every fix small: no redesign, no new features and no rewrites of working code. Run the database check again after any fix. Remove the script afterwards and do not commit it. Return exactly one: DIRECTORY READY or: NEEDS ATTENTION If NEEDS ATTENTION, give me any corrected SQL to run, list what still fails, and test again once I confirm the SQL has run.

Which checks failed?

The pricing filter ignores Freemium. The filter drawer covers the results on a phone...

Continue when Claude Code reports DIRECTORY READY. Its report confirms:

Signed-out visitors can't change listings or read drafts, pending listings or submitter details

The test account can't do anything only the admin can

No secret keys reach the browser

Prepare Listing Pages for Search Engines

Prepare Listing Pages for Search Engines

Give every published listing its own title, description and preview, and add a sitemap — using a small server, because browser-only tags aren't enough.

Prepare the directory's public pages for search engines and link previews, without turning this into a full SEO project. Read the "Directory" section of CLAUDE.md first. Only real, published listings may become indexable pages. Do not create thin pages — no page per search or filter combination. 1. THE HONEST LIMIT Search engines and link previews often read only the first HTML a page returns, so tags set later by browser JavaScript are not enough on their own. Each listing's address must return its own metadata from the server. 2. A SMALL PRODUCTION SERVER Use one small Node production server — for example Express — as the app's entry file. It serves the built app, falls back to the app for client-side routes, and: - for a listing address: looks up the PUBLISHED listing by its slug with the Supabase Project URL and Publishable key, and returns the page with that listing's own title, meta description, canonical URL and Open Graph title, description and image. Escape every value you insert. An unknown, draft or pending slug returns a real 404 status, a noindex tag and the app's not-found page. - /sitemap.xml: the directory home, real category pages if they exist, and every published listing's address — built from the database and cached for a few minutes - /robots.txt: allows the public directory, disallows the admin area and points to the sitemap Build every absolute URL from a SITE_URL environment variable, never a hard-coded address. 3. IN THE APP - a unique title and meta description for the home, category and listing pages - one h1 per page — the listing's name on its own page - listing cards use real links (a href), so crawlers can follow them - search and filter views point their canonical URL at the main directory page - the admin area and the Submit a Listing page carry noindex 4. STRUCTURED DATA — only if it truly fits Add JSON-LD only when a type genuinely matches this directory — for example LocalBusiness for local businesses — and only with real fields. Otherwise skip it. 5. CHECK IT Run the production build with the server locally, give me its address, and show me the returned HTML head for one listing page, the sitemap, and the status code of an unknown listing. When finished, report: - the server's entry file and how Hostinger should run it - what one listing page's head contains - what the sitemap includes and excludes - anything the SPA still cannot do for SEO

Then open the local address Claude Code gives you and check:

View a listing's page source — its own title and description are there

/sitemap.xml lists your published listings and no drafts

/robots.txt points to the sitemap

An unknown listing address shows the not-found page

Expected result

The directory is functional, secure enough for its intended workflow, mobile-friendly, and its real published listing pages are ready for visitors and search engines.

Deploy the Directory to Hostinger

Prepare and Deploy the Directory

Prepare the Directory for Production

Build the directory for production, remove development leftovers, keep secrets out, and get the exact Hostinger settings.

Prepare this directory for production on Hostinger, as a Node.js Web App deployed from GitHub. Read the "Directory" section of CLAUDE.md first. Do not add features, and never print secret values. 1. BUILD Run the production build and fix anything that fails. 2. REMOVE DEVELOPMENT CODE Remove anything left from development in the code: leftover sample listings, test-only scripts, debug logging and any hard-coded test account. Sample listings in the database stay until I remove them myself. 3. NO SECRETS IN THE APP Search the source code and the built files. Only the Supabase Project URL and Publishable key may appear — no Secret or service-role key and no passwords. Make sure .env is git-ignored and never committed, and that .env.example lists the variable names without values. 4. ENVIRONMENT VARIABLES List the exact environment variable names Hostinger needs — including SITE_URL for the server — and whether each is needed at build time, at runtime or both. 5. ROUTING The production server from the search-engine step must serve the app, fall back to it for client-side routes, and return listing metadata. Confirm that refreshing or directly opening a listing, a category or an admin page loads correctly, and that nothing points at localhost. 6. HOSTINGER SETTINGS Tell me what to confirm on Hostinger's deploy screen: the framework preset, the build command, the output directory, the Node version and the entry file that starts the server. Do not commit or push — I will review first. Report: - the build result - what you removed - the environment variable names - the Hostinger settings - anything that blocks deployment

Push the project to GitHub with Claude Code or your normal GitHub workflow. If it already has a repository, use it.

Deploy on Hostinger

Recommended plan: Business

USED IN TUTORIAL

https://www.hostg.xyz/SHK1P

Hostinger Websites Add Website Node.js Web App

Choose Import Git repository Connect GitHub and select the directory's repository Confirm the framework, build settings and entry file Claude Code gave you Add the environment variables with your project's exact names Click Deploy and wait for the result

IMPORTANT

Add the Supabase Project URL and Publishable key under the names your project already uses. Private server keys stay private — never rename one to a VITE_ or NEXT_PUBLIC_ variable to make the deployment work.

Fix a Failed Website or Web App Deployment with AI

Use this if the Hostinger deployment fails.

/video/fix-a-failed-website-or-web-app-deployment-with-ai

Point Everything at Your Live Address

Listing pages, the sitemap and admin sign-in all need your real address.

1. Set SITE_URL in Hostinger

Add SITE_URL with your live address — for example https://yourdirectory.com — to the app's environment variables in Hostinger, then redeploy.

2. Add your live address to Supabase

Set the Site URL to your live Hostinger address and add it to the Redirect URLs.

Supabase Authentication URL Configuration

Test the Live Directory

Open your live address and check. Skip any check for a feature your directory doesn't have.

The directory loads on your Hostinger address

Published listings appear

Search works

Filters work

A listing address opens directly

Refreshing a listing page works

Admin: sign in

Admin: create, edit and delete a test listing

Listing images load

Submissions: a visitor can submit a listing

Submissions: it stays private until you approve it

A listing's page source shows its title, description and live address

The directory works on a phone

Verify the Live Directory

Check the deployment, listing pages and metadata, the sitemap, access rules and secrets on the live directory.

Perform a focused production check of this directory, now live on Hostinger. Read the "Directory" section of CLAUDE.md first. Do not add features and never print secret values. Do not claim to inspect Hostinger or Supabase settings you cannot see — ask me for the live address, and ask me to confirm specific settings. 1. DEPLOYMENT - the deployment succeeded from the intended repository and branch - the required environment variables are set, and SITE_URL is the live address - no secret files are in the repository 2. PAGES - listing addresses open directly and after a refresh - each listing page returns its own title, description, canonical URL and Open Graph tags, all using the live address - an unknown listing returns a 404 - /sitemap.xml lists only published listings, and /robots.txt points to it 3. ACCESS - admin sign-in works on the live address - run the signed-out and test-account database checks against the production Supabase project, with the Publishable key — never the Secret or service-role key - drafts, pending submissions and submitter details stay private 4. SECRETS - no secret key appears in the live site's code or network requests Return exactly one: DIRECTORY LIVE or: NEEDS ATTENTION If DIRECTORY LIVE, summarize the live address, listings, search and filters, listing pages and metadata, the admin workflow and access protection. If NEEDS ATTENTION, list only launch blockers.

Continue when Claude Code reports DIRECTORY LIVE, confirming:

No secret keys appear in the live site's code or network requests

Before real visitors arrive

Unpublish or delete the sample listings in your admin dashboard, then delete the test account in Supabase. Keep your own admin account.

Supabase Authentication Users

Expected result

Your searchable online directory is live on Hostinger with real listings, useful filters, dedicated listing pages, and a protected admin workflow.