Build and Deploy an Online Course Platform With Claude Code
Build a real course platform with lessons, student accounts, learning progress, and an admin dashboard, then deploy it live on Hostinger.
Roadmap & Resources
Plan & Build Your Course Platform
Choose Your Platform Setup
Open an empty folder — or your existing project — in Claude Code, fill in the fields, then copy the prompt.
Build Your Course Platform Interface
Choose your topic, lesson formats and who can access the courses, and Claude Code builds the whole platform interface with realistic sample courses.
Build the interface for an online course platform. This task builds the screens only, with realistic sample content. Sign-in and real data come later. Platform name: {{PLATFORM_NAME}} What the platform teaches: {{TEACHING_TOPIC}} Example course: {{EXAMPLE_COURSE}} Lesson formats: {{LESSON_FORMATS}} Who can access the courses: {{ACCESS_MODEL}} Visual style: {{VISUAL_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 platform 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 PLATFORM SCOPE Add a "Course platform" section to CLAUDE.md in the project root — create the file if it does not exist. Record the platform name, the topic, the lesson formats, the access model and the visual style. Every later task reads this section, so keep it short and accurate. Never write keys or passwords into it. 3. KEEP THE SCOPE FOCUSED This is one owner's course platform, not a marketplace: one admin manages every course. The core is Course → Sections → Lessons → Student progress. Build only the lesson formats listed above. Do not add payments, subscriptions, certificates, quizzes, assignments, live classes, a community or forum, drip scheduling, multiple instructors or advanced analytics. 4. PUBLIC PAGES - a course library listing the published courses - a course page: title, description, cover image, number of lessons, the full curriculum of section and lesson titles, and a clear Start or Continue action - sign-in and sign-up screens — the design only, they do not need to work yet No fake reviews, ratings, enrollment counts or instructor stats. 5. STUDENT AREA - a dashboard with Continue learning and My Courses, each course with its progress - the course player, the centrepiece of the platform: the lesson content, the curriculum beside it (a drawer on phones) with completed lessons marked, Previous and Next, Mark as complete, and the course progress — for example "8 of 12 lessons complete — 67%". Keep it clean and distraction-free. - a course-complete state — no certificate 6. ADMIN AREA - an overview of the courses - a course list showing draft and published courses - a course editor: the course details, its sections and lessons in order, and a lesson editor for the chosen formats - only if I enroll students manually, a place to enroll students The admin forms can stay local for now. Never pretend that something was saved. 7. ACCESS MODEL Reflect the chosen access model in the interface. With manual enrollment, a student sees the courses they are enrolled in, and other courses clearly show that enrollment is needed. 8. SAMPLE CONTENT Create two or three sample courses for this topic, including the example course, each with two or three sections of lessons in the chosen formats. Use realistic titles and lesson text; for video lessons, use clearly marked placeholder video links. No lorem ipsum. Keep all sample content in ONE clearly named module, separate from the components and shaped like real data — courses, sections, lessons — so a database can replace it later. 9. ADDRESSES Give every course and every lesson its own address, so a lesson can be bookmarked and refreshed. 10. PREVIEW SWITCH Until real sign-in exists, add one small, clearly labelled switch between the visitor, student and admin views. Keep it in one place so it is easy to remove. 11. DESIGN Apply the visual style and the platform name. The platform must work well on phones, tablets and desktops — many students learn on a phone. Keep it calm and focused on learning: no marketing clutter, no decorative gradients or glows and no fake statistics. 12. 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, student and admin screens - where the sample content lives - anything you did not build, and why
What is your platform called?
SkillBase
What will you teach?
Name one example course
Build Websites With AI
Which visual style fits your brand?
Who can access the courses?
Which lesson formats do you need?
Claude Code saves your choices in the project's CLAUDE.md file, so every later prompt builds only what you picked.
Check the Course Platform
Open the local address Claude Code gives you and use the preview switch to look at each side:
The course library shows the sample courses
A course page shows its curriculum and a Start button
The lesson player shows the lesson, the curriculum, and Previous and Next
The student dashboard shows Continue learning and course progress
The admin screens show your courses and the course editor
Only the lesson formats you chose appear
Everything works 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 complete course-platform interface running locally with realistic sample courses and lessons.
Add Real Accounts & Course Data
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 Test Accounts
Create three accounts: one for you with your real email address — it becomes the admin — and two test students, Student A and Student B.
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 until all three accounts exist
Use email addresses you control for the test students.
Add Sign-In and Course Data
Use this prompt in Claude Code. It gives you one SQL block to review and run.
Add Real Accounts and Course Data
Add sign-in, the admin and student roles, and real course, section and lesson data, with lesson content protected from the start.
Turn the course platform into a real app with Supabase: real accounts, an admin and real course data. Read the "Course platform" section of CLAUDE.md first. It records the lesson formats and the access model — follow them, and do not ask me about the access model again. 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. SIGN-IN Add email and password sign-up, sign-in and sign-out with Supabase Auth. Protect the student area and the admin area. Signed-out visitors can still browse the course library and course pages. Remove the preview switch. From now on, the signed-in account decides what appears. 3. ADMIN AND STUDENTS This platform has exactly two kinds of account: the admin (me) and students. Do not build a general roles-and-permissions system. - Store the role in a profiles table keyed by the auth user id. Create a profile automatically for every new account, as a student, and backfill profiles for the accounts that already exist. - Nobody can change their own role. Never decide the role from user_metadata, local storage, the URL or anything else the browser controls. - Make MY account the admin with ONE reviewed SQL statement — never through sign-up or the app. - Hiding the admin link is not protection: the database must refuse admin actions from everyone else. 4. COURSE DATA Use related tables, not one large JSON document, so content is easy to edit, order and track: - courses: title, a URL slug, summary, description, cover image and a draft or published status - sections: belong to a course, with a position for their order - lessons: belong to a section, with a position, a title and — when more than one format was chosen — a lesson type such as video or text - lesson content: only the fields the chosen formats need, such as a video URL or the lesson text - lesson resources, only if downloadable resources were chosen: the file details, with the files in a PRIVATE Storage bucket - enrollments: which student can access which course - lesson progress: which student completed which lesson and when, one row per student and lesson Use generated ids. Create nothing unrelated. 5. WHO CAN READ WHAT Turn on Row Level Security on every table immediately. - Anyone can read PUBLISHED courses and their curriculum: course details, section titles and lesson titles. Drafts are visible only to the admin — the database enforces this, not a frontend filter. - Lesson content and resources are protected. With "anyone with an account", any signed-in student can read the content of published courses. With manual enrollment, only a student enrolled in that course can. - Row Level Security works per row, so keep lesson content where these rules can actually protect it — for example in its own table — never in a row the public curriculum can read. - Students can read only their own enrollments and progress. - The admin can read and manage everything. Use one trusted database check for "is this account the admin". 6. REAL DATA Replace the sample content with real queries, and remove the sample-content module. Give me ONE reviewed SQL seed that recreates the sample courses in Supabase, plus one draft course. If I chose manual enrollment, enroll Student A in the first course and leave Student B unenrolled. Ask me for the three test accounts' email addresses — never their passwords. Do not seed resource rows without real files; the admin uploads those later. 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 role is stored and protected 4. The read rules, table by table 5. ONE reviewed SQL block to run in the Supabase SQL Editor: the tables, the rules, the private bucket if needed, the profile backfill, 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 connect the admin forms or progress saving yet — they come next.
Review the SQL, then run it in your Supabase project. It creates the course tables, makes your account the admin and adds the sample courses.
Supabase SQL Editor
Visitor: the library shows the published sample courses
Visitor: the draft course does not appear
Student A: sign in and see the student dashboard
Student A: the admin area is refused
Admin: sign in and see the admin dashboard
Refresh a page — you stay signed in
Expected result
The app now loads real courses and lessons from the database and recognizes signed-in students.
Build the Student Learning Experience
Make the Course Player Work
Build the Learning Experience
Make course access, the lesson player, saved progress and Continue learning work for real students.
Make the student learning experience fully work. Read the "Course platform" section of CLAUDE.md first. Build only the lesson formats it lists, and follow its access model. Every read and write goes through the database rules. No Secret or service-role key in the app. 1. COURSE ACCESS - Anyone with an account: a signed-in student can start any published course. Starting it adds the course to My Courses — an enrollment students may create only for themselves, and only for published courses. - Manual enrollment: only students the admin enrolled can open lessons, and students cannot enroll themselves. Everyone else sees the course page with a clear "enrollment needed" state. Guessing a lesson address must never reveal its content. The database refuses it, not just the screen. 2. COURSE PLAYER A student can open a course, open any lesson they have access to, see the curriculum with completed lessons marked, move with Previous and Next, and continue to the next lesson. Every lesson keeps its own address and survives a refresh. 3. VIDEO LESSONS — only if chosen Store a normal video URL from a host such as YouTube, Vimeo or Bunny Stream — never pasted embed HTML — and show it in an embedded player. Accept only links you can embed safely, and show a clear message for anything else. Do not build video hosting or processing. The platform only hides the link from people without access. Say plainly in your report that anyone who has an unlisted video link can share it, and that the video host's own privacy settings control that. 4. TEXT LESSONS — only if chosen Keep it simple and reliable — for example Markdown written in a plain text area and rendered safely, with no raw HTML. No heavy rich-text editor. 5. RESOURCES — only if chosen Keep the files in the private bucket, in a folder per course. Students with access download them through short-lived signed URLs that expire within a few minutes; nobody else can, even with a guessed path. Students never upload, replace or delete files. 6. PROGRESS - Mark as complete saves one progress row for this student and lesson, and the student can undo it. - The database lets a student write only their own progress, and only for lessons they can access. The student comes from the signed-in account, never from a value the browser sends. - Calculate course progress from real rows: completed published lessons divided by the course's published lessons — for example "8 of 12 lessons complete — 67%". Never store a percentage on its own. - The curriculum, the course page and the dashboard show the same numbers, and they survive a refresh and a new sign-in. 7. CONTINUE LEARNING Remember the lesson each student last opened in each course. Continue learning returns to it if it is unfinished, and otherwise to the next unfinished lesson in curriculum order — never simply to lesson 1. 8. COURSE COMPLETE When every published lesson in a course is complete, show a clean course-complete state. No certificate. Give me ONE reviewed SQL block for any new rules or columns, to run in the Supabase SQL Editor. Never drop tables, columns or data. When finished, report: - how access is checked for the chosen access model - how progress is saved and calculated - how Continue learning chooses a lesson - how each chosen lesson format is shown - the video-link limitation, in plain words
Review the SQL it gives you, then run it in the SQL Editor.
IMPORTANT
Video lessons use a link from a host such as YouTube or Vimeo. Students without access never see it, but anyone who has an unlisted link can share it. If that matters, use your video host's privacy settings — for example allowing embeds only on your own domain.
Test Learning as a Student
Sign in as Student A:
Open a course and its first lesson
Move through the lessons with Next and Previous
Mark a lesson complete — the curriculum shows it
The course progress updates, such as 1 of 12 lessons complete
Sign out and back in — your progress is still there
Open a later lesson, go back to the dashboard — Continue learning returns to it
Student B: a course they aren't enrolled in stays locked — only if you enroll students manually
Expected result
A student can open a real course, complete lessons, leave the app, come back, and continue from saved progress.
Build the Course Admin Dashboard
Build the Course Manager
Build the Course Admin
Create, edit, order and publish courses, sections and lessons from your own admin dashboard instead of Supabase.
Make the admin dashboard manage the whole course library. I must never need the Supabase dashboard to manage content. Read the "Course platform" section of CLAUDE.md first, and build only for the lesson formats 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. Any other account sees a "no access" page, and the database refuses its requests anyway. 2. COURSES - See every course with its status and number of lessons. - Create a course and edit its title, summary, description and cover image. - Publish and unpublish a course. Warn before publishing a course with no lessons. Upload cover images to a separate public bucket — they are shown publicly anyway. Never put lesson resources there. 3. COURSE BUILDER Show the course structure the way a student sees it: sections, with numbered lessons inside them. Let me: - add, rename, reorder and delete sections - add, edit, reorder and delete lessons - move a lesson to another section Use simple Move up and Move down controls unless this project already has reliable drag-and-drop. Ask for confirmation before deleting, and say plainly that deleting a lesson also removes students' progress on it. 4. LESSON EDITOR Manage only what the chosen formats need: the title, the lesson type, the video URL, the lesson text and the resources — uploaded to and deleted from the private bucket. Add a draft or published state for single lessons only if it stays simple. 5. FORMS Validate required fields, 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 or buckets, 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 - how the order of sections and lessons is stored and changed - what happens to progress when a lesson is deleted
Run any SQL it gives you in the SQL Editor. Then, as the admin:
Create a course with two sections
Add a lesson of each format you chose
Reorder two lessons
Publish the course
Delete a test lesson — the app asks you to confirm first
Manage Students and Access
Add Student Management
See each student's progress and, if you enroll students manually, give and remove course access from the admin dashboard.
Add student management to the admin dashboard. Read the "Course platform" section of CLAUDE.md first, and follow its access model. 1. STUDENTS Show a simple list of students, with each student's courses and progress — for example "Sara — 8 / 12 lessons complete". Show names or email addresses through an admin-only path. No analytics, charts or student CRM. 2. ENROLLMENT — only with manual enrollment - Find a student by the email address they signed up with. Only confirmed accounts can be enrolled. - Enroll them in a course. - Remove their access. Keep their progress, so enrolling them again restores it. - See who is enrolled in each course. Enrollment writes are admin-only in the database. 3. ANYONE WITH AN ACCOUNT Skip enrollment management, and show which students started each course instead. Give me ONE reviewed SQL block for any new rules or database functions, to run in the Supabase SQL Editor. When finished, report: - what the students page shows - how enrollment works, if it applies - where the admin-only checks are enforced
Run any SQL it gives you, then check. Skip the enrollment checks if anyone with an account can learn.
Admin: see Student A's progress, such as 3 / 12 lessons complete
Admin: enroll Student B in the new course
Student B: the course now opens
Admin: remove Student B's access — the course locks again
Admin: edit a lesson in a course Student A can open — Student A sees the change
Expected result
You can create and edit a course in the app and publish it, and students see the change.
Test the Complete Platform
Test as a Visitor and a Student
Sign out first, then use Student A — and Student B where a check says so. Skip any check for a setup you didn't choose.
Visitor: published courses appear in the library
Visitor: draft courses stay hidden, even by their address
Visitor: a course page shows its details and curriculum
Sign in and sign out work
Student A: the dashboard opens after sign-in
Student A: the right courses are available
Student B: a course they aren't enrolled in stays locked, even by its address — manual enrollment only
Student A: lessons load correctly
Student A: Previous and Next work
Student A: completing a lesson is saved
Student A: the course percentage updates correctly
Student A: progress survives a refresh
Student A: progress survives signing out and back in
Student A: Continue learning opens a useful lesson, not always the first one
Student A: finishing every lesson shows the course-complete state
Test the Admin and Course Content
Sign in as the admin, then check the student side. Skip any check for a setup you didn't choose.
Admin: create a course
Admin: add sections
Admin: add and edit lessons
Admin: reorder sections and lessons
Admin: publish the course
Student A: sees the published changes
Admin: enroll a student, then remove them — manual enrollment only
Student A: download a resource from a course they can open
A copied resource link stops working after a few minutes
Video and text lessons display as intended
Test Security and Quality
Run these by hand, then let Claude Code check the database directly:
Student A: the admin area is refused, even by typing its address
Empty states look intentional, such as a course with no lessons yet
Loading states appear while lessons load
Errors are easy to understand
Refreshing a lesson or an admin page keeps you there
Learning works well on a phone
Verify and Fix the Platform
Prove the access rules directly in the database as two students and a visitor, then fix only the checks that failed.
Verify this course platform at the database level, then fix what failed. Read the "Course platform" section of CLAUDE.md first, and test only the features and the access model 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 accounts' passwords in local, uncommitted environment variables. Never commit passwords, never put them in source code and never print them. As STUDENT B, try to: - read, create, change or delete Student A's progress - save progress with another student's id - create, edit, publish or delete a course, section or lesson - read a draft course or its lessons - with manual enrollment: read lesson content or resources of a course they are not enrolled in, or enroll themselves - change their own role As a SIGNED-OUT visitor, try to read lesson content, resources, draft courses and anyone's progress. Expected: refused — an error, no rows returned or zero rows changed. Re-read afterwards to confirm nothing changed. As STUDENT A: read an allowed lesson and save their own progress. Expected: it works. As the ADMIN: edit and publish a course. Expected: it works. 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: PLATFORM 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?
Progress disappears after signing out. The lesson sidebar covers the video on a phone...
Continue when Claude Code reports PLATFORM READY. Its report confirms:
Student B can't change Student A's progress
No student can save progress for someone else
No student can create, edit or delete courses
Direct database requests can't get around these rules
No secret keys reach the browser
Expected result
The admin can publish real course content and students can securely learn and save their progress.
Deploy the Course Platform to Hostinger
Prepare and Deploy the Platform
Prepare the Platform for Production
Build the platform for production, remove development leftovers, keep secrets out, and make every lesson page survive a refresh on Hostinger.
Prepare this course platform for production on Hostinger, as a Node.js Web App deployed from GitHub. Read the "Course platform" 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: sample-content leftovers, the preview switch, test-only scripts, debug logging and any hard-coded test account. 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, and whether this framework needs them at build time. 5. LIVE ADDRESSES Nothing may point at localhost in production. Build every sign-in, sign-up and email-confirmation redirect from the live address, never a hard-coded URL. 6. PAGE REFRESH Course, lesson and admin pages use client-side routes. Refreshing or directly opening any of them on Hostinger must load the app, not a 404. Set this up the way Hostinger's Node.js Web App serves this framework — for example a small production server with a fallback to the app. 7. HOSTINGER SETTINGS Tell me what to confirm on Hostinger's deploy screen: the framework, build command, output directory, Node version and, if one is needed, the entry file. Do not commit or push — I will review first. Report: - the build result - what you removed - the environment variable names - how page refresh is handled - 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 platform's repository Confirm the framework and build settings 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
Set Up Production Sign-In
Students can only sign in on your live address once Supabase knows it, and they need real confirmation emails.
1. Add your live address
Set the Site URL to your live Hostinger address and add it to the Redirect URLs.
Supabase Authentication URL Configuration
2. Keep Confirm email on
Open Email and make sure Confirm email is on, so every student account belongs to a real inbox — and you only ever enroll the person who owns it.
Supabase Authentication Sign In / Providers
3. Send emails from your own domain
Supabase's built-in email only reaches your own team's addresses, two emails an hour, so real students would never receive their confirmation email. Choose a provider such as Resend, Postmark, Amazon SES or Brevo, verify your domain there and create SMTP credentials. Then turn on Enable Custom SMTP and enter the sender email, sender name, host, port, username and password.
Supabase Authentication Emails SMTP Settings
Keep SMTP credentials in Supabase
Your SMTP password lets anyone send email as your domain. Enter it only in Supabase's SMTP settings — never in the app, an environment file, the repository or a Claude Code conversation.
Test the Live Platform
Open your live address and check:
The course library loads on your Hostinger address
New student: sign up with a real email address and confirm it from the inbox
Student: open a course they can access — enroll them first if you enroll manually
Student: move between lessons
Student: complete a lesson — the progress saves
Student: refresh — the progress is still there
Admin: sign in
Admin: update a course and publish the change
Student: sees the change
Restricted and draft courses stay locked
A copied resource link stops working after a few minutes
The platform works on a phone
Verify the Live Course Platform
Check the deployment, production sign-in, course access and secrets on the live platform.
Perform a focused production check of this course platform, now live on Hostinger. Read the "Course platform" 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 - no secret files are in the repository 2. SIGN-IN - the Supabase Site URL and Redirect URLs use the live address - Confirm email is on, and custom SMTP sends the confirmation emails - sign-in, sign-out and email-confirmation links use the live address, never localhost - refreshing a lesson or an admin page keeps the session and never shows a 404 3. ACCESS - run the Student A and Student B database checks against the production Supabase project, with the Publishable key — never the Secret or service-role key - draft courses, restricted lessons and resources stay protected - only the admin reaches the admin area 4. SECRETS - no secret key appears in the live site's code or network requests Return exactly one: PLATFORM LIVE or: NEEDS ATTENTION If PLATFORM LIVE, summarize the live address, sign-in, the course library, student progress, the admin area and access protection. If NEEDS ATTENTION, list only launch blockers.
Continue when Claude Code reports PLATFORM LIVE, confirming:
No secret keys appear in the live site's code or network requests
Before real students join
Unpublish or delete the sample courses you don't want students to see, then delete the Student A and Student B accounts in Supabase. Keep your own admin account.
Supabase Authentication Users
Expected result
Your online course platform is live on Hostinger with real courses, student accounts, saved learning progress, and a protected admin dashboard.