An anagram is a magic trick hiding in plain sight: the same letters, rearranged, become a completely different word. This free Anagram Solver performs the trick on demand. Type in any set of letters — a word, a name, a stubborn rack — and it returns the perfect anagrams first: every word that uses all your letters. Below them it lists every shorter word your letters can make, grouped by length, each with its Scrabble score. It runs in your browser against our 359,039-word list, so nothing you type is uploaded.
How the Anagram Solver works
The solver treats your letters as a multiset of tiles where duplicates count. A word qualifies as a perfect anagram when its letters match yours exactly — same letters, same counts, nothing left over and nothing missing. Shorter words qualify when every letter they need can be covered by your tiles, with a ? standing in for a blank tile (blank-covered letters score zero, as they do on a real board). Scores use standard Scrabble values, and results are ordered the way a player wants them: perfect anagrams first, then longer words before shorter ones, best score first inside each group.
How to use it
Type your letters in any order — the solver does not care how they arrive. Press Solve Anagrams and read from the top: the first group, labelled “Full anagrams”, is the answer most people came for. Keep scrolling for the shorter words, which are gold in tile games when the board is tight. If you are working a puzzle with a blank, add a ? and the solver will spend it wherever it helps most.
A worked example
Enter listen and the solver finds 156 words. Six of them are perfect anagrams: listen itself, silent, enlist, inlets, tinsel — and slinte, a Scots word for a slope that shows how deep the list runs. Each scores 6 points in Scrabble values. Underneath sit the five-letter words like tiles and stein, then a long tail of short plays — tin, tie, sin, lit — exactly the words that rescue a blocked board. It is no accident that listen / silent / enlist is the classic anagram trio taught in classrooms: six common letters, rearranged, keep making real words.
Anagrams beyond the game board
Players are not the only anagram hunters. Writers use anagrams to name characters (a rearranged name can hide a clue or a joke), puzzle setters build anagram clues for crosswords, teachers use them to show how English spelling carries patterns, and more than a few people have checked what their own name rearranges into. A proper name will rarely produce a perfect anagram from a general word list — names are not dictionary words — but the shorter-word groups usually surface something usable, and the ? wildcard lets you test what one extra letter would unlock.
Limitations worth knowing
Our list is a broad English word list, wider than any single game’s dictionary, so a few rare or archaic anagrams appear that official Scrabble dictionaries (CSW or NASPA) would reject. It contains no phrases and no proper names, so multi-word anagrams (“debit card” → “bad credit”) are outside its reach. Scores are tile values only — board multipliers are not included.
Anagram Solver – frequently asked questions
What counts as a perfect anagram?
A word that uses every one of your letters exactly once — same letters, same counts, in a new order. Listen and silent are perfect anagrams of each other.
Can it solve anagrams with a blank tile?
Yes. Add ? for the blank and the solver treats it as any letter, scoring words that use it with zero for that letter, exactly as Scrabble and Words With Friends do.
How many letters can I enter?
Up to 15. Longer inputs are almost always phrases, and this solver works one word at a time.
Are all the anagrams valid in Scrabble?
Most are. Our 359,039-word list is broader than the official tournament dictionaries, so an occasional obscure anagram will not be legal in tournament play — common words are always safe.
More word tools
Keep playing: Word Finder & Word Tools hub, Word Unscrambler, Wordle Solver and Jumble 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 = 5211;
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 Solve Anagrams again.'); });
}
function render(res, letterCount){
var box = document.getElementById('results');
if (!res.length) { box.innerHTML = '<p class="none">No words found for those letters. Check for typos, or add a ? if one of your tiles is blank.</p>'; sendH(); return; }
var html = '', curLen = -1, first = true;
for (var i = 0; i < res.length; i++) {
var x = res[i];
if (x.w.length !== curLen) {
if (curLen !== -1) html += '</div>';
curLen = x.w.length;
var n = 0; res.forEach(function(y){ if (y.w.length === curLen) n++; });
var label = (first && curLen === letterCount) ? 'Full anagrams — ' + curLen + ' letters' : curLen + ' letters';
html += '<div class="grp"><h3>' + label + ' — ' + n + ' word' + (n === 1 ? '' : 's') + '</h3>';
first = false;
}
html += '<span class="chip">' + x.w + '<sup>' + x.s + '</sup></span>';
}
html += '</div>';
box.innerHTML = html;
st(res.length.toLocaleString('en-US') + ' words found.');
sendH();
}
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 letters.'); return; }
render(ilmRack(rack, WORDS, ILM_SCRABBLE), rack.length);
});
}
document.getElementById('go').addEventListener('click', run);
document.getElementById('rack').addEventListener('keydown', function(e){ if (e.key === 'Enter') run(); });
</script>
</body>
</html>
" id="ilmhunt-anagram-solver" title="Anagram Solver — Find Anagrams of Any Letters" style="width:100%;max-width:720px;height:640px;border:0;" loading="lazy"></iframe>
<script>(function(){var f=document.getElementById('ilmhunt-anagram-solver');window.addEventListener('message',function(e){if(e&&e.data&&e.data.wpcId===5211&&e.data.wpcH&&f){f.style.height=(e.data.wpcH+24)+'px';}});})();</script>
<p><a href="https://ilmhunt.com/anagram-solver/">Anagram Solver — Find Anagrams of Any Letters</a> — a free tool from <a href="https://ilmhunt.com/">IlmHunt — free online tools</a></p>
