Portli
For beginners who want to understand orders, risk and charts before they ever consider real money. Each concept is taught in a short lesson and used straight away in a simulator with practice funds; there are no deposits, no brokerage connections and no investment advice.
- Category
- Web app
- Status
- Prototype
- Role
- Design and development
- Year
- 2026
No public version right now. Portli is a prototype.

Overview
Portli is an educational market simulator built with Expo and React Native, with a web build from the same code. Lessons lead into a paper-trading simulator that opens every learner's account with $10,000 in practice money, labelled as practice or virtual wherever it appears.
The prototype covers the whole learning loop: onboarding, a first course of five lessons, a guided first trade, market and limit orders, a trade journal, replayable scenarios and spaced review. Prices come from a deterministic practice market of fictional companies, so no invented prices ever appear under real tickers.
Sign-in and a first backup of profile and progress run on Supabase. Billing, full data sync and a public launch are not finished, and the earlier web deployment is no longer online.
What it does
Short lessons with instant feedback
Multiple-choice and numeric questions explain why each option is right or wrong, and progress feeds XP, a daily goal, a streak and a mastery level for each concept.
Paper trading with practice money
Market and limit orders on a practice market. Buys fill at the ask and sells at the bid, and each fill explains the spread in plain language. The order ticket warns before one position would take more than half the account.
A guided first trade
A lesson step places a real practice order on the simulator. In the limit-order exercise the learner sets a price, watches the order wait, and steps the market forward until it fills.
Journal and Process Score
Every fill becomes a journal entry, and a short reflection records whether the plan was followed, how it felt, tags and a note. A Process Score rates understanding, risk, planning and discipline, with the outcome weighted least.
Practice scenarios
Three scenarios replay practice-market history one candle at a time with no peeking ahead. The learner sets an intent and a maximum risk, runs the scenario, then reads a debrief.
Spaced review and skills
Concepts come back for review when their mastery says they are due, weakest first, and a Skills screen shows each concept's state with a link back to the lesson that teaches it.
Charts with honest labels
Custom SVG line charts with touch scrubbing and ranges from 1D to 5Y. Every price carries a data label such as mock, delayed or historical, and price changes use a sign and an arrow, never colour alone.
Screens
How it was built
Money as integer cents in a pure engine
All trading logic lives in pure, tested functions: validation with plain-language rejections, fills, limit crossing, and positions and realized gains built from a fill ledger at average cost. Money is stored as integer cents, and screens only render state; they never compute portfolio math.
A practice market that never fakes real prices
Market data sits behind a provider interface. The default provider is a seeded, deterministic random walk over eight fictional tickers with a spread model and market-hours awareness. A provider for delayed real quotes was also built, routed through a proxy that keeps the API key off the device, but it stays opt-in.
Restoring an account without overwriting anyone
After sign-in, a tested decision function chooses between restoring, keeping local data or asking. Progress that belongs to another account is never pushed, and before local data is replaced the server copy is fetched and validated first and a recovery copy is written.
Scoring the process, not the profit
The Process Score weights understanding and risk at 25% each, planning and discipline at 20% each and the outcome at 10%, so the app can say 'good process, unlucky outcome'. In scenarios, staying out of a bad setup when that was the plan can be the best run.
Built with
- Expo SDK 57
- React Native 0.86
- React 19
- TypeScript
- Expo Router
- React Native Web
- Zustand with AsyncStorage
- TanStack Query
- react-native-svg
- Reanimated
- expo-audio and expo-haptics
- Supabase (auth and Postgres)
- Jest with jest-expo
Want something like Portli?
Tell me what you are building and what it needs to do. rowenapichardo@gmail.com