<?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: Vyom J</title>
    <description>The latest articles on DEV Community by Vyom J (@vyom_j_b0def99a225a400789).</description>
    <link>https://dev.to/vyom_j_b0def99a225a400789</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.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F4086034%2F6c716184-5583-4ca4-9b4c-b5978cdd9bf2.png</url>
      <title>DEV Community: Vyom J</title>
      <link>https://dev.to/vyom_j_b0def99a225a400789</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/vyom_j_b0def99a225a400789"/>
    <language>en</language>
    <item>
      <title>ChessIQ v1.5- More data!</title>
      <dc:creator>Vyom J</dc:creator>
      <pubDate>Thu, 27 Aug 2026 06:42:31 +0000</pubDate>
      <link>https://dev.to/vyom_j_b0def99a225a400789/chessiq-v15-more-data-200p</link>
      <guid>https://dev.to/vyom_j_b0def99a225a400789/chessiq-v15-more-data-200p</guid>
      <description>&lt;p&gt;A few days ago, I wrote about why I built ChessIQ: I wanted to train the part of chess that happens before calculation.&lt;/p&gt;

&lt;p&gt;Not “find the winning move,” but the harder and more common judgment: which side is better, and why? A player may have more space, safer king, stronger piece activity, or an easier position to play—even when no tactic is available.&lt;/p&gt;

&lt;p&gt;That core loop has not changed. ChessIQ still asks you to commit to White better, Equal, or Black better before revealing the Stockfish evaluation and AI explanation. But v1.5 improves what happens after that judgment.&lt;/p&gt;

&lt;p&gt;A position is not an isolated diagram&lt;/p&gt;

&lt;p&gt;The biggest update is the expanded library: ChessIQ now contains 1,200+ real-game positions. Half come from Lichess games; the other half come from international over-the-board games from the early 2000s.&lt;/p&gt;

&lt;p&gt;More importantly, many puzzles now include a metadata bar beneath the board. Tournament-game positions show the players, event, and year, while Lichess-sourced positions are identified as online games.&lt;/p&gt;

&lt;p&gt;That sounds small, but it changes the learning experience. A position is no longer just an engine snapshot. It came from a real game, with a history and a continuation worth investigating.&lt;/p&gt;

&lt;p&gt;From a guess to deeper analysis&lt;/p&gt;

&lt;p&gt;v1.5 also adds an export menu so that curiosity does not end at the puzzle.&lt;/p&gt;

&lt;p&gt;You can copy the position’s FEN or open the exact board directly in Lichess Analysis or Chess.com Analysis. For positions with an associated PGN, you can also open the full source game on Lichess.&lt;/p&gt;

&lt;p&gt;FEN answers, “What can happen from this position?” PGN answers, “How did this position arise, and what happened next?” Both matter for positional training. An engine can tell you that one side is better; the full game can show whether that advantage was actually converted.&lt;/p&gt;

&lt;p&gt;I wanted these tools to extend the training loop, not replace it. You still make your positional judgment first. The exports are there for the moments when a position earns more of your attention.&lt;/p&gt;

&lt;p&gt;What comes next: Ranked and Rush&lt;/p&gt;

&lt;p&gt;Next: Ranked and Rush modes.&lt;/p&gt;

&lt;p&gt;Regular ChessIQ play should remain deliberate: take time, assess the position, and build Position Rating through sustained accuracy. Rush will explore the other side of positional skill—fast recognition—with three- or five-minute sessions, a separate leaderboard, and a clear switch from regular rated play.&lt;/p&gt;

&lt;p&gt;The design question is how to make speed exciting without rewarding blind guessing. A good fast mode should reward recognition, not replace understanding.&lt;/p&gt;

&lt;p&gt;If you are interested in positional chess, chess-training systems, or rating design, I would love your feedback—especially on what would make a speed-based positional mode feel competitive without becoming shallow.&lt;/p&gt;

&lt;p&gt;Try ChessIQ at chessiqapp.com, and read the original build post for the data pipeline, theme normalization, and rating-design thinking behind it.&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>programming</category>
      <category>chess</category>
      <category>development</category>
    </item>
    <item>
      <title>It's been over a year, and finally a vision I had for a unique chess app has been finished, the ChessIQ is released! --&gt; Try it out here: https://chessiqapp.com/

Positional chess training is finally here, and I hope you guys try this out and improve!</title>
      <dc:creator>Vyom J</dc:creator>
      <pubDate>Thu, 20 Aug 2026 06:14:57 +0000</pubDate>
      <link>https://dev.to/vyom_j_b0def99a225a400789/its-been-over-a-year-and-finally-a-vision-i-had-for-a-unique-chess-app-has-been-finished-the-13dd</link>
      <guid>https://dev.to/vyom_j_b0def99a225a400789/its-been-over-a-year-and-finally-a-vision-i-had-for-a-unique-chess-app-has-been-finished-the-13dd</guid>
      <description>&lt;div class="crayons-card c-embed text-styles text-styles--secondary"&gt;
    &lt;div class="c-embed__content"&gt;
      &lt;div class="c-embed__body flex items-center justify-between"&gt;
        &lt;a href="https://chessiqapp.com/" rel="noopener noreferrer" class="c-link fw-bold flex items-center"&gt;
          &lt;span class="mr-2"&gt;chessiqapp.com&lt;/span&gt;
          

        &lt;/a&gt;
      &lt;/div&gt;
    &lt;/div&gt;
&lt;/div&gt;


</description>
      <category>saas</category>
      <category>showdev</category>
      <category>sideprojects</category>
    </item>
    <item>
      <title>I Built ChessIQ to Train Positional Chess Evaluation, Not Just Tactics</title>
      <dc:creator>Vyom J</dc:creator>
      <pubDate>Thu, 20 Aug 2026 06:06:42 +0000</pubDate>
      <link>https://dev.to/vyom_j_b0def99a225a400789/i-built-chessiq-to-train-positional-chess-evaluation-not-just-tactics-5bk3</link>
      <guid>https://dev.to/vyom_j_b0def99a225a400789/i-built-chessiq-to-train-positional-chess-evaluation-not-just-tactics-5bk3</guid>
      <description>&lt;p&gt;If you've played competitive chess, you've probably hit this moment:&lt;/p&gt;

&lt;p&gt;Neither side has a tactic. Nothing is hanging. No forced combination to calculate. But a strong player glances at the board for three seconds and says:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;"White is clearly better here."&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;That judgment — fast, confident, pre-calculation — is one of the hardest skills in chess to practice deliberately.&lt;/p&gt;

&lt;p&gt;So I built &lt;strong&gt;&lt;a href="https://chessiqapp.com" rel="noopener noreferrer"&gt;ChessIQ&lt;/a&gt;&lt;/strong&gt; to fix that.&lt;/p&gt;




&lt;h2&gt;
  
  
  ♟️ What is ChessIQ?
&lt;/h2&gt;

&lt;p&gt;ChessIQ is a positional evaluation trainer. Instead of asking you to find the best move like a typical puzzle site, it shows you a real game position and asks one question:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;White is better / Equal / Black is better&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;You commit to your answer &lt;em&gt;before&lt;/em&gt; seeing the engine. Then ChessIQ shows you the Stockfish evaluation and a pre-generated AI explanation of the positional ideas behind it.&lt;/p&gt;

&lt;p&gt;You can try it without an account at &lt;strong&gt;&lt;a href="https://chessiqapp.com" rel="noopener noreferrer"&gt;chessiqapp.com&lt;/a&gt;&lt;/strong&gt;.&lt;/p&gt;




&lt;h2&gt;
  
  
  🤔 Why train positional evaluation?
&lt;/h2&gt;

&lt;p&gt;Traditional chess puzzles are great at training &lt;strong&gt;calculation&lt;/strong&gt;. You see a position, find a tactic, calculate variations, get the move.&lt;/p&gt;

&lt;p&gt;But real games aren't always like that. A huge portion of chess is spent in positions where there's no immediate tactic — and you're instead asking:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Which side has more useful space?&lt;/li&gt;
&lt;li&gt;Are there weak squares to exploit?&lt;/li&gt;
&lt;li&gt;Which pieces are better placed?&lt;/li&gt;
&lt;li&gt;Who has the initiative?&lt;/li&gt;
&lt;li&gt;Which position is easier to play?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Strong players answer these almost intuitively. ChessIQ is designed to make that intuition something you can &lt;strong&gt;practice, measure, and improve&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;The three-way format matters here — it's fast enough to do many positions per session while still producing a meaningful signal about your positional judgment.&lt;/p&gt;




&lt;h2&gt;
  
  
  ⚙️ How the data pipeline works
&lt;/h2&gt;

&lt;p&gt;The frontend is conventional HTML/CSS/JS backed by Firebase. The interesting part is upstream.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The preprocessing pipeline looks roughly like this:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Lichess games
  → candidate position extraction
  → filtering
  → Stockfish analysis
  → metadata generation
  → AI explanation (pre-generated)
  → Firebase
  → ChessIQ
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;A few design decisions I'm glad I made early:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;AI explanations are generated ahead of time.&lt;/strong&gt; No LLM call sits in the training loop. Feedback is instant, and API costs don't scale with user interactions.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The AI explanation is feedback, not ground truth.&lt;/strong&gt; Stockfish is still the underlying evaluation signal. The model's job is to turn that signal and position metadata into something a player can actually learn from.&lt;/p&gt;




&lt;h2&gt;
  
  
  🏷️ The theme normalization problem
&lt;/h2&gt;

&lt;p&gt;Every puzzle gets tagged with positional themes — things like &lt;em&gt;Piece Activity&lt;/em&gt;, &lt;em&gt;King Safety&lt;/em&gt;, &lt;em&gt;Weak Squares&lt;/em&gt;, &lt;em&gt;Outposts&lt;/em&gt;, &lt;em&gt;Passed Pawns&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;The problem: an LLM doesn't naturally produce a consistent taxonomy.&lt;/p&gt;

&lt;p&gt;One explanation might say &lt;code&gt;"weak squares"&lt;/code&gt;. Another says &lt;code&gt;"weak dark squares"&lt;/code&gt;. Another says &lt;code&gt;"strong knight outpost"&lt;/code&gt;. Fine individually — but if each generated phrase becomes its own category, your analytics become useless.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;My solution:&lt;/strong&gt; a normalization layer that maps generated themes into a canonical vocabulary of &lt;strong&gt;73 positional concepts&lt;/strong&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;AI explanation text
  → raw themes extracted
  → mapped to canonical 73-theme vocabulary
  → stored as structured data
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The explanation stays natural and descriptive. The rest of the app gets stable, consistent identifiers it can actually use for thematic training and analytics.&lt;/p&gt;




&lt;h2&gt;
  
  
  📊 Two separate rating problems
&lt;/h2&gt;

&lt;p&gt;ChessIQ has two different rating concepts, and they're genuinely different problems.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Player Position Rating (PR)&lt;/strong&gt;&lt;br&gt;
The player's long-term progression metric. Designed to answer: &lt;em&gt;how consistently good am I at evaluating chess positions?&lt;/em&gt; It uses compression curves, provisional periods, streak bonuses, and inactivity decay to reward genuine sustained improvement — not luck.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Puzzle difficulty rating&lt;/strong&gt;&lt;br&gt;
A static Easy/Medium/Hard label goes stale as real player data accumulates. A position that looked Hard during preprocessing might consistently get answered correctly by real players.&lt;/p&gt;

&lt;p&gt;So ChessIQ tracks community performance on individual positions and updates their difficulty ratings adaptively over time. I'm treating this as an ongoing experiment — sparse data and selection effects are real problems at this scale, and I'd rather have a smaller dataset I can inspect than a huge one I can't reason about.&lt;/p&gt;




&lt;h2&gt;
  
  
  🔁 Completion-based spaced repetition
&lt;/h2&gt;

&lt;p&gt;Missed positions enter a personal review queue — but on a &lt;strong&gt;completion-based&lt;/strong&gt; schedule, not a time-based one.&lt;/p&gt;

&lt;p&gt;If someone does 100 puzzles in one session, and someone else does 5 puzzles over a week, they should get a similar training experience. Tying review to the calendar would make the first person's experience wildly different from the second's.&lt;/p&gt;

&lt;p&gt;Current open question I'm sitting with: is reviewing the &lt;strong&gt;exact same position&lt;/strong&gt; the right unit? Or should review surface a structurally similar position that tests the same concept in a new setting?&lt;/p&gt;




&lt;h2&gt;
  
  
  🚀 Current feature set
&lt;/h2&gt;

&lt;p&gt;ChessIQ v1.4.8 ships with:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Position Rating (PR)&lt;/strong&gt; — earned through consistent accuracy, not grinding&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Adaptive puzzle difficulty&lt;/strong&gt; — per-puzzle ratings that update with community data&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Thematic training&lt;/strong&gt; — filter by any of the 73 positional themes&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;AI positional explanations&lt;/strong&gt; — pre-cached, instant feedback after every puzzle&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Theme-accuracy radar&lt;/strong&gt; — analytics showing your strengths/weaknesses by theme&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Spaced repetition&lt;/strong&gt; — missed puzzles re-enter your queue&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Daily puzzle&lt;/strong&gt; — one shared community challenge per day&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;47 achievements&lt;/strong&gt; across performance, consistency, and progression milestones&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Global leaderboard&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Admin Control Center&lt;/strong&gt; — operational dashboard for puzzle health and theme coverage&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  🤷 What I'm still figuring out
&lt;/h2&gt;

&lt;p&gt;A few open problems I'd love input on:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;1. Calibrating "Equal"&lt;/strong&gt;&lt;br&gt;
Engine evaluations are continuous. Turning them into three discrete buckets is lossy. Where should the Equal boundaries sit — and should they change based on position type or player strength?&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2. Fixed taxonomy vs. embeddings&lt;/strong&gt;&lt;br&gt;
Is a canonical 73-theme vocabulary the right abstraction for personalization? Or would embeddings and clustering eventually produce better, more nuanced results?&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;3. What to measure for actual improvement&lt;/strong&gt;&lt;br&gt;
PR going up is a proxy metric. What I'd really like to know: does ChessIQ make someone's positional evaluations more accurate on positions they've &lt;em&gt;never seen before&lt;/em&gt;? That's a much harder measurement problem.&lt;/p&gt;




&lt;h2&gt;
  
  
  🙏 Try it out
&lt;/h2&gt;

&lt;p&gt;If you're into chess, training systems, rating design, or just want to see how a Stockfish + Firebase + Python data pipeline fits together — I'd love feedback.&lt;/p&gt;

&lt;p&gt;👉 &lt;strong&gt;&lt;a href="https://chessiqapp.com" rel="noopener noreferrer"&gt;chessiqapp.com&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Accounts are free and add PR tracking, history, achievements, and your personal review queue. Or just play anonymously.&lt;/p&gt;

&lt;p&gt;Happy to answer questions about the data pipeline, the PR algorithm, the theme normalization layer, or anything else in the comments. 🏆&lt;/p&gt;

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