
03 · Visitor concierge & marketplace
TaRLI
A digital concierge that meets visitors to Tanzania before they land.
- Category
- Visitor concierge & marketplace
- Role
- Product design & full-stack engineering
- Built by
- Empire Pro Dev
- Links
- To be confirmed


Screens
TaRLI interface
Overview
A concierge and marketplace platform for international visitors to Tanzania. Visitors describe their trip before they fly, are matched with a vetted local guide (a winga), receive a quotation, pay once and are met at the airport. Hotels, transport, tour operators, translators, and investment and mining consultants offer their services as verified partners.
Product areas
- Visitors
- Local guides (winga)
- Trip planning
- Quotations & bookings
- Payments & commissions
- Partner verification
- Airport handover
- Destinations
- English, Kiswahili & Chinese
Technologies
- Next.js
- TypeScript
- Supabase
- PostgreSQL
- Cloudflare R2
Case study
From problem to product
The complete engineering lifecycle behind TaRLI.
- 01
Problem
International visitors to Tanzania have to arrange guides, stays, transport and specialist services from abroad, with little way to tell who has been vetted or who will actually meet them on arrival.
- No reliable way to know who will be waiting at the airport
- Guides, stays, transport and consultants all booked separately
- Language barriers for visitors arriving from abroad
- 02
Idea
TaRLI: register before you fly, describe the trip, get matched with a winga, receive one quotation, pay once, and be met at the airport by someone whose identity you can verify with a one-time code.
- A four-step trip wizard completed before departure
- A vetted local guide matched by language and workload
- One quotation and one payment, covering every partner on the trip
- 03
Approach
TaRLI was built to a written business and system requirements specification. I first delivered it as an ASP.NET Core application, then ported it to Next.js and Supabase, keeping the interface and every translated string unchanged.
- Requirements traced from the specification to screens and services
- The money path treated as the centre of the system
- Honest stand-ins for providers not yet chosen: a sandbox payment gateway and an offline AI concierge
- 04
Architecture
Pages hold no business logic; they resolve the current user and call a service. Services own the rules: commission calculation, booking state, payment verification and settlements. Payment and AI providers sit behind interfaces, so a real vendor can be added without changing the rest of the system, and seven roles each reach only their own guarded area.
- Roles for visitors, guides, partner managers, finance, support, auditors and administrators
- Row-level security denies everything; the app reaches the database only from server code
- Server actions replace the old controller endpoints, with the same authorisation checks in the same order
System architecture
3 layers · 12 modules
L01Experiences
4 modules- Visitor journey
- Winga desk
- Partner console
- Finance & admin
L02Services
5 modules- Trips & quotations
- Bookings & payments
- Commissions & payouts
- Partner verification
- AI concierge
L03Data & storage
3 modules- PostgreSQL · Supabase
- Row-level security
- Cloudflare R2 documents
Conceptual architecture: layers and their responsibilities. - 05
Design
The interface uses an editorial design system of hard edges, no rounded corners, a terracotta accent and generous space, preserved exactly through the port.
- A role-aware bottom tab bar, bottom-sheet filters and bottom-sheet dialogs on phones
- The one critical action on each page pinned to the foot of the screen on mobile
- Available in English, Kiswahili and Chinese
- 06
Development
The application is TypeScript on Next.js, with Supabase for the database and sign-in and a services layer that owns every business rule.
- Partner documents kept in a private bucket and read only through short-lived signed links
- Airport handover codes that are cryptographically random and lock after repeated failed attempts
- An AI concierge that refuses visa, immigration and legal questions and hands them to a person
- Installable as an app, with a service worker that never caches personal pages
- 07
Data
Every completed booking writes a commission to the winga who arranged it and a fee to the platform. Commission rates are stored as data, scoped by partner category, and every payment is re-verified with the gateway before a booking is confirmed.
- Commission rules by partner category, with a guide default and a platform fee
- An append-only audit log for privileged actions
- Full-text search across partner services
- 08
Testing
The safeguards are built into the flows themselves, and rebuilding the automated suite from the original application is the first priority after the port.
- A replayed payment webhook produces one set of commissions, not two
- Every record read from a URL is checked against its owner, and failures look the same as missing records
- Next: automated tests for the role matrix and the money path
- 09
Deployment
TaRLI runs on Supabase for its database and authentication and on Cloudflare storage for documents, with scheduled jobs that send notifications and reconcile payments.
- Scheduled endpoints protected by a shared secret, and refused in production without one
- Every credential kept in environment configuration, never in source control
- Maintenance mode and broadcast announcements controlled from the admin area
- 10
Result & current state
TaRLI is a working MVP: the whole trip, quotation, booking, payment and commission flow runs end to end. Choosing the live payment provider and the hosted AI provider are the steps left before launch.
- Complete: destinations, trips, bookings, commissions, partner verification and admin settings
- Next: a live payment gateway, the hosted AI concierge, transactional email and the automated test suite
What building it taught.
Challenges
- Porting a working application to a new stack without changing anything users see
- Confirming bookings safely without a database transaction spanning several calls
- Keeping AI answers away from visa, immigration and legal advice
Solutions
- Kept the same stylesheets, markup and translations, and replaced controllers one for one
- Ordered the writes so commissions land before a booking is confirmed, with a reconciliation sweep for anything interrupted
- A deliberately broad refusal filter that hands regulated questions to a person
Lessons
- The order of writes can carry a guarantee that a transaction used to
- An honest stand-in is better than a fake integration
- Tests are the first thing a port loses, so rebuild them first







