How it’s built

Students, teachers, batch scheduling and the entire money workflow — multi-tender payments, allocations, discounts and receipts — with role-based access enforced down to the database row.

Built on Next.js 15 / React 19 / Supabase + RLS

50/51

Pages are Server Components

25

Server-action modules

67

Database migrations

4

Tender types per payment

Explore the system

Pick a pillar to see how Centrely runs a multi-branch coaching business — from enrolment to receipt to row-level access.

Everything a coaching centre runs on

One data-heavy internal tool, no separate API layer — every domain from enrolment to receipt in the same system.

Students & teachers

Auto-generated student IDs, teacher profiles with subject specialisations and availability.

Batch scheduling

Flexible batches with weekly time slots, per-batch calendars and attendance tracking.

Enrolments

Regular and holiday-course enrolments, with multiple enrolments per subject supported.

Pricing & discounts

Year/class and subject-level pricing, plus per-student recurring or one-off discounts.

Reporting suite

Collection, enrolment, workload, utilisation, credit-due, overdue and transaction reports.

Progress & audit

Printable report cards per batch, and database triggers that log every data change.

Under the hood

Pages fetch data by calling server-action functions directly. Every action returns a uniform { success, data | error } contract, with auth and role checks inside — not just at the route.

  • Next.js 15 · App Router
  • React 19
  • TypeScript · strict
  • Supabase · Postgres + RLS
  • Tailwind v4
  • shadcn/ui · Radix
  • TanStack Table
  • Recharts
  • react-hook-form + Zod
  • Vitest
  • Sentry

Server-first

Interactivity isolated to client components; pages stay thin and data-driven.

Type-safe end-to-end

DB types generated from the live schema; forms and actions infer from one source.

Tested where it counts

Money math and access control unit-tested — pure logic factored out of actions.

Want to see it running?

Built with Next.js 15 · Supabase · RLS