Case Study

Property
News Namibia

Namibia's leading property portal. Thousands of listings from multiple providers, served from the cloud with zero servers to manage. Here's how we built it and why every decision matters.

Future Media
Namibia
Laravel + AWS
Scroll to explore
The Problem

Namibia needed a modern property portal that could pull listings from multiple data providers and present them beautifully.

Property data in Southern Africa doesn't come from one place. Agencies use different platforms — some are on Propdata, others on Entegral, and they all expect their listings to show up correctly, with the right photos, the right agent, and the right contact details.

We built Property News to solve this: a platform that ingests data from multiple providers, normalises it into a single system, and serves it through a fast, searchable website — all without us ever managing a single server.

The Infrastructure

This entire platform runs without a single server.

Traditional web apps sit on a server that's always running, always costing money, whether anyone's using the site or not. At 3am when nobody's browsing? Still paying. Traffic spikes because a listing went viral? Hope the server can handle it.

Property News takes a completely different approach. We use Laravel Vapor to deploy the entire application to AWS Lambda — Amazon's serverless computing platform. Instead of a server waiting for requests, the code only runs when someone actually visits the site. AWS spins up a tiny container, handles the request, and shuts it down. You only pay for what you use.

And here's the best part: if a thousand people hit the site at the same time, AWS just spins up a thousand containers. It scales infinitely, automatically, with zero intervention. No capacity planning, no load balancers to configure, no 2am alerts about CPU usage.

Cape Town Region

Deployed to Africa

The app runs in AWS's Cape Town region - the closest AWS region to Namibia. This means pages load fast because the data doesn't have to travel halfway around the world.

CloudFront CDN

Edge Computing

CloudFront sits in front of everything - images, CSS, JavaScript - cached at edge locations across the globe. When someone loads a property listing, the heavy assets are already waiting nearby.

AWS WAF Enabled

Protected at the Edge

AWS WAF (Web Application Firewall) blocks malicious traffic before it even reaches the application. Bot detection, rate limiting, and threat mitigation all happen automatically.

Laravel Vapor

One-Command Deploys

Deploying a new version of the site is literally one command: vapor deploy production. Vapor handles building assets, uploading code, swapping the Lambda function, and invalidating caches. Zero downtime, every time.

Graviton ARM64

ARM-Powered

The Lambda functions run on AWS Graviton (ARM64) processors - they're cheaper and faster than traditional x86 instances. Better performance at lower cost. It's a no-brainer.

Secure Uploads

Files Go Straight to S3

When agents upload photos, the files go directly from their browser to AWS S3 using presigned URLs. The Lambda function never touches the file - it just signs a permission slip and gets out of the way.

The Images

Every image is resized on the fly. Agent photos use AI face detection.

A property portal serves thousands of images — property photos, agent headshots, agency logos, advert banners. You can't just dump the original 4000x3000 photo from someone's phone and hope for the best. But you also can't manually resize every image for every context — a thumbnail needs different dimensions than a hero image.

So we built something better. When any image is requested, it passes through an edge function sitting on CloudFront. The function reads the dimensions from the URL, resizes the image on the fly using Sharp.js, caches the result, and serves it. First request does the work, every request after that hits the cache. The original image is never modified.

On-the-fly resizing

Need a 720x480 thumbnail for a property card? Just add ?w=720&h=480 to the image URL. Need a 1600x900 version for the gallery? Change the parameters. The same source image serves every size you'll ever need.

The Lambda function runs on 1536MB of memory with a 30-second timeout — more than enough to resize even large images. Results are cached in S3 with a one-year TTL, so each unique dimension is only ever generated once.

If anything goes wrong — corrupted image, timeout, anything — the function gracefully falls back to serving the original unresized image. Better a big image than a broken one.

AI-powered face centering

Here's the problem with agent photos: people don't upload perfectly framed headshots. They send full-body shots, group photos cropped badly, or landscape images where they're standing off to the side. A standard center-crop turns those into a photo of someone's chest.

When an agent avatar is requested with ?facedetect=true, the Lambda function sends the image to AWS Rekognition — Amazon's computer vision AI. Rekognition finds the face, returns a bounding box, and the function crops around the face with a 2x buffer zone for natural framing before resizing to the final dimensions.

The result? Every agent photo is perfectly centred on their face, regardless of how badly the original was framed. And it's all automatic — no manual cropping, no intervention needed.

image-pipeline
# Property card thumbnail
cdn.cloudfront.net/property-hero.jpg?w=720&h=480
# Full gallery image
cdn.cloudfront.net/property-hero.jpg?w=1600&h=900
# Agent avatar with face detection
cdn.cloudfront.net/agents/john-smith.jpg?w=160&h=160&facedetect=true
# What happens behind the scenes:
CloudFront → Edge function intercepts request
Check S3 cache → miss → fetch original
facedetect=true? → AWS Rekognition → find face
Crop around face (2x buffer) → Sharp.js resize
Store in S3 cache (TTL: 1 year) → serve
Next request → served from cache instantly
The Data

Two providers. Thousands of listings. One seamless experience.

Here's where it gets interesting. Property News doesn't have its own listings — it aggregates data from Propdata and Entegral, two of Southern Africa's biggest property data platforms. Each has their own API, their own data format, their own way of doing things.

We built two custom Laravel packages that talk to these APIs, fetch all the listings, and normalise them into a single unified format. A house listed on Propdata looks exactly like a house listed on Entegral. Same search, same filters, same experience for the user.

How the sync actually works

When the sync runs, it doesn't just blindly download everything. It hashes each property's data and compares it to what we already have. If nothing changed? Skip it. No wasted processing, no unnecessary database writes.

Properties that have changed get dispatched as individual jobs onto dedicated queues — separate queues for listings, properties, agents, and images. This means photo processing doesn't block property updates, and a slow image download doesn't hold up the entire pipeline.

Each property also has a 5-hour cooldown. If a sync runs every hour, a property that was just updated won't be re-processed unnecessarily. Smart throttling that keeps costs down and performance up.

The clever bits

Auto-creates locations — when a new suburb appears in the feed, the system automatically creates it and links it to the correct town. No manual data entry.

Agent stub linking — when properties come in with agent info, placeholder accounts are created. Agents can later claim their profile and manage their own listings.

Stale listing cleanup — if a property disappears from the provider feed, it gets automatically deactivated. No ghost listings hanging around.

Photo pipeline — images are downloaded from the provider, uploaded to S3, and served through CloudFront. Gallery ordering is preserved so the hero shot is always first.

property-sync
$ artisan propdata-sync-api:sync
Fetching residential listings... 847 found
Fetching commercial listings... 124 found
Fetching holiday listings... 56 found
> 623 unchanged (hash match) — skipped
> 404 updated — dispatched to queue
> 2,340 photos processing on 4 parallel queues
> 12 stale listings deactivated
✓ Sync complete in 45s
$
The Framework

Built with Laravel because nothing else comes close.

Laravel isn't just a framework — it's an entire ecosystem. The queue system that powers the data pipeline? Built in. The authentication for agents and admins? Built in. The notification system that emails agents when they get enquiries? Built in. We're not stitching together a dozen different libraries and hoping they play nice — it all works together because it was designed to.

And because we're on the latest Laravel — we get the newest features, the best performance, and long-term support.

Livewire

63 Components

The entire frontend is reactive without a single line of React or Vue. Search filters update in real-time, forms validate as you type, admin dashboards refresh without page loads. 63 Livewire components power everything from property search to the full admin panel.

Tailwind CSS

Utility-First

Every pixel is styled with utility classes. No bloated CSS files, no unused styles. The design system uses a custom brand palette and a component library for the admin dashboard — consistent, polished, and fully responsive.

Interactive UI

Lightweight

For the interactions that need to feel instant — keyboard-navigable location selectors, price formatting as you type, multi-select dropdowns with search. Small, fast, and designed to make every click feel responsive.

Job Queues

Async Everything

The sync pipeline, image processing, email notifications, cleanup tasks - they all run in the background on dedicated queues. The user never waits for a sync to finish or a photo to upload. Everything is async.

Full Audit Trail

Audit Logging

Every change to a property, user, agency, or advert is logged. Who changed what, when, and what the old value was. When you're managing third-party data at scale, accountability isn't optional.

Role-Based Access

Permissions

Admins see everything. Agents see their own listings and analytics. The public sees the search. Three different experiences, one codebase, powered by a role-based permission system.

The Experience

It's not just a listing site. It's a full platform.

Property News isn't a brochure with a search bar. It's a living platform with advertising, analytics, agent management, a magazine, and a smart search that actually helps people find homes.

Search that actually works

Filter by location, price, bedrooms, bathrooms, parking, plot size, property features - and every combination updates instantly without a page reload. URLs update as you filter, so you can share a search with someone and they'll see exactly what you see. It's powered by a single Livewire component that handles all the state, pagination, and query string sync.

Fair advertising system

Advertisers pay for placement, so we built a rotation system that's actually fair. It tracks when each ad was last shown and distributes impressions evenly. Different placement modes let advertisers pin to specific spots or enter a random rotation. Every impression and click is tracked with full analytics - advertisers can see exactly what they're getting.

Built-in bug reporter

When something looks off, users can click a button and report it. The system captures a full DOM snapshot of the page - with all the CSS inlined - plus browser info, screen size, and an optional screenshot. Everything gets uploaded to S3 and errors are piped to Slack in real-time. We often know about issues before users finish typing their description.

Agent ecosystem

Agents aren't just names on a listing. They get their own dashboard where they can manage their properties, view analytics on how their listings perform, and update their profiles. The agent finder lets house-hunters search by location and language. It's a two-sided platform - useful for buyers and agents alike.

Digital magazine

Property News publishes a digital magazine - and the entire archive is browsable on the site with view tracking. Pair that with automated newsletter subscriptions, and you've got a content platform built right into the property portal.

Under the Hood

The full tech stack

Laravel
Livewire
PHP
Tailwind CSS
MySQL
REST API
Serverless
CDN
Automated Testing
Responsive Design
Laravel
Livewire
PHP
Tailwind CSS
MySQL
REST API
Serverless
CDN
Automated Testing
Responsive Design
AWS Lambda
CloudFront
S3
SQS
RDS
Laravel Vapor
Email Delivery
Newsletter
Permissions
Audit Logging
AWS Lambda
CloudFront
S3
SQS
RDS
Laravel Vapor
Email Delivery
Newsletter
Permissions
Audit Logging

Want something like this?

We build platforms that scale, integrate with real-world data, and just work. Let's talk about yours.