<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Joel</title>
    <description>The latest articles on DEV Community by Joel (@candle-dojo).</description>
    <link>https://dev.to/candle-dojo</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3845154%2F62b7f12d-40de-48a6-94ef-3f10a10a152c.png</url>
      <title>DEV Community: Joel</title>
      <link>https://dev.to/candle-dojo</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/candle-dojo"/>
    <language>en</language>
    <item>
      <title>How I’m Building SEO + GEO for CandleDojo, a Chart-Reading Trainer</title>
      <dc:creator>Joel</dc:creator>
      <pubDate>Tue, 31 Mar 2026 17:09:15 +0000</pubDate>
      <link>https://dev.to/candle-dojo/how-im-building-seo-geo-for-candledojo-a-chart-reading-trainer-1kfk</link>
      <guid>https://dev.to/candle-dojo/how-im-building-seo-geo-for-candledojo-a-chart-reading-trainer-1kfk</guid>
      <description>&lt;p&gt;Hi there!&lt;/p&gt;

&lt;p&gt;I’ve been working on &lt;a href="https://candledojo.app" rel="noopener noreferrer"&gt;CandleDojo&lt;/a&gt;, a browser-based chart-reading trainer for traders.&lt;/p&gt;

&lt;p&gt;The product idea was always pretty clear in my head:&lt;br&gt;
help traders get structured reps reading historical charts, recognizing candlestick patterns in context, and improving chart-reading skill without turning practice into random screen time.&lt;/p&gt;

&lt;p&gt;But I realized something uncomfortable:&lt;/p&gt;

&lt;p&gt;the product made much more sense when &lt;em&gt;I&lt;/em&gt; explained it than when the website explained it.&lt;/p&gt;

&lt;p&gt;That is a problem for normal SEO, and it is also a problem for GEO.&lt;/p&gt;

&lt;p&gt;If someone searches Google for a &lt;strong&gt;candlestick practice tool&lt;/strong&gt;, a &lt;strong&gt;chart-reading trainer&lt;/strong&gt;, or a &lt;strong&gt;way to practice price action&lt;/strong&gt;, the site needs to make that obvious.&lt;/p&gt;

&lt;p&gt;And if someone asks ChatGPT, Claude, Perplexity, or Google AI something like:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;what’s a good tool for practicing chart reading?&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;then CandleDojo needs to be understandable enough to be suggested as an answer.&lt;/p&gt;

&lt;p&gt;So I started rebuilding the public side of CandleDojo around those goals.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fxywo5uamrdgsn6a9c57x.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fxywo5uamrdgsn6a9c57x.png" alt="CandleDojo tools hub with chart-reading assessments and practice diagnostics" width="800" height="611"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  Why I cared about SEO and GEO
&lt;/h2&gt;

&lt;p&gt;At first, most of the discoverability was basically brand-driven.&lt;/p&gt;

&lt;p&gt;That means if someone already knew &lt;code&gt;CandleDojo&lt;/code&gt; or typed &lt;code&gt;Candle Dojo&lt;/code&gt;, they could probably find it.&lt;/p&gt;

&lt;p&gt;But that is not the real challenge.&lt;/p&gt;

&lt;p&gt;The real challenge is showing up for the kind of searches people use when they do &lt;strong&gt;not&lt;/strong&gt; know your product yet:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;candlestick practice tool&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;chart reading trainer&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;how to practice price action&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;trading replay simulator&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;bar replay vs paper trading&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;best way to practice chart reading&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That is the SEO side.&lt;/p&gt;

&lt;p&gt;The GEO side is slightly different.&lt;/p&gt;

&lt;p&gt;For me, GEO is not about stuffing “AI” everywhere.&lt;br&gt;
It is about making the site easier for generative systems to classify, summarize, and recommend.&lt;/p&gt;

&lt;p&gt;In other words:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;what is this product?&lt;/li&gt;
&lt;li&gt;who is it for?&lt;/li&gt;
&lt;li&gt;what problem does it solve?&lt;/li&gt;
&lt;li&gt;when should it be recommended instead of something else?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I wanted CandleDojo to answer those questions much more clearly.&lt;/p&gt;




&lt;h2&gt;
  
  
  What CandleDojo actually is
&lt;/h2&gt;

&lt;p&gt;This was the first thing I had to fix.&lt;/p&gt;

&lt;p&gt;I stopped assuming the branding alone was enough.&lt;/p&gt;

&lt;p&gt;So instead of leaving the product too abstract, I started being much more explicit about the language on public pages.&lt;/p&gt;

&lt;p&gt;CandleDojo is now described more clearly as:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;a &lt;strong&gt;chart-reading trainer&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;a &lt;strong&gt;candlestick practice tool&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;a product for &lt;strong&gt;price action practice&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;a way to train with &lt;strong&gt;historical charts and structured reps&lt;/strong&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That sounds simple, but I think it matters a lot.&lt;/p&gt;

&lt;p&gt;Search engines do better when the product category is clear.&lt;br&gt;
LLMs also do better when the product can be placed into a clean mental bucket.&lt;/p&gt;

&lt;p&gt;If the site only sounds clever or branded, it is harder to rank and harder to recommend.&lt;/p&gt;

&lt;p&gt;If the site clearly says what it is, the odds get much better.&lt;/p&gt;




&lt;h2&gt;
  
  
  What I changed on the site
&lt;/h2&gt;

&lt;p&gt;The biggest shift was structural.&lt;/p&gt;

&lt;p&gt;I stopped treating public pages like isolated marketing pages and started treating them like a real content system.&lt;/p&gt;

&lt;p&gt;I split the public surface into clearer sections:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fbmptldfvukbiwi8dnm4t.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fbmptldfvukbiwi8dnm4t.png" alt="A CandleDojo guide page targeting chart-reading practice intent" width="800" height="611"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;/guides&lt;/code&gt; for educational and problem-aware content&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;/patterns&lt;/code&gt; for glossary-style candlestick pattern pages&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;/vs&lt;/code&gt; for comparison intent&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;/tools&lt;/code&gt; for interactive assessments&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;/insights&lt;/code&gt; for first-party research and reporting&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;/newsletter&lt;/code&gt; for owned audience growth&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That gave each page type a more specific job.&lt;/p&gt;

&lt;p&gt;For example:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;a &lt;strong&gt;guide&lt;/strong&gt; can target questions like “how to practice price action”&lt;/li&gt;
&lt;li&gt;a &lt;strong&gt;comparison page&lt;/strong&gt; can target high-intent searches like “CandleDojo vs TradingView Replay”&lt;/li&gt;
&lt;li&gt;a &lt;strong&gt;tool page&lt;/strong&gt; can capture people looking for a chart-reading assessment or candlestick quiz&lt;/li&gt;
&lt;li&gt;an &lt;strong&gt;insight page&lt;/strong&gt; can build trust and give the product something more citeable&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That last point matters more than I expected.&lt;/p&gt;

&lt;p&gt;A lot of GEO-friendly content is not just “content.”&lt;br&gt;
It is content that is easy to quote, summarize, or reference.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F8uuyk5sub339rtpq939y.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F8uuyk5sub339rtpq939y.png" alt="A CandleDojo insights page built to make first-party research easier to cite and understand" width="800" height="611"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  What I changed specifically for GEO
&lt;/h2&gt;

&lt;p&gt;For GEO, I tried to focus on clarity over gimmicks.&lt;/p&gt;

&lt;p&gt;A few things seemed especially important:&lt;/p&gt;

&lt;h3&gt;
  
  
  1. Clear product classification
&lt;/h3&gt;

&lt;p&gt;I made sure the pages say what CandleDojo is in plain English.&lt;/p&gt;

&lt;p&gt;Not just “train your chart reading.”&lt;br&gt;
More like:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;CandleDojo is a chart-reading trainer&lt;/li&gt;
&lt;li&gt;CandleDojo is a candlestick practice tool&lt;/li&gt;
&lt;li&gt;CandleDojo helps traders practice reading price action on historical charts&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That gives LLMs much better raw material.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Pages that match recommendation intent
&lt;/h3&gt;

&lt;p&gt;A lot of AI questions are recommendation-shaped.&lt;/p&gt;

&lt;p&gt;So I leaned into content that naturally answers those kinds of prompts:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;best way to practice chart reading&lt;/li&gt;
&lt;li&gt;what makes a good chart-reading trainer&lt;/li&gt;
&lt;li&gt;bar replay vs paper trading&lt;/li&gt;
&lt;li&gt;candlestick pattern practice tool&lt;/li&gt;
&lt;li&gt;trading replay simulator&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Those are not giant vanity keywords, but they are much closer to actual product discovery.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Better internal linking
&lt;/h3&gt;

&lt;p&gt;I wanted the public content to feel like a connected graph instead of scattered pages.&lt;/p&gt;

&lt;p&gt;So pattern pages can point to related tools or guides.&lt;br&gt;
Guides can point to assessments.&lt;br&gt;
Insight pages can point back into the product.&lt;br&gt;
Comparison pages can link to deeper educational content.&lt;/p&gt;

&lt;p&gt;That helps both users and machines understand how the topics connect.&lt;/p&gt;

&lt;h3&gt;
  
  
  4. Crawl accessibility for public pages
&lt;/h3&gt;

&lt;p&gt;I also updated the crawl policy so public content can be accessed more broadly, while private app routes stay blocked.&lt;/p&gt;

&lt;p&gt;That means pages like guides, tools, comparisons, and insights are part of the public surface, while routes like &lt;code&gt;/play&lt;/code&gt;, &lt;code&gt;/profile&lt;/code&gt;, &lt;code&gt;/auth&lt;/code&gt;, and &lt;code&gt;/api&lt;/code&gt; stay out of that layer.&lt;/p&gt;

&lt;p&gt;For me, that is the right split:&lt;br&gt;
make the public knowledge surface accessible, and keep the actual app internals private.&lt;/p&gt;




&lt;h2&gt;
  
  
  What I changed for measurement
&lt;/h2&gt;

&lt;p&gt;One thing I really did not want was to spend weeks “doing SEO” and then only know whether pageviews went up.&lt;/p&gt;

&lt;p&gt;That is not enough.&lt;/p&gt;

&lt;p&gt;So I added more attribution and event tracking around the public funnel.&lt;/p&gt;

&lt;p&gt;I started tracking things like:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;page views&lt;/li&gt;
&lt;li&gt;CTA clicks&lt;/li&gt;
&lt;li&gt;tool starts&lt;/li&gt;
&lt;li&gt;tool completions&lt;/li&gt;
&lt;li&gt;newsletter signups&lt;/li&gt;
&lt;li&gt;signup starts&lt;/li&gt;
&lt;li&gt;signup completions&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I also added first-touch attribution on signup.&lt;/p&gt;

&lt;p&gt;That matters because I want to know which content types actually help create users.&lt;/p&gt;

&lt;p&gt;Not just:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;which page got traffic&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;but:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;which page led to a newsletter signup&lt;/li&gt;
&lt;li&gt;which page led to a tool completion&lt;/li&gt;
&lt;li&gt;which page helped start an account signup&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That feels much closer to the real job.&lt;/p&gt;




&lt;h2&gt;
  
  
  What I changed for scale
&lt;/h2&gt;

&lt;p&gt;I also built a weekly content pack workflow around CandleDojo.&lt;/p&gt;

&lt;p&gt;Instead of thinking about SEO posts, videos, newsletter content, and directory snippets as separate workflows, I wanted one source topic to create a full pack.&lt;/p&gt;

&lt;p&gt;So one topic can produce:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fmq40k3dtc7onh5pp6yhr.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fmq40k3dtc7onh5pp6yhr.png" alt="CandleDojo newsletter page for the weekly drill digest" width="800" height="611"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;one primary content asset&lt;/li&gt;
&lt;li&gt;one YouTube script&lt;/li&gt;
&lt;li&gt;a few short-form hooks&lt;/li&gt;
&lt;li&gt;one newsletter block&lt;/li&gt;
&lt;li&gt;one directory/profile snippet&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This makes the system much more scalable.&lt;/p&gt;

&lt;p&gt;It also fits how I think about search now.&lt;/p&gt;

&lt;p&gt;The same core idea should be able to show up across:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Google Search&lt;/li&gt;
&lt;li&gt;AI-generated recommendations&lt;/li&gt;
&lt;li&gt;YouTube&lt;/li&gt;
&lt;li&gt;newsletter&lt;/li&gt;
&lt;li&gt;directory/referral traffic&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Different channels, same underlying intent.&lt;/p&gt;

&lt;p&gt;That feels much more durable than creating random one-off content.&lt;/p&gt;




&lt;h2&gt;
  
  
  What I learned
&lt;/h2&gt;

&lt;p&gt;A few things became clearer while doing this.&lt;/p&gt;

&lt;h3&gt;
  
  
  Broad keywords are not the point
&lt;/h3&gt;

&lt;p&gt;Trying to rank for something like &lt;code&gt;candle&lt;/code&gt;, &lt;code&gt;dojo&lt;/code&gt;, or even &lt;code&gt;trading&lt;/code&gt; is not the right game.&lt;/p&gt;

&lt;p&gt;The better targets are narrower and more product-shaped:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;chart-reading trainer&lt;/li&gt;
&lt;li&gt;candlestick practice tool&lt;/li&gt;
&lt;li&gt;best way to practice chart reading&lt;/li&gt;
&lt;li&gt;trading replay simulator&lt;/li&gt;
&lt;li&gt;bar replay vs paper trading&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Those are much more realistic and much more useful.&lt;/p&gt;

&lt;h3&gt;
  
  
  GEO is not magic
&lt;/h3&gt;

&lt;p&gt;Just letting AI crawlers access your site does not automatically make your product recommendable.&lt;/p&gt;

&lt;p&gt;If the pages are vague, thin, or hard to classify, LLMs still will not have much to work with.&lt;/p&gt;

&lt;p&gt;The real work is still:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;clarity&lt;/li&gt;
&lt;li&gt;structure&lt;/li&gt;
&lt;li&gt;useful page types&lt;/li&gt;
&lt;li&gt;internal linking&lt;/li&gt;
&lt;li&gt;recommendation-friendly language&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Tools and comparisons are strong assets
&lt;/h3&gt;

&lt;p&gt;I think interactive tools and comparison pages are underrated.&lt;/p&gt;

&lt;p&gt;A generic blog post can be useful, but a good tool page or a strong comparison page often does a much better job of matching high-intent discovery.&lt;/p&gt;

&lt;h3&gt;
  
  
  The content system matters as much as the writing
&lt;/h3&gt;

&lt;p&gt;The more I worked on this, the more it felt like an information architecture problem, not just a writing problem.&lt;/p&gt;

&lt;p&gt;You are not only writing articles.&lt;br&gt;
You are teaching search engines and LLMs how your product should be understood.&lt;/p&gt;




&lt;h2&gt;
  
  
  Where I am now
&lt;/h2&gt;

&lt;p&gt;I do not think SEO or GEO is something you “finish.”&lt;/p&gt;

&lt;p&gt;It feels more like building a long-lived public knowledge layer around the product.&lt;/p&gt;

&lt;p&gt;For CandleDojo, that layer now has a much clearer shape:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;educational guides&lt;/li&gt;
&lt;li&gt;pattern pages&lt;/li&gt;
&lt;li&gt;comparison pages&lt;/li&gt;
&lt;li&gt;interactive tools&lt;/li&gt;
&lt;li&gt;insight pages&lt;/li&gt;
&lt;li&gt;newsletter capture&lt;/li&gt;
&lt;li&gt;attribution so I can measure what actually works&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;It is still early, but this already feels much better than hoping the homepage alone will do all the work.&lt;/p&gt;




&lt;h2&gt;
  
  
  Final thought
&lt;/h2&gt;

&lt;p&gt;My current takeaway is pretty simple:&lt;/p&gt;

&lt;p&gt;if you want your product to show up in both search and AI recommendations, do not just publish more content.&lt;/p&gt;

&lt;p&gt;Make your site easier to understand.&lt;/p&gt;

&lt;p&gt;Make it obvious what the product is, who it is for, and when it should be recommended.&lt;/p&gt;

&lt;p&gt;That has been the real shift for me with CandleDojo.&lt;/p&gt;

&lt;p&gt;If you want to check it out, it’s here:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://candledojo.app" rel="noopener noreferrer"&gt;https://candledojo.app&lt;/a&gt;&lt;/p&gt;

</description>
      <category>seo</category>
      <category>ai</category>
      <category>nextjs</category>
      <category>buildinpublic</category>
    </item>
    <item>
      <title>I Built "Duolingo for Chart Reading" as a Solo Dev - Here's What I Learned</title>
      <dc:creator>Joel</dc:creator>
      <pubDate>Thu, 26 Mar 2026 19:00:38 +0000</pubDate>
      <link>https://dev.to/candle-dojo/i-built-duolingo-for-chart-reading-as-a-solo-dev-heres-what-i-learned-3770</link>
      <guid>https://dev.to/candle-dojo/i-built-duolingo-for-chart-reading-as-a-solo-dev-heres-what-i-learned-3770</guid>
      <description>&lt;p&gt;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.&lt;/p&gt;

&lt;p&gt;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.&lt;/p&gt;

&lt;p&gt;So I built &lt;a href="https://candledojo.app" rel="noopener noreferrer"&gt;CandleDojo&lt;/a&gt;. It gives you a real historical chart, you call the direction, and then the chart replays forward so you see what actually happened.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fkhqio9aareca12guzwdm.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fkhqio9aareca12guzwdm.png" alt="CandleDojo gameplay" width="800" height="397"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  How it works
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;You see a frozen moment from a real BTC, ETH, or SOL chart&lt;/li&gt;
&lt;li&gt;You read the candles and call bullish or bearish&lt;/li&gt;
&lt;li&gt;The chart replays forward - instant feedback&lt;/li&gt;
&lt;li&gt;A belt system (white to black) tracks your progression across 3,700+ scenarios&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;No sign-up required. You can start practicing immediately.&lt;/p&gt;

&lt;h2&gt;
  
  
  The stack
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Layer&lt;/th&gt;
&lt;th&gt;Tool&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Framework&lt;/td&gt;
&lt;td&gt;Next.js 15 (App Router)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Auth + DB&lt;/td&gt;
&lt;td&gt;Supabase (Postgres + RPC)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Hosting&lt;/td&gt;
&lt;td&gt;Vercel&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Styling&lt;/td&gt;
&lt;td&gt;TailwindCSS&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Charts&lt;/td&gt;
&lt;td&gt;Hand-rolled HTML Canvas&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;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.&lt;/p&gt;

&lt;h2&gt;
  
  
  What was actually hard
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;The scenarios, not the code.&lt;/strong&gt; 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.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Difficulty balance broke retention.&lt;/strong&gt; 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.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Round saves had race conditions.&lt;/strong&gt; 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.&lt;/p&gt;

&lt;h2&gt;
  
  
  Lessons from building solo
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Ship the core loop first.&lt;/strong&gt; 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.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Distribution is a separate problem from building.&lt;/strong&gt; 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.&lt;/p&gt;

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

&lt;h2&gt;
  
  
  What's next
&lt;/h2&gt;

&lt;p&gt;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.&lt;/p&gt;

&lt;p&gt;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.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;a href="https://candledojo.app/play" rel="noopener noreferrer"&gt;Try it here - no sign-up needed&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>javascript</category>
      <category>ai</category>
      <category>beginners</category>
    </item>
  </channel>
</rss>
