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

Requestrecipient's view

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.

Discipline
Web and mobile
Year
2025
Stack
  • TypeScript
  • React
  • Express
  • Node

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

Requestrecipient's view

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.

A web recreation of the request flow: a claim moving from pending to settled, with the recipient signing at the end.

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.

  1. Send, request and settle flows with client-held keys

  2. Authentication, backend logic and UI built end to end

  3. Shares its crypto layer with the file-storage project

  4. 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

  1. 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.

  2. 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.