What does not travel is not there: a day with shortlist, map and form
Some working days consist of one large building block. This one consisted of two dozen small ones — and was still the most instructive in a long time, because behind almost every finding lay the same question: how does the server know what the visitor has already done?
We did not test the estate agent website, we used it. Searching, saving, comparing, opening an exposé, going back. Exactly the way someone does who is looking for a flat and not admiring our software.
The shortlist that existed twice
Whoever saves an offer expects it to stay saved. It did — only the shortlist lived exclusively in the browser. For the server it was invisible.
That had an unpleasant consequence. When the shortlist was opened, the server first sent an empty page, then a small program in the browser read out the saved offers, wrote them into the address and loaded the page once more. You briefly saw “your shortlist is empty”, then the address jumped, then the offers came. Two requests for one page — and in between a claim that was not true.
The solution was unspectacular and right for exactly that reason: the selection now travels along in a small functional cookie. A cookie is the only thing the browser sends of its own accord with the very first request. With it the server knows straight away and delivers the finished page: the saved offers, the counters in the buttons, and even the heart symbols on the cards are correct from the first second.
It holds nothing but the numbers of the offers somebody clicked themselves. It only comes into being once something was actually saved, it ends after thirty days, and it serves solely the function the visitor asked for.
A way back that forgot the search
The next finding was subtler. Whoever searches in Coswig within ten kilometres, saves two offers and then switches to the shortlist wants to get back to their search from there. With us the button led back to the full portfolio and proudly showed the total number of all properties.
The reason: our search state lives in the address — which is good, because that way every result list can be shared, linked and bookmarked. Only the address was lost on the jump to the shortlist.
At that point came the best question of the day, and it did not come from me: why are we building a second route for this when the exposé has long carried the search along? Entirely justified. With the exposé the search state hangs on the link the list itself creates — and what a link can carry belongs in the address, not in a second store. Shortlist and comparison now do the same. If somebody arrives through the menu instead of from a search, there is simply no search to preserve; then the button leads to the full portfolio, and that is the honest answer.
The error that displayed nothing
In the radius search the map stayed grey. No map material, no markers, no message — an empty rectangle with zoom buttons.
The cause was an ordering problem of the instructive kind. For the red radius the map has to know which section it should show. We calculated the section from the circle — only a circle computes its bounds in pixels, and pixels only exist once the map already has a section. Chicken and egg. The call failed, and with it everything that came after.
The annoying part was not the error but its invisibility: the message was to be written into a hint text that the map had long since replaced at that moment. So it went nowhere. What remained was a grey field that looked like a design problem and was none.
Now the centre sets the section and the circle comes on top afterwards. And if a map does fail once, it says so — in the place where the map should be. An error that displays nothing is found late.
Two stores, one truth
Now the part where I watched my own fingers.
Once the cookie was introduced, the old store in the browser simply stayed lying beside it. Maintaining both seemed harmless — until we noticed that the pages were still loading a second time. The program in the browser was still deciding from the address whether it had to reload, and after the rebuild there was nothing in the address any more. So it reloaded every fully rendered page: double server load, visible as a short flicker at the end.
The question that resolved it was simple: why two stores at all? There was no good reason. Since then there is only the cookie. With it the reconciliation between the two, the precedence rule and the whole reload route have disappeared — and with them the place where the double call could creep in at all. The program part responsible shrank by a quarter.
The lesson is uncomfortable but good: a second store is not a safeguard, it is a second truth.
What you see immediately
In parallel ran the fine work on the exposé — the comparison with our model, screen next to screen.
The buttons above the details were too small, the number of hits was missing, and on a phone they squeezed instead of stacking. So what we adopted was not the appearance but the construction: full button size, the number of hits inside the button, and one button per row on narrow screens.
The three boxes of the right column — provider, energy certificate, contact form — were tiles with shadows with us, collapsible boxes in the model. Now every box can be folded shut at its head, with a changing symbol, and the whole head reacts to the click, not just the small icon.
And the contact form got its validation back. Previously the browser did the complaining — with its own little speech bubble that fits no website because it belongs to all of them. Now the form itself says which field it is missing, marks it and jumps into it. Plus the small things you only miss once you see them: first name and surname side by side, placeholders in the fields, a country field that did not exist at all before.
And the way back out
Finally two things that belong together.
Our maps load their material only after explicit consent — before that not a single request goes out. That consent again lived only in the browser, which is why the “load map” box flashed briefly on every new page although consent had long been given. It travels along now too and applies for the duration of the visit.
And because everything you give must also be retractable, there is an address that does exactly that: it deletes everything this website has stored on the device — shortlist, comparison, map consent — and brings the visitor back to the home page with a short confirmation. The link for it belongs on the privacy page, and that is where it will stand.
The confirmation itself was built as a tool right away: a message that appears exactly once, above the content, in three tones from hint to error. Every part of the application can use it in future.
What we take away
State that does not travel does not exist for the server. Almost every finding of that day was a variant of this. Whoever wants to deliver a page fully rendered on the server has to make sure everything needed arrives with the first request.
What a link can carry belongs in the address. Only what is impossible there — a selection only the browser knows — justifies a store on the device.
Half a rebuild is more expensive than none. The double page load did not arise from the new part, but from the old one staying beside it.
As a visitor you will notice none of this. Pages stand immediately, hearts are filled, the search is still where you left it. That is exactly the point: the successful version of this work is the one nobody notices.