Wordle is a game of elimination, and this solver does the eliminating. Copy your grid into three rows — green letters in their exact spots, yellow letters in the spots where you guessed them, grey letters in the last box — and it filters our 15,921 five-letter words down to only the ones that still fit everything Wordle has told you. What is left is your honest candidate list: every answer the game could still be hiding. You can use this Wordle Solver free on IlmHunt — no sign-up needed, and it runs entirely in your browser.
How the Wordle Solver works
Each colour is a rule. A green letter fixes one position exactly. A yellow letter must be in the word but cannot sit in the position where you guessed it — which is why this solver asks you to type each yellow letter into the box where it appeared, not just list the letters. A grey letter is excluded entirely, with one subtlety the solver handles for you: if a letter is both grey in one guess and green or yellow in another, the confirmed copies are real, so the word must contain exactly that many of the letter and no more. That duplicate-letter rule is where most home-made filters go wrong, and it is built into every search here.
How to use it
Work top to bottom. Put each green letter in its numbered box, each yellow letter in the box matching the position you played it, and every grey letter in the long box — order does not matter there. Press Solve and the count at the top tells you how much room is left: hundreds means guess a fresh word that tests new letters; under twenty means pick from the list; one means you have the answer. Update the boxes after every guess and solve again.
A worked example
Say your guesses have established a green S in position 1, a yellow A (played in position 2, so the word contains A but not there), and a grey E. The solver cuts 15,921 words down to 378 — among them scary, sugar, scalp, scald, scamp, scars and scarf. Note what is missing: saint is gone because its A sits in position 2, and saber is gone because of the grey E. Add grey T, O, I, N and L after another guess and only 100 candidates survive, including scary, sugar, shard, shark, sharp, smash, spark, spray, squad, swamp and swarm — a list short enough to choose from by feel.
Playing better with a candidate list
A solver list is most powerful in the mid-game. With 100+ candidates, do not guess from the list at all — guess a word that tests the most common untested letters across the list, even one that cannot be the answer, and let the new colours do the cutting. Under roughly twenty candidates, switch to guessing list words directly, preferring ones whose letters split the remaining possibilities most evenly. And when the count reaches one, take the win — but check it is a plausible everyday word, because our list is wider than Wordle’s answer list (see below).
Limitations worth knowing
Our five-letter list (15,921 words) is deliberately broader than Wordle’s official answer list, so the candidate list can include rare words Wordle would never pick — treat the tail of the list with suspicion and favour familiar words. The solver also merges your whole grid into one set of rules; an exotic duplicate-letter edge case spanning several guesses can very occasionally keep or cut a word the strict per-guess rules would not. It narrows the field honestly; the final pick is still yours.
Wordle Solver – frequently asked questions
Why do I enter yellow letters in position boxes?
Because “in the word, wrong spot” is positional information. Knowing A is in the word is weaker than knowing A is in the word and not in position 2 — the second version cuts far more candidates, so the solver asks for the box where each yellow appeared.
Does it handle duplicate letters correctly?
Yes. If a letter shows green or yellow anywhere, grey copies of the same letter cap its count at the confirmed number instead of banning the letter — the rule most solvers get wrong.
Are all the candidates real Wordle answers?
They are all real five-letter words from a broad dictionary list, which is larger than Wordle’s answer pool. Every true answer that fits your grid will be in the list; a few obscure extras may be too.
Is using a solver cheating?
That is your call and your streak. Many players use one only when truly stuck, or after their final guess to learn what the answer could have been.
More word tools
Keep playing: Word Finder & Word Tools hub, Word Unscrambler, Quordle Solver and Anagram Solver — all free, all running on the same 359,039-word list.
Embed this tool on your website — free
Copy the code below and paste it into your page to add this working tool to your own site. A small credit link stays with it — that is all we ask.
var ILM_SCRABBLE = {a:1,b:3,c:3,d:2,e:1,f:4,g:2,h:4,i:1,j:8,k:5,l:1,m:3,n:1,o:1,p:3,q:10,r:1,s:1,t:1,u:1,v:4,w:4,x:8,y:4,z:10};
var ILM_WWF = {a:1,b:4,c:4,d:2,e:1,f:4,g:3,h:3,i:1,j:10,k:5,l:2,m:4,n:2,o:1,p:4,q:10,r:1,s:1,t:1,u:2,v:5,w:6,x:8,y:3,z:10};
function ilmCountLetters(str) {
var counts = {};
for (var i = 0; i < str.length; i++) { var c = str[i]; counts[c] = (counts[c] || 0) + 1; }
return counts;
}
function ilmScoreWith(word, rackCounts, wild, VAL) {
// Score of word built from rack letters; letters covered by wildcards score 0.
// Returns -1 when the word cannot be built.
var need = ilmCountLetters(word), score = 0, deficit = 0;
for (var L in need) {
var have = rackCounts[L] || 0;
if (need[L] <= have) { score += VAL[L] * need[L]; }
else { deficit += need[L] – have; score += VAL[L] * have; if (deficit > wild) return -1; }
}
return score;
}
// Every word buildable from the rack (letters + ? or * wildcards).
// Sorted by length desc, then score desc, then A-Z. [{w, s}]
function ilmRack(rack, words, VAL) {
rack = (rack || '').toLowerCase();
var wild = 0, counts = {}, total = 0;
for (var i = 0; i < rack.length; i++) {
var ch = rack[i];
if (ch === '?' || ch === '*') { wild++; total++; }
else if (ch >= 'a' && ch <= 'z') { counts[ch] = (counts[ch] || 0) + 1; total++; }
}
var out = [];
for (var j = 0; j < words.length; j++) {
var w = words[j];
if (w.length < 2 || w.length > total) continue;
var s = ilmScoreWith(w, counts, wild, VAL);
if (s >= 0) out.push({ w: w, s: s });
}
out.sort(function (a, b) {
return b.w.length – a.w.length || b.s – a.s || (a.w < b.w ? -1 : a.w > b.w ? 1 : 0);
});
return out;
}
// Words using every letter of `letters` exactly (perfect anagrams).
// Sorted by score desc, then A-Z. [{w, s}]
function ilmExactAnagrams(letters, words, VAL) {
letters = (letters || '').toLowerCase().replace(/[^a-z]/g, '');
var target = letters.split('').sort().join(''), out = [];
for (var j = 0; j < words.length; j++) {
var w = words[j];
if (w.length !== letters.length) continue;
if (w.split('').sort().join('') === target) {
var s = 0;
for (var k = 0; k < w.length; k++) s += VAL[w[k]];
out.push({ w: w, s: s });
}
}
out.sort(function (a, b) { return b.s – a.s || (a.w < b.w ? -1 : a.w > b.w ? 1 : 0); });
return out;
}
// Wordle/Quordle constraint filter over 5-letter words.
// green: array of 5 — letter fixed at that position, '' when unknown.
// yellow: array of 5 — letter is in the word but NOT at that position, '' when none.
// grey: string of excluded letters. A grey letter that is also confirmed
// (green/yellow) caps that letter's count at the confirmed count.
// Returns matching words in A-Z order.
function ilmWordleFilter(fiveWords, green, yellow, grey) {
var confirmed = {}, i, L;
for (i = 0; i < 5; i++) {
if (green[i]) confirmed[green[i]] = (confirmed[green[i]] || 0) + 1;
if (yellow[i]) confirmed[yellow[i]] = (confirmed[yellow[i]] || 0) + 1;
}
var greySet = {};
grey = (grey || '').toLowerCase();
for (i = 0; i < grey.length; i++) { if (grey[i] >= 'a' && grey[i] <= 'z') greySet[grey[i]] = true; }
var out = [];
for (var j = 0; j < fiveWords.length; j++) {
var w = fiveWords[j], ok = true;
for (i = 0; i < 5; i++) {
if (green[i] && w[i] !== green[i]) { ok = false; break; }
if (yellow[i] && w[i] === yellow[i]) { ok = false; break; }
}
if (!ok) continue;
var wc = ilmCountLetters(w);
for (L in confirmed) { if ((wc[L] || 0) < confirmed[L]) { ok = false; break; } }
if (!ok) continue;
for (L in greySet) {
if (confirmed[L]) { if ((wc[L] || 0) !== confirmed[L]) { ok = false; break; } }
else if (wc[L]) { ok = false; break; }
}
if (ok) out.push(w);
}
return out;
}
// Rack results narrowed by optional starts-with / ends-with / contains filters,
// re-sorted by score desc, then length desc, then A-Z. [{w, s}]
function ilmRackFiltered(rack, words, VAL, opts) {
opts = opts || {};
var starts = (opts.starts || '').toLowerCase(), ends = (opts.ends || '').toLowerCase(),
contains = (opts.contains || '').toLowerCase();
var res = ilmRack(rack, words, VAL).filter(function (x) {
if (starts && x.w.indexOf(starts) !== 0) return false;
if (ends && x.w.slice(x.w.length – ends.length) !== ends) return false;
if (contains && x.w.indexOf(contains) === -1) return false;
return true;
});
res.sort(function (a, b) {
return b.s – a.s || b.w.length – a.w.length || (a.w < b.w ? -1 : a.w > b.w ? 1 : 0);
});
return res;
}
if (typeof module !== 'undefined') {
module.exports = { ILM_SCRABBLE: ILM_SCRABBLE, ILM_WWF: ILM_WWF, ilmRack: ilmRack,
ilmExactAnagrams: ilmExactAnagrams, ilmWordleFilter: ilmWordleFilter,
ilmRackFiltered: ilmRackFiltered, ilmScoreWith: ilmScoreWith, ilmCountLetters: ilmCountLetters };
}
var WORDLIST_URL = 'https://ilmhunt.com/wp-content/uploads/2026/10/wordlist.txt';
var FRAME_ID = 5213;
var WORDS = null, FIVE = null, PENDING = [];
function sendH(){ try { parent.postMessage({wpcId: FRAME_ID, wpcH: document.body.scrollHeight + 16}, '*'); } catch (e) {} }
window.addEventListener('load', sendH);
function st(msg){ document.getElementById('status').textContent = msg; }
function buildRow(id){
var row = document.getElementById(id);
for (var i = 0; i < 5; i++) {
var inp = document.createElement('input');
inp.type = 'text'; inp.maxLength = 1; inp.autocomplete = 'off'; inp.setAttribute('data-i', i);
inp.addEventListener('input', function(){ this.value = this.value.replace(/[^a-zA-Z]/g, '').slice(0, 1); });
inp.addEventListener('keydown', function(e){ if (e.key === 'Enter') run(); });
row.appendChild(inp);
}
}
buildRow('gRow'); buildRow('yRow');
function readRow(id){
var out = [], inputs = document.getElementById(id).getElementsByTagName('input');
for (var i = 0; i < 5; i++) out.push((inputs[i].value || '').toLowerCase().slice(0, 1));
return out;
}
function ensureWords(cb){
if (WORDS) { cb(); return; }
PENDING.push(cb);
if (PENDING.length > 1) return;
st('Loading the word list (359,039 words)…');
fetch(WORDLIST_URL).then(function(r){ return r.text(); }).then(function(t){
WORDS = t.split(/\r?\n/).filter(function(x){ return x.length > 0; });
FIVE = WORDS.filter(function(w){ return w.length === 5; });
st('Word list ready — ' + FIVE.length.toLocaleString('en-US') + ' five-letter words.');
var q = PENDING; PENDING = []; q.forEach(function(f){ f(); });
}).catch(function(){ PENDING = []; st('Could not load the word list. Check your connection and press Solve again.'); });
}
function run(){
ensureWords(function(){
var green = readRow('gRow'), yellow = readRow('yRow');
var grey = document.getElementById('grey').value.replace(/[^a-zA-Z]/g, '').toLowerCase();
var res = ilmWordleFilter(FIVE, green, yellow, grey);
var box = document.getElementById('results');
if (!res.length) {
box.innerHTML = '<p class="none">No 5-letter word fits that grid. Double-check the boxes — a yellow letter typed in the wrong box is the usual culprit.</p>';
st('0 possible answers.');
} else {
var show = res.slice(0, 600);
var html = '<div class="grp">';
show.forEach(function(w){ html += '<span class="chip">' + w + '</span>'; });
html += '</div>';
if (res.length > show.length) html += '<p class="none">Showing the first 600 — add more grid information to narrow the list.</p>';
box.innerHTML = html;
st(res.length.toLocaleString('en-US') + ' possible answer' + (res.length === 1 ? '' : 's') + ' left.');
}
sendH();
});
}
document.getElementById('go').addEventListener('click', run);
document.getElementById('grey').addEventListener('keydown', function(e){ if (e.key === 'Enter') run(); });
</script>
</body>
</html>
" id="ilmhunt-wordle-solver" title="Wordle Solver — Every Word That Still Fits Your Grid" style="width:100%;max-width:720px;height:640px;border:0;" loading="lazy"></iframe>
<script>(function(){var f=document.getElementById('ilmhunt-wordle-solver');window.addEventListener('message',function(e){if(e&&e.data&&e.data.wpcId===5213&&e.data.wpcH&&f){f.style.height=(e.data.wpcH+24)+'px';}});})();</script>
<p><a href="https://ilmhunt.com/wordle-solver/">Wordle Solver — Every Word That Still Fits Your Grid</a> — a free tool from <a href="https://ilmhunt.com/">IlmHunt — free online tools</a></p>

Pingback: Wordle Words List — All - Ilmhunt