Business templates

Full design · Business

Learning platform

Insignia, a course platform for independent teachers and small studios: photography, craft and practical business skills.

Live preview. Click around, it works.

About this template

Insignia, a course platform for independent teachers and small studios: photography, craft and practical business skills. Learners browse a catalogue with filters by topic, level and format, open a course page with a full syllabus and instructor bio, and enrol. Each lesson plays with a video poster, notes and a mark complete action; a module quiz scores itself immediately and can be retaken. Progress shows every enrolled course as a ring with a streak, and finishing a course issues a certificate: printable, carrying a short verification code anyone can check on a public lookup screen, generated through a security definer function that will not double issue one. Instructors get their own side: an overview of enrolments and completions, a course builder that reorders modules and lessons and edits quiz questions with a live preview, and a student roster with search, sort and a per student progress drill in.

What the agents are asked

The first message sent when you use this template. You can edit the plan before anything is built.

Adapt Insignia to my teaching business. Keep both sides and every working rule: the learner side (Catalogue with search, filters and sorting, Course page with syllabus and instructor bio, Lesson player with video poster, notes and progress, Quiz with immediate scoring and retakes, Progress with a ring and streak per course, Certificates with a printable certificate and a public verify by code lookup) and the instructor side (Overview of enrolments and completions, Course builder that reorders modules and lessons and edits quiz questions with a live preview, Students roster with search, sort and per student progress). Change the brand, colours, subjects, courses, instructors and sample students to mine. Keep the sample data marked Sample and removable in one step, keep the general information line wherever the site touches certification or accreditation claims, and never state a real accreditation body or government figure as fact. When I want real accounts, wire in sign in and the tables and functions in schema.sql as the README describes, with every secret key on the server.

A course platform for independent teachers and small studios: photography, ceramics, product design and small business skills. Learners browse a catalogue, work through video, reading and quiz lessons, track their progress, and earn a printable certificate with a code anyone can verify. Instructors get their own side to build courses and watch how students are doing.

Built on the NovaBuild template kit (docs/guardrails/TEMPLATE-KIT.md): one CONFIG block, one design token block, and a shared data layer that runs in demo mode with no backend or against a real Supabase project once one is connected, with no code change either way.

Screens

Learner side:

  • Catalogue (#/): search, filter by subject and level, sort, an asymmetric hero with a short looping shot of the studio.
  • Course (#/courses/<slug>): syllabus by module, the instructor's bio, enrol or continue.
  • Lesson (#/learn/<slug>/<lessonId>): a video lesson (poster plus a demo preview clip), a reading lesson, or a quiz lesson, with previous/next and a mark complete action.
  • Progress (#/progress): every enrolled course as a ring, a rough day streak.
  • Certificates (#/certificates, #/certificates/<code>): every certificate earned, and a printable certificate with its verification code.
  • Verify (#/verify): public, no sign in needed: type a code, confirm who earned it and for what.

Instructor side ("Viewing as: Instructor"):

  • Overview (#/instructor): enrolments, completions, certificates issued, a card per course.
  • Course builder (#/instructor/courses/<slug>): edit the title and summary, reorder modules and lessons, add or remove a lesson, edit a quiz's questions and correct answers, with a live preview of the syllabus a learner sees.
  • Students (#/instructor/students): every enrolment, searchable and sortable, expanding to a lesson by lesson breakdown for one student.

In this demo, "Viewing as: Instructor" is a preview toggle that shows every course, the way the kit's demo mode has no separate sign up for instructors. Wire in owns_instructor() (schema.sql) once you connect a real backend and it scopes to the instructor who is actually signed in.

Signature function

Lesson completion writes through complete_lesson and submit_quiz, both of which recompute the enrolment's percent from how many of the course's lessons now have a completed_at. At 100 percent, issue_certificate writes a certificate with a short, unambiguous code (no 0, 1, I or O). Calling it twice with the same enrolment returns the same certificate, never a second one; the public verify_certificate function looks a code up for anyone, signed in or not.

Data model (schema.sql)

instructors, courses, modules, lessons, quiz_questions, enrollments, lesson_progress, certificates. Row level security on every table: courses, modules, lessons and quiz questions are publicly readable when published and writable by the instructor who owns them (owns_instructor()); enrolments, progress and certificates are only ever written through the SECURITY DEFINER functions (enroll_in_course, complete_lesson, submit_quiz, issue_certificate), each of which checks the caller owns the enrolment before touching it. verify_certificate is the one function anyone, signed out included, may call.

Sample data

Every course, instructor, enrolment and certificate is marked is_sample: true and carries SAMPLE_VERSION (script.js). A returning visitor's own enrolments, progress and certificates are never sample rows, so they always survive a version bump; only the sample cast gets replaced. There is no single "remove sample data" button in this build (see "What is not built yet" below); the pattern for one is the same used elsewhere in NovaBuild templates: iterate each table's is_sample rows and call store.remove.

Going live

  1. Run schema.sql on a Supabase project (rehearsed first with tools/rehearse-template-schema.mjs, never applied directly).
  2. Set CONFIG.backend in script.js to { mode: 'supabase', url: '<project url>', anonKey: '<anon key>' }. The anon key is public by design; row level security is the actual boundary. Never put a service_role or sb_secret_... key here; the kit refuses to start with one and the checker refuses to publish a template that contains one.
  3. schema.sql's instructors_insert policy already lets any signed in user create their own instructor row (owner_user_id = auth.uid()) and instructors_update lets them edit it, so the database itself needs no admin step to turn someone into an instructor. This template's UI does not offer that yet, though: there is no "become an instructor" screen, so today an instructor profile is created by hand (an insert, or the row already seeded) rather than through a form.
  4. Everything the customer would change (brand, contact details, locale, which screens are on) comes from CONFIG at the top of script.js. Colours, fonts, radii and spacing come from the nova:tokens block at the top of styles.css.

What is not built yet

  • Payments: every course in the sample data is free (price_cents: 0). Wiring in Stripe Checkout for a paid course is a server function this template does not include.
  • A "become an instructor" screen: the database already allows it (see "Going live" above), the template's UI just does not offer the form yet.
  • A single "remove sample data" action (see "Sample data" above for the pattern).

Honesty

Insignia and every person, course and studio in it are fictional, for demonstration only. A certificate issued here confirms completion of that course within this platform; it does not represent, and this template never claims, a government or nationally recognised accreditation. Courses on bookkeeping and other regulated subjects carry a plain "general information only, not advice" line wherever that matters. This template was not modelled on any specific existing product.

Art direction

One shoot, one grade: cool, neutral daylight (slightly overcast rather than warm or golden hour), real unretouched skin and materials, tight or asymmetric crops with negative space, hands shown at work on tools and materials (a pottery wheel, sketches) rather than on a person, no logos, no readable text or lettering in any frame. The one video (hero-loop.mp4) is a locked off, static camera shot of the same desk as hero-studio.webp, with only steam and a curtain moving, so it reads as one continuous photograph rather than a separate piece of footage.