Inspiration
Every investor believes they would have held through 2008. Almost nobody did.
The gap between how people think they behave under a drawdown and how they actually behave is the most expensive gap in personal finance, and it is invisible until real money is on the line. By then it is too late to learn anything cheaply.
HistoX closes that gap with virtual capital. You find out what you do when the tape is falling and you do not know when it stops, before it costs you anything.
What it does
You start already invested, in a real historical crash that has already begun. You are not told which crash it is, what you are holding, or what year it is. The tape rolls forward, and at scripted moments it stops and asks one question: hold, sell all, or buy the dip. There is no timer.
Afterwards the Debrief scores your discipline out of 100 against what price actually did next, breaks every call down with its real outcome, and compares this run against your earlier ones: how often you sold into a fall before, how often this time, and how deep the fall usually was when you did.
Seventeen playable crashes, across eight US equity events, seven Indian market events and two crypto cycles. Black Monday 1987, the dot-com collapse, the 2008 financial crisis, Ketan Parekh 2001, demonetisation, COVID, the crypto winter, SVB. Every price, date and historically optimal move is computed from a real price series by an importer in the repository. Nothing is typed by hand.
Three more pillars sit alongside the simulator:
Daily Pivot, one sealed call a day on whether Bitcoin closes above a strike, set at 09:00 IST and resolved at 17:00 IST against Binance.
Time Machine, a what-if compounding calculator with a shareable result card and no login.
Live Markets, a read-only watchlist across US, Indian and crypto markets where every price displays its source and whether it is delayed.
And a Nerve Profile, a five-axis read of how you trade under stress.
No real money anywhere. Every position is virtual, the app cannot place a trade, and Daily Pivot points have no cash value.
How we built it
Flutter and Dart, one codebase for iOS and Android, around 26,000 lines in lib/. Riverpod 3 for state. A custom CustomPainter chart engine with pan/zoom, a crosshair, four chart types, six indicators and three drawing tools, shared by every screen that draws prices. shared_preferences for progress, scores and run history.
One simulator engine. Every campaign level, Endless window and Custom Simulation runs through it, because a level is data rather than code.
RevenueCat powers HistoX Pro, the subscription that unlocks fifteen of the seventeen crashes and the full Nerve Profile. The app talks to the store through a single PurchasesService interface, so tests and the web demo swap it out without touching a screen. Prices come from the current offering's annual and monthly packages exactly as the store formats them. Pro is the pro entitlement, and a customer-info listener pushes renewals, expiries and purchases made on other devices to every locked screen. A build with no key falls back to an honest "store not connected" state rather than showing a price it cannot charge.
Market data is queried live and never bundled for the live pillars: Binance for crypto in real time, Yahoo for US and Indian equity with a delay.
CI runs the analyzer, the full test suite, and an offline validation pass that recomputes every level and the scoring from the shipped data and fails if the committed validation report has drifted.
Challenges we ran into
Scoring hindsight as though it were nerve. Nine of the 130 pause points are marked ambiguous in the level data, meaning price neither recovered nor fell further. Nothing read that flag, so selling at a moment the importer itself calls unanswerable scored zero and counted as a panic. Those are now reported in the breakdown and excluded from the score.
A release build that would have given every user Pro for free. With no RevenueCat key the app falls back to the unconnected store, and the paywall offered a "continue without Pro" button to everyone, unlocking all fifteen Pro levels. The only guard was "is a store connected", which in that build is exactly false. It is now refused in release builds whatever the store is doing, and proven fixed on a device rather than only in code.
An Android manifest with no INTERNET permission. Flutter only declares it in the debug and profile manifests, so a release APK could have shipped unable to reach Live Markets, the Daily Pivot, Time Machine or RevenueCat itself. A plugin usually contributes it during merge, but relying on that means a dependency change can silently kill networking in release.
Proving the campaign is not reducible to one button. Always holding averages 72 across the campaign, always buying the dip 66, always selling 21, random play 53. The shape is right, but five levels are still beatable with a single repeated action, and that is recorded as open rather than quietly reweighted.
Accomplishments that we're proud of
The audit. AUDIT_REPORT.md was written against our own code before submitting, and it names a blocker that would have handed the paywall away, a manifest that would have shipped with no network access, and five levels where a player can score 100 by tapping Hold repeatedly. That last one is still open and stated as open.
Reproducibility. tool/validation/ recomputes every level and the entire Discipline Score from the shipped data with no network, and CI fails if the committed report no longer matches. Any claim in the README can be rechecked by anyone with a clone.
Sourced numbers only. Every historical price, date and optimal move traces to a real series through an importer. Where data was not sourced, the level is hidden rather than filled in.
What we learned
That a build that looks successful can be a failed one. Piping a Gradle failure through tail made the shell report exit code zero, and a broken release build read as a working one until it was installed.
That "is the store connected" is not the same question as "is this a release build", and conflating them is how a paywall gets given away.
That honesty is cheaper than polish. Writing down the five levels that can be beaten by tapping one button was more useful than tuning the score until the problem disappeared.
What's next for Histox
The Daily Pivot's shared crowd backend. The crowd split is currently a labelled local placeholder, and the app says "too few votes" rather than inventing a percentage.
The five levels where always-Hold scores 100, by adding a deeper pause point to each where the data supports a sell, rather than reweighting the score to manufacture difficulty.
Re-importing the equity levels from a redistributable source. Yahoo's terms forbid redistribution and every bundled level is currently marked licence unverified, which blocks a store release.
Real-time NSE and BSE through an optional Kotak Neo broker connection, which is structurally in place but unfinished.
Built With
- binance-api
- custom-painter
- dart
- flutter
- github-actions
- revenuecat
- riverpod
- shared-preferences
- vercel
- yahoo-finance
Log in or sign up for Devpost to join the conversation.