Skip to content
Two horizontal teal lines on a dark grid: the upper one dashed, with four empty outlined rectangles strung along it; the lower one solid, carrying a single filled rectangle, two small dots and one short vertical tick.

“Nothing failed. The document simply became a different document.”

What was created is not what is valid

Three systems, three domains, one decision: separate the moment something exists from the moment it counts.

Get in touch
Three engagements · customs invoicing, 2020 · remittance terminals, 2022 · meeting platform, 2023
3
systems, three domains, three years
0
issued documents changed afterwards
1
decision: exists is not binding
Summary

A customs authority needed invoices that could never change after issue. A remittance terminal needed to print a coupon while offline without risking a double payout. A meeting platform needed a whiteboard that survived the meeting as something you could still work with.

Three unrelated products, three unrelated years — and the same answer each time. What a system stores must distinguish between “this exists” and “this is binding”.

The problem

A template changes. A layout is corrected, a legal notice updated, a logo replaced. Then someone opens a document issued two years ago and sees this year’s template — with this year’s legal text, on a record that was signed under different terms.

The constraint

Nothing failed. No error was raised. The document simply became a different document, quietly, and the archive stopped being an archive. The same shape appears wherever creation and validity can drift apart: a coupon printed with no network, a whiteboard that only exists as a screenshot.

What we did

  1. Customs invoicing: frozen at the moment of issue

    The requirement was absolute: an issued invoice must never change. So at the moment of issue the document is rendered and stored as immutable HTML. Later template edits touch nothing already issued.

    Issued is issued
  2. The definition of a document, separated from the issued document

    The template is free to evolve; history stays intact. A second benefit is easy to miss — the frozen output no longer depends on the future correctness of the rendering code. Had documents been rendered on demand, any change to that code would have retroactively altered every old document.

    Independent of future code
  3. The coupon prints — and is not valid

    A recipient collects cash at a filling station using a coupon code. The terminal has to keep working when the network doesn’t, but a coupon that pays out twice is the one failure that costs real money. So it becomes valid when the system says so: automatically when connectivity returns, or manually through an operator, who is signalled that an unactivated coupon exists.

    Better unusable than paid twice
  4. The whiteboard as objects, not as an image

    The board is persisted as structured objects rather than a flat image — every stroke, shape and piece of text keeps its own properties. It can be reloaded and edited rather than only viewed.

    Survives the closed session
THREE DOMAINS, THE SAME SEPARATION
The customs invoice the template changes

The issued document is rendered and stored as immutable HTML. Later template edits touch nothing issued — and the frozen output does not depend on the future correctness of the rendering code.

Every system that produces documents eventually meets the same question, and most meet it too late.

The result

Three products where the record survived contact with the thing that usually destroys it — a template change, a lost connection, a closed session.

What we’d do differently

On the customs system, freezing the issued document was correct but incomplete: we never versioned the template itself. So while no issued invoice could change, there was no record of which template version produced it, or who changed it and when. The snapshot answered the urgent question and left the audit question open.

Related
Passport chips and payment terminalsThe same terminals, seen from the hardware side.Permissions as a graph on a HIPAA platformThe same meeting platform, a different question: may this be seen.
All 18 case studies
  • Node.js
  • PostgreSQL
  • Kotlin
  • Fabric.js

Does your archive change when your template does?

Get in touch

Systems that can’t stop — from architecture to production.

© 2026 Micro Tech, Sarajevo