← All projects

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