Learn to invest by rehearsing

Understudy is a practice brokerage account for beginners. Orders fill, partially fill or get rejected with a plain-English reason, time only moves when you move it, and every idea is explained with the trade you just made.

Inspiration

I didn't take financial literacy seriously until later in life, in my early thirties, instead of in college or right out of college. Where I come from, the Bronx, NY, it isn't taught in low-income neighborhoods or to low-income families. You're only ever taught to save your money, not how to get your hard-earned money to work for you.

Sifting through articles online, and not knowing the exact steps to place an order at Charles Schwab, Vanguard or Fidelity, is already nerve-wracking enough. And it isn't only stocks: buying a first rental property, starting a business or buying a bond all come with their own steps and their own jargon. Paper-trading modes exist, but they're built for people who already trade. That's what led me to rehearsing, and to Understudy.

What it does

  • Open a practice account with an account type, a starting amount and a market scenario.
  • Place real-style orders (market, limit, stop, stop-limit) on real fund names and fictional stocks at simulated prices, and watch them fill, partially fill or get rejected, with a plain-English reason.
  • Move the clock. Nothing happens until you advance a day, a week or a month. When a dividend lands or the market drops, time stops and the app tells you what it means for you.
  • Learn in the moment. Terms like bid and ask, buying power, settlement and slippage are explained with the trade you just made. Your first ticket is three plain-English questions, and a field appears as you learn, until it's the seven-field ticket a real brokerage shows.
  • Predict, then place (new in 1.1). Once a session, before a buy limit or a sell stop goes in, you predict what happens if the price opens past your number. Your prediction only counts once the market actually tests your price.

When a limit order hasn't filled yet, the app says:

STILL OPEN

Nothing's wrong — your order is waiting.

No real money, no brokerage or bank connection, and no recommendations. Prices are simulated, and the app says so.

How it makes money. One premium entitlement on RevenueCat: Weekly ($7.99), Annual ($49.99 with a 7-day free trial) or Lifetime ($99.99, one payment). Stocks is free, with every Stocks lesson and market and limit orders. Premium adds the other three paths (projection simulators until 2.0), the crash replays and advanced orders.

How we built it

I built Understudy the way I learned to build apps at Tapcart, with Clean Architecture + MVVM. Then I came across Kyle Browning's series on modularizing Swift apps and split it into eight local Swift packages. Next I came across SQLiteData, and I went that route over SwiftData because of the complaints I'd seen from the iOS community. It keeps the simulation on the device, so you can rehearse offline. I chose Supabase because it's a relational database that goes hand in hand with SQLiteData, and it has Sign in with Apple and Google, so your progress can sync across devices.

From there it was setting up the ground rules for Claude Code and using the skills, connectors and APIs I thought fit best for a modern iOS app on the iOS 27 SDK: Swift 6, SwiftUI, and Apple Foundation Models for on-device explanations (on iOS 27, with a static fallback), with 400 tests running in Xcode Cloud on every pull request.

RevenueCat does everything transactional: a custom SwiftUI paywall on the core SDK, with the trial laid out as dates and a reminder before billing.

I designed and built the app during Shipaton, from my first commit on August 16 to the App Store on September 25, with Claude Code as my pair and one foundation package carried over from an earlier project.

Challenges we ran into

  • No honest data source. No free provider allows bundling real per-ticker price history in a commercial app. So bond funds follow the Fed's public-domain Treasury yields, equities are synthesized from calibrated statistics, and individual stocks are fictional.
  • Recasting the lead two days before launch. Every character illustration in 1.0 starred one young Latino man. That was my story, but the app isn't only for people who look like me. For 1.1 I retired him for Cue, a theater ghost light with no gender, age or ethnicity, and re-shot fifteen illustrations, the icon and the screenshots in two days.
  • Rejected once, for the screenshots. My first screenshots didn't show the app in use. I rebuilt all twelve from real captures, resubmitted the same afternoon, and it was approved.

Accomplishments that we're proud of

  • 1.0 and 1.1 both approved and live on September 25.
  • A simulator with real friction (settlement, spreads, partial fills) that still feels calm.

What we learned

  • Beginners need somewhere a mistake costs nothing.
  • Advancing time became the core mechanic. Once "nothing happens until you move the clock" clicked, every other screen got simpler.

What's next for Understudy: Investing Practice

  • Next, the retention loop: a daily rehearsal, and a ring that fills as concepts become yours.
  • Every path's lessons free, with only rehearsing the other paths in Premium.
  • Real Estate as a full practice account (2.0), priced from public FHFA and HUD data, then Bonds.

Awards we're entering

  • Peace Prize: learning financial literacy shouldn't depend on where you grew up.
  • Design Award: an order ticket that grows as you learn.
  • HAMM Award: a trial sized to how long learning takes.

Practice money · Simulated prices · Not investment advice

Built With

  • claudecode
  • foundationmodels
  • higgsfield
  • ios
  • recraftai
  • revenuecat
  • sqlitedata
  • supabase
  • swift
  • swiftcharts
  • swiftui
  • xcodecloud
Share this project:

Updates

posted an update —

1.0 and 1.1, live on the same day

1.0 went live on the App Store on September 25. I'd kept building while it sat in review, so I submitted 1.1 that morning, and Apple approved it before the day was out. The 1.0.1 fixes I mentioned last time went into 1.1 instead.

WHAT'S NEW IN 1.1

  • Meet Cue. A theater ghost light, the lamp left on so nobody walks in the dark. A new app icon and new illustrations throughout.
  • Predict, then place. Once a session, before a buy limit or a sell stop goes in, you predict what happens if the price opens past your number. Your prediction only counts once the market actually tests your price.
  • A quicker first rehearsal. Three fewer screens between opening the app and your first filled order.
  • Six fixes, including Restore Purchases telling you exactly what it found.

WHAT'S NEXT

1.2 is the retention loop: a daily rehearsal, and a ring that fills as concepts become yours.

Understudy on the App Store

Practice money · Simulated prices · Not investment advice

Log in or sign up for Devpost to join the conversation.

posted an update —

Meet Cue, and what's changed since submission

Where 1.0 stands: Understudy was submitted to the App Store on Sept 14. On Sept 17 it was rejected under Guideline 2.3.3 because the screenshots didn't show the app in use. I rebuilt all twelve from real simulator captures and resubmitted the same day, and it's back in review. Meanwhile 1.0.1 (six fixes) is out to TestFlight.

A new mascot: Cue. The original art starred one young man, which didn't fit an app meant for anyone nervous about investing. Understudy now has Cue, a theater ghost light: the single lamp a theater leaves burning on an empty stage so nobody falls in the dark. That's the whole idea of the app: rehearse in a safe-to-fail space before the real performance. Cue now appears in:

  • every illustration in the app
  • the new app icon
  • a fresh set of App Store screenshots

All of it arrives in 1.1.

Learning you can prove, not just read. Before placing certain orders, the app now asks you to predict what will happen, and the market answers. A concept only counts as learned when you've shown it in a session, or told the app you already know it. Reading about it isn't enough.

Designed next (round 41):

  • a Repertoire ring for each path
  • a Session Complete screen that names what you did, not just what you made
  • an optional daily decision drawn from your own session

No streaks, no points, and no confetti when you place a trade. The one celebration left is for learning a concept.

Under the hood: 8 Swift packages, 400 Swift Testing tests on Xcode Cloud, Swift 6 strict concurrency, and on-device Foundation Models explanations.

Every price in Understudy is simulated. It's practice, not advice.

Link: bertolabs.com/understudy

Log in or sign up for Devpost to join the conversation.

posted an update —

1.0 is still sitting in App Review, so today went to 1.0.1.

Restore Purchases was lying

It said "restored" whenever the request came back without an error — including when there was nothing to restore, and when a subscription had expired months ago. You'd tap it, get a cheerful confirmation, and nothing would unlock. It now tells you which of the three things actually happened.

Three screens were showing the wrong thing while they waited

Pick a Path drew its title, its tagline and its dock instantly, then popped the list of paths in a beat later. Your Activity showed the dashboard's frame and then cut abruptly to "nothing here yet." Both now wait until they know what to say, and fade in instead of snapping.

One of them could get stuck that way permanently under the right conditions — a header over a blank screen, with no way out. Glad I caught that one before it reached anyone.

And the app was quietly phoning the server on every single launch to ask a question it had already answered. Now it asks once.

Four small fixes, one theme: "no error" and "it worked" are not the same claim.

Log in or sign up for Devpost to join the conversation.

posted an update —

Update from Thursday, Sept. 17, 2026

Understudy has four investment paths. Stocks shipped in 1.0. Real Estate, Business and Bonds have been blocked on the same two questions since I scoped them: what do the screens look like, and where do the numbers come from?

Both closed today.

25 artboards

Ten for Real Estate, eight for Business, seven for Bonds. Real Estate gets the most because it has the most to teach — pre-approval, listings, comps, offer, inspection, closing costs, and equity over time.

The sourcing rule

This was the harder half. The problem isn't finding financial data — it's that almost none of it can legally ship inside an app binary. Case-Shiller belongs to S&P. PMMS belongs to Freddie Mac. Corporate bond yields belong to Moody's and ICE. Every one of them forbids redistribution, and shipping a binary is redistribution.

I hit this same wall for stocks back in round 24. It's why Understudy's individual stocks are fictional.

So here's the rule I settled on: real where a public-domain series exists, modeled where it must be, labeled either way, and never a third-party feed inside the binary.

  • Real estate — FHFA House Price Index (a federal work, public domain) for prices, HUD Fair Market Rents for rent. The mortgage rate is modeled: the bundled 10-year Treasury plus a documented spread.
  • Bonds — the Fed's H.15 Treasury yields, already bundled daily since 1990, plus TreasuryDirect auction results as dated anchors. Corporate and municipal issuers are fictional, priced as the matching Treasury plus a credit spread by rating.
  • Business — IRS Statistics of Income expense-to-receipts ratios, BLS establishment survival rates for the failure hazard, H.15 prime plus the published SBA 7(a) maximum spread for loans.

Every price surface in the app says whether a number is historical or simulated. Business additionally keeps its ILLUSTRATIVE chip — the grounding is what lets that chip say "grounded in public data" instead of "made up."

Also today: moved to a trunk-based git flow and tagged v1.0.0.

1.0 is still in App Review.

Log in or sign up for Devpost to join the conversation.

posted an update —

Understudy is in App Review.

Version 1.0 went to Apple on September 14 with all three products attached — Weekly, Annual with a 7-day trial, and Lifetime — all running on RevenueCat. The build in review is the one the demo video was recorded on.

What's in 1.0: a practice brokerage account with an account type, starting cash, and a market scenario; real-style orders (market, limit, stop, stop-limit) that fill, partially fill, or get rejected with a plain-English reason; time that only moves when you advance it; dividends and market events that pause the clock and explain what they mean for you; and an order ticket that starts with one field and grows as you learn. Everything is simulated, and every screen that matters says so.

Two things changed after the recording, based on playing the build end to end: the paywall no longer appears the moment onboarding finishes (Pick a Path already shows what's locked), and leaving a session is now one tap back to the path picker instead of three.

Since submitting: the repo moved to GitHub and Xcode Cloud now builds the app and runs all 358 package tests on every push. First cloud run passed today.

Next up once it's live: 1.0.1, starting with a fix so Restore Purchases tells you what it found — "Premium restored", "your subscription ended on ", or "nothing to restore" — instead of quietly doing nothing when a trial has lapsed.

Demo: https://www.youtube.com/watch?v=G3QS0Y9Gqq0

Log in or sign up for Devpost to join the conversation.

Submission history