A twenty four unit development, and the only photographs available were the ones the agencies had put on the portal. Every one of them was 591 pixels wide, taken on a phone, in a room with a bare floor, a half drawn curtain and a cable across the skirting. A buyer scrolling a listing at nine at night decides in about a second, and those photographs were losing the decision before anybody read the price.
Mortgage count from the Centre for Affordable Housing Finance in Africa's 2024 yearbook. Household count from the 2022 national census. The agent register was counted from the Estate Agents Council's own published list of approved agents, 26 August 2026. Internet penetration is the regulator's Q4 2025 figure. Roughly one mortgage per 780 households is what makes this a cash market, and a cash buyer decides on what they can see.
A pipeline that reads a listing, scores every photograph on it, enhances the ones worth enhancing, and labels every result as enhanced. Claude's vision scores each image out of ten on room type, lighting and composition, and names what is actually wrong with it: the toilet lid is open, there are wires around the television, the window is blown out. Those named faults become the instruction for the enhancement, so each photograph gets its own prompt rather than a filter.
The original photograph is passed to the model as a reference on every call, and every prompt carries the instruction that the result must be a photograph rather than a rendering. What comes back is the same room, the same walls, the same window and the same floor, lit properly, with the clutter gone.
Nothing publishes on its own. Each photograph carries an approval that starts as unset, and a person sets it. The productised version of this runs live with that gate built into the database rather than into the interface, so it cannot be skipped by a different screen.
A pair of lessons learned the hard way and written down so nobody relearns them. The word watermark cannot appear in a prompt: the model reads it as a request to infringe copyright and returns text instead of an image. And a generation call without an explicit size setting returns something soft at about a fifth of the file size, which looks fine on a phone and falls apart on a laptop.
Every stage below runs on the photographs an agency already has. Nothing is reshot, and nothing is invented.
| Attribute | Value |
|---|---|
| Photographs found | 59 |
| Width, every one | 591 px |
| Sources | Four agencies |
| Usable as a hero image | None |
The scraper pulls the listing and everything attached to it. On the development this was built for, that meant 59 photographs across four competing agencies, every one of them 591 pixels wide.
That width is the whole problem stated as a number. It is a picture taken for a portal thumbnail, being asked to sell a house.
| Room | Score | What is wrong |
|---|---|---|
| Open plan living | 3/10 | Watermark across the centre |
| Hallway | 4/10 | Too dark to read the space |
| Bedroom | 6/10 | Bed unmade, cable on the floor |
| Kitchen | 7/10 | Blown-out window, lid up |
Every photograph is scored out of ten on room type, lighting and composition, and the score comes with the actual fault written out.
The faults are what make the next stage work. A three out of ten with the note that a watermark sits across the middle of an open plan shot needs something different from a four out of ten in a dim hallway.
Same room, same walls, same window, same floor material. Light it evenly as if late afternoon. Open the curtain. Remove the cable along the skirting and the bin. Make the bed. Add a rug and a bedside lamp. Realistic, NOT a rendering. // The original photograph is attached as a reference on // every call. The word 'watermark' is never used: the // model reads it as a copyright request and returns text.
Each photograph gets its own written prompt, built from what the score found. Not a preset, and not a filter applied to everything.
The original is passed to the model alongside the prompt as a reference, so the output is anchored to the room that exists rather than to the model's idea of a room.
Every enhanced photograph carries a visible label on the page saying it was enhanced, alongside a short note of what was changed.
That is not a compliance gesture. It is the thing that lets the enhancement be worth doing at all: a buyer who knows the room was lit and tidied is being helped, and a buyer who finds out later has been misled.
Approval starts unset on every photograph and a person sets it. In the productised version the gate is enforced by the database rather than the interface, so a different screen cannot get around it.
On the development this was built for, 23 photographs were scored and enhanced and 15 went on the page. The other eight were not good enough after enhancement, which is the gate doing its job.
The agency walked into a meeting with a set of listing photographs, a set of lifestyle films and a set of channel-ready posts for one development, produced from photographs that were already public and cost nothing to obtain. The productised version of the pipeline now runs as a service, with the approval gate and the labelling built in rather than remembered.
Every figure is counted from the files. The originals are 591 by 443 pixels without exception, which is what the portal serves. One image in the delivered set changes a floor material while staging a room, which is on the project's own banned list; it is disclosed on the page it appears on and it is recorded here as a defect rather than presented as an example.
This page once carried claims that described the work inaccurately. They came down in an audit of our own copy, and each one went back up only when its numbers could be traced to something measured. A case study you cannot check is worth nothing to you, and one that turns out to be wrong costs us more than it ever earned.