Your area
Country and town estimated from the connection, server side. Never guessed, always correctable.

Search by service and by town. The list opens with providers who have a finished job on the record for that exact service, in an area they really serve. Every rule below runs on the server.
No browser location prompt. The country and town are estimated from the connection, inside a bounded timeout, and whatever you choose yourself wins.
Each step is one numbered requirement in your document, and each one refuses bad input on the server rather than in the markup.
Country and town estimated from the connection, server side. Never guessed, always correctable.
A managed list with immutable ids, filtered to the market you are in. Other, or not sure, always stays open.
Field level refusals with the reason attached, and one job per submission however many times the button is pressed.
The confirmation opens with completed job counts only. A claim is never counted, and nothing is widened to fill space.
Live from the catalogue on the server, filtered to your market. An administrator adds or retires one of these without a deployment.
Pick one and the posting console opens on that category. Categories that are not enabled in your market are not drawn at all.
This is the delivered part of the brief, running. Pick a category, pick the service, publish, and the confirmation page opens with the providers who have finished that exact work nearby.
Only categories enabled for the selected market are shown. An administrator adds or retires these without a deployment.
Ids are immutable and never reused, so a rename upstream does not break a job that was already posted. The market codes on the right are the markets each service is enabled in.
Two towns can share a name across markets, so each one carries its region.
Required when the service is Other or not sure, because there is nothing else to match on.
Each card below is one acceptance criterion from your document. One click sets the area, the category, the service and the job, publishes it, and leaves the result on screen for you to check.
F13 · location
The country and town come from the connection on the server, inside a bounded timeout, so nobody is asked for a browser location permission just to look around. When the town signal is not good enough the build says country only and asks, rather than inventing a town.
Someone in Denmark can browse Gambia. The choice a person makes beats anything that arrives later, and it holds for the rest of the session. The globe beside this turns to whatever the build currently believes.
Invented records, seeded so that each one proves a different clause in your document. Open the working panel in the console and you can watch each of them pass or fail, gate by gate.
F14 · mobile first
Your document makes mobile first mandatory from the first release, so this build was laid out at 320 pixels and widened from there, not shrunk down afterwards. The screen beside this is a real capture of this page at 390 pixels, taken from the live server rather than drawn by hand.
Three decisions in this build that are easy to get wrong, and what your document actually asks for in each one.

A browser permission prompt on the first visit costs you the visit. The country and town are estimated from the connection inside a bounded timeout, and if the lookup is slow the page carries on without it.
Read more
Matching needs a stable id on both sides. A managed catalogue with immutable ids makes that possible, and Other or not sure keeps the door open for anyone whose job does not fit the list.
Read more
One contract paid over five milestones is one completed job. Counting approvals inflates every number on the platform, and it is the single easiest way to lose the trust this product is built on.
Read moreYour document asks for a line by line response. This is that response for the part I built. Nothing is marked done unless you can click it on this page.
Identity capture, proposals, milestones, escrow and disputes are all specified in your brief and quoted separately rather than implied.
This is a demonstration page, so nothing is sent anywhere.