CommerceTallyhubGH
2025 — presentInventory, point of sale and business operations for retail and wholesale
Poultry-farm operations on a cheap Android phone with no signal
A poultry farm produces a small number of facts every day that decide whether it made money: attendance, feed consumed, eggs collected, birds lost, sales banked. Kept in a notebook, those facts are unqueryable and quietly unreliable — and the owner is usually not on site to see them being written. Farm Ops is the app the farmhands actually hold, and the owner’s window into it.
It came out of an on-site brief rather than a guess about the market, and it is built in phases against that brief. The daily loop shipped first; sales and money came second.
Android-first, budget hardware, and a farm with bad signal. Everything else follows from those.
The interface reads from the device, never from the network. Local SQLite is what the screens query. Writes go to an explicit outbox — a queue that can be opened and inspected — and drain when connectivity returns. A general-purpose sync engine was considered and rejected: the data is overwhelmingly append-only log entries, and a library’s last-write-wins default is the wrong rule for a disagreement about how much feed went into a house. The brief called for keeping both versions and flagging them, which is easier to implement honestly than to argue a framework into.
The performance budget is checked, not hoped for. Cold start under 2.5 seconds on a 2 GB device, an APK under 45 MB, and a log entry saved and visible within 200 milliseconds of the tap with no network at all. That last number is the one that decides whether the app gets used: a farmhand holding a feed scoop in one hand does not wait for a spinner, and if saving feels uncertain they go back to the notebook.
Nothing is hard-deleted. Records are voided with a reason, visible to the owner. This is a data-trust product before it is a features product.
Feed-mix maths, price-from-weight, geofence distance and the late-arrival rules live in a package with no React and no database imports — just functions and unit tests. That constraint exists because the same arithmetic has to run in the field client and in the owner’s reporting, and a feed-mix calculator that disagrees with itself in two places is worse than not having one. Writing the tests first is also what caught a float-rounding error before any real kilos went through it.
Server-side, role separation is enforced in the database with row-level policies rather than in the app, so a farmhand’s session cannot read the owner’s view even if a screen is reached some other way. Staff sign in with a short code and a PIN rather than an email address, bound to a specific device, with a lockout after repeated failures — because the phones are farm-issued and shared, and nobody on a farm has a work email.
The reason the farm wanted software was remote clock-ins. So starting a day is a gate: a GPS check against the farm boundary, a selfie, and a reason if late. Attempts from outside the fence, or from a device reporting a faked location, are recorded as blocked attempts the owner can see rather than silently refused. Face matching is deliberately a later phase — a photograph the owner can look at already ends the problem, and promising on-device face recognition in the first phase would have been promising weeks of work as a checkbox.
Sales are weighed, priced from the buyer’s rate card, and then confirmed on a second screen before they commit. Everywhere else in the app a duplicate entry is an annoyance; a duplicated sale is a dispute with a customer. The receipt and the buyer’s running ledger come off the same postings.
The daily loop is code-complete and the sales phase is in progress. It is not called shipped here, because the farm’s own sign-off — a build on the real devices, a walkthrough with the staff, and the boundary coordinates and feed formula confirmed by the owner — is still open. Two repositories carry the work: the monorepo holds the domain package, the database schema and the written decisions, and the Expo client is where the current screens live.
CommerceInventory, point of sale and business operations for retail and wholesale
FinanceCore banking for savings-and-loans companies and rural banks
CommerceA hair and beauty storefront built for mobile money and mobile data