← All projects

Full-stack product · web + mobile

Circle

Social app for small, invite-based groups. My project for getting hands-on with a real database, auth, and shipping across two clients.

Year
2025 — 2026
Status
Built — pre-launch
Stack
Next.js · TypeScript · Supabase · Expo / React Native · Tailwind CSS

I built this to get hands-on with things I'd only read about, a real database, real authentication, a real security model, rather than to plan out a product. Most of it came from directing Claude Code and reviewing what it produced instead of hand-writing every piece, and it shows: it was built fast and loose, without much upfront design. It works, but I wouldn't call it polished.

Most social apps give you one big feed. Circle is organized around small groups instead, public or private, where posts, membership, and roles stay scoped to that group. 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, and 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 in the client. Denormalized counters (members, followers, likes, comments) stay consistent through Postgres triggers instead of being counted in the app.

Rebuilding the mobile app

The first Expo project got stuck in dependency conflicts that resolution overrides couldn't fix. I rebuilt it from scratch at a fresh path with a minimal, locked-down dependency set and moved the code over piece by piece. Took longer, but it actually builds reliably now.

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