
Harf Media — Smart OOH Advertising
Out-of-home advertising platform for managing DOOH and static billboard campaigns across Iraq. Advertisers browse networks, schedule campaigns, upload creative, and pay online — while an admin team reviews and fulfills every request.
What I did
- Built the cross-platform mobile app from scratch with React Native + Expo, hand-crafting every screen to the client's design and shipping to both iOS and Android from a single codebase.
- Designed and developed the backend REST API in PHP (Laravel) to power campaign booking, media management, and order fulfillment.
- Integrated Stripe for card payments, plus a cash-on-delivery / direct-cash option to fit local buying habits in the Iraqi market.
- Built a server-rendered Laravel Blade admin dashboard so staff can review incoming requests, manage media inventory, and track campaigns end to end.
- Implemented full Arabic localization with right-to-left (RTL) layouts across the app.
Impact & results
- Shipped and published on the App Store as a complete advertiser-to-admin platform.
- Single React Native codebase delivered to both iOS and Android.
The problem
Booking out-of-home advertising in Iraq — billboards, LED screens, digital placements — was a manual, offline process: back-and-forth with sales, no single place to see availability, and no self-serve way to pay. The client wanted to turn that into a product: advertisers should be able to browse networks, book a campaign, upload their creative, and pay, all from their phone, while staff kept control over what actually goes live.
My approach
I took the project end to end as the sole developer — mobile app, backend, and admin.
- Mobile app — I built the whole app in React Native + Expo, translating the client's design into every screen by hand and shipping the same codebase to iOS and Android.
- Backend — I designed a Laravel (PHP) REST API to model advertising networks, campaign bookings, creative uploads, and the order lifecycle.
- Payments — I integrated Stripe for card payments and deliberately kept a cash-on-delivery / direct-cash path alongside it, because a card-only flow would have excluded a large part of the local market.
- Admin — I built a server-rendered Laravel Blade dashboard so staff can review incoming requests, manage media inventory, and move campaigns through fulfillment.
Challenges
- Localization & RTL — the app is Arabic-first, so I implemented right-to-left layouts throughout rather than bolting them on afterward, which affects layout, iconography, and text flow across every screen.
- Two-sided flow — advertisers self-serve on mobile while staff approve and fulfill on the web admin. I designed the API and data model so both sides stay in sync around a single campaign's state.
Outcome
Shipped and published on the App Store as a complete advertiser-to-admin platform, running on both iOS and Android from one React Native codebase.