All work

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.

  1. 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.

  2. 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.

  3. 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.

  4. 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.

  5. 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.

  6. 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.

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

  8. 08

    Paid photo-shoot booking

    Landlords book a professional shoot from the marketplace with MyFatoorah checkout, credits and purchase history.

  9. 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. 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. 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. 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.

  1. 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.

  2. 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
Ajar · Alex Thomas