How I think · across every project

Decisions

The hard calls behind five products, and the site you're reading. Each one in two lines: the constraint, and what I chose.

Entries
16
Projects
5 + this site
Read time
~45 sec
01 / DECISIONShappay

Funding is not checkout

The constraint

Firing a real-time bank transfer on every scan inherited bank uptime, latency, fees, and redirects. Validation proved that bet couldn't hold mid-build.

The call

Decoupled funding from checkout. Banks are touched only when a user tops up their wallet; payments clear instantly against wallet balance.

What it cost

Holding balances raises regulatory surface, ledger consistency work, and settlement complexity. Naming those costs is part of owning the call.

02 / DECISIONShappay

Static QR first

The constraint

Dynamic QR infrastructure is expensive to build and operate, and an MVP doesn't need it to prove the loop.

The call

Ship a static merchant QR where the payer enters the amount. Print it once, accept money forever.

03 / DECISIONShappay

Two addressing modes, one engine

The constraint

A QR-only model breaks peer-to-peer payments, where there is nothing physical to scan.

The call

Every user gets a name@shappay virtual address. QR codes and typed addresses resolve through the same engine.

04 / DECISIONUI to JSON

Optimize for what to discard

The constraint

Every export tool optimizes for completeness, producing noisy output that burns AI tokens and confuses the model.

The call

Built the opposite bet: a semantic representation defined by what it confidently throws away.

05 / DECISIONUI to JSON

Ship a plugin, not a demo

The constraint

A clean export only proves itself against messy, real files made by people who never expected a machine to read them.

The call

Shipped to the Figma Community so the output had to survive contact with files it was never designed around.

06 / DECISIONOshap

No app, no login, no waiter

The constraint

Any download or sign-in step kills conversion at the table, where a hungry customer has zero patience.

The call

The QR opens a web app deep-linked to the table. Scan, browse, order, and pay by transfer, with nothing to install.

07 / DECISIONOshap

Order together, like a real table

The constraint

People arrive in groups, read the menu at the same time, and hand the waiter one combined order. A separate cart per phone breaks that ritual.

The call

A shared table session: everyone at the table adds to one synced order and it is placed together, mirroring how groups actually order.

08 / DECISIONOshap

One role-gated admin app over separate dashboards

The constraint

Staff cannot juggle several different tools per shift while the floor is busy.

The call

A single role-gated admin app spans kitchen, floor, and management, showing each person only what their role needs.

09 / DECISIONNawNaw

Serve the affluent customer, by arithmetic not taste

The constraint

In Nigeria's big cities, operating cost (rent, power, overhead) runs higher than India's while shopper spending power runs lower. Mass-market baskets are too small to support 15-minute delivery economics.

The call

Target the tier-1, convenience-paying customer who already values twenty minutes over a few hundred naira. The choice of who to serve fell straight out of the economics, and quietly decided everything downstream.

10 / DECISIONNawNaw

Sell time and convenience, not price

The constraint

The moment you teach this customer to hunt for discounts, you start a fight the margins can't win.

The call

Lead with speed and proximity everywhere; the home screen's top line shows the delivery time and store distance, not a sale banner. The customer is paying for speed, so the product talks about speed.

11 / DECISIONNawNaw

Surface the want; don't make people hunt

The constraint

For the youngest, most frequent shoppers most orders are unplanned. They open the app because they remembered they're out of something, not with a list, so an empty search box is the wrong tool.

The call

The home screen shows aisles, not products: each aisle a 2x2 peek of what's inside. You read the whole store in a glance and tap straight to it, while the catalog gently tempts the impulse buyer.

12 / DECISIONNawNaw

Optimize for monthly customer value, not the biggest basket

The constraint

The easy way to lift average order value is to discourage small orders, but small frequent orders are exactly the habit that keeps a customer coming back. Push too hard and you win the order while losing the customer.

The call

Design toward what a customer is worth over a month, order size and frequency together. The cart nudges baskets upward gently instead of bullying them.

13 / DECISIONNawNaw

Offer an account, never force one

The constraint

Asking who someone is should never stand between them and the thing they came to buy. A sign-up wall at the door kills speed.

The call

Guests shop straight past the sign-up screen. Identity is collected only at the one moment it matters, placing the order, and only the minimum a delivery needs (phone, name, address), as a sheet over checkout so no one loses their place.

14 / DECISIONNawNaw

The wait is part of the product

The constraint

The fifteen minutes between paying and opening the door is where the promise either feels kept or doesn't. It is not dead time to hide behind a spinner.

The call

Show the order moving through real stages (accepted, packed, on the way) with a live countdown on screen, making the brand's whole claim visible and accountable.

15 / DECISIONFlow

The mark lives inside the wordmark

The constraint

Period-care branding defaults to either clinical or overly cute, and neither earns trust.

The call

A single leaf-droplet mark built into the wordmark around Cheerful Violet, carrying the system without leaning either way.

16 / DECISIONThis site

The site is the proof

The constraint

Claiming to be a product designer and engineer is cheap; anyone can write it on a page.

The call

Hand-coded this site end to end (Next.js, Tailwind, GSAP) and labeled the stack, so the container is itself the evidence.