Case study
Listing Launch.
A tool that takes a real-estate listing from the moment an agent wins it to the moment it’s live online, without the agent losing control of what goes public. The AI does the grunt work: copy, hero photo, compliance check. The agent approves every word before anything publishes. Show the human. Don’t auto-send.
Problem
The gap between won and live is where deals die.
I shoot real estate on the side, so I live in the gap between an agent winning a listing and that listing going live: writing the copy, picking the hero photo, getting it into the MLS, the shared database every listing site pulls from. Days go by. On a fast market, days are deals.
The obvious fix is a chatbot that writes the listing and posts it. That fix is a liability. Real-estate copy is legally regulated, and the agent’s license is on every word. So I designed a tool that does the grunt work and keeps the agent in control of the one thing they can’t outsource.
The flow, and the calls behind it
Four stages. Every consequential call stays human.
The flow has four stages: capture the property facts, shoot the photos, draft the listing, then push it out to the listing sites. I designed the whole flow and went deepest where the risk lives: the draft. Each screen below carries the design decision it embodies.

Stage 1 · Intake
Capture the facts once.
The agent enters the property facts and books the photo shoot in one step. Beds, baths, square footage, year built, shoot notes. These are not just form fields. They become the exact sources the AI drafts from, and cites, later.
Stage 2 · Shoot
The agent picks the set.
Twelve photos come back and the agent picks the eight that sell the home. Later, the AI suggests a hero shot from this set. Here it picked the renovated kitchen over the front of the house, because the kitchen is what sells this home. It is marked as a suggestion the agent can override in one tap. The machine has an opinion. The agent has the final say.


Stage 3 · DraftBuilt in React
The AI drafts. It never publishes.
The easy version auto-posts the listing. That is a lawsuit waiting to happen, with the agent's license on every word. So the AI drafts the copy, leads with a confidence score and the exact inputs it drafted from, and hands every decision back. The status reads “Not published” the entire time, on purpose. Trust comes from visible evidence, not a confident tone.
Try the working version belowStage 4 · Syndicate
One approval pushes everywhere.
After the agent approves, one action pushes the listing to the MLS and the portal sites, with per-channel status they can watch land. Nothing goes out until a human made the call. That is the whole point.

The key interaction, live
The publish gate unlocks.
This is the working prototype, not a mockup. Publish stays disabled until the fair-housing flag is handled. Resolve it, approve the listing, and watch it go live on every channel. Try the whole loop.
Hero photo · AI suggested the kitchen
Listing description
Bright, family-friendly home close to parks and schools. The 2019 build lives like new.
Fair-housing review needed
“family-friendly” can read as describing the buyer, not the home.
TL;DR
At a glance
A self-directed concept, fully anonymized. No real listing, agent, or property. The point of the project is how the interaction behaves, so I built that stage in working code instead of mocking it.
- Flow designed
- 4 stageswon to live, end to end
- Stage built live
- Draft reviewReact, runs in the browser
- Compliance model
- Human-decidedflag the risk, don't auto-fix
The hardest call, in depth
Show the risk where the words live.
The fair-housing flag was the hardest call. Language that describes the buyer instead of the home, like “family-friendly” or “perfect for a young couple,” can read as steering under the Fair Housing Act. That is real legal exposure, and it is legally the agent’s call to make. There were three ways to surface a risky phrase. Only one keeps the decision with the agent.
Hides a decision that is legally the agent's to make. The agent learns nothing and can't defend a word they never knew changed.
Correct, but disconnected. The agent reads the warning far from the phrase it's actually about.
Underline the phrase in place. The risk lives where the words live. Apply the rewrite, or keep it and own the call.
Listing description
Bright, family-friendly home close to parks and schools.
Fair-housing review needed
Flagged phrase: “family-friendly”
Listing description
Bright, family-friendly home close to parks and schools.
Fair-housing review needed
Flagged phrase is underlined above ↑
Design system
The system behind the card.
Trust-blue for the accent, deliberately not Realtor.com red. Green for confidence, amber for compliance risk, and a tight neutral ramp. Every component in the flow is built from these tokens.
Color tokens
Trust · accent
- trust-50#eef4fb
- trust-100#d9e6f6
- trust-500#2f6fb0
- trust-600#235a93
- trust-700#1c4874
Confidence
- good-50#eaf6ef
- good-500#2e9e5b
- good-700#1f6f40
Compliance flag
- flag-50#fdf4e7
- flag-100#fbe8cd
- flag-500#d68a1e
- flag-700#9a6212
Neutral
- ink#16202b
- muted#5b6976
- line#e3e8ee
- surface#ffffff
- canvas#f4f6f9
Components
Fair-housing review needed
Validation
How I'd prove it works.
This is a concept, so I have no shipped metrics, and I won’t invent any. But I don’t ship trust patterns on faith. Here’s how I’d validate it.
Instrument the gate.
Track how often agents override the AI's copy, its hero pick, and its compliance flag. High override on the flag means the detector is too noisy. Near-zero override on copy means agents are rubber-stamping, which is its own kind of risk.
Build a labeled set for the detector.
Hand-label real listings for fair-housing risk, run the detector against them, measure precision and recall. That's exactly how I validated the qualifier in Lead Response Loop to 96% on a labeled set. A flag that cries wolf gets ignored, and an ignored safety feature is worse than none.
Measure the real outcome.
Time from won to live, before and after. That's the number an agent actually feels.