Full-stack product · web + mobile
Circle
Social networking app built around small, intentional groups — two clients (web + native) sharing one Supabase backend with row-level security.
- Year
- 2025 — 2026
- Status
- Built — pre-launch
- Stack
- Next.js · TypeScript · Supabase · Expo / React Native · Tailwind CSS
Most social apps give you one big feed. Circle is organized around small groups — public or private — where posts, membership, and roles stay scoped to the people who actually matter for that context. A close-friends circle and a class circle don't need to see each other.
What it does
Users create or join circles (public ones are discoverable, private ones use invite codes). Inside a circle: text posts, likes, comments, role-based permissions. On top of that there's a personal feed that pulls from all your circles, standard follow/profile mechanics, and a discover page for finding public circles. The mobile app extends further with capacity limits and waitlists per circle, category tagging, a notifications tab, and a discovery-mode home feed for new users.
One backend, two clients
The web app is Next.js with TypeScript and Tailwind; the mobile app is Expo with React Native. Both talk to one Supabase backend — Postgres for data, Supabase Auth for identity. Security is enforced at the database layer with row-level security policies on every table, not just client-side checks. Denormalized counters (members, followers, likes, comments) stay consistent through Postgres triggers rather than application-side counting.
Rebuilding the mobile app
The first Expo project drifted into dependency conflicts that no amount of resolution overrides could fix. I rebuilt it clean at a fresh path with a minimal, locked dependency set and moved code over piece by piece. Slower than forcing it, but the result actually builds reliably.
- Web
- Next.js 16 · React 19 · TypeScript · Tailwind CSS v4 · Framer Motion
- Mobile
- Expo SDK 52 · React Native · Reanimated · expo-haptics
- Backend
- Supabase — Postgres with RLS, Auth, SQL triggers
- Security
- Row-level security policies per table, not client-side