Case Study · Internal Platform

Borehole Map & Quoting Engine

One map for thousands of past boreholes, a pricing engine that took quoting off one engineer's shoulders, and a mobile viewer for geologists in the field.

Windows desktop app · Mobile web·Geotechnical drilling company·2025 – 2026
Official 1:50 000 geological map overlay with its legend

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.

A single Go binary serves the desktop map, the admin panel and the APIs, reading from the existing ERP and the official LNEG geological maps. The field viewer is a static snapshot published to a CDN.
A single Go binary serves the desktop map, the admin panel and the APIs, reading from the existing ERP and the official LNEG geological maps. The field viewer is a static snapshot published to a CDN.

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.

Every borehole in one place, colour-coded by type, with search by place name or coordinates.
Every borehole in one place, colour-coded by type, with search by place name or coordinates.
Satellite view, useful for spotting access roads to rural sites that don't show on the standard map.
Satellite view, useful for spotting access roads to rural sites that don't show on the standard map.
Official 1:50 000 geological map (LNEG). Clicking a sheet opens its official legend in a side panel.
Official 1:50 000 geological map (LNEG). Clicking a sheet opens its official legend in a side panel.
1:200 000 vector map with a live legend that only lists the formations inside the current view.
1:200 000 vector map with a live legend that only lists the formations inside the current view.
Radius filter around a borehole, answering 'what else have we drilled near here?' when reviewing a proposal.
Radius filter around a borehole, answering 'what else have we drilled near here?' when reviewing a proposal.

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.

To quote — raw contacts from the ERP that don't have a decision yet.
To quote — raw contacts from the ERP that don't have a decision yet.
To approve — one click moves a contact on to 'to send' without reopening the editor.
To approve — one click moves a contact on to 'to send' without reopening the editor.

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.

Contact editor with a demo contact: cascading inputs, live price with a full breakdown, and an editable final price that requires a reason when it differs.
Contact editor with a demo contact: cascading inputs, live price with a full breakdown, and an editable final price that requires a reason when it differs.
Quote lines — standard items locked, optional ones free. Blue cells are filled by the engine and can be overridden.
Quote lines — standard items locked, optional ones free. Blue cells are filled by the engine and can be overridden.

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.

Past boreholes + GPS
Past boreholes + GPS
Satellite view
Satellite view
1:50 000 geology
1:50 000 geology
Detail + directions
Detail + directions

Engineering decisions

01

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.

02

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.

03

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.

04

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.

05

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

01

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.

02

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.

03

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.