<?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: XIAO FENG</title>
    <description>The latest articles on DEV Community by XIAO FENG (@xiao_feng_0e2f7e64656ddff).</description>
    <link>https://dev.to/xiao_feng_0e2f7e64656ddff</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%2F3932300%2Fcdd6878d-6956-4fcd-9257-7afe4c0abd3e.png</url>
      <title>DEV Community: XIAO FENG</title>
      <link>https://dev.to/xiao_feng_0e2f7e64656ddff</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/xiao_feng_0e2f7e64656ddff"/>
    <language>en</language>
    <item>
      <title>I Built a Free Word Finder That Checks 350K+ Words — Here's What Makes It Different</title>
      <dc:creator>XIAO FENG</dc:creator>
      <pubDate>Fri, 15 May 2026 12:48:18 +0000</pubDate>
      <link>https://dev.to/xiao_feng_0e2f7e64656ddff/i-built-a-free-word-finder-that-checks-350k-words-heres-what-makes-it-different-3hd2</link>
      <guid>https://dev.to/xiao_feng_0e2f7e64656ddff/i-built-a-free-word-finder-that-checks-350k-words-heres-what-makes-it-different-3hd2</guid>
      <description>&lt;h2&gt;
  
  
  Building a comprehensive word finder and dictionary checker that serves Scrabble, Wordle, and crossword players with real-time word validation and definitions."
&lt;/h2&gt;

&lt;h2&gt;
  
  
  The Problem
&lt;/h2&gt;

&lt;p&gt;Every word game player knows the frustration: you have a rack of letters, you know there's a valid word there somewhere, but you just can't see it. Or worse — you play a word, only to have it rejected because it's "not in the dictionary."&lt;/p&gt;

&lt;p&gt;I built &lt;a href="https://wordhelper.me" rel="noopener noreferrer"&gt;WordHelper.me&lt;/a&gt; to solve this — a free, no-signup word finder that checks over 350,000 English words with real definitions, Scrabble scores, and anagram support.&lt;/p&gt;

&lt;h2&gt;
  
  
  Core Features
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. Dictionary Check with Definitions
&lt;/h3&gt;

&lt;p&gt;The heart of the site is the &lt;code&gt;/check/{word}&lt;/code&gt; page. Type any word and get:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;✅ Whether it's a valid English word&lt;/li&gt;
&lt;li&gt;📝 Full definition and part of speech&lt;/li&gt;
&lt;li&gt;🏆 Scrabble and Words With Friends scores (letter-by-letter breakdown)&lt;/li&gt;
&lt;li&gt;🔄 Anagrams of the word&lt;/li&gt;
&lt;li&gt;📚 Related words from the same root&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;For example, check out &lt;a href="https://wordhelper.me/check/hello" rel="noopener noreferrer"&gt;&lt;code&gt;hello&lt;/code&gt;&lt;/a&gt; — it's worth 8 points in Scrabble with the definition right there.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Scrabble Word Finder &amp;amp; Cheat
&lt;/h3&gt;

&lt;p&gt;Enter your rack letters and instantly find every valid word you can play, sorted by score. Uses the official SOWPODS dictionary (the same one tournament Scrabble uses).&lt;/p&gt;

&lt;p&gt;Try it: &lt;a href="https://wordhelper.me/scrabble-word-finder" rel="noopener noreferrer"&gt;Scrabble Word Finder&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Wordle Solver
&lt;/h3&gt;

&lt;p&gt;Green, yellow, and gray letter filtering for Wordle. Enter your known letters and eliminate impossibilities. Works for Wordle, Quordle, and any variant.&lt;/p&gt;

&lt;h3&gt;
  
  
  4. Anagram Solver
&lt;/h3&gt;

&lt;p&gt;Enter any set of letters and get every possible word arrangement, from 2-letter words up to full-length anagrams.&lt;/p&gt;

&lt;h3&gt;
  
  
  5. Crossword Solver
&lt;/h3&gt;

&lt;p&gt;Pattern-based search: enter known letters and blanks (e.g., &lt;code&gt;?a??e&lt;/code&gt;) to find matching words. Supports regex-friendly patterns.&lt;/p&gt;

&lt;h3&gt;
  
  
  6. Words With Friends &amp;amp; Wordfeud Helpers
&lt;/h3&gt;

&lt;p&gt;Dedicated tools for popular Scrabble variants like Words With Friends and Wordfeud, with platform-specific scoring rules.&lt;/p&gt;

&lt;h3&gt;
  
  
  7. Word Lists
&lt;/h3&gt;

&lt;p&gt;Browse words by:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Starting with&lt;/strong&gt; — &lt;code&gt;[wa](https://wordhelper.me/words-starting-with/wa)*&lt;/code&gt; → water, watch, wave...&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Ending with&lt;/strong&gt; — &lt;code&gt;*[ing](https://wordhelper.me/words-ending-with/ing)&lt;/code&gt; → running, jumping...&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Containing&lt;/strong&gt; — &lt;code&gt;*[un](https://wordhelper.me/words-containing/un)*&lt;/code&gt; → under, until, unable...&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  8. Specialty Tools
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://wordhelper.me/word-scrambler-generator/" rel="noopener noreferrer"&gt;Word Scrambler&lt;/a&gt; — generate scrambled words for puzzles&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://wordhelper.me/word-ladder" rel="noopener noreferrer"&gt;Word Ladder&lt;/a&gt; — transform one word into another one letter at a time&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://wordhelper.me/two-letter-words" rel="noopener noreferrer"&gt;Two-Letter Words&lt;/a&gt; — complete list of valid 2-letter Scrabble words&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://wordhelper.me/jumble-solver" rel="noopener noreferrer"&gt;Jumble Solver&lt;/a&gt; — solve daily jumble puzzles&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  The Tech Stack
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Backend:&lt;/strong&gt; Python (Flask) — handles dynamic pages and API requests&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Frontend:&lt;/strong&gt; Vanilla JavaScript — no framework bloat, just fast client-side interactions&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Dictionary:&lt;/strong&gt; SOWPODS (combined TWL + CSW) with ~350K+ words, all with definitions and part-of-speech tagging&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Hosting:&lt;/strong&gt; Self-hosted with Nginx reverse proxy for performance&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;SEO:&lt;/strong&gt; Static-rendered pages with proper meta tags, Open Graph, and JSON-LD structured data — each word check page is its own indexed URL&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Why I Built This
&lt;/h2&gt;

&lt;p&gt;I play a lot of Scrabble and Wordle, and I kept running into word checkers that were either:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Full of ads and popups&lt;/li&gt;
&lt;li&gt;Using incomplete or inaccurate dictionaries&lt;/li&gt;
&lt;li&gt;Slow and clunky on mobile&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;So I made my own — fast, clean, ad-reasonable, and backed by a proper dictionary with real definitions. No AI-generated nonsense, just verified word data.&lt;/p&gt;

&lt;h2&gt;
  
  
  Stats After Launch
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;14,000+&lt;/strong&gt; word check pages indexed by Google&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Active daily&lt;/strong&gt; crawls from Google (1,500+ requests/day)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;200+&lt;/strong&gt; blog posts covering Scrabble strategy, Wordle tips, and word lists&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;All free&lt;/strong&gt;, no account needed, no paywalls&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Try It
&lt;/h2&gt;

&lt;p&gt;Give it a spin: &lt;a href="https://wordhelper.me" rel="noopener noreferrer"&gt;WordHelper.me&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;If you play any word games — Scrabble, Wordle, Words With Friends, Wordfeud, crosswords — there's something here that'll save you time (or settle an argument about whether "qi" is a valid word — spoiler: it is, 11 points).&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Built by a fellow word game enthusiast. No trackers, no login wall, just words.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>productivity</category>
      <category>javascript</category>
      <category>beginners</category>
    </item>
    <item>
      <title>I Built a Better Wordle Solver — Here's How It Works Under the Hood</title>
      <dc:creator>XIAO FENG</dc:creator>
      <pubDate>Fri, 15 May 2026 04:13:10 +0000</pubDate>
      <link>https://dev.to/xiao_feng_0e2f7e64656ddff/i-built-a-better-wordle-solver-heres-how-it-works-under-the-hood-37g7</link>
      <guid>https://dev.to/xiao_feng_0e2f7e64656ddff/i-built-a-better-wordle-solver-heres-how-it-works-under-the-hood-37g7</guid>
      <description>&lt;p&gt;A Wordle solver needs to answer one question: given everything I know so far, which 5-letter words are still possible?&lt;/p&gt;

&lt;p&gt;In a running game, you accumulate clues across multiple guesses:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt; Green 🟩 — correct letter, correct position&lt;/li&gt;
&lt;li&gt;Yellow 🟨 — correct letter, wrong position&lt;/li&gt;
&lt;li&gt;  Gray ⬜ — letter not in the word&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;After 2-3 guesses, you might have constraints like:&lt;/p&gt;

&lt;p&gt;Position 1 = S (green), R is somewhere but not position 2, A and E are excluded entirely.&lt;/p&gt;

&lt;p&gt;That's a lot of state to track. And it has to update instantly as you type.&lt;/p&gt;




&lt;p&gt;The Approach&lt;/p&gt;

&lt;p&gt;Dictionary Preprocessing&lt;/p&gt;

&lt;p&gt;Everything starts with the dictionary. SOWPODS (Scrabble International word list) contains ~267K words. I filtered it down to 12,470 five-letter words — the Wordle candidate pool.&lt;/p&gt;

&lt;p&gt;This was a one-time preprocessing step. The list lives in memory and gets filtered on every solver query.&lt;/p&gt;

&lt;p&gt;The Filtering Engine&lt;/p&gt;

&lt;p&gt;The core logic is a pipeline of constraint checks:&lt;/p&gt;

&lt;p&gt;function solveWordle(rows, excludedLetters) {&lt;br&gt;
  return FIVE_LETTER_WORDS.filter(word =&amp;gt; {&lt;br&gt;
    for (const row of rows) {&lt;br&gt;
      for (let pos = 0; pos &amp;lt; 5; pos++) {&lt;br&gt;
        const letter = row.letters[pos];&lt;br&gt;
        const color = row.colors[pos];&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;    if (color === 'green' &amp;amp;&amp;amp; word[pos] !== letter) return false;
    if (color === 'yellow' &amp;amp;&amp;amp; (
      word[pos] === letter ||
      !word.includes(letter)
    )) return false;
    if (color === 'gray' &amp;amp;&amp;amp; word.includes(letter)) return false;
  }
}

for (const ch of excludedLetters) {
  if (word.includes(ch)) return false;
}

return true;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;});&lt;br&gt;
}&lt;/p&gt;

&lt;p&gt;The simplicity is deliberate. Each constraint is an independent filter — short-circuit evaluation makes it fast. On average, this runs in under 2ms for the full 12K word list.&lt;/p&gt;

&lt;p&gt;Multi-Row State Management&lt;/p&gt;

&lt;p&gt;The tricky part is managing state across 5 rows:&lt;/p&gt;

&lt;p&gt;const grid = Array(5).fill(null).map(() =&amp;gt; &lt;br&gt;
  Array(5).fill(null).map(() =&amp;gt; ({&lt;br&gt;
    letter: '',&lt;br&gt;
    color: 'empty'&lt;br&gt;
  }))&lt;br&gt;
);&lt;/p&gt;

&lt;p&gt;const COLOR_CYCLE = ['empty', 'green', 'yellow', 'gray'];&lt;/p&gt;

&lt;p&gt;function cycleColor(current) {&lt;br&gt;
  const idx = COLOR_CYCLE.indexOf(current);&lt;br&gt;
  return COLOR_CYCLE[(idx + 1) % COLOR_CYCLE.length];&lt;br&gt;
}&lt;/p&gt;

&lt;p&gt;Performance&lt;/p&gt;

&lt;p&gt;Here's the performance profile for a typical 3-guess scenario:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;List initialization: ~0.3ms&lt;/li&gt;
&lt;li&gt;Per-constraint filter: ~0.5ms per row&lt;/li&gt;
&lt;li&gt;Total solve time: &amp;lt; 5ms&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Building the UI&lt;/p&gt;

&lt;p&gt;The UI went through three iterations:&lt;/p&gt;

&lt;p&gt;v1 — Server-side: Every input triggered a server round-trip. Slow and wasteful.&lt;/p&gt;

&lt;p&gt;v2 — React-style: Too much overhead for what's essentially a filtering tool.&lt;/p&gt;

&lt;p&gt;v3 — Vanilla JS (final): Direct DOM manipulation. No framework, no dependencies, no bloat.&lt;/p&gt;

&lt;p&gt;CSS handles the visual feedback:&lt;/p&gt;

&lt;p&gt;.wordle-tile.green { background: #6aaa64; color: white; }&lt;br&gt;
.wordle-tile.yellow { background: #c9b458; color: white; }&lt;br&gt;
.wordle-tile.gray { background: #787c7e; color: white; }&lt;/p&gt;

&lt;p&gt;What I Learned&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;Simplicity wins — The first version tried to be clever with bitmasks and precomputed indexes. The second version just iterates over 12K words. 10x simpler and just as fast.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Client-side &amp;gt; server-side — For a problem this small (12K items, simple string operations), there's zero reason to involve a server. It's faster, cheaper, and works offline.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;CSS transitions &amp;gt; JavaScript animations — Tile color changes feel smooth because they're hardware-accelerated CSS transforms, not JS timer loops.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Try It&lt;/p&gt;

&lt;p&gt;👉 (&lt;a href="https://wordhelper.me/wordle-solver" rel="noopener noreferrer"&gt;https://wordhelper.me/wordle-solver&lt;/a&gt;)&lt;/p&gt;

&lt;p&gt;No signup, no ads, no tracking. Just type your clues and get answers.&lt;/p&gt;




&lt;p&gt;This is part of a larger collection of word game tools I'm building at WordHelper.me — including a Scrabble word checker, anagram solver, crossword helper, and more. All tools are free, client-side, and built with vanilla JavaScript.&lt;/p&gt;

</description>
      <category>wordle</category>
      <category>webdev</category>
      <category>opensou</category>
    </item>
    <item>
      <title>Scrabble Hooks: The Secret Weapon That Doubles Your Score</title>
      <dc:creator>XIAO FENG</dc:creator>
      <pubDate>Fri, 15 May 2026 04:00:47 +0000</pubDate>
      <link>https://dev.to/xiao_feng_0e2f7e64656ddff/scrabble-hooks-the-secret-weapon-that-doubles-your-score-57md</link>
      <guid>https://dev.to/xiao_feng_0e2f7e64656ddff/scrabble-hooks-the-secret-weapon-that-doubles-your-score-57md</guid>
      <description>&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%2Fj5jmr3s8xhp2gnofhhvt.jpg" 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%2Fj5jmr3s8xhp2gnofhhvt.jpg" alt=" " width="800" height="420"&gt;&lt;/a&gt;&lt;br&gt;
There’s a moment in Scrabble when you realize the game isn’t about playing one word — it’s about playing two words at once.&lt;/p&gt;

&lt;p&gt;You place your tiles parallel to an existing word, and suddenly you’re scoring points in two directions. The technique is called a hook — adding a single letter to an existing word to form a new one.&lt;/p&gt;

&lt;p&gt;Here’s the data on how hooks actually work, from the SOWPODS + TWL dictionaries (270,000+ words).&lt;/p&gt;

&lt;p&gt;Try the tool: WordHelper.me/hooks/&lt;/p&gt;

&lt;p&gt;— -&lt;/p&gt;

&lt;p&gt;What Is a Hook?&lt;/p&gt;

&lt;p&gt;Front hook&lt;/p&gt;

&lt;p&gt;• Type: Front hook&lt;/p&gt;

&lt;p&gt;• Description: Add a letter before&lt;/p&gt;

&lt;p&gt;• Example: B + EAR = BEAR&lt;/p&gt;

&lt;p&gt;Back hook&lt;/p&gt;

&lt;p&gt;• Type: Back hook&lt;/p&gt;

&lt;p&gt;• Description: Add a letter after&lt;/p&gt;

&lt;p&gt;• Example: EAR + S = EARS&lt;/p&gt;

&lt;p&gt;Inner hook&lt;/p&gt;

&lt;p&gt;• Type: Inner hook&lt;/p&gt;

&lt;p&gt;• Description: Insert a letter inside&lt;/p&gt;

&lt;p&gt;• Example: C + AT = CAT (or CART, CAST)&lt;/p&gt;

&lt;p&gt;Subscribe to the Medium newsletter&lt;br&gt;
— -&lt;/p&gt;

&lt;p&gt;The Data: Which Hooks Matter Most&lt;/p&gt;

&lt;p&gt;Back Hooks: S Dominates Everything&lt;/p&gt;

&lt;p&gt;S — 77,708 words (28% of the dictionary!)&lt;br&gt;
D — 8,446&lt;br&gt;
R — 2,878&lt;br&gt;
Y — 2,703&lt;br&gt;
E — 2,392&lt;/p&gt;

&lt;p&gt;S is in a league of its own — over 9x more than #2 (D).&lt;/p&gt;

&lt;p&gt;Front Hooks: S Also Leads&lt;/p&gt;

&lt;p&gt;S — 3,444 | P — 2,113 | C — 1,560 | A — 1,366 | B — 1,288&lt;/p&gt;

&lt;p&gt;— -&lt;/p&gt;

&lt;p&gt;Words With the Most Hooks&lt;/p&gt;

&lt;p&gt;Top front hooks: ILLS and ILL — 19 letters each. Almost every consonant works.&lt;/p&gt;

&lt;p&gt;Top back hooks: TA and MO — 19 letters each. If you see TA or MO on the board, you almost certainly have a play.&lt;/p&gt;

&lt;p&gt;Most versatile word: AR — 15 front + 10 back = 25 hooks total.&lt;/p&gt;

&lt;p&gt;— -&lt;/p&gt;

&lt;p&gt;Q-Without-U: 49 Words&lt;/p&gt;

&lt;p&gt;QABALA, QABALAH, QABALAS, QADI, QADIS, QAID, QAIDS, QANAT, QANATS, QAT, QATS, QI, QIS, QOPH, QOPHS, QWERTY…&lt;/p&gt;

&lt;p&gt;Most important: QI (11 points). If you have Q and no U, QI is your escape. And you can hook it: QIS, QINDAR, QINTAR.&lt;/p&gt;

&lt;p&gt;— -&lt;/p&gt;

&lt;p&gt;Strategy Takeaways&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Save your S tiles — 28% of all words accept an S hook&lt;/li&gt;
&lt;li&gt;Know your two-letter platforms — AR, HO, RE, TA, MO unlock the most plays&lt;/li&gt;
&lt;li&gt;Rack balance — common front hooks = S,P,C,A,B; common back hooks = S,D,R,Y,E&lt;/li&gt;
&lt;li&gt;ILL is a trap — 19 front hooks turn it into BILL, DILL, FILL, GILL, HILL, KILL, MILL, PILL, SILL, TILL, WILL…&lt;/li&gt;
&lt;li&gt;Memorize QI — your Q escape when there’s no U&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;a href="https://wordhelper.me/hooks/" rel="noopener noreferrer"&gt;WordHelper.me/hooks/&lt;/a&gt; — enter any word to see all hooks instantly&lt;/p&gt;

</description>
    </item>
  </channel>
</rss>
