1. Agree what it does
One page: the job the software does, who uses it, what it does not do. Most arguments later come from this page being vague now.
The computing part is a plain module with unit tests and no dependency on the interface. When a number looks wrong three months later, we already know where it is not.
Every permission, every required field, every step before first use has to justify itself. We also strip the permissions that libraries declare on our behalf, so the manifest describes the app rather than its dependencies.
We build the version that works with the network off, then add the online part. Doing it the other way round produces an app that shows a spinner in a lift.
Local storage, working export, working import. If we cannot restore a backup we produced, we have not finished the feature.
An error message names the thing that failed and what to try. "Something went wrong" tells the user nothing and tells us nothing when they report it.
Cold start, time to first usable screen, and size of the download. Those three decide whether a utility gets used or uninstalled, and they are easy to let slip.
No fake countdowns, no cancel buried four screens deep, no notification whose only job is reengagement, no review prompt in the middle of a task.
A short README that says how to build it, what the modules do, and which decisions were deliberate. Usually the next person is one of us, a year later.
Features accumulate, and each one costs something at every release afterwards. A review where we remove two settings is a good review.
Stopping matters. It is where you get to change your mind cheaply.
One page: the job the software does, who uses it, what it does not do. Most arguments later come from this page being vague now.
The rules, the calculations, the data model, with tests. You can run it before any screen exists.
Compose or Flutter on mobile, plain HTML and CSS on the web. We check it on a slow device, not only the fast one.
Signed build, store declarations filled in by hand, then a quiet period where we fix what real use turns up.
We keep the stack small on purpose. Two mobile paths and one web path cover almost everything we are asked for, and staying inside them means we are fast at the parts that repeat.
When a project genuinely needs something else, we say so before starting rather than bending a tool that does not fit.
No framework on a page that does not need one.
If it does, send us the one-page version of your idea and we will tell you honestly whether we are the right people for it.
Contact us