Built with React Native + Expo
Live product · no user testing yet
Live with real prices. No user testing yet.
Open VesperBuilt with React Native + Expo
Live product · no user testing yet
Live with real prices. No user testing yet.
Open VesperIndependent product · Product design & development
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.
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.
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.
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.
A credit balance subtracts from net worth but stays out of the allocation denominator. Only market-valued positions move the daily figure.
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.
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.
A current quote from the price feed.
Interactive illustration, not a live account. Change the price source: the stated balance stays fixed, and an unavailable quote never becomes zero.
A substitute chart is labelled “Indicative shape” when market history is unavailable.
Price alerts only run while the app is open. There is no server watching after the tab closes.
The screen explains that nothing is traded. The action updates the local book and its accounting.
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.
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.
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.
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.
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.
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.
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.
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 VesperExplore Kinset, a training journal for the moment between sets.
Product design & development