FairSkills — fairskills.app
A multi-tenant learning platform where every community gets its own subdomain — and the database, not the application, decides who sees what.

The challenge
I ran an earlier version of this platform (SkillTransfers, 2019–2022) on AWS. It worked, but it had a flaw I did not want to carry forward: the tenant a request belonged to was supplied by the client, so the server trusted the browser to say which community's data it was allowed to read. That is one bug away from a cross-tenant data leak. The rebuild had to make that class of mistake structurally impossible — while also adding course authoring, peer teaching, bookings and payments.
What I built
A multi-tenant community-learning SaaS: organisations claim a subdomain, brand it, invite members, author courses out of levels and lessons, and let members book one-to-one sessions with peers — with paid enrolment over iDEAL. Each community also gets its own installable PWA, favicon and share image, generated at runtime from its branding.
Stack & why
How it works
- The service-role key is used only for validated onboarding flows (registration, invite redemption) and never trusts a client-supplied tenant id; every other query runs as the signed-in user, so RLS applies.
- The content model is tenants → courses → levels → lessons, with separate tables for teachers, enrolments, progress, bookings, coupons and payments — 23 tables, all RLS-protected.
- Peer booking is availability-constrained: teachers publish their availability and the booking flow only offers slots that actually exist, pinned to Europe/Amsterdam so daylight saving cannot shift a session.
- Hardest part: writing RLS policies strict enough to isolate tenants while still letting anonymous visitors browse a catalogue, members see their own progress, and admins manage everything — expressed as database policies instead of if-statements scattered across the app.
Outcome
- ✓10 communities running live on their own branded subdomains (webdev, guitar, chess, yoga, cooking and more) from one deployment — a community created through the UI is online instantly, with no deploy and no DNS change.
- ✓Tenant isolation enforced in the database (51 policies across 23 tables), closing the client-supplied-tenant-id hole the 2019 platform shipped with.
- ✓Paid enrolment verified end-to-end against Mollie in test mode (iDEAL checkout → webhook → enrolment), including a server-validated free-access coupon.
My role
Sole architect and engineer — a ground-up rebuild of a platform I ran from 2019 to 2022.
Ready to make AI actually work?