Project / 2026
ThinkUp Intranet
Invite-only intranet for ThinkUp Academy with a county and zone map.
- Role
- Tech Director. Author of all 38 commits.
- Team
- Team of 3, built with the ThinkUp team.
- Next.js
- TypeScript
- Tailwind
- Supabase
- Clerk
- Leaflet
- Resend
01
Problem
ThinkUp Academy runs work across departments and a National Program with schools, counties and ambassador students. It needed one internal place for tasks, meetings, decisions and that program.
02
What I built
Postgres row level security decides access. The interface mirrors those rules and server actions check them again. A county changes zone only through one database function, and the map color comes from the zone table.
03
Result
An internal, invite-only intranet with 6 roles, 3 departments and a student platform. Schools and ambassador students follow their county when it changes zone. More than 20 ThinkUp people use it daily to assign tasks, create projects, follow ambassador students and give feedback.
04
In the code
Permission rules are pure functions with tests.
src/lib/permissions.ts
The service role key lives in one server-only file.
src/lib/supabase/admin.ts
County to zone moves go through move_county() and write a history row.
supabase/migrations/20261004000000_intranet_schema.sql
County boundaries come from public data, reduced to code and name.
scripts/build-counties-geojson.ts
School contact data stays out of activity logs.
supabase/migrations/20261004000500_pn.sql
05
Size
- 38 commits
- 16 migrations
- 7 test files
- 6 roles, 3 departments