Fleet
Led the team · built calls, social auto-posting and chat media
Fleet is Lebanon's car marketplace for buying, selling and renting cars, on iOS, Android and the web at fleetapp.me. Asif Alam led the Fleet team at Qwerty and built its in-app calling (calls that ring like a real phone call even when the app is closed, with numbers kept private), along with automatic Facebook and Instagram posting and chat media.
- Role
- Led the team · built calls, social auto-posting and chat media
- When
- Since April 2025
- Platforms
- iOS · Android · Web

- users
- 22k+
- cars listed
- 6k+
- dealers
- 230+
- on the App Store
- 4.8★
(01)
The problem
Buying a car in Lebanon runs on scattered listings and phone numbers passed around on WhatsApp. Fleet puts cars, dealers, rentals, number plates and chat in one app, and lets a buyer call a dealer without either of them ever seeing the other's number.
(02)
What I built
- 01In-app voice calls that ring natively (CallKit on iPhone, a full-screen call on Android), even when the app is closed
- 02Private numbers: the person you call is resolved on the server, never on your phone
- 03Automatic posting of new listings to dealers' Facebook Pages and Instagram
- 04Chat photos and voice notes, kept private and cleared after 14 days
(03)
What it does
- Browse and search cars, rentals and number plates, no account needed to look
- Dealer tools: inventory, analytics, listing republish and lock
- AutoClips: short videos of listings
- An AI assistant that turns a question into a filtered search, and compares cars on five-year cost of ownership
- Wallet and featured boosts, push notifications and reminders
- English and Arabic, right-to-left included
- A web admin for moderation, banners, chats and calls
(04)
The hard parts
Calls that ring when the app is closed
One server function owns every call's state. It writes the call, mints a LiveKit token and wakes the other phone with a VoIP push: CallKit on iOS, a data message and a full-screen call screen on Android. I patched the native calling library so a phone stops ringing the moment the caller hangs up, and a LiveKit webhook closes rooms left open by a crash or a dead battery.
Numbers that never leave the server
Neither side of a call ever sees a phone number. The callee is resolved from the conversation on the server, so the app only ever knows who it is talking to, not how to reach them outside Fleet.
Auto-posting that never posts twice
When a listing goes live, a job is queued; a worker claims two a minute and runs each as a saved state machine, so a retry resumes where it stopped instead of posting again. Failures back off from a minute to two hours. It also has to respect Meta's rules (JPEG only on Instagram, aspect-ratio limits, 8 MB, ten photos a carousel), so photos are converted on the way out.
Chat media with a 14-day memory
Photos and voice notes live in a private bucket behind signed links and row-level security. A scheduled job deletes them after 14 days but leaves a marker, so the conversation still shows that a photo was there.
(05)
Stack
- Expo
- React Native
- Next.js
- TypeScript
- Supabase
- PostgreSQL
- Edge Functions
- pg_cron
- LiveKit
- CallKit
- Firebase Cloud Messaging
- Meta Graph API
- Gemini