Case study
Inspire Columbia Website
A production website that combines Inspire Columbia's public presence with a secure, staff-managed application and recruiting workflow.
- Role:
- CTO and full-stack developer
- Timeline:
- 2026 - present
- Stack:
- TypeScript, Next.js, Supabase, Clerk, Resend, Playwright
The problem
Inspire Columbia needed more than a brochure site. The same system had to publish opportunities, accept applications and documents, help reviewers coordinate decisions, and keep applicants informed.
The workflow handles personal applicant information, so staff permissions, database policies, auditability, and safe deployments had to be part of the product rather than later additions.
Constraints and tradeoffs
Constraint
Public visitors, staff, and administrators require different levels of access.
Decision
Clerk establishes staff identity while Supabase row-level security and server-side role checks enforce access again at the data boundary. This adds policy and test work, but avoids relying on hidden interface controls for security.
Constraint
Database changes affect a live application workflow.
Decision
CI runs builds and automated tests before approval-gated production migrations. Releases take a little more coordination, but schema changes do not bypass review.
How it works
Next.js serves the public pages and staff tools. Clerk authenticates staff, Supabase stores positions and applications behind row-level security, Resend delivers workflow email, and automated unit, RLS, and browser tests protect the main paths.
Product screens

Results and takeaways
- Recruiting works better as one connected workflow: staff can publish a position, collect structured applications, review documents, record decisions, and contact applicants from the same system.
- Row-level security tests catch authorization mistakes that interface-level role checks cannot.
- Audit history, reviewer notes, and confirmation steps make consequential staff actions easier to understand and recover from.