Inspiration Sizing a cable is arithmetic an electrician does several times a day, and every tool I could find answered it the same way: one number, no working. That is the one form of answer this trade cannot use. A figure you cannot check is a figure you have to redo by hand before you put your name under it, and where the failure mode is a fire, nobody signs a number they did not watch being made.

The second idea came from watching the job rather than the apps. Sizing a circuit is not one calculation, it is four — whether the cable can carry the current, whether the voltage drop stays inside the limit, whether a fault would be cleared in time, whether the earth conductor survives it. Each gives its own answer and the cable is the biggest of the four, but no app will tell you which of them decided it. That is the answer that matters, because it tells you what to do next: a run held back by voltage drop can be shortened or given more allowance, and one held back by heat cannot. People work it out today by copying a cross-section between four screens until the numbers stop changing.

And a third: the arithmetic in this trade is not a premium feature. Several apps put basic sizing behind a subscription. That settled the business model before a line was written — the calculators would be free, permanently, and the paid tier would sell the document, not the sum.

What it does VoltageBoard is an offline toolkit for electricians, installation technicians, electrical engineers and students.

20 calculators that show every intermediate step, not just the result 40 reference topics — breaker curves, RCD types, earthing systems, disconnection times, IP and IK ratings, conductor colours, correction factors — where every table names the standard it was transcribed from 24 theory topics at three levels, with quizzes built from the same engine the calculators use, so a question can never drift from the tool A unit converter across 19 categories, including AWG to mm² A glossary of 117 terms, and 36 field notes from practice A projects module that turns a list of circuits into a full circuit schedule, and prints next to each one which requirement decided its size Read the nameplate — point the camera at an equipment plate and the voltage, current and power come off it, on the device, without the photo going anywhere 12 languages All of it offline. Everything but the forum works with no connection at all. What Pro sells is one purchase, made once and owned forever: a PDF of a calculation, a PDF of a project's circuit schedule, and the advanced theory shelf. Deliberately not a subscription — a tool somebody opens on the days they need it converts badly on renewals and earns a support burden instead. All 20 calculators, the converter, every reference table, the glossary, the projects module and the forum are free and stay free.

How we built it The whole app is built in Kotlin with Compose, around one rule: a number is never shown without the reasoning that produced it. That decides more of the architecture than it sounds like it should. Every calculator is a small engine that returns its steps as data rather than a formatted string, which is why the same engine can drive the on-screen working, the exported PDF and the quiz questions without any of the three being written twice.

The projects module is the piece I am least willing to give up. It does not run four calculators and take the largest answer, because the four are not independent — enlarging a cable to fix a voltage drop also improves the fault loop. Instead it walks the standard cable sizes upward and stops at the first one that satisfies every requirement at once. Choosing it that way means the question an engineer actually asks — what decided this size? — answers itself: it is whatever rejected the size one step below the one that won.

RevenueCat handles everything to do with the purchase, and the interesting part was not making a purchase work. It was deciding what the app should believe while the store is still answering. This app is used in basements, plant rooms and half-built buildings. Someone who has paid and opens it with no signal must not be told they have not paid — offline, "waiting for the store" lasts forever.

So the entitlement is not a single yes-or-no. The app keeps the last answer the store gave it on disk, available the instant the app opens, and asks the store again on every launch. The fresh answer wins the moment it arrives; until then the remembered one stands, and nothing about the screen flickers between them. That small ordering is the whole behaviour of the paywall, so it lives on its own and is tested on its own.

One decision I would repeat: a build with no RevenueCat key configured — a continuous-integration run, or anyone who checks out the project to work on the calculators — treats the reader as if they had paid. The alternative is a paywall they could not buy from even if they wanted to, standing in front of features that used to be free. A release build simply refuses to be produced in that state.

Challenges we ran into The purchase that succeeded and unlocked nothing. The entitlement in the RevenueCat dashboard had been named after the product. The app asks for a different name. Every test purchase went through perfectly, the money moved, and the app stayed locked — with no error anywhere, because nothing had actually failed. The thing you sell and the thing you unlock are two different names, and only one of them is the app's business. It cost an evening and was entirely my own doing.

Deciding what free means. Gating is easy to get wrong in both directions. Lock too little and there is no reason to pay; lock the wrong thing and the app loses the trust it is selling. A safety-adjacent tool that charges for the arithmetic is one bad review away from being read as untrustworthy. Landing on "the calculation is free, the document you hand to somebody else is paid" took longer than building the paywall.

Emulators lie quietly. The nameplate camera feature returns nothing at all on a virtual device — not an error, just an empty result. Nothing in the tooling says "this cannot work here". The same class of problem hid a missing camera permission declaration that would have closed the app on the first real phone that ran it. Anything involving a sensor had to be proven on actual hardware or it was not proven.

Forty thousand strings. Twelve languages over roughly three and a half thousand pieces of text, and a half-finished language is worse than a missing one — it ships an interface in two languages at once. Each language had to land complete, in one piece, with the build refusing anything partial.

Finding data anyone can check. The app reproduces no standard and copies no copyrighted table; it implements published engineering formulas and cites the standard each figure comes from, so a reader can verify it against the source. That turns out to be real work. Aluminium conductor data in particular appears in almost no public manufacturer material — cable suppliers publish copper and stop — and every transcribed figure ended up in a register recording where it came from and whether it had been checked.

Knowing when the working is too much working. The first version of the step-by-step view showed everything, and it was unreadable. Showing your work is only useful if a person can follow it, so the result comes first and the reasoning unfolds underneath it for whoever wants it.

Accomplishments that we're proud of A paywall that behaves correctly in a basement, which is the only place this app's paywall was ever going to be judged. 1,255 automated tests, most of them on the calculation engines and the full sizing chain, because a wrong number here is not a cosmetic bug. The calculators stayed free — all 20 of them, plus the converter, the references, the glossary, the projects module and the forum. Nothing tracks anybody. No analytics, no advertising, no crash reporting, no account required to use any of it. The camera feature reads the photo on the device and the photo is never saved or sent. Every figure has a source. Each transcribed value is tracked against the standard it derives from and whether it has been verified — the thing that makes the app usable by somebody whose signature goes on the result. What we learned An entitlement is a question about time, not a boolean. "Has this person paid" and "does this device currently know whether this person paid" are different questions, and an offline-first app has to answer the second one honestly while it waits for the first. Getting that ordering right is most of what a good purchase experience is, and none of it is visible when it works.

Sell the artifact, not the arithmetic. It is the fairer split and also the better business. The free calculators are what somebody uses on site every day; the PDF is what they need on the day they have to hand something to a client, an inspector or a colleague. One builds the habit, the other is worth paying for.

Nothing behind a paywall on the device can be a secret, so it should be a convenience rather than a secret. That is exactly why the export is paid and the formulas are not.

The expensive bugs are the silent ones. A purchase completing against the wrong entitlement, a camera returning no text, a font quietly falling back to a different one — each looked like success. Everything that could fail silently had to be checked by hand on real hardware.

Trust is the product. In a tool where a mistake has consequences, the thing worth building is not more features, it is the reason to believe the number.

What's next for Voltage Board Offerings and pricing tests through RevenueCat. The paywall currently asks for one product by name. Moving it to configurable offerings makes price and placement something to measure rather than argue about — the theory gate in particular is the decision I am least sure of. Let the numbers decide about advertising. The stores report active installs for free. Banner revenue is meaningless below a few thousand daily users, so nothing gets added until those figures say otherwise. Regional rulesets. The engine follows IEC practice with other standards cited alongside; making the ruleset a first-class choice instead of a default is the largest piece of real work left. The inspection module, already built and not yet surfaced: recording test results against their limits and printing them into the same schedule as the design figures. More languages, one complete language at a time.

Built With

  • android
  • google-play-billing
  • gradle
  • in-app-purchases
  • jetpack-compose
  • jetpack-datastore
  • junit
  • koin
  • kotlin
  • kotlin-coroutines
  • kotlinx-serialization
  • ktor
  • material-design-3
  • ml-kit
  • navigation-compose
  • ocr
  • on-device-ml
  • pdf
  • postgresql
  • revenuecat
  • room
  • sqlite
  • supabase
Share this project:

Updates

Submission history