A Scrabble rack is a small optimisation problem: seven tiles, one board, and a best play hiding somewhere among hundreds of possibilities. This finder solves the rack half of it. Type your letters and it returns every word they can make ranked by score — highest first — using official US Scrabble letter values. Add a blank as ?, then use the optional filters to match the board: words that start with a letter already in place, contain a hook, or end where you need them to end. You can use this Scrabble Word Finder free on IlmHunt — no sign-up needed, and it runs entirely in your browser.
How the Scrabble Word Finder works
The finder checks your rack against our 359,039-word list as a multiset problem: a word is playable when every letter it needs can be covered by your tiles, with each ? covering one letter you lack (and scoring zero for it, exactly as a blank does on the board). Survivors are scored by adding face values — Q and Z at 10, J and X at 8, the vowels and common consonants at 1 — and sorted by that total, with longer words winning ties because length usually means better board reach. The three filters then apply plain pattern rules on top: starts-with for playing off an existing letter, ends-with for landing on one, contains for the letter or pair a hook demands.
How to use it
Start with the rack alone and note the best raw score — that is your ceiling before board bonuses. Then look at the board and ask what the position offers: a double or triple word square multiplies everything, so a 20-point word on a triple beats a 30-point word on bare board. Use starts-with when a letter is already sitting where your word must begin, ends-with for the mirror case, and contains when a parallel play or hook forces a letter into the middle. If the list is long, remember the display caps at the top 400 by score — the words you want are never below that cut.
A worked example
The rack AEINRST — seven friendly letters — makes 468 words, and the finder’s score-first ranking shows the strategic picture instantly: the top of the list is a wall of seven-letter plays (nastier, ratines, antsier, asterin and friends) all scoring exactly 7, because every tile is worth 1. Any of them played with all seven tiles earns the 50-point bingo bonus on top, which is the real prize — the finder surfaces them together so you can pick the one the board geometry favours. Contrast a power rack: letters C?T return cat, cot and cut at 4 points each — C scores 3, T scores 1, and the blank covering the vowel scores 0, precisely as the rules demand. Add a blank to AENIRST (AEINRST?) and the options explode to 6,027 words, which is why strong players guard their blanks jealously.
Score is not the whole game
The finder ranks by tile value because that is what a rack alone can know. Real play adds three things on top, all worth remembering while you scan its list. Board multipliers come first: premium squares can double or triple a word, and a modest word through a triple-word square outscores a flashy one on plain tiles. Tile turnover comes second: using more tiles draws more replacements and hunts the next bingo, which is why the seven-letter group matters beyond its face value. Rack leave comes third: the tiles you keep shape your next turn, so shedding a Q without its U, or keeping a balanced vowel-consonant mix, can be worth more than two extra points now. Use the finder for candidates and scores; keep those three judgements for yourself.
Limitations worth knowing
Scores are raw tile totals — premium squares, parallel-word points and the 50-point bingo bonus are not added, since the tool cannot see your board. Our word list is broader than the official NASPA (TWL) and CSW dictionaries, so an occasional high-scorer will be a word tournament Scrabble rejects; if a word looks invented, verify it before you play it. The finder also cannot judge defensive play — sometimes the best move is the one that opens nothing for your opponent.
Scrabble Word Finder – frequently asked questions
How are scores calculated?
By US Scrabble face values summed across the word — Q and Z 10, J and X 8, K 5, blanks 0. Board bonuses are excluded because they depend on placement, which only you can see.
What do the filters do?
Starts-with, contains and ends-with narrow the results to words matching a pattern the board imposes — an existing letter to build from, a hook letter in the middle, or a letter your word must land on.
Why is a 7-letter word only worth 7 points?
Because its tiles are all 1-point letters. Played in full it still collects the 50-point bingo bonus in a real game — the finder shows tile value only and leaves bonuses to the board.
Are all results legal Scrabble words?
Most are, but our list is wider than the official tournament dictionaries. Common words are safe; exotic ones are worth a dictionary check before you commit them.
More word tools
Keep playing: Word Finder & Word Tools hub, Word Unscrambler, Words With Friends Cheat 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 = 5216;
var GAME_VAL = ILM_SCRABBLE;
var WORDS = 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 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; });
st('Word list ready — ' + WORDS.length.toLocaleString('en-US') + ' 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 Find Words again.'); });
}
function clean(id){ return document.getElementById(id).value.replace(/[^a-zA-Z]/g, '').toLowerCase(); }
function run(){
ensureWords(function(){
var rack = document.getElementById('rack').value.replace(/[^a-zA-Z?*]/g, '').slice(0, 15);
if (rack.length < 2) { st('Enter at least 2 rack letters.'); return; }
var res = ilmRackFiltered(rack, WORDS, GAME_VAL, { starts: clean('starts'), contains: clean('contains'), ends: clean('ends') });
var box = document.getElementById('results');
if (!res.length) {
box.innerHTML = '<p class="none">No words match. Loosen the filters, or add a ? if you hold a blank tile.</p>';
st('0 words found.');
} else {
var show = res.slice(0, 400), html = '<div class="grp">';
show.forEach(function(x){ html += '<span class="chip">' + x.w + '<sup>' + x.s + '</sup></span>'; });
html += '</div>';
if (res.length > show.length) html += '<p class="none">Showing the top 400 by score.</p>';
box.innerHTML = html;
st(res.length.toLocaleString('en-US') + ' words found. Best: ' + res[0].w + ' — ' + res[0].s + ' points before board bonuses.');
}
sendH();
});
}
document.getElementById('go').addEventListener('click', run);
['rack','starts','contains','ends'].forEach(function(id){
document.getElementById(id).addEventListener('keydown', function(e){ if (e.key === 'Enter') run(); });
});
</script>
</body>
</html>
" id="ilmhunt-scrabble-word-finder" title="Scrabble Word Finder — Highest-Scoring Words From Your Rack" style="width:100%;max-width:720px;height:640px;border:0;" loading="lazy"></iframe>
<script>(function(){var f=document.getElementById('ilmhunt-scrabble-word-finder');window.addEventListener('message',function(e){if(e&&e.data&&e.data.wpcId===5216&&e.data.wpcH&&f){f.style.height=(e.data.wpcH+24)+'px';}});})();</script>
<p><a href="https://ilmhunt.com/scrabble-word-finder/">Scrabble Word Finder — Highest-Scoring Words From Your Rack</a> — a free tool from <a href="https://ilmhunt.com/">IlmHunt — free online tools</a></p>

Pingback: 27 Words To Remember for Scrabble - Ilmhunt
Pingback: Scrabble vs. Scrabble Junior