00. Projects/Fullstack/completed

Socio Kolab

A white-label portal that replaces the spreadsheets and group chats student societies run on — member lifecycle, dues tracking, and events with public custom registration forms, each club branded under its own URL and colors.

Socio Kolab

01. The Problem

Student clubs run on a fragile mix of WhatsApp groups, forgotten Google Forms, and a spreadsheet only one exec understands. Membership records, dues collection, and event turnout are scattered — and every year, leadership turnover wipes the club's institutional memory.

02. The Logic

A

Scoped v1 to the three highest-pain modules (members, dues, events) and cut everything else to protect adoption.

B

Chose a deliberately boring single-codebase stack — full-stack Next.js with Server Actions over a separate Django API — because solo maintainability, not traffic, is what kills student-built tools.

C

Designed multi-tenant from day one (club-scoped tables, user/membership split, config-not-code) while deploying single-tenant, so multi-club support later became an additive migration instead of a rewrite.

D

Rejected an encrypted-ID URL scheme in favor of real isolation: human-readable club slugs, with every query compound-scoped by id and clubId and authorization checked in every server action.

E

Modelled dues as immutable period-scoped records and guests as membership-less attendees, keeping history auditable across academic years and unifying member/guest reporting.

03. The Stack

Next.js
TypeScript
Prisma
PostgreSQL
Tailwind CSS
Zod

04. The Solution

Implementation Result

A multi-tenant platform where each club gets a branded portal at its own slug: role-based member management with an approval pipeline, period-scoped dues tracking with CSV export, and events with a drag-and-drop custom form builder whose public registration links accept members, non-members, and anonymous visitors — all validated server-side against each event's form schema. A theming engine derives a ~25-token design system from three club-chosen colors, with luminance-based dark-theme detection and server-side WCAG contrast validation.

Key Outcomes

  • 01.Adopted by 2 clubs / over 100 members
  • 02.3 user-chosen colors expanded into ~25 derived design tokens per club
  • 03.Cross-tenant isolation verified by adversarial tests on every resource type

Reflection

  • ID obscurity is not access control — per-query authorization scoping is what actually isolates tenants.
  • Cheap future-proofing (a clubId on every table) beats expensive future-building (tenant onboarding before tenants exist).
  • Constraining user input — three colors, five field types — is what makes guaranteed-good output possible.
  • Keying stored data by immutable ids instead of editable labels keeps history intact through every rename and delete.