Skip to content
Multi-tenant attendance SaaS for schools

Hodori

A multi-tenant school attendance SaaS, from the tenant model to the apps on both stores.

Sole engineer, web and mobile
hodori.upgrade-kwt.com
Hodori website screenshot
4
role surfaces on one backend
80+
database migrations
2
stores, one React Native codebase

Hodori is a multi-tenant school attendance platform built for UPGRADE in Kuwait: any school registers, gets an isolated workspace, and runs attendance from a Next.js dashboard and a React Native app on the App Store and Google Play. I built the whole platform as the sole engineer.

The context

Hodori started as an attendance system for one Kuwaiti school. The goal became a product any school could sign up for, so it was refactored into a multi-tenant platform where each school is an isolated tenant on one Supabase backend.

Four kinds of users need different surfaces: a super-admin overseeing every school on the web, a school admin on web and mobile, supervisors on web and mobile, and teachers on mobile only.

What I built

One backend, two apps, four role surfaces, and the store submissions, built and shipped by me.

  • Tenant model with school self-registration, trials, and subscriptions
  • Per-school isolation with PostgreSQL Row-Level Security on 15+ tenant-scoped tables
  • 30+ server-side RPCs holding the business logic for web and mobile alike
  • Next.js dashboard with 20+ pages: rosters, staff, attendance analytics, audit logs, billing
  • React Native app for teachers, supervisors, and admins with offline-first attendance sync
  • Push notifications and full Arabic/English RTL localisation
  • Vercel cron jobs, Sentry monitoring, and a backup restore drill
  • App Store and Google Play submissions, with the review pitfalls documented for reuse

How it works

The mobile app talks to Supabase directly with the user's JWT; there is no API layer in between. Every write goes through a SECURITY DEFINER Postgres RPC that re-checks the caller's role and organisation, and every tenant table carries a denormalised organization_id that Row-Level Security policies read from the JWT. Isolation therefore holds in the database, not only in the UI.

Next.js serves the dashboards, the public registration flow, the few API routes that need the service-role key (creating auth users), and the cron jobs. Types are kept in sync by hand between the dashboard and the mobile app, and a prebuilt knowledge graph of both apps documents how every RPC, table, and screen connect.

A later hardening pass narrowed the super-admin's RLS bypass to reads only, so cross-school writes must go through audited RPCs or the service role.

Next.jsReact NativeExpoSupabasePostgreSQLRow-Level SecurityVercelSentryTypeScript

The outcome

Hodori is live on the App Store and Google Play and runs multiple schools as isolated tenants on one codebase.

It is the clearest proof that I can design a multi-tenant SaaS end to end, enforce isolation where it matters, and ship the web and mobile surfaces on top.

More work

Have a project like this?

I build platforms, apps, and systems like these end to end, from Cairo and remote worldwide. Tell me what you are building.

Get in touch