Building LandIS: A Multi-Tenant Land Information System for Ghana
Customary land in Ghana is still administered largely on paper. The fallout is real: the Supreme Court once documented 13 registered "sellers" for a single plot. Add lost or forged documents, boundary disputes with no authoritative record, and untracked ground rents, and you have a system crying out for digitization — which the Land Act 2020 (Act 1036) now mandates through Customary Land Secretariats.
LandIS is my answer: a multi-tenant, web-based Land Information System where each traditional council runs as an isolated tenant — its own branding, domain and data — on a single shared deployment.
What it does
- Interactive geospatial mapping of parcels with overlap / double-allocation detection
- Ownership chains and full transfer history
- Document management, payments and revenue tracking with receipts
- A complete audit trail, SMS & email notifications, and a per-council public portal
- Backup and offline sync for low-connectivity environments
Architecture
The backend is Django + Django REST Framework, using DRF-GIS over PostGIS for geospatial queries, JWT auth and Celery for async work. The frontend is Next.js 15 / React 19 / TypeScript with Leaflet for the maps.
The feature that earns its keep is overlap detection — PostGIS makes it almost trivial to stop the same plot being allocated twice:
overlaps = Parcel.objects.filter(
geometry__intersects=new_parcel.geometry,
).exclude(pk=new_parcel.pk)
if overlaps.exists():
raise ValidationError("This boundary overlaps an existing parcel.")
Why it matters
Zero double-allocations, transparent records, Land Act 2020 compliance, and searches that take seconds instead of months.
It's in active development — you can see the platform at lis.joetib.com.
// keep reading
We're Getting Married! #OtiWedsSwabra
Stepping away from the keyboard for the most important commit of my life — Joseph weds Swabra on 27 June 2026 in Kintampo, Ghana.
Building Real-Time Voice Agents with LiveKit and aiortc
How I wired up low-latency voice conversations between users and LLM-powered agents using LiveKit, coturn and aiortc.