The app writes to your phone first, every time. Sync catches up when there is signal, and when it cannot, it tells you what is stuck and why in plain English rather than spinning at you.
Every screen reads and writes a database on the phone. Not a cache, not a queue of things waiting to be real, the actual record. So there is no spinner waiting on a server and no feature that quietly stops working in a basement. Build an estimate in a new-construction site with no service, send it from the truck an hour later, and nothing about the app behaved differently in between.
- Every feature works with the phone in airplane mode
- The database on your device is the record, not a copy of one
- No half-functioning offline mode with features missing
- Changes wait on the device and go up on their own when signal returns
- Nobody can flip a switch and lock you out of your own job records
Sync pushes your changes up and pulls everyone else's down, every ninety seconds while you have the app open and every fifteen minutes in the background. You can run it by hand any time, pull everything down fresh onto a new phone, or push a whole local database up. Conflicts between the server and a device are recorded rather than silently resolved, so nothing gets overwritten behind your back.
- Every ninety seconds in the app, every fifteen minutes in the background
- Push and pull, so more than one phone stays in step
- Sync now, full re-pull, and bootstrap upload, available to the account owner
- Automatic sync can be turned off by the owner, and stays on for crew
- Conflicts recorded rather than quietly resolved
- Every synced record carries who last changed it and in what role
Most apps give you a spinning icon and a shrug. This one gives you a list: what is pending, what failed, and what each item actually is, named in words a person uses. Estimate task. Deposit ledger. Crew invite. Each failure carries a reason in plain English and when it will try again. Retry everything that failed, put a single item back in the queue, or clear out what has already gone through.
- Every pending and failed item, listed by what it actually is
- Human-readable labels rather than table names
- Plain reasons: no internet connection, conflict with server data, server unavailable
- When the next retry is coming
- Retry all failed, re-queue one, or clear completed items
The database on your device is encrypted with SQLCipher and the key lives in the Android Keystore, so a lost phone is a lost phone rather than a lost customer list. On the server, every table carries row-level security tied to your account, which means isolation is enforced by the database itself rather than by an app-layer check somebody could get around. Sensitive attachments like a trade license sit behind short-lived signed links, and screens that show a recovery key block screenshots.
- On-device database encrypted with SQLCipher, key held in the Android Keystore
- Row-level security on every table, enforced by the database
- Your account's data cannot be reached from another account
- Certification attachments served behind short-lived signed links
- Screenshot blocking on sensitive screens
- Deletions are marked deleted rather than erased, so a delete reaches every device
A real database on your phone, sync that runs itself and explains itself when it cannot, and encryption at both ends. Bought once, with no monthly charge behind any of it.