Inspiration
We kept coming back to one stat: on finance quizzes, way more women pick "I don't know" than men do, but when you take that option away, they get it right just as often. That's not a knowledge gap, that's an escape hatch. Every trading app we looked at hands you the answer on a silver platter. They score you, time you, scare you with jargon, bury the risk in fine print. So we built the opposite, a model with no "I don't know," no score, no timer, and no loss shown without a next step.
How we built it
Backend is Python + FastAPI. The trading math (sim_engine.py) is written as pure functions with no file reads, no clock, no random calls so we could test it without even running a server. Stop price is just
$$\text{stop_price} = \text{avg_price} \times (1 + \tfrac{\text{pct}}{100})$$
and the safety net kicks in once you're down 8%:
$$\frac{\text{close} - \text{avg_price}}{\text{avg_price}} \leq -8\%$$
After the safety net sells, we also compute what would've happened if it hadn't:
$$\Delta = \sum \text{qty} \times (\text{price_now} - \text{fill_price})$$
and we show that number either way, even when it makes the safety net look bad. Didn't want to build a feature that only ever brags about itself.
Frontend is plain JS, no framework, no build step. Big rule we stuck to: the browser never does math with money. Every click hits the server, server sends back the full new state, browser just redraws. Keeps the screen and the server from ever disagreeing.
All the hints/dialogue/tier rules live in JSON, not in the code, so we could tweak wording without touching Python or JS. Prices are fully made up (six fake companies, generated with a fixed seed so the same demo moment happens the same way every time), and we say so on screen. Whole thing runs offline with no CDN, no fonts loading from the internet because we didn't trust venue Wi-Fi for a second.
192 tests, plus a browser test suite that actually clicks through the app.
Challenges we ran into
We shipped a rule that fought our own idea without realizing it. Early on, every hint had to lead with the downside, enforced by a test. Then we actually thought about it: if hesitation is the problem, hammering "here's what you could lose" on every single click just creates more hesitation. We had a test forcing us to do the exact thing our own research said was the issue. Had to rewrite the rule and the tests behind it.
Our price data made the story impossible to win. All our original fixtures were built to guarantee a big drop, because the old version of the app was about teaching loss. Turns out none of them ever gained more than ~4%, so the in-story wager (grow $100 by 10%, win a wish) literally couldn't be won by anyone. Had to build a new price path just so winning was actually possible.
Also had to build a check that fails the build if the coach's numbers ever stop matching the actual price data because the coach says exact dollar amounts on screen and it would've been really bad to have those go stale mid-demo.
What we learned
A rule can sound responsible and still work against the thing you're trying to fix we only caught ours by going back and checking it against our own reasoning, not by staring at code. Also, the best teaching moment in the whole app wasn't any line of dialogue, it was just math: showing what the same market drop does to three different position sizes side by side. That taught the lesson faster than anything we wrote.
Log in or sign up for Devpost to join the conversation.