Sovren · Design and product lead · Pay

I reversed a wallet from addresses to people, and four surfaces inherited it.

Pay is Sovren’s non-custodial wallet on mobile and web, and the rail every tip, order and payout in the ecosystem settles on. The version I inherited put a hexadecimal address where a person’s name belongs.

RoleDesign and product lead, owner end to end. The vision, the scope and the quality bar were mine; I led the design with two other designers
OwnedThe money components, and the rules the surfaces using them follow
When2024 to now, with the wallet layer rebuilt on Privy in 2026
Built onThe SOVR chain, non-custodial, with an embeddable SDK
Stickiness
35%DAU / MAU
Monthly actives who come back daily. Not a growth rate, and not a share of everyone who ever registered.
Access kept
0.2%lost it
Of all users, ever, to a forgotten seed phrase. In a non-custodial wallet that means the money, with nobody to call.
On the same components
$40KMRR
Node hosting, shipped without one new component drawn for it.

One in five hundred.

Under 0.2% of all users ever lost access to a seed phrase. The rest kept their keys.

The Pay web wallet: one total balance in dollars above a list of assets and live prices, with a persistent request and send panel down the right side carrying an amount, a wallet picker, a contact picker and a memo field.
  1. 1One balance, in dollars, assets beneath it.
  2. 2Send and request are a panel, not a page.
  3. 3You pick a contact, not an address.
Shipped product. On a desktop the wallet becomes a workspace, because a person paying at a desk is doing it alongside something else.
01 · A wallet for two kinds of user

A wallet for people who had never held one, that people who had would not quit.

The objective was bigger than an app: unlock funding and partnerships for Sovren through blockchain and cryptocurrency, with a clear path to integrating fiat later. The product that had to carry it was a non-custodial wallet on the SOVR chain, mobile and web, shipped quickly. It had to be simple enough to be somebody’s first wallet, social rather than address-shaped, and embeddable, so other products in the ecosystem could carry money without rebuilding it.

That is two audiences who want opposite things, and the design problem is the gap between them. A first-time owner needs the vocabulary explained. Somebody who already holds keys will leave a product that explains it to them.

02 · Interviews with both groups

I interviewed both, and each one broke a different screen.

I ran more than thirty interviews, and separately sat with people from both groups through the wallets they already had. What came back was not two personalities, it was two different screens failing.

Who
Where it broke
What changed
Her first wallet

Sixty years old, an older phone, no crypto experience at all. “Seed phrase” is not a term she has ever met.

Onboarding assumed a vocabulary she did not have. A recovery phrase is handed over to keep safe before anything explains what it recovers, and a hexadecimal address is a wall she will not walk through.

Explanation at the point of confusion. A word that needs defining is defined inside the step that uses it, never in a help centre nobody opens. Onboarding continues by email after she has closed the app.

Already holds keys

Reads the chain, verifies before sending, and will abandon a wallet that talks down to her.

A person-first send hides the address she wants to check with her own eyes. Hand-holding on every step reads as a toy.

The address path stayed, in full. The default moved and nothing was removed. Help is available rather than compulsory, which is the only version both people can use.

Two segments shared the wallet. The interviews did not produce personalities. They produced two lists of screens that failed for opposite reasons.
The first screen of onboarding: an illustration of a phone, a card and a wallet, the Pay name, the line Manage and Use Your Digital Rewards, and a single Get Started control. The wallet home screen: a total balance of $1830.50 in dollars with the day's change beneath it, three controls for send, receive and stake, then each asset listed with its dollar value first and its token amount underneath.
  1. 1The first screen names no wallet vocabulary at all.
  2. 2What she lands in leads with dollars. Tokens sit underneath.
Shipped product. The denomination she already thinks in is the one on top. Nothing is hidden, it is ordered.

Under 0.2% of all users ever lost access to a forgotten seed phrase. In a non-custodial wallet, losing the phrase means losing the money with nobody to call, so that is the number the onboarding was built to move, and the one I would defend first.

03 · People, not addresses, in send

I changed the recipient component, not the send screen.

Send identified the person you were paying by their hexadecimal address, and told you what you could spend as a token count. That is what a wallet looks like when the people who built the chain draw it. It is also what a form looks like to somebody afraid of getting it wrong.

The killed send screen, on a dark field: no person anywhere, a full hexadecimal wallet address under Send To, the token amount leading and its dollar value printed small beneath it. The shipped send screen, on a light field: the recipient shown with a photograph and an at-handle, the amount large with its dollar value beneath, and a spendable balance in dollars carrying a Max control.
  1. 1Left, the address is the person. Right, the handle is.
  2. 2The spendable balance became a dollar figure and a Max.
  3. 3Both keep the keypad. What changed is the vocabulary.
Shipped product, both eras. Killed on the left, shipped on the right. Same keypad underneath; what changed is the vocabulary the screen speaks.

The address did not disappear. On the review step in the rebuilt wallet, it sits beside the network, the fee and a warning that a send can’t be reversed.

Running code, not a picture. Pick a person, type an amount, send it. I rebuilt the shipped flow in HTML, CSS and JavaScript so the recipient component, the dollar-first amount and the spendable balance can be tried, not described. Invented contacts, fixed rate.
One component, four surfaces The recipient component sits inside the wallet SDK, above four surfaces that use it: the wallet, a live room, a chat thread and a storefront. The last three are their own platforms, and all four inherited the reversal. The recipient component Address‑first, reversed to person‑first The wallet A live room A chat thread A storefront Send, receive, confirm Tipping a creator Paying a person Checking out Inside the SDK Its own platform Its own platform Its own platform One change, made once, in the thing all four of them use. Each integration met its host platform: its design system, its APIs, its account IDs.
  1. The walletInside the SDKSend, receive, confirm
  2. A live roomIts own platformTipping a creator
  3. A chat threadIts own platformPaying a person
  4. A storefrontIts own platformChecking out
Four surfaces share the recipient component. The wallet ships as an SDK, and the other three are separate platforms that embed it and move the same balance, which is the reason the reversal had to happen below the screen rather than on it.

Where the change happened is the part that matters. Address-first was a property of the recipient component, the shared piece inside the SDK, so reversing it once reversed a tip in a live room, a payment inside a chat thread and a storefront checkout. Each of those is its own platform, and embedding the wallet meant meeting every one on its own terms: its design system, its APIs, its account IDs and user information. I worked with each of those teams to land it. Designing the component was half the job; designing it to survive four platforms without breaking any of them was the other half.

The argument was not about taste. Address-first is precise, honest about what is actually happening, and what the users already there understood. Person-first is a bet on the people who had not arrived yet, made against the people who had. I made that call, and then spent the time it takes to land one: product, engineering, and the designers drawing the surfaces it reached.

04 · Node hosting and peer-to-peer

Node hosting shipped without one new component.

Node hosting shipped on the components that already existed. Not one new component was drawn for it. It runs $40K MRR, and the design cost of that revenue was close to zero.

The node hosting screen: total node licences against active nodes with an offline warning, a card per blockchain showing active nodes and a node strength meter, an unstarted chain with its entry price, and a hosting plans table listing usage, renewal date, amount, payment method and status.
  1. 1Plans priced per chain, renewed monthly.
  2. 2What is running and what is offline, counted separately.
Shipped product. Every component on this screen already existed. The feature is the arrangement.

The components it shipped on, the rules they follow and the sixteen checks that hold them together are written up in full: the design system this site is built on, which is the same architecture, documented against its own gaps.

Peer-to-peer payments took the same route. They shipped in USDC and USDT. Fiat integration is in progress, and tap to pay with USDC is being added now.

05 · Session timeout, 15 to 60 minutes

Fifteen minutes was the wrong timeout for this wallet.

Security was the posture from the start, so the app signed people out after fifteen minutes of inactivity, the way a banking app does. It caused friction immediately, and it was worst for exactly the person section 02 is about, who moved slowest through every screen and got thrown out mid-task.

The reasoning was wrong in a specific way. No transaction happens without the Wallet Key. The session was never what stood between an attacker and the money, so a short timeout bought almost nothing and charged for it on every screen.

Desktop went to sixty minutes. Mobile stays signed in for thirty days, because the device carries its own lock and the Wallet Key still gates every movement of money.

06 · The 2026 rebuild on Privy

In 2026 I rebuilt the wallet layer on Privy, Stripe’s wallet stack, in four weeks against a six-month estimate. Read the rebuild →