Skip to content
Hanna.

Selected work

Each of these is one problem that turned out to be something else

The reported version of a problem is rarely the problem. Each one here is written from the report down to the mechanism that closed it.

012024–2026

Reported: Records keep reverting.

Offline drafts had no owner, so the newest work lost

Not sync frequency. Offline drafts had no ownership, so a device that had been away could land stale state on top of newer work — and nothing in the model could make that write fail.

React Native · Expo · WatermelonDBRead
022025–2026

Reported: There are rounding errors on the requisition totals.

Every level could tax an already-taxed amount

Not rounding. Tax and discount lived at several levels at once, so every level was individually defensible and the total was still wrong — collapsed into one ladder with no second rung.

NestJS · MySQL · SequelizeRead
032025–2026

Reported: All tests are green — we should be fine to release.

"All tests green" meant nothing, so I froze the debt by name

Inherited authorization gaps meant a passing suite proved nothing. Fixing them first would have blocked every release for months, so they were frozen by name — old debt cannot pass, new regressions show the day they land.

Playwright · MySQL · TypeScriptRead
042025–2026

Reported: Approvals are wrong for this customer.

One hard-coded approver did not survive the second customer

The obvious fix was a branch per customer, which compounds forever. Instead the business configures its own ladders, spending authority and price guards, and a new customer costs no code at all.

NestJS · Next.js · React NativeRead
052026

Reported: Procurement should live in the web app, not on the vessel.

Moving a module off the offline app, with no specification to work from

No specification existed, only flows shaped by an offline device. Porting them faithfully would have carried offline assumptions into a place where they are wrong, so the workflows were re-decided at the pace of a migration.

Next.js · NestJS · TypeScriptRead
062021–2023

Reported: Android and iOS each have their own list of bugs.

Two platforms, two bug lists, one missing shared layer

The defect list looked like two sets of platform bugs. It was one product implemented twice and drifting, so closing defects could never catch up — the platforms were unified onto one codebase instead.

React Native · TypeScript · ReduxRead

Earlier client work

Real builds, without the divergence

Here the reported problem and the actual problem were the same thing, so they are listed rather than written up as case studies they cannot support.

Interactive 3D product-solutions site
Product configurator and scroll-driven 3D scenes for a client web product.
three.js · GSAP · Next.js
Banking-sector interface
Customer-facing interface work for a regional bank.
React · TypeScript
Environmental-platform mobile app
Mobile client for an environmental data platform.
React Native · TypeScript