Skip to content

cat case-studies/roomeo.md

Roomeo

## 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

roomeo - data flow
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.