Estate agents no longer answer the same five questions about a property, because the tour answers them itself.
There are four bedrooms across the two floors, each with its own bathroom. Ask me about any of them and I can be more specific.
Asked out loud, answered from the property's own file.
The situation
How this used to work
A 3D property tour is a good way to look around and a bad way to ask anything. You can walk through every room and still not know how many bedrooms there are, when it was built, or whether the thing you are standing in front of is included.
The questions are always the same handful, they arrive at whatever hour somebody is browsing, and the answers all exist already. They are just sitting in a listing document that the person in the tour is not reading.
So the choice was between a person being available to answer the same five questions forever, and the tour being able to answer them itself.
What we built
The system
A chat panel that lives inside the tour, injected into the page rather than bolted onto the side of it. It sits alongside the 3D viewer rather than inside it, which is the detail that makes the rest possible: from there it can reach the microphone and call out to its own service, neither of which it could do from inside the embedded viewer.
It listens as well as reads. The visitor can type, or press the microphone and speak, using the browser's own speech recognition set to accept either language. If a browser does not support it, the microphone button is not drawn at all rather than offered and broken.
It talks back, optionally. A speaker toggle, off by default, sends the answer to a voice service which picks the voice by detecting the script the answer is written in.
There is no vector database and no retrieval step. The whole property fits in a single structured file that is handed to the model with every question, which for one building is both simpler and more accurate than chunking it up and hoping the right piece comes back.
How it works
The pipeline, step by step
Typed or spoken, either language
The question goes in by keyboard or by voice. Speech recognition is configured for both the local language and English, and a final transcript submits itself, so speaking a question is one press rather than press, wait, read, confirm.
Only what the property actually says
The model is given the entire property record and told to answer from it and to say when it does not know. There is nothing else in its context, so an answer about this building cannot drift into a general fact about buildings.
One file, handed over whole with every question. No retrieval step at all.
Reply in the language you were asked in
The instruction is explicit, and it matters for a listing that gets looked at from more than one country. An assistant that silently answers in English has decided who the buyer is.
The one subject it will not discuss
It is forbidden from discussing the price and told to hand the question to the agent instead. That is the correct boundary for a listing: a number said confidently by a chat window is a number somebody will hold you to, and it is not the software's to give.
Three sentences, and no formatting
Answers are capped at around three sentences. Any markdown the model produces anyway is stripped out afterwards by the server rather than trusted not to appear, because the panel renders what it is given and a stray asterisk would show. Instructing and enforcing are two different things and this does both.
**Four bedrooms**, each with its own *bathroom*.
What the visitor gets, and the formatting the server took out of it.
Off by default
Spoken answers are opt in. The voice is chosen by looking at the characters in the answer, so a reply in the local language is read by a local voice rather than by an English one working through unfamiliar words.
What changed
The result
It is live. The widget is serving inside the real tour today, which is worth saying precisely because the project's own notes still describe it as built and waiting to be installed. That note was out of date and only opening the page showed it.
The tour it is running on is a duplicated copy rather than the public listing, and there is no analytics of any kind in the project, so nothing is claimed here about visitors, questions asked, or enquiries generated. What is demonstrated is that it answers, correctly, from the property's own record.
The thing that made this cheap is the thing most projects skip. There is no retrieval layer, no database and no framework. One building's details fit in one file, and the whole client side is a few hundred lines of plain JavaScript with no build step, because it has to be pasted into somebody else's page without breaking it.
The stack
In the page
- vanilla JavaScript
- no build step
- Web Speech API
- shadow-free IIFE
Service
- Node serverless
- Claude Sonnet
- single structured property file
Voice
- ElevenLabs multilingual
- script-detected voice selection
- opt in
Boundaries
- answers from the file only
- no price
- three sentences
- markdown stripped