The problem
A Portuguese geotechnical drilling company with thousands of boreholes on record. The data existed, but it was spread across three systems that didn't talk to each other.
TWO LEGACY MAPS
Hand-made HTML maps with Google pins. Getting to a borehole's report meant opening Explorer and guessing the folder.
QUOTING IN ONE HEAD
Every proposal waited on a senior engineer and his mental pricing model. When he was away, quoting stopped.
LEADS LOST IN THE ERP
Sales contacts sat in the ERP with no way to tell whether a lead already had a quote or was still waiting.
BLIND IN THE FIELD
Geologists took a laptop in the car or phoned the office. No GPS or geological map in their pocket.
The result: late proposals, siloed knowledge, and field decisions made without context.
The solution
One internal platform that brings the three flows together: a single Windows executable with no dependencies, plus a mobile web sibling for the field. Everything runs on tools the company already had — no new servers to maintain, no cloud to pay for, nothing that needs the IT team.

The desktop map
The two legacy maps merged into one, with nearby duplicates removed. All static assets are embedded in the executable, so the interface loads without a network — only map tiles and ERP data need one.





WHY FILTER THE LEGEND
The full 1:200 000 legend has over 200 entries. For any given site, about ten matter. Filtering by viewport cuts most of the noise without losing information: you only see what you're looking at.
Leads, as a kanban
Contacts come straight from the ERP (read-only) and move through three queues: to quote, to approve with the senior engineer, and to send. The list refreshes itself every five minutes, only while the window is visible.


Each decision is saved as its own file on the network share, so two people editing two contacts never collide. If the share is offline, decisions queue locally and a counter in the top bar shows how many are waiting to sync.
The quoting engine
The engineer's pricing model became an editable table. Pick the pipe diameter and drilling method, and the engine fills in the rest and shows a line-by-line breakdown of how it got to the price. That transparency is what gets people to trust an engine like this.


LEARNING FROM OVERRIDES
Every time someone changes the calculated price, they have to say why. Those reasons go into an append-only log. A suggestions button groups similar boreholes (same diameter, method and depth ±30 m) and shows the median, the range and the most common reasons. For now it suggests, it doesn't decide. Once there are 50+ labelled overrides, it can grow into a regression model.
An admin page holds every coefficient — base price per diameter, percentages for machine type, access and geology, depth surcharges, transport per km — editable by anyone in the office without touching code. Every save keeps a snapshot, so mistakes can be rolled back.
In the geologist's pocket
A static mobile web app built from a nightly export. No VPN, no access to the internal network, and it works offline after the first load. Sign-in is by email.




Engineering decisions
Go and a single executable
Office machines block installing Node, Python or Java. Go compiles to one self-contained binary with the web server, database driver, web assets and tray icon inside.
Local-only server
The executable only listens on the machine itself. Nobody else on the network can reach it — a rule from day one, not hardening added later.
A home-made auto-updater
On start, the app compares itself to the copy on the network share and offers to update. No installer, no update server — the share is the distribution channel, with staging and production side by side.
Read-only against the ERP
Enforced at the database account level and checked in review. Every query uses real parameter binding, with input validated at every boundary on top.
Allow-lists over block-lists
The geological map proxy only allows three official services; the 'open folder' button only opens paths under one approved root. Each choice closes a whole class of bugs.
Impact
~9 MB
Single executable, zero dependencies
< 300 ms
To calculate a quote (P95)
< 3 s
To rebuild the field viewer
0
New servers or licences
- —The senior engineer stopped being the bottleneck: the office produces proposals from editable values with an auditable breakdown.
- —Every price override carries a reason, so the 'why' that used to live in one head now sits in a log the whole company can read.
- —Geologists open the map on their phone in seconds, without a VPN and without calling IT.
Key learnings
Less is more when mistakes are expensive
A React SPA with a cloud backend and Postgres would have taken five times longer and added three vendors. One binary and a JSON file on a share deliver the same value with no new operational risk.
Incremental learning beats magic AI
Capturing reasons and suggesting prices came before any predictive model. Asking for the reason already changes behaviour and produces the clean dataset a future model will need.
Find the invisible kanban
The one-click 'to send' button is a single line of code, and it changed how fast proposals go out more than any technical optimisation. Look for the workflow people already follow and make it explicit.
Screens use demo contacts; client names have been left out.
