The problem
Webokrator is a small SaaS I built for my own practice: a platform where a small local business in Serbia, a plumber or an electrician first, puts together its own website. The owner answers a short set of questions on a phone, sees the finished site on a preview address and only then takes it live on a domain of their own. Two things make that hard to do honestly. A tradesman will not write his own copy, so the software has to, and software that writes will state a price, an arrival time or a founding year nobody gave it, under a real business's name. And a platform like this only works if one more customer costs nothing to run: no build and no deploy per site, with every business's data kept apart from the next.
What I did
Three applications share one codebase: the platform that serves the customer sites and runs the sign-up wizard, an admin and the public site at webokrator.rs. The wizard is ten steps, built for a phone; it saves as it goes, signs the owner in by an emailed link and covers 38 kinds of business.
A customer site is assembled from twelve kinds of block in one of six color schemes, each scheme held to the contrast standard before it can ship. The writing model fills only the headline, the service descriptions, the about text, the questions and answers and the search description. Prices, the numbers a business is proud of, the area it covers, the gallery and the call button are filled in by hand, on purpose.
Every site is served by one running application that reads the address the visitor typed: the app's own, a preview address that search engines are told to skip or the customer's own domain, which shows a site only once it is live. The database itself enforces the wall between businesses, and a script proves it. A site moves through seven states, from registered to live, suspended or cancelled, through one function that records every change. The admin shows one button for each allowed move and says what it will do, because the person clicking may be an employee with a half-remembered procedure and not me. The public site carries a page for each kind of business, 86 of them.
The hard part
Copy that cannot lie. The first versions of the writing prompt produced fluent Serbian with facts in it that no one had supplied; one draft promised how fast a plumber would arrive, which the plumber had never said. Asking the model to be careful does not fix that. What fixes it is a second pass that uses no model at all: once the text is written, a checker reads it for every year, every length of time and every price and compares each one with what the owner typed into the form. Anything that is not in the form fails the whole draft, and a failed draft writes nothing to the site. The same pass rejects a wrong number of services and a search description that runs long. A set of 36 test businesses runs against every change to the prompt, so a new wording has to pass the old cases before it reaches a customer.
What changed
The platform has been in production since July 2026. On July 6 a generated site measured 94 of 100 for speed on Google's mobile test and 99 on desktop, with 100 for accessibility, and a scripted run of the whole flow passed 28 of 28 steps on production. The public site read 89 on the mobile test on July 10, up from 72, and about 85 on a later run. It is a small product and it does what it says: a tradesman answers the questions, sees his site and takes it live, and nothing on that site is a fact he did not give.

