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.
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.

Seven problems, seven pivots
Every challenge on the left became a shipped capability on the right.
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.
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%.
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.
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.
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.
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.
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.
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.
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.
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.
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.
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.
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.
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.
The Platform Modules - Five Roles, Three Surfaces, One Backend
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.
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.
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.
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.
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.
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.
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.
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.
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.
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.
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.
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.
Two surfaces, one rhythm




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
A closer look at every screen
The office's command center
Everything back-office in one console — with role-based access drawn as a hard line, not a suggestion.

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

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.
The rulebook under the hood
Everything inside
11 capability groups, laid out as an uneven mosaic — not a wall of identical cards.
Built with a modern AI stack
- 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
- 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
- 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
- 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
- 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
- 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
- PostgreSQL + PostGIS - primary store and spatial index
- OpenSearch - search index
- Redis 7 - Celery broker and Socket.IO pub/sub
- Hive - mobile local store
- 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
- Stripe Checkout + Subscriptions + webhooks - card billing
- Startbutton API - M-Pesa mobile money
- Multi-currency support - local and international
- Cloudinary - listing photos, inspection images and documents
- Signed uploads - direct-to-CDN with access control
- Docker - containerised builds
- GitHub Actions - CI/CD
- Nginx - reverse proxy
What actually changed
Engineering outcomes beneath the headline numbers.
See it in action
The platform is live — browse the site, poke the demo, or install the app.





