← How we build

How we build

Mistakes fail the build

We build software so that a mistake is caught while the code is being built, long before it can reach you or your users.

On Planet Positive Sport an event qualifies at a score of 2.61, so a hundredth of a point matters. If anyone edits a scoring value without declaring a new version of the method, the build fails and names the value that moved. Before a new method ships, every live event is scored under the old rules and the new ones.

119

Styling rules checked against the styling tool's own engine on every build

19,200

Lines of tests behind GZS Inovacije, some files named after the bug they catch

What you get is software that refuses to be wrong

Before any program runs, a tool called a compiler reads the code and checks it. We write our code so that this check knows a great deal about the project. It knows which pages exist, which parts of a page can be updated, and which permissions a user can hold. When something does not fit, the code does not build and nobody can ship it.

Some mistakes only show up once the program starts. For those, the program checks itself at startup and refuses to run. On Planet Positive Sport a missing file store stops the server on the spot. Everything the first two checks cannot reach gets an automated test, written to fail loudly and to say exactly what went wrong.

  • A misspelled permission on Planet Positive Sport, such as "assesments:read", does not build
  • A missing file store stops the platform at startup, before any user can reach it
  • A changed scoring value fails a test that names it

A hundredth of a point, guarded

Planet Positive Sport is the platform FIVB uses to certify the environmental footprint of volleyball events. An event qualifies at 2.61. A careless edit to one number in the scoring method could move real events across that line, and nobody would notice until a report was wrong.

So every value and rounding step in the method is recorded under the method's version name. A test compares the live method with that record on every run. Change a value without declaring a new version and the test fails, printing the value that moved, what it was, and what it became. Earlier versions stay recorded too, so the test file also shows how every past version scored.

When the method was replaced in July, a script scored every live event under the old rules and the new ones. It listed the events whose result changed enough to matter. That list went to the client before the change shipped.

A page that cannot point at something missing

Our web pages often update one part of the screen without reloading the whole page. The piece of code that asks for the update names its target, and the server sends back a piece of page carrying that name. If the two names drift apart, the button quietly does nothing, and nobody notices until a user does.

In fluent-html, our own library for writing web pages, the name of each target travels with the code that uses it. A request aimed at a name the reply never contains fails the build, and the error names both of them. On fluent-html.com anyone can click through 36 combinations and six broken setups and read the real error for each, with no script running on the page.

One copy of every rule

A rule written down in two places will eventually say two different things. On GZS Inovacije, Slovenia's national innovation awards, the weighted formula that scores each entry lives in one file. The same formula feeds the official total and the preview a judge sees while typing, so the two cannot disagree.

Where copies have to exist, a drift test watches them. That is an automated check that compares the copies on every build and fails the moment they differ. In fluent-html one table of about 120 rows generates the styling methods, a tool that collects the styles each page uses, and a set of 32 code-checking rules. Tests fail the build if any of them stops matching the table.

None of this makes software perfect, and we write down when it falls short. The fluent-html changelog says plainly that one feature passed every check and still did nothing in the browser for a while. That note is there for anyone to read.

Proven by

One award video playing in full, then the frame pulling back to every video made for the cycle at once.
Client work

GZS Inovacije

Slovenia's national innovation awards, from the regional round in thirteen chambers to the national ceremony, on one platform we built and still run.

Every one of the 235 entries got a branded 35-second video for the ceremonies, made from the text of its own entry with a Slovenian voiceover. Nobody edited any of them. Technical terms are checked against Slovenia's official lexical database, and the narration is fitted to each video's length without a change anyone can hear.

2026 Gospodarska zbornica Slovenije
Read the case study
The questionnaire for a waste category, with criteria answered one at a time, room for a note against each, and a progress figure in the header.
Client work

Planet Positive Sport

The platform FIVB uses to measure, review and certify the environmental footprint of volleyball events, with reports rendered by the server and AI run on our own GPU.

One click freezes an event's numbers, and three things are built from that snapshot: the public web page, a PDF and a single HTML file with every photo inside. The server draws all nine charts, so the PDF, which runs no script, always prints complete. Photos per page view fell from 140.5 MB to about 19 MB.

2026 FIVB
Read the case study
The fluent-html.com home page, showing a TypeScript snippet, the exact HTML string the library returned for it, and that string rendered as a list item.
Our product

fluent-html

Our TypeScript library that writes HTML as function calls, and the rendering layer under every web app we ship.

When two files disagree about the name of an element, the page stops compiling. An HTMX swap aimed at an id the response does not contain used to break the page silently in the browser. Now the compiler names both ids before the code ever runs.

2024
See the project

One more project behind this does not have a public page yet.

Want this under your project?

Tell us what you need and we build a working prototype first, so you see it before you pay for it.