Internal tools
Authenticated back-office systems for the work currently living in a spreadsheet.
Internal tools are where a business keeps the work it cannot buy software for. They are usually the highest-leverage thing we build and the least visible, because nobody outside the company ever sees one.
The starting point is almost always a spreadsheet that has become load-bearing — a pipeline, a roster, a reconciliation, a queue — kept by one person, edited by several, and correct only as long as everyone follows a convention nobody wrote down.
Authentication exists from the first commit instead of being added before launch. A tool that starts on an unguarded address because it is only internal for now is a tool that will still be unguarded in two years, holding considerably more sensitive data than it did on the day that decision was made.
Permissions are modeled on roles that already exist in the business rather than invented for the software. Where the business genuinely has one kind of user, the tool has one role, and adding a second later is a small change; inventing five roles nobody asked for produces a permission matrix that is maintained by guesswork.
Every destructive action is recoverable or confirmed. Records are marked as removed rather than deleted where history matters, and anything genuinely irreversible states plainly what it is about to do.
An audit trail records who changed what and when. In a tool that holds operational truth, the question that eventually gets asked is not what the value is but when it changed and who changed it, and a system that cannot answer that converts a two-minute question into an afternoon.
Interfaces are built for the person doing the task repeatedly instead of for a first-time visitor. Dense is correct here. Keyboard operation, sensible defaults, and the next action already in focus matter more than an onboarding flow nobody will see twice.
Export is built in from the start. A tool the business cannot get its data out of is a tool the business does not really own, and the export path is also the most reliable disaster recovery available for a system small enough not to warrant more.
What this does not cover.
- Tools left on unauthenticated addresses on the basis that they are internal.
- Permission models invented for the software, not derived from how the business already works.
- Systems with no export path.
Software Engineering
Specification before code
The document that names every entity, every state, and every failure path — and why a project that cannot produce it should not start.
Types as guarantees
Making the likeliest mistake in a system impossible to express, rather than merely against the rules.
Commerce and payments
Checkout, registration, and subscription flows built against the client's own payment account.
Moving data between systems
Reversible where possible, rehearsed against a copy, and always producing a record of what changed.
Interfaces between systems
The interfaces a system exposes, and the contracts it holds itself to once something depends on them.
Testing
Coverage aimed at what would actually be expensive to get wrong, instead of at a percentage.