Rebalancer
Designed and built solo, from concept to App Store.

Problem & Context
I rebalance crypto myself, and the pair I actually care about is almost never one an exchange will show me. Everything is priced against USDT.
If I want to know where SOL stands against XRP, no exchange and no wallet treats that as something I can keep on a list and watch.
Roadmap
I owned every layer of this one — concept, product design, the iOS app, the backend, the servers, the APIs and the push notifications — built with Claude Code.
- 01
Research
Competitor analysis, reviews on the App Store and YouTube, Telegram channels, interviews with the crypto community. Nobody treated an ALT/ALT pair as something you could keep and watch.
Interviews and competitor review - 02
Prototype
Several concepts ran side by side. I committed to one — the pair as the only object the app asks you to create — and cut the rest instead of keeping options open.
Concepts cut to one - 03
Testing and iteration
Two rounds through TestFlight, then reworking what testers actually stumbled on rather than what looked worth polishing.
Two TestFlight rounds - 04
Publish on the App Store
Shipping was a design decision too: what to leave out so the first version could stand on its own, and what the listing should promise.
Shipped to the App Store - 05
Analytics and post-launch research
Analytics went in to replace opinion with behaviour, and the reading of reviews and channels carried on after release rather than stopping at launch.
Analytics wired in
Research
Market analysis
| Where people look now | Any ALT/ALT pair | Kept as a pair | Ratio history | Alert on the ratio | Holdings in it |
|---|---|---|---|---|---|
| TradingView spread charts | Does it | Partlya chart layout | Does it | Doesn't | Doesn't |
| Community Pine scripts | Does it | Partlyper chart, per script | Does it | Does it | Doesn't |
| Converters — Coinbase, MetaMask and the rest | Does it | Doesn't | Doesn't | Doesn't | Partlyone amount, typed in |
| Portfolio trackers | Doesn'tfixed bases | Doesn't | Partlyof the portfolio | Partlyon the USD price | Does it |
| Rebalancer | Does it | Does it | Does it | Does it | Does it |
User personas — 3 groups
Crypto investor
WhoHolds several alts and moves between them on the pair's ratio, not the dollar price.
PainNo exchange or wallet shows ALT/ALT directly — you read two USDT prices and divide them yourself.
Experienced rebalancer
WhoFollows the ratio by hand — a spreadsheet, or arithmetic in their head — and keeps coming back to check.
PainIt all rests on remembering to look. Nothing watches the number, so the moment can pass unnoticed.
Technical trader
WhoTechnical enough to chart a spread in TradingView or write their own indicator.
PainThe workaround never becomes a product: TradingView advises against alerts on spread charts, and a script needs an account and setup.
User flows — 6 flows
- Off-appApp Store listingFive screenshots and a description — no trial, no preview
- DecisionDoes this solve my problem?NoEndNever installedThe listing is the entire pitch
- Yes
- ActionInstall
- Inside the app
- SheetDisclaimerA notice with one button — nothing to answer
- ScreenEmpty watchlistOne line, one button, no tour
- DecisionObvious what to do here?NoEndLeaves with nothingNothing on screen explains a ratio
- Yes
- ActionTap Add pair
- SystemA live pair appearsSeeded and already tracking, not a blank form
- ActionSwap in your own coins
- DecisionWorth keeping?
-
No
- EndDeletedStraight back to the empty state
Yes- EndKeptAn alert on it is the next thing to do
- ActionTap +From the watchlist
- SheetToken selectorSearch the catalogue
- ActionPick base
- ActionPick quote
-
If picked the wrong way round
- ActionSwap sidesSame pair, reversed
- EndPair is liveTracked from that moment
Two picks, no form. The pair is the only thing the app asks you to create, so I kept it to two decisions — and made the sides swappable instead of expecting people to get the order right first time.
- ScreenPair detailOpened from the watchlist
- ActionNew alert
- SheetPrefilled at the current ratioOpens on today's number
- DecisionNotifications allowed?
-
Not yet
- SystemPermission bannerAsks once; the alert is still saved
Yes- ActionSet the threshold
- EndAlert armed
The prefill is the whole design. An empty field asks “what number?” — prefilled with where the ratio sits right now, it asks “how far from here?” — which is the question I always arrived with myself.
The permission branch saves the alert either way. Making the notification prompt a precondition would have meant losing the thing the person came to do.
- ScreenPair detailSimulator lives here, not in the list
- ActionEnter amountsWhat you'd move
- DecisionMore than two steps?
-
Within Free
- EndSee the outcomeBefore committing to anything
Beyond Free- SheetPaywallPro: unlimited chain steps
The simulator answers “what would this do” without doing it. Free stops at two steps in a chain; deeper chains are where Pro begins — I put the paywall where the tool starts doing planning work, not at the front door.
- ScreenCoinsIts own tab
- ActionEnter what you holdEdited in place, hideable
- SystemPrices move
- EndTotals recalculateIn the denomination you choose
The only flow here with no branch, and that's the point: Coins is a ledger of what you own. Anything that behaves like an exchange rate belongs to the simulator — keeping those apart is what stops the app from implying it can trade for you.
- SystemThreshold crossedRatio reaches your number
- SystemPush deliveredEven with the app closed
- ScreenOpen and checkChart, holdings, simulator
- Outside the app
- Off-appExecute on the exchangeRebalancer never places the order
This is where I drew the product's edge. Rebalancer tells you the moment arrived and shows you the numbers; the trade happens on your exchange. Not a missing feature — a deliberate limit that keeps the app clear of custody, keys and order execution.
Prototype
There was no Figma stage. I built the prototype with Claude Code, iterating on a real phone — screens and system decided together.
The alert is the product, and an alert has to arrive with the app closed — that one requirement pulled a backend behind a one-person design project. Price sources that answer a phone refuse a data centre, iOS background refresh cannot be trusted, and an alert that has fired must not fire again: every one of those is a server problem, not a screen.
Testing
Two rounds through TestFlight, on other people's phones. Each flow gave up one thing I had assumed, and each one changed the build.
Creating a pair
- Found
- Nobody could see how to enter the amounts they hold from the watchlist.
- Changed
- A prompt button on the watchlist, so holdings go in without leaving the screen you are on.
Living with the watchlist
- Found
- The first thing people reached for was reordering the cards.
- Changed
- Press and hold to drag — the order of the list is the user's, not mine.
Pair detail and the simulator
- Found
- People expected the app to remember their holdings and carry them into the simulator.
- Changed
- A MAX button that fills in the saved holding, so the simulator starts from real numbers.
Hitting the free limits
- Found
- The paywall landed out of nowhere and read as a wall.
- Changed
- A plain note that the free limit is reached first, with a way to read about Pro — so going further is a choice, not an ambush.
Publish on the App Store
The listing had to sell the same idea in every storefront, so the cards lead with the pair — not the feature list.
Analytics and post-launch research
Analytics is in place and the reading of reviews and channels carries on. The question it has to answer first: whether a first alert leads to a second — the signal that it has entered someone's routine.
- Whether a first alert leads to a second
- Which flow people stop at
- Whether the free limits sit in the right place
It's live. One person took it from concept to the App Store — design, app, backend, delivery.
What it settles into in daily use is the next thing to measure.
09 — ReflectionThe backend was bigger than I scoped. Next time I’d size the invisible parts first.
With AI I shipped end-to-end what would take a team — but only the parts I understood.