Case study · 01 / 04
Ajar
PropTech platform — a listing marketplace I architected solo, plus engineering across the Ajar property-management suite.
- Role
- Product & Tech Lead · sole architect of Ajar Listing
- Timeline
- Jan 2026 – Present
- Status
- Live · In production
The problem
GCC landlords run on spreadsheets and WhatsApp. The property tools on the market are built for Western workflows — no national addressing systems, no regional payment rails, no Arabic that reads well to native speakers, no model of how leases and rent actually work in the region.
Ajar’s answer is a platform in two halves: a property-management system (PMS) that takes landlords from lease to invoice to settlement, and a public listing marketplace where seekers find homes in their own language. I own the marketplace end-to-end and work across the PMS — in two languages, on web and mobile.
My approach
Ajar Listing is one Turborepo + pnpm monorepo: an Express + Prisma API, a Next.js admin dashboard, a Next.js public marketplace, and an Expo app for iOS and Android, sharing four packages so types flow end-to-end. The data model — 87 Prisma models — treats countries as first-class: users are unique per country, and each country carries its own currency, timezone, and Country → State → City → Zone hierarchy.
Documentation-first throughout. A .ai/ knowledge base captures architecture, RBAC matrices, GIS rules, listing lifecycle and deployment topology, so a new engineer — or an AI coding agent — can read it in order and ship without onboarding meetings. The same discipline carries into the PMS work: ticket plans with decision tables, and Playwright suites that must pass in both English and Arabic.
Delivered
What I shipped.
- 01
Four apps, one monorepo
REST API, bilingual admin dashboard, SEO-first public marketplace, and an iOS and Android app (Expo / React Native) for seekers and landlords — with shared UI, types, utils and config packages.
- 02
Listing lifecycle + search
Account-setup gate, a three-step add-property wizard (basics → details → media), tracked status history, and publish-time sync to Elasticsearch for bilingual, geo and fuzzy search.
- 03
Permission-aware RBAC
About 37 modules × 8 standard actions plus special permissions (e.g. payout approval), grouped into 12 roles — enforced in API middleware and mirrored in the admin navigation.
- 04
AI operations assistant
An admin copilot on Groq (Llama 3.3 70B) with 132 tools filtered by the user’s permissions. Write actions become server-side proposals that expire and re-check permissions at execution — the model can suggest, never bypass.
- 05
Dual-provider maps + national GIS
National government GIS (PACI) through a backend proxy, ArcGIS and Google Maps switchable per market on web, MapLibre on mobile — the same forms work everywhere.
- 06
Data-driven bilingual lookups
Hard-coded enums moved to admin-managed EN / AR lookup tables, so ops can add a property type or amenity in both languages without a deploy. Currency derives from the country.
- 07
Async pipeline on Pub/Sub + Cloud Tasks
Topics for email, notifications and listing events; Cloud Tasks for delayed jobs — keeping slow work off the request path.
- 08
Paid photo-shoot booking
Landlords book a professional shoot from the marketplace with MyFatoorah checkout, credits and purchase history.
- 09
LLM SEO infrastructure
Hand-written
/llms.txt, an explicit AI-crawler allowlist, dynamic sitemap, JSON-LD and per-page OG images — with a written rule against hidden prompt-style content. - 10
PMS: landlord → tenant announcements
Backend and tenant-app feature for the property-management suite: audiences by property or tenant, EN / AR content, rate limits, “read by X of Y” tracking, and batched FCM push with retries and a sweeper for stalled sends.
- 11
PMS: tenant app + maintenance
On the team codebase: a tenant payment record, a shareable rent record with public verification, push and inbox, and login in the tenant app, plus maintenance messaging and ratings across the landlord web and mobile apps, and on-call support for production data and engineering requests.
- 12
Marketing site: integrations + SEO
On the joinajar.com site, wired every form to real destinations (contact API, HubSpot, demo, newsletter, lead capture), per-page SEO with redirects and a real 404, accessible forms, and the production deploy pipeline.
Decisions
Worth calling out.
01Why dual-provider maps over hard-coding ArcGIS
National PACI data is unmatched for accurate addressing — but only inside its own borders. Google Maps wins everywhere else. Hard-coding either choice would have left markets underserved. So the provider is configuration, and a switchable location picker hides the choice from every form. New countries pick their own authoritative source without touching feature code.
02An AI assistant that can’t outrun its permissions
Giving an LLM 132 admin tools is only safe if it sees exactly what the user could do by hand. Tools are filtered by RBAC before the model sees them, and anything that writes becomes a proposed action stored server-side with an expiry. When the user confirms, permissions are checked again — so a stale suggestion or a role change can never slip through.
Outcome
Ajar Listing is live on web and mobile, in English and Arabic. Three isolated environments deploy from branches with no manual steps. Alongside it, I keep shipping features into the property-management suite.
Stack
- TypeScript
- Next.js 15 · React 19
- Tailwind CSS · shadcn/ui · Radix UI
- TanStack Query · Zustand · next-intl
- Expo · React Native
- Express · Prisma · PostgreSQL
- Redis
- Elasticsearch
- Firebase Auth · Firebase Cloud Messaging
- GCP (Cloud Run, Cloud SQL, Pub/Sub, Cloud Tasks, Artifact Registry, Secret Manager)
- SendGrid · MyFatoorah
- Groq (Llama 3.3 70B) · OpenAI SDK
- ArcGIS · Google Maps · MapLibre · PACI
- Sentry · Prometheus + Grafana · ELK
- GitHub Actions · EAS · Turborepo · pnpm
- Vitest · Playwright
Working on something similar?
Free 15-minute discovery call. We’ll work out whether I’m the right person for it, and if not, I’ll point you somewhere better.
Next case study
BambooHR MCP Server
A custom Model Context Protocol server exposing BambooHR HR systems to Claude Desktop.
Read the case study