Co-founder · June 2026 – present · In development

Revv

A premium car-rental marketplace for Lebanon, in development: renter and host apps, an admin console, a public site and one API, from one monorepo.

  • 157

    API endpoints

    One OpenAPI 3.1 contract generating React Query and Zod clients, so validation is identical at build time and at runtime.

  • 5

    surfaces

    Renter app, host app, admin console, public site and Express API in one pnpm monorepo.

  • 2

    languages, Arabic RTL

    English and Arabic with full RTL, booking-overlap protection under concurrency, idempotent refund reconciliation.

Problem
Renting a car in Lebanon meant phone calls, cash and no way to verify the other party.
Role
Co-founder
Period
June 2026 – present
Status
In development
Focus
Full-stack · Mobile · Backend · Infra
Stack
  • TypeScript
  • Expo SDK 54
  • React Native 0.81
  • React
  • Vite
  • Express 5

Problem

Renting a car in Lebanon meant phone calls, cash and no way to verify the other party. A renter could not see whether a car was actually free without messaging its owner, an owner had nothing stopping two people from booking the same dates, and neither side had a record when a pickup or a return went wrong. Revv makes it a marketplace: listings with real availability, bookings that cannot overlap, verified renters and hosts, and inspections, messaging and disputes handled inside the product instead of over the phone.

Architecture

One pnpm monorepo holds every surface and the libraries they share.

  • artifacts/api-server — the Node API on Express 5 at api.revvrental.com, hosted on Railway, on PostgreSQL through Drizzle ORM.
  • artifacts/revv-mobile — the renter and host apps on Expo SDK 54 and React Native 0.81.
  • artifacts/revv-admin — the internal admin console on React, Vite and Tailwind at admin.revvrental.com.
  • artifacts/revv-web — the public site on React and Vite, currently a Coming Soon page at revvrental.com.
  • artifacts/mockup-sandbox — a sandbox for screen mockups.
  • lib/api-spec — the 157-path OpenAPI 3.1 contract, the single source of truth.
  • lib/api-client-react and lib/api-zod — the React Query and Zod clients generated from that contract.
  • lib/db, lib/payments and lib/vehicle-brands — the schema, payment reconciliation and vehicle catalogue every surface imports.

The renter app covers accounts, browsing with search, filters and favourites, map discovery, booking with availability and overlap protection, trip history, checkout, host-renter chat, reviews, driver-verification uploads, phone verification, push notifications and a loyalty UI.

The host app covers listings, photo upload to R2, booking approvals, blocked dates, extension requests, pickup and drop-off inspection photo flows, disputes, and a wallet with earnings. The admin console carries the dashboard and KPIs, plus users, bookings, vehicles, verifications, disputes, promos, finance, payouts, settings and a health monitor.

Around the core: photos on Cloudflare R2, email through Resend, maps through Google Maps, phone verification over WhatsApp (Meta WhatsApp Cloud and Twilio Verify, with Infobip planned), payment providers and push notifications. GitHub Actions runs CI on every merge.

Decisions

  • Contract first. The OpenAPI 3.1 document is the source of truth; the React Query hooks and the Zod schemas are generated from it, never written by hand. A request is validated the same way at build time and at runtime, and a schema change fails the build on every screen that depends on it.
  • Overlap protection under concurrency. Two renters booking the same car for the same dates at the same moment cannot both succeed.
  • Role-aware authorization. Renter, host and admin permissions are checked by the API, not inferred from which app made the call.
  • Idempotent refund reconciliation. A refund that is retried, replayed or reported twice by a provider reconciles exactly once.
  • RTL from day one. English and Arabic ship together with real right-to-left layouts rather than a translation bolted on later.

Result

Revv is live at revvrental.com as a Coming Soon page while the renter and host apps complete, with the API at api.revvrental.com and the admin console at admin.revvrental.com behind it. Progress is posted on Instagram at @revv_rental.

Layers

How it is built.

4 layers, back to front: what each one owns, and why it is its own layer.

  • Data

    • lib/db
    • lib/payments
    • PostgreSQL · Drizzle ORM
    • booking overlap protection under concurrency
    • idempotent refund reconciliation
  • API

    • Express 5 · api.revvrental.com
    • 157-path OpenAPI 3.1 contract
    • generated React Query + Zod clients
    • role-aware authorization
  • Surfaces

    • Renter + host apps · Expo SDK 54
    • Admin console · React + Vite
    • Public site · revvrental.com
    • English / Arabic RTL
  • Ops

    • GitHub Actions CI
    • Cloudflare R2
    • Resend
    • Google Maps
    • WhatsApp verification
    • Push
  1. Data

    The data layer owns the invariants: a booking can never overlap another for the same vehicle, and a refund reconciles once.

  2. API

    One contract is the source of truth; the clients are generated from it, never written by hand.

  3. Surfaces

    Five surfaces share the same types, so a schema change fails the build on every screen that depends on it.

  4. Ops

    Photos on R2, email through Resend, phone verification over WhatsApp, and CI gates on every merge.

Hiring?

Hiring for frontend, full-stack or AI?

The CV has the degree, six internships and every project. Email is the fastest way to reach me.

Keyboard shortcuts

1–5
Home, Projects, Experience, Store, Contact
J K
Next / previous section
C
Copy email
D
Download CV
T
Switch theme
G
Open GitHub profile
?
Show or hide this panel

When off, only ? still works.

// one more: type the word for taking a stack apart