The problem
Brands in the UAE pay for street presence, run clubs, mall activations and UGC with no record of whether anyone actually turned up. The people doing the work wait weeks to be paid, and nobody can prove what happened on the day.
What was built
Built for a UAE founder from a fourteen-milestone brief. Brands set the place, the day, the look, the number of seats and the pay per person, and reserve the full budget before anyone is invited. Only eligible people see a campaign; they check in on location inside a drawn map area, submit photos or links against the proof standard, and are paid when the brand approves. A live tracker shows check-ins on a satellite map, an admin console handles risk flags and disputes, and the brand gets a report built from verified records. Six Gulf markets with their own currencies, and seven interface languages including Arabic and Urdu laid out right to left.
The engineering decision
Money never moves on trust: pay is released only by an approved proof record, unused budget goes back, and every fee is computed on the server, never in the browser. AI agents draft campaigns, watch operations and help the admin team, all on structured outputs, and any reply that invents a money figure is rejected. Card funding runs through Stripe; payouts and identity checks stay in simulated mode until the founder's providers are connected, and the product says so.
How I built it
- Languages
- TypeScriptSQLCSS
- Frameworks & libraries
- Next.js 16 (App Router)React 19Tailwind CSS 4Prisma 7 ORMBetter Auth (email codes and passwords)next-intl (7 languages, Arabic and Urdu right-to-left)Zod (input validation)
- Apps & tools
- Claude Code (AI pair-programming)Git & GitHubDocker DesktopVitest (unit and database tests)Playwright (end-to-end tests)Stripe (card funding)Claude API (AI agents on structured outputs)Esri satellite mapsMailpit (local email testing)
- Hosting & data
- Hostinger KVM 4 VPS (Ubuntu 24.04)Docker Compose: app, background worker, PostgreSQL, MinIO file storageCaddy (HTTPS and reverse proxy)crowvy.com domain
- 01
Brief into milestones
The founder's brief was split into fourteen milestones, M0 to M13. Each one ended with a written report and a stop until the founder said continue, and every design decision was recorded as a numbered decision note, so nothing was built on an unspoken assumption.
- 02
Data and money model first
Before any screen existed, the database schema was written for brands, campaigns, seats, check-ins, proofs and payouts, with the fee rules (seat pay, service fee, commission) computed on the server and locked rows wherever money changes hands.
- 03
The product, screen by screen
Campaign builder with a drawn map area, matching that shows a campaign only to eligible people, on-location check-in, proof upload and review, a live tracker on a satellite map, payouts, reports and an admin console for risk flags and disputes.
- 04
Languages and markets
Seven interface languages through next-intl, with Arabic and Urdu mirrored right to left, and six Gulf markets each with its own currency.
- 05
AI agents with guardrails
Claude-powered agents draft campaigns, watch operations and assist the admin team. Their output is schema-checked, and any text that invents a money figure fails the run instead of reaching a user.
- 06
Testing
Over 1,800 unit and database tests in Vitest and 80+ end-to-end browser tests in Playwright, run against both the development server and a production build before each milestone was reported.
- 07
Production
Deployed as a Docker Compose stack on a Hostinger VPS behind Caddy, with a written deployment runbook. Stripe funding is wired; payouts and identity checks stay visibly simulated until the founder's providers are connected.
Next plate
Juris Prime FintechA UAE virtual-asset licensing practice, published in twelve languages with real right-to-left layout.