Three sounding dips into net palm kernel tonnage. One screen, offline, on the phone already in your pocket.
THE CALCULATOR SCREEN
To know how much kernel is in a bunker you dip it — a sounding rod, three points, read off in feet and inches. Then you take the average, subtract it from the bunker depth, and look the answer up on a printed chart that gives tonnage per foot.
Between the readings and the answer sit two chances to get it wrong: the arithmetic, and reading the wrong row off a laminated sheet in the sun.
You enter the three dips in feet and inches. Everything else follows automatically:
average sounding = (P1 + P2 + P3) ÷ 3
ullage depth = bunker depth − average sounding
tonnage = interpolated between the two nearest chart rows
Values that fall outside the chart are extrapolated from the two nearest rows, and the result is floored at zero — because a negative tonnage is a measurement error, not a reading.
Dips of 6′1″, 3′7″ and 5′9″ against a 22 ft bunker give an average sounding of 5.138889 ft and an ullage depth of 16.861111 ft. That sits between the 16 ft row (71.55 MT) and the 17 ft row (79.61 MT), and interpolates to 78.49 MT.
That figure matches the reference spreadsheet exactly, and there is a test in the codebase that fails if it ever stops matching. Porting the calculation was the easy part; proving it still agreed with the sheet the mill already trusted was the point.
Every tab fits the phone without scrolling. This gets used standing on top of a bunker, one hand on the rail, in daylight you cannot read a screen in. Anything that needs a scroll gets skipped, and a skipped step is a wrong number.
Bunkers are not where the signal is. The whole app — chart, logs, calculation — works with no connection at all. Nothing waits on a server to tell you what 16.86 feet is worth.
Every bunker has its own calibration table, and they are not interchangeable. So the chart is data, not code: you can add rows, correct a figure, and keep a separate table per tank. Hard-coding one mill's numbers would have made it useless to the next one.
Each calculation can be saved with a shift and a note, then searched or exported to CSV. The calculator answers today's question; the log answers the one that comes a month later about what the bunker held on the 14th.
Originally written as an Android app in Kotlin and Compose, then rebuilt as a PWA so the same thing runs on iPhone without a second codebase or an app store listing.
Want this for your bunkers, with your calibration tables? akmalka97@gmail.com