cat case-studies/roomeo.md
Roomeo
- Next.js 16
- TypeScript
- PostgreSQL
- PostGIS
- Prisma 7
- Leaflet
- Better Auth
- Zustand
- TanStack Query
- shadcn/ui
## the problem
Room hunting in Nepali cities happens in Facebook groups and word of mouth: no map, no filters, no way to know if a listing is still available. Renters waste days calling numbers on expired posts.
Three user roles with different jobs: renters exploring by location, landlords managing properties and units, and admins moderating listings. The map is the product - everything else supports it.
## screens
## constraints & tradeoffs
- Location queries had to be real geography, not bounding-box hacks - PostgreSQL + PostGIS from day one.
- Strict TypeScript end to end: Prisma schema as the single source of truth for types.
- Mobile-first: the map with a bottom-sheet list mirrors how people actually browse on phones.
## architecture
Next.js 16 App Router (strict TS) ├─ map view (Leaflet) ◄── viewport query ──► PostGIS radius search ├─ grid view + filter sidebar ──► TanStack Query cache ├─ Better Auth ──► role gates (renter / landlord / admin) └─ landlord dashboard ──► Prisma 7 ──► PostgreSQL 16
## key decisions
Map-first, list-second
The primary browse surface is the map with a draggable bottom sheet, not a grid with a map tab. Viewport changes drive the query, so panning the map is searching.
PostGIS over client-side filtering
Distance and radius queries run in the database with spatial indexes. The client never downloads the full listing set, which keeps the map responsive as inventory grows.
## results & lessons
- Live at roomeo.vercel.app with full renter, landlord, and admin flows.
- Favorites, unit galleries, and moderation dashboard shipped in the first release.
- Lesson: modeling geography properly in the database eliminated an entire class of frontend complexity.
next
Easy Sorting →