Live product · no user testing yet

Live with real prices. No user testing yet.

Open Vesper

Independent product · Product design & development

Two kinds of money.
One honest page.

A checking account is worth what the bank says it is worth. Half a Bitcoin is worth whatever the last trade said, and that number is stale by the time it finishes rendering.

I designed and built Vesper to keep those facts apart: a personal wealth view in React Native + Expo that shows what you hold, what you paid, and where every price came from.

The current desktop overview, using the product’s sample book. The balance and chart sit beside the holdings; the price ticker stays in view.
Vesper overview with the new greeting, net worth and return, holdings pane, and bottom price ticker

Vesper overview with the new greeting, net worth and return, holdings pane, and bottom price ticker

Two kinds of money
Stated balances and market-valued holdings remain distinct.
Three price states
Live, cached or indicative. Every quote carries its source.
React Native + Expo
One set of components, arranged for a desktop or a phone.

A balance is a fact.
A price has an age.

Most dashboards flatten both into one list. A failed price request can then make a perfectly valid balance disappear. In Vesper, the difference survives from the data model to the screen.

Stated balance

What somebody told you it is.

Checking, savings, a retirement account or a credit balance holds its stated value until you change it. It contributes nothing to the day’s market movement.

Marked to market

What the latest quote says.

A crypto position is quantity multiplied by a price, with a timestamp and a source. Losing the feed changes its status; it does not erase the position.

The distinction appears on each allocation row. The chart also explains that crypto history is market-derived while stated balances are held flat.
Vesper analytics with a net-worth chart and allocation rows labelled stated balance or marked to market

Vesper analytics with a net-worth chart and allocation rows labelled stated balance or marked to market

A liability is not a holding.

A credit balance subtracts from net worth but stays out of the allocation denominator. Only market-valued positions move the daily figure.

Then it reads the book back.

Analytics names the strongest and weakest positions and flags concentration. The narration uses the same figures as the charts: a small move stays quiet, a loss is never rounded into cheerful copy, and stated balances are not described as a flat market.

Every number says
where it came from.

CoinGecko’s public feed can be rate limited. Vesper keeps the last usable quote, labels it cached, and falls back to indicative values only when it has no confirmed quote to use.

The difficult bug was a label that disagreed with its own explanation. A browser can reject a rate-limit response before the app can read its status. The fix was to label any previously live quote that could no longer be confirmed as cached.

Live

A current quote from the price feed.

Chase CheckingStated balance
$4,500.00
BitcoinMarked to market
$34,221.60
Net worth $38,721.60

Interactive illustration, not a live account. Change the price source: the stated balance stays fixed, and an unavailable quote never becomes zero.

Under the chart

A substitute chart is labelled “Indicative shape” when market history is unavailable.

Beside the alert

Price alerts only run while the app is open. There is no server watching after the tab closes.

Before the swap

The screen explains that nothing is traded. The action updates the local book and its accounting.

React Native + Expo.
One codebase. Two shapes.

Views, Text, Pressable and ScrollView throughout, exported to the web with Expo. One layout breakpoint turns the desktop’s two-column workspace into a phone view.

The same holdings, charts and sheets reflow. On a phone, navigation moves to the bottom and the main action rises out of the tab bar, within reach of a thumb.

Overview: the whole book, before the detail.
Vesper mobile overview with net worth, return and allocation inside a phone frame

Vesper mobile overview with net worth, return and allocation inside a phone frame

Crypto: a list with a selected position below it.
Vesper mobile crypto holdings and selected Bitcoin inside a phone frame

Vesper mobile crypto holdings and selected Bitcoin inside a phone frame

One asset: price history and the position behind it.
Vesper mobile Bitcoin detail with price, chart and range controls inside a phone frame

Vesper mobile Bitcoin detail with price, chart and range controls inside a phone frame

A selection with
a consequence.

The token beside the list is a real 3D object. Selecting a holding changes its glyph, metal and readout together. The raised mark comes from the same SVG path as its flat icon, so the identity stays consistent at every scale.

Bitcoin selected: the position, quote and token agree.
Vesper desktop crypto screen with Bitcoin selected and a gold Bitcoin coin

Vesper desktop crypto screen with Bitcoin selected and a gold Bitcoin coin

Ethereum selected: the same layout, one row later.
Vesper desktop crypto screen with Ethereum selected and a violet Ethereum coin

Vesper desktop crypto screen with Ethereum selected and a violet Ethereum coin

What you have.
What you made.

The first version could tell you what a position was worth, but not what you had made on it. Adding cost basis turned a balance viewer into a portfolio.

Positions without a known cost stay out of the return calculation. Treating missing cost as zero would manufacture a gain the app cannot justify.

The position shows its value and what it cost. The available actions are to correct or remove the holding; Vesper holds no keys and places no orders.
Vesper Bitcoin detail with current value, cost, return and editable holding fields

Vesper Bitcoin detail with current value, cost, return and editable holding fields

A swap carries the accounting with it.

Exchanging one local holding for another records a disposal and an acquisition. The preview shows the rate, fee, realised gain and amount received before the action. A realised gain then stops moving with the market.

A preview from the sample book. Nothing was traded or submitted for this capture; the screen makes the consequences visible before confirmation.
Vesper exchange preview for 0.1 Bitcoin into Ethereum showing rate, fee, realised gain and amount received

Vesper exchange preview for 0.1 Bitcoin into Ethereum showing rate, fee, realised gain and amount received

Six tabs.
One grammar.

The overview, analytics, crypto, watchlist, exchange and wallet reuse the same surfaces, type hierarchy and source labels. Everyday actions stay close to the thing they change.

Watch: follow a token without adding it to the book.
Vesper mobile watchlist with search and follow controls inside a phone frame

Vesper mobile watchlist with search and follow controls inside a phone frame

Wallet: personal details and positions in one place.
Vesper mobile wallet with profile, portfolio totals and token cards inside a phone frame

Vesper mobile wallet with profile, portfolio totals and token cards inside a phone frame

One raised button, four specific actions.
Vesper mobile action sheet offering add asset, swap, price alert and transfer inside a phone frame

Vesper mobile action sheet offering add asset, swap, price alert and transfer inside a phone frame

The desktop watchlist leaves room for the catalogue and its alerts.
Vesper desktop watchlist with searchable token catalogue and price-alert area

Vesper desktop watchlist with searchable token catalogue and price-alert area

An alert names its limits alongside the controls.
Vesper price-alert sheet with token, direction and price controls and a tab-open disclosure

Vesper price-alert sheet with token, direction and price controls and a tab-open disclosure

Your book.
Your way out.

A dashboard displaying someone’s net worth owes them a plain explanation of where the numbers live. The wallet puts disclosures, motion preferences, activity, and CSV import and export in the product itself.

No bank connection
Accounts begin as editable sample data.
No keys or orders
Holdings are records, not a connected crypto wallet.
No account server
The book stays in this browser; public prices come from CoinGecko.
A visible explanation of the product’s boundaries, with a way to take the data out again.
Vesper wallet disclosures, reduced-motion preference, CSV import and export, and local data controls

Vesper wallet disclosures, reduced-motion preference, CSV import and export, and local data controls

A door,
not a toll booth.

Opening directly onto someone else’s dense portfolio left too much unexplained. The entry now introduces the product before the numbers.

A short, skippable welcome explains what Vesper does, invites a name, and offers a sample book or an empty one. The mark’s entrance waits for a deliberate tap instead of dismissing itself on a timer.

The first interaction sets the tone: a deliberate entry into a personal view.
Vesper entry screen with its V identity, greeting and Enter action

Vesper entry screen with its V identity, greeting and Enter action

Live, and clear about
what comes next.

Vesper is a working independent product. Valuation, price history, swaps, imports and narration are plain functions tested separately from React, because plausible but wrong arithmetic is harder to notice than a crash.

The next step is watching someone read their own numbers: whether the stated-versus-market distinction makes sense, and whether they notice the source label when it matters. No user research, adoption or time savings have been measured yet.

Open Vesper

Explore Kinset, a training journal for the moment between sets.

Available for my next opportunity

Let’s build something people love using.

Looking for a product designer who can take an idea from the first sketch to a working experience? Let’s talk.

Designed and developed © 2026 Erik Rodríguez