Exhibit 03 / 03
neobank
A payment request is a claim the recipient settles, not a transfer the sender pushes.
- Discipline
- Web and mobile
- Built with
- TypeScript, React, Express
- Year
- 2025
Scroll
Nadia asks you for
RM 48.00
Dinner, Thursday
Pending your decision
The request is a claim. Until you settle it, no money has moved and nothing needs reversing; declining costs the sender a decline, not a refund.
Overview
A payment request is a claim the recipient settles, not a transfer the sender pushes.
A banking app for sending money, requesting it and settling what you owe. I built the whole thing: the screens, the authentication, the Express and Node backend behind them.
Send, request and settle, built end to end in TypeScript. A payment request here is a claim the recipient can settle, decline or ignore, rather than a transfer the sender pushes out. That keeps the step that cannot be undone on one side of the exchange.
The interface
Nadia asks you for
RM 48.00
Dinner, Thursday
Pending your decision
The request is a claim. Until you settle it, no money has moved and nothing needs reversing; declining costs the sender a decline, not a refund.
How it works
Most of the time went into the front end: three flows a person actually touches, each with four states to design, and a key model that has to stay out of sight in all of them.
Send, request and settle flows with client-held keys
Authentication, backend logic and UI built end to end
Shares its crypto layer with the file-storage project
Zero-trust principles carried through the application flow
When things go wrong
- Pendingawaiting the recipient
The claim exists and nothing has moved. The sender can cancel it at no cost, because there is nothing to reverse.
- Settledsigned
The recipient signs with their own key. That signature is the irreversible step, and it belongs to the person holding the money.
- Declinednothing moved
A decline costs the sender a decline. There is no refund path because there was never a transfer.
Decisions
Why model a request as a claim?
A transfer initiated by the sender is irreversible the moment it is made. A claim moves the irreversible step to the person who holds the money, so a mistaken request costs a decline rather than a reversal.
Where the work actually went
The interface. Three flows that each have an empty state, a pending state, a failure state and a settled state, and a key model that must never appear in any of them.