Metaviz AI
PropTech / Real Estate SaaS / AI PlatformCase study

AI-Powered PropTech SaaS - Multi-Role Real-Estate Platform

Five roles. Three surfaces. One backend. From listing intake to deal-room close - with an AI Butler that speaks English and Swahili, and payments via Stripe and M-Pesa.

An AI-powered real-estate platform that connects agents, buyers, tenants, and professionals with property search, deal management, messaging, and payments.

Project Overview

Five roles. Three surfaces. One backend. From listing intake to deal-room close - with an AI Butler that speaks English and Swahili, and payments via Stripe and M-Pesa.

East African real-estate transactions are fragmented across WhatsApp threads, spreadsheet listings, PDF lease templates, and cash or mobile-money payments with no common platform connecting agents, buyers, lawyers, caretakers, and tenants. This platform replaces that entire stack with one AI-powered workspace built for the market.

Five roles share one Flutter codebase and one FastAPI backend with role-based routing, permissions, and dashboards. Buyers search 300+ live listings on a PostGIS + OpenSearch geo-map with 10 km radius filters and AI area summaries. Agents manage listings, enquiries, and the full 9-milestone deal room. Lawyers and valuers join deals as invited parties. Caretakers handle maintenance triage and inspection reports. Tenants manage leases and rent from their own dashboard.

The streaming OpenAI Butler co-pilot is present on every screen: it compares properties in markdown tables, suggests professionals as one-tap cards, drafts buyer questionnaires, and answers rent and maintenance questions in both English and Swahili. Offline-first messaging survives flaky 3G with outbox queuing and reconnect-drain deduplication. Payments run on Stripe for cards and Startbutton for M-Pesa and African mobile money.

The platform covers the full East African real-estate transaction lifecycle: agents list and manage properties, buyers discover and enquire through geo-search and AI recommendations, lawyers and valuers participate in a structured 9-milestone deal room, caretakers handle maintenance and inspections, and tenants manage leases and rent - all in one workspace.

Three client surfaces share a single event-driven FastAPI backend: a React + Vite web SPA for agents and admin, a cross-platform Flutter mobile app (iOS, Android, and Web) for all roles, and a streaming OpenAI Butler chat embedded across both. There is no API drift between surfaces because every client calls the same typed endpoints enforced by Pydantic v2 and PydanticAI structured outputs.

The platform is built specifically for emerging-market realities: offline-first messaging that survives flaky 3G, bilingual EN/SW with ~1,900 localized strings, mobile-money payments via M-Pesa through the Startbutton API alongside Stripe card billing, and Flutter builds optimized for low-spec Android devices. PostGIS + OpenSearch geo-indexing delivers sub-300ms map queries over 300+ listings, with the architecture ready for 10x volume without changes.

AI-Powered PropTech SaaS - Multi-Role Real-Estate Platform
— Relevant keywords —
AI PropTech SaaSEast African Real Estate PlatformFlutter Multi-Role AppOpenAI Butler Real EstatePostGIS Geo SearchMulti-Party Deal Room
Offline-First MessagingM-Pesa Stripe PaymentsSwahili English Bilingual SaaSFastAPI Multi-Tenant Backend9-Milestone Transaction WorkflowKeycloak RBAC Real Estate
Challenge & Solution

Seven problems, seven pivots

Every challenge on the left became a shipped capability on the right.

Problem 01
One Event-Driven Backend for Three Surfaces

No unified platform for the full transaction lifecycle - East African property transactions move across WhatsApp for communication, PDF or paper for listings, Excel spreadsheets for tracking, and separate MPESA or cash processes for payments. Agents, buyers, lawyers, caretakers, and tenants have no shared workspace, so every handoff between parties loses context and creates delays.

Solution

A single FastAPI + PostgreSQL backend powers the React web SPA, Flutter mobile app, and OpenAI Butler chat with zero API drift. Every client calls the same typed Pydantic v2 endpoints. Feature changes deploy once and reach all three surfaces simultaneously, cutting feature development time by approximately 40%.

Problem 02
PostGIS + OpenSearch Geo-Search with AI Area Summaries

Property discovery is broken without geo-search - listings are shared as WhatsApp images, Facebook posts, or printed flyers with no structured search, no map view, and no way to filter by location radius, price, or property type. Buyers cannot compare properties side by side or get AI-powered area summaries to understand a neighbourhood before visiting.

Solution

Buyers search 300+ live listings on a clustered Mapbox/Leaflet map with 10 km radius filters, price facets, and property-type filters. Sub-300ms geo queries powered by PostGIS spatial indexing and OpenSearch. The AI Butler generates area summaries for any searched neighbourhood on demand.

Problem 03
9-Milestone Multi-Party Deal Room

Deals collapse without a structured multi-party workflow - a property transaction involves an agent, a buyer, a lawyer, a valuer, and sometimes a lender, coordinating over WhatsApp with no shared document vault, no milestone tracking, and no dispute mechanism. Deals fall through because no one knows what stage they are at or who needs to act next.

Solution

Every transaction spins up a realtime Socket.IO workspace with nine milestones, a shared document vault, a parties tab showing agent, buyer, lawyer, and valuer, and a dispute tracker. All parties see the same milestone state in real time across web and mobile via Socket.IO + Redis pub/sub.

Problem 04
Streaming AI Butler Co-Pilot on Every Screen

No AI assistant for a market with low digital literacy - first-time buyers and tenants in East Africa need guided help comparing properties, understanding lease terms, and knowing which professionals to engage. An AI Butler that speaks Swahili and presents results as one-tap cards rather than raw data lowers the barrier to using the platform significantly.

Solution

OpenAI GPT-4/GPT-4o co-pilot streams responses via WebSocket across web and mobile. It compares properties in markdown tables, surfaces lawyers and valuers as one-tap action cards, drafts buyer questionnaires, and answers rent and maintenance questions in both English and Swahili. PydanticAI validates all structured outputs.

Problem 05
Offline-First Messaging for Flaky 3G

Connectivity is unreliable but messaging must work - East African markets have widely variable 3G and 4G coverage. A messaging platform that drops messages or shows errors when connectivity is intermittent is unusable. Agents in the field, caretakers on-site, and tenants in low-signal areas all need chat that works offline and syncs reliably when connectivity returns.

Solution

Messages are assigned temp-UUIDs on send and stored in a per-mutation Bloc outbox on the device. On reconnect, the outbox drains in order with server-side idempotency key deduplication preventing double delivery. Optimistic UI shows messages immediately; delivered/failed status updates on sync.

Problem 06
Tenant + Caretaker Operations Workspace

Tenant and caretaker operations have no digital home - lease management, rent tracking, maintenance requests, and property inspections are handled through paper, WhatsApp, and phone calls. Caretakers have no structured workflow for maintenance triage, no way to upload inspection photos, and no PDF inspection report generation. Tenants have no rent dashboard or maintenance tracking.

Solution

Tenants have a lease dashboard, rent history, and maintenance request tracker. Caretakers receive FCM push notifications for new requests, triage them across four severity tiers, upload inspection photos to Cloudinary, and generate branded PDF inspection reports via ReportLab/WeasyPrint - all from one workspace.

Problem 07
Bilingual EN/SW + M-Pesa & Stripe Payments

African payment methods are excluded from most SaaS tools - Stripe card billing works for the minority of East African users with international cards. The majority pay via M-Pesa and mobile money. Any platform that does not natively support Startbutton or equivalent M-Pesa API integration is inaccessible to the primary payment method of the market.

Solution

Approximately 1,900 localized strings with compile-time i18n safety on Flutter (ARB files) and react-i18next on web. One-tap language switching with no restart. Subscription billing via Stripe for card payments and Startbutton API for M-Pesa and African mobile money, with per-role plan configuration.

Ecosystem

The Platform Modules - Five Roles, Three Surfaces, One Backend

01
AI Butler Co-Pilot

Streaming OpenAI GPT-4o assistant present on every screen. Compares properties in markdown tables, suggests lawyers/valuers as one-tap action cards, drafts buyer questionnaires, and answers rent/maintenance questions in EN & SW. PydanticAI validates all structured card outputs.

OpenAI GPT-4oPydanticAIWebSocket streamingsherpa-ONNX speech-to-text
02
Listing Intake & Management

Agents create structured listings with photos (Cloudinary), location (PostGIS point), price, property type, and amenity tags. Listings are indexed into OpenSearch on creation for instant search availability. Bulk listing import via CSV for agency onboarding.

FastAPIPostgreSQL + PostGISOpenSearchCloudinaryCelery
03
Geo-Indexed Search

Buyers search 300+ live listings on a clustered Mapbox/Leaflet map with 10 km radius filters, price range sliders, property-type and amenity facets. Sub-300ms geo queries via PostGIS spatial index + OpenSearch. AI Butler generates neighbourhood summaries on demand.

PostgreSQL + PostGISOpenSearchMapbox GLFlutter mapsLeaflet
04
9-Milestone Deal Room

Every transaction spins up a realtime Socket.IO workspace with nine sequential milestones, a shared document vault (Cloudinary), a parties tab showing all actors, and a dispute tracker. Milestone state fans out to all parties via Redis pub/sub on every change.

Socket.IORedis pub/subCloudinaryPydanticAIFastAPIFlutter
05
Offline-First Messaging

Chat that survives flaky 3G: messages assigned temp-UUIDs on send, stored in a per-mutation Bloc outbox on-device. On reconnect, outbox drains in order with server-side idempotency-key deduplication. Optimistic UI shows messages immediately with delivered/failed status.

Socket.IOraw WebSocketRedis pub/subflutter_bloc outboxHive
06
Agent Dashboard & CRM

Agents manage listings, track enquiries, monitor deal-room milestones, and view commission pipeline from a single dashboard. Agencies invite team members under one workspace with role-scoped access. Lead-to-deal conversion funnel analytics built in.

React 18TanStack QueryFastAPIPostgreSQLRBAC JWT
07
Buyer Discovery & Shortlist

Buyers search, save, and compare properties from geo-map or list view. AI Butler surfaces comparison tables and suggests next steps. Enquiry flow sends structured intake form to the listing agent and triggers a deal-room invitation on acceptance.

FlutterOpenSearchPostGISFastAPIOpenAI GPT-4oFCM
08
Lawyer & Valuer Portal

Lawyers and valuers are invited to specific deals and join the deal room with a scoped view of documents, milestones, and chat. They upload reports, sign off milestones, and communicate via the deal-room channel. Professional directory searchable by the AI Butler.

FastAPIRBAC JWTSocket.IOCloudinaryFlutter
09
Tenant & Caretaker Ops

Tenants manage leases, view rent history, and submit maintenance requests with photo attachments. Caretakers receive FCM push for new requests, triage across four severity tiers, log work updates, and generate branded PDF inspection reports via ReportLab/WeasyPrint.

FlutterFastAPICloudinaryFCMReportLabWeasyPrintPostgreSQL
10
Payments & Subscriptions

Multi-currency Stripe checkout for card payments and Startbutton API for M-Pesa and African mobile money. Per-role subscription plans (Agent Pro, Agency, Tenant, Caretaker) managed via Stripe Subscriptions. Webhook auto-reconciliation updates plan status within seconds.

StripeStartbutton API (M-Pesa)FastAPI webhooksPostgreSQL
11
Multi-Tenant Auth & RBAC

Keycloak SSO with OAuth2, role-scoped JWTs, and RBAC middleware enforced at FastAPI route level. Agencies are tenants with workspace-scoped data isolation. Five role types with distinct permission sets and dashboard views from one shared Flutter codebase.

Keycloak SSOOAuth2JWTRBACFastAPI middlewareflutter_bloc
12
Bilingual EN/SW i18n

Approximately 1,900 localized strings across web and mobile with compile-time i18n safety on Flutter (ARB files + flutter_localizations) and react-i18next on the web SPA. One-tap language switching with no app restart. AI Butler responds in the active language.

flutter_localizationsARB filesreact-i18nextFastAPI i18n middleware
User Experience

Two surfaces, one rhythm

Web dashboard screenshot
Web screenshot 2
Web screenshot 3
Web screenshot 4
Console features
Agent listing management: create, edit, photo upload, geo-pin, and publish to OpenSearch from a single form
Agency workspace: invite team members, assign listings, and track deal pipelines across all agents
Geo-search admin map with bulk listing status management and OpenSearch re-index controls
Deal-room oversight: full 9-milestone view with document vault, dispute tracker, and party management
Analytics dashboard: listing views, enquiry conversion, deal-stage funnel, and revenue by subscription tier
Subscription and billing management: plan changes, Stripe invoice history, M-Pesa transaction log
Bilingual content management: all listing and notification copy manageable in EN and SW
Key flows

Buyer Discovery Flow

  • Buyer opens map
  • sets 10 km radius filter
  • taps listing cluster
  • views property detail
  • asks Butler to compare with shortlist
  • Butler returns markdown comparison table
  • buyer submits enquiry
  • agent notified via FCM
  • deal room spins up on acceptance

Deal Room Flow

  • Deal room opened
  • all parties joined (agent, buyer, lawyer, valuer)
  • milestone 1 marked active
  • lawyer uploads title search to document vault
  • milestone 2 signed off
  • Socket.IO fans out to all parties
  • dispute raised on milestone 4
  • dispute tracker logs resolution
  • milestone 9: deal closed

Caretaker Maintenance Flow

  • Tenant submits maintenance request with photo
  • FCM push fires to caretaker
  • caretaker opens triage view
  • assigns severity tier (Critical / High / Medium / Low)
  • logs work in progress updates
  • uploads inspection photos to Cloudinary
  • generates branded PDF inspection report
  • tenant and landlord notified on completion

Offline Messaging Flow

  • Agent enters low-signal area
  • types message
  • temp-UUID assigned
  • message shown in chat immediately (optimistic UI)
  • Bloc outbox stores mutation
  • connectivity restored
  • outbox drains in send order
  • server acknowledges with idempotency key
  • temp-UUID swapped for server ID
  • no duplicate delivery
Feature Showcase

A closer look at every screen

tap any screen to zoom
01 · Home
02 · Buying Checklist
03 · Search Map
04 · Search List
05 · Profile
06 · Rent Dashboard
07 · Disputes
08 · Billing
09 · Onboarding role picker
10 · Listings
11 · Lawyer Home
12 · Lawyer leads CRM
Admin Dashboard

The office's command center

Everything back-office in one console — with role-based access drawn as a hard line, not a suggestion.

Admin dashboard
16 back-office capabilities
Agents build a listing once - photos to Cloudinary, a PostGIS geo-pin, then Celery indexes it into OpenSearch and it lands on the buyer map within seconds
Agency workspace: invite team members, assign listings, and follow every agent’s deal pipeline from a single screen
Deal-room oversight with the full nine-milestone tracker, document vault, party list and dispute log
Milestones are sequential on purpose - none can be signed off until the documents it requires are actually in the vault
Geo-search admin map with bulk listing status changes and OpenSearch re-index controls
Analytics on listing views, enquiry conversion, the deal-stage funnel, and revenue split by subscription tier
Subscription and billing management - plan changes, Stripe invoice history and the M-Pesa transaction log side by side
Payments arrive through Stripe Checkout or M-Pesa via Startbutton; both webhooks reconcile the subscription record within seconds
Plan gating is read from the Stripe subscription in the database at the FastAPI middleware - never trusted to the client
Caretaker maintenance queue with four severity tiers, photo evidence, and ReportLab inspection reports
The Butler proposes a severity tier from the request text, and the caretaker can override it before accepting the job
Every listing, notification and interface string is managed in English and Swahili - around 1,900 localized strings, checked at compile time
Tenant records carrying lease details, payment history and the maintenance requests raised against each unit
Role-scoped JWTs put agent, buyer, lawyer, caretaker and tenant on one codebase with five different dashboards
Every Cloudinary upload is signed with a configurable expiry - no public access to listing photos, inspection images or deal-room documents
FCM push on every milestone change, new message, maintenance event and payment confirmation
Roles × permissions matrix
Billing & subscription
Adminhas accessAgency Adminhas accessAgentno accessCaretakerno accessTenantno access
Team & agency settings
Adminhas accessAgency Adminhas accessAgentno accessCaretakerno accessTenantno access
Listings & search index
Adminhas accessAgency Adminhas accessAgenthas accessCaretakerno accessTenantno access
Deal rooms & document vault
Adminhas accessAgency Adminhas accessAgenthas accessCaretakerno accessTenantno access
Analytics & exports
Adminhas accessAgency Adminhas accessAgentno accessCaretakerno accessTenantno access
Maintenance queue
Adminhas accessAgency Adminhas accessAgentno accessCaretakerhas accessTenantno access
Own lease & requests
Adminhas accessAgency Adminhas accessAgenthas accessCaretakerhas accessTenanthas access
AI Assistant · Embedded

Meet the Butler AI

An embedded, streaming co-pilot on the React web SPA and Flutter mobile app. Primary Model: OpenAI GPT-4 / GPT-4o via a PydanticAI routing layer. Speech Input: sherpa-ONNX on-device speech-to-text - no audio leaves the device. Streaming: WebSocket streaming for real-time response rendering on both surfaces. Structured Outputs: PydanticAI validates all card outputs (professionals, comparisons) before UI render. Languages: English (EN) and Swahili (SW) - responds in the user's active language.

  • Compare multiple properties side by side in AI-generated markdown tables with pros/cons and recommended action
  • Surface lawyers, valuers, and professionals as structured one-tap action cards with direct contact options
  • Draft buyer questionnaires tailored to specific property types (residential, commercial, land)
  • Answer rent, lease, and maintenance questions in both English and Swahili
  • Generate AI neighbourhood summaries for any searched area on the geo-map
  • Guide first-time buyers through the 9-milestone deal workflow step by step
  • sherpa-ONNX on-device speech-to-text: voice input processed entirely on the device, no audio sent to servers
  • Streaming WebSocket responses for real-time co-pilot feel on both web and Flutter mobile
  • PydanticAI validates all structured card outputs (professional suggestions, property comparisons) before rendering
  • Context-aware: the Butler reads the current screen context (listing, deal room, lease) before responding
Butler AI
online · ready to draft
Embedded
Compare the three properties in my shortlist and tell me which is better value for a young family in Nairobi - jibu kwa Kiswahili
Draft ready — grounded in similar past jobs:
Line item · materials— · —
Labour— · —
VATauto
Totalcomputed
Who are the best property lawyers for a commercial transfer in Kampala? Show me as cards I can tap to contact
What documents do I need to provide at milestone 3 of the deal room for a freehold title transfer?My tenant in Unit 4B says the water heater is broken - what severity tier should I assign and what is the standard repair timeline?Draft a buyer questionnaire for a 3-bedroom apartment viewing in Dar es Salaam - focus on structural and utilities questions
Architecture

How it all fits together

Three layers, read top to bottom — the applications people use, the services that power them, and the infrastructure they run on.

Layer 1
What people use
Mobile app
Flutter · iOS + Android
Web console
React 18 · Vite
Works offline
Hive local storage
Layer 2
The brains
App server
FastAPI · handles everything
AI co-pilot
PydanticAI · GPT-4o
Geo search
PostGIS + OpenSearch
Realtime chat
Socket.IO + Redis
Payments
Stripe · M-Pesa
Layer 3
Where it runs
Cloud hosting
Docker · Nginx
Media & CDN
Cloudinary
Ships itself
GitHub Actions CI/CD
Business Logic

The rulebook under the hood

Rules · the ledger
§1
All five roles (agent, buyer, lawyer/valuer, caretaker, tenant) share one Flutter codebase and one FastAPI backend; role-scoped JWT determines dashboard and data access at both API middleware and UI level
§2
Listings must be geo-tagged with a PostGIS point on creation; without a location they cannot be indexed into OpenSearch or appear on the map search
§3
A deal room is created only when an agent accepts a buyer enquiry; the room auto-populates with the listing agent, the buyer, and a default 9-milestone sequence
§4
Milestone progression is sequential
a milestone cannot be marked complete until all required documents for that milestone are present in the document vault
§5
Offline messages are assigned a temp-UUID on the device and stored in the Bloc outbox; the server accepts them only with an idempotency key to prevent duplicate delivery on reconnect-drain
§6
Maintenance requests are auto-assigned a severity tier (Critical/High/Medium/Low) by the AI Butler based on description keywords; caretakers can override before accepting
§7
Subscription plan gating is enforced at the FastAPI middleware level by reading the Stripe subscription status from the database - no client-side plan checks
§8
All Cloudinary uploads use signed URLs with configurable expiry; no unsigned public access to listing photos, inspection images, or deal-room documents
Workflows · pipelines
Listing Intake Workflow6 steps
1Agent creates listing2photos uploaded to Cloudinary3location geo-tagged as PostGIS point4listing saved to PostgreSQL5Celery task indexes into OpenSearch6listing appears on buyer map within seconds
Buyer Enquiry to Deal Room Workflow9 steps
1Buyer submits enquiry2structured intake form stored3agent receives FCM push4agent reviews and accepts5deal room created69 milestones initialized7lawyer and valuer invited8Socket.IO channel opened9all parties joined and notified
Maintenance Request Workflow8 steps
1Tenant submits request with description and photo2AI Butler suggests severity tier3FCM push fires to caretaker4caretaker triages and accepts5work-in-progress updates logged6completion photos uploaded to Cloudinary7PDF inspection report generated by ReportLab8tenant and agent notified
Payment & Subscription Workflow6 steps
1User selects plan2Stripe Checkout (card) or Startbutton (M-Pesa) payment initiated3payment webhook received by FastAPI4subscription record updated in PostgreSQL5role-scoped feature gates unlocked within seconds6confirmation email via SendGrid
Automations · trigger → action
Celery task auto-indexes new and updated listings into OpenSearch within seconds of save
FCM push notification fires on every deal-room milestone update, new message, maintenance event, and payment confirmation
AI Butler auto-generates a neighbourhood summary for any searched area the first time it is queried, cached in Redis for subsequent requests
Stripe and Startbutton webhook handlers auto-reconcile subscription status and payment records within seconds of payment event
Offline outbox drain fires automatically on Socket.IO reconnect, processing queued messages in send order with idempotency-key dedup
Celery Beat sends lease renewal reminders to tenants and agents at configurable intervals before lease expiry
Features

Everything inside

11 capability groups, laid out as an uneven mosaic — not a wall of identical cards.

01AI Butler Co-Pilot (EN/SW)
Streaming GPT-4o assistant on every screen via WebSocket - responds in the user's active language
Property comparison tables, professional suggestion cards, and buyer questionnaire drafts
sherpa-ONNX on-device speech-to-text: voice input processed on the device, no audio leaves the phone
Neighbourhood AI summaries for any searched area on the geo-map
PydanticAI validates all structured card outputs before UI render
02Geo-Indexed Property Search
300+ listings on a clustered Mapbox/Leaflet geo-map with 10 km radius filter
Sub-300ms geo queries via PostGIS GIST spatial index + OpenSearch geo_distance
Price range, property type, bedroom count, and amenity facets
AI-generated neighbourhood summaries on demand
Save-to-shortlist and side-by-side comparison from map or list view
03Listing Intake & Agent CRM
Structured listing creation with Cloudinary photo upload, PostGIS geo-tag, and OpenSearch auto-index
Enquiry pipeline with lead-to-deal conversion tracking
Agency workspace with team invitation, listing assignment, and deal oversight
Bulk listing import via CSV for agency onboarding
Listing performance analytics: views, enquiry rate, and time-to-deal
049-Milestone Multi-Party Deal Room
Deal room spins up on agent acceptance of buyer enquiry with parties auto-populated
Nine sequential milestones with document-vault requirements gating progression
Shared document vault via Cloudinary with role-scoped access
Dispute tracker: raise, log, and resolve disputes inline in the deal room
Realtime milestone fan-out via Socket.IO + Redis pub/sub to all parties
05Offline-First Messaging
Temp-UUID optimistic UI: messages shown instantly on send regardless of connectivity
Per-mutation Bloc outbox: unsent messages stored in Hive local store on device
Reconnect-drain: outbox processes in order on Socket.IO reconnect
Server-side idempotency-key deduplication prevents double delivery
Raw WebSocket fallback for environments where Socket.IO is blocked
06Tenant Dashboard
Current lease details: property, landlord, start/end dates, monthly rent
Rent payment history with M-Pesa and Stripe transaction records
Maintenance request submission with photo attachment and status tracking
AI Butler answers lease and rent questions in EN/SW
FCM push notifications for payment reminders and maintenance updates
07Caretaker Operations
FCM push on new maintenance request with property and tenant details
4-tier severity triage: Critical / High / Medium / Low with AI-suggested initial tier
Work-in-progress logging with time stamps and photo uploads to Cloudinary
Branded PDF inspection report generation via ReportLab/WeasyPrint
Caretaker schedule view: all active and upcoming maintenance assignments
08Lawyer & Valuer Portal
Invited to specific deals via deal-room parties tab with scoped JWT access
Document upload to deal-room vault: title deeds, valuation reports, legal opinions
Milestone sign-off: lawyers and valuers confirm completion of their milestone responsibilities
Searchable professional directory: buyers and agents can find lawyers/valuers via AI Butler
Deal-room chat participation with full offline-first messaging support
09Bilingual EN/SW i18n
Approximately 1,900 localized strings across web (react-i18next) and mobile (ARB + flutter_localizations)
Compile-time i18n safety on Flutter: missing keys caught at build time, not runtime
One-tap language switching on mobile and web with no app restart required
AI Butler detects active language and responds in EN or SW accordingly
All notification copy (FCM, SendGrid) rendered in user's preferred language
10Payments & Subscriptions
Stripe Checkout and Subscriptions for card billing with webhook auto-reconciliation
Startbutton API integration for M-Pesa and African mobile-money payments
Per-role subscription plans: Agent Pro, Agency, Tenant, Caretaker
Stripe Connect for agent commission payouts on completed deals
PostgreSQL ledger tracking all payment events, subscription changes, and refunds
11Multi-Tenant RBAC & Auth
Keycloak SSO with OAuth2 and role-scoped JWT enforced at FastAPI middleware
Agency-scoped workspace isolation: team members see only their agency's data
Five role types with distinct permission sets and tailored dashboard views
Passkey (FIDO2/WebAuthn) and biometric login on Flutter mobile
Full audit logging on sensitive operations: deal-room actions, payment events, role changes
Tech Stack Implementation

Built with a modern AI stack

Mobile App (Flutter)
  • Flutter + Dart - iOS, Android and Web
  • flutter_bloc + GetIt - state management and DI
  • Material 3 - design system
  • Hive - offline local store
  • flutter_localizations + ARB - EN / SW bilingual
  • flutter_map + Mapbox - property maps
  • sherpa-ONNX - on-device speech-to-text
  • flutter_secure_storage - secure device storage
Web Console (React)
  • React 18 + TypeScript + Vite - agent console
  • TanStack Query - data fetching and caching
  • TailwindCSS - styling
  • Mapbox GL - geo-search maps
  • react-i18next - EN / SW interface
  • Socket.IO client - realtime deal room
  • dnd-kit - drag-and-drop workflows
  • Stripe Checkout - browser payments
Backend (FastAPI)
  • FastAPI (Python) - async API with uvicorn + gunicorn
  • Pydantic v2 - typed schemas and validation
  • async SQLAlchemy + asyncpg + Alembic - ORM and migrations
  • Celery + Redis - background jobs
  • REST + WebSocket - sync and realtime transport
AI Engine
  • OpenAI GPT-4 / GPT-4o - Butler co-pilot
  • PydanticAI - structured card outputs and routing
  • sherpa-ONNX - on-device speech recognition
  • WebSocket streaming - token-by-token responses
Geo & Search
  • PostgreSQL + PostGIS - GIST spatial index
  • OpenSearch - full-text and geo_distance filters
  • Mapbox GL - clustered listing maps on web
  • flutter_map + Leaflet - maps on mobile
Realtime & Messaging
  • Socket.IO server + Redis pub/sub - multi-instance fan-out
  • Raw WebSocket fallback - flaky-network resilience
  • Bloc offline outbox - messages queue on the device
  • Idempotency-key deduplication - no double sends
  • Firebase Cloud Messaging - push notifications
Database
  • PostgreSQL + PostGIS - primary store and spatial index
  • OpenSearch - search index
  • Redis 7 - Celery broker and Socket.IO pub/sub
  • Hive - mobile local store
Auth & Multi-Tenancy
  • Keycloak SSO - OAuth2 identity provider
  • Role-scoped JWT - per-role access tokens
  • RBAC middleware - enforced in FastAPI
  • FIDO2 / WebAuthn passkeys - passwordless login
  • Argon2 - password hashing
Payments
  • Stripe Checkout + Subscriptions + webhooks - card billing
  • Startbutton API - M-Pesa mobile money
  • Multi-currency support - local and international
Storage & CDN
  • Cloudinary - listing photos, inspection images and documents
  • Signed uploads - direct-to-CDN with access control
DevOps & Infrastructure
  • Docker - containerised builds
  • GitHub Actions - CI/CD
  • Nginx - reverse proxy
Results & Value

What actually changed

01
Three Surfaces, Zero API Drift, ~40% Faster Features
02
🤖
AI Embedded Deep, Not Bolted On
03
🌍
Built for Emerging Markets, Not Retrofitted
04
📍
Sub-300ms Geo-Search at Scale
05
🤝
Multi-Party Deal Room Replaces WhatsApp + Spreadsheets
06
💬
Production Realtime Under Packet Loss
07
💳
African Payments as a First-Class Feature
Key achievements

Engineering outcomes beneath the headline numbers.

A1Shipped five distinct roles (agent, buyer, lawyer/valuer, caretaker, tenant) from one Flutter codebase and one FastAPI backend with role-scoped JWT and RBAC - zero code duplication across roles
A2PostGIS + OpenSearch geo-search delivers sub-300ms map queries over 300+ listings and is architected for 10x volume without infrastructure changes
A39-milestone multi-party deal room with realtime Socket.IO sync replaces fragmented WhatsApp, email, and spreadsheet coordination for the full transaction lifecycle
A4Offline-first Bloc outbox with temp-UUID optimistic UI, reconnect-drain deduplication, and idempotency-key dedup - chat works reliably on flaky 3G across East Africa
A5Streaming OpenAI Butler in EN/SW with sherpa-ONNX on-device speech, PydanticAI structured card outputs, and context-aware screen reading
A6Bilingual EN/SW with ~1,900 localized strings and compile-time ARB i18n safety on Flutter - zero runtime i18n key errors
A7Startbutton M-Pesa + Stripe card billing as co-equal first-class payment methods with per-role subscription plans and webhook auto-reconciliation
A8Event-driven FastAPI core powering three surfaces - ~40% faster feature development, no API drift across React SPA, Flutter mobile, and AI chat

See it in action

The platform is live — browse the site, poke the demo, or install the app.