I Built "Duolingo for Chart Reading" as a Solo Dev - Here's What I Learned

# webdev# javascript# ai# beginners
I Built "Duolingo for Chart Reading" as a Solo Dev - Here's What I LearnedJoel

There are thousands of resources that teach you what a hammer candlestick looks like. Almost none of...

There are thousands of resources that teach you what a hammer candlestick looks like. Almost none of them make you actually practice spotting one in a real chart.

Reading price action is a visual skill. You can't learn it from flashcards. You learn it the same way you learn to read sheet music or spot patterns in an X-ray - through repetition with real data.

So I built CandleDojo. It gives you a real historical chart, you call the direction, and then the chart replays forward so you see what actually happened.

CandleDojo gameplay

How it works

  1. You see a frozen moment from a real BTC, ETH, or SOL chart
  2. You read the candles and call bullish or bearish
  3. The chart replays forward - instant feedback
  4. A belt system (white to black) tracks your progression across 3,700+ scenarios

No sign-up required. You can start practicing immediately.

The stack

Layer Tool
Framework Next.js 15 (App Router)
Auth + DB Supabase (Postgres + RPC)
Hosting Vercel
Styling TailwindCSS
Charts Hand-rolled HTML Canvas

I didn't use a charting library. The replay animation needed frame-level control over candle rendering, so the entire chart component is built directly on the Canvas API.

What was actually hard

The scenarios, not the code. A random slice of price data is usually flat and boring. I had to build a generation pipeline that filters for interesting price action - clear trends, reversals at key levels, recognizable patterns - and tags each scenario by difficulty level.

Difficulty balance broke retention. The first version had 87% hard scenarios. New users went on losing streaks and bounced. After rebalancing to 14% easy, 18% medium, 67% hard, session lengths went up immediately.

Round saves had race conditions. A single round completion touches XP, belt unlocks, streaks, weekly challenges, and profile stats. The first implementation was 13+ sequential database calls and took 3-5 seconds. I collapsed it into one atomic Postgres RPC function. Save time dropped to under a second.

Lessons from building solo

Ship the core loop first. I built belts, weekly challenges, streak tracking, and an admin dashboard before anyone had used the app. The only thing that mattered early was: show chart, get input, replay result. Everything else could have waited.

Distribution is a separate problem from building. I had zero audience when I launched. The product could have been ready months earlier if I'd started building in public from day one.

Talk to users before you assume. I built difficulty balancing based on gut feel. Five minutes of watching someone use the app would have shown me the problem immediately.

What's next

I'm working on adding SPY and ES/NQ futures (the trading community asked for these), a badge system, and figuring out monetization. Right now it's completely free.

If you trade, or you're curious about how the chart rendering or scenario generation works, I'm happy to go deeper on any of it.

Try it here - no sign-up needed