A 4×4 letter board hides far more words than any player can spot against a timer — our example board below contains 763 of them. This free Board Solver finds them all. Type the 16 letters of your Boggle-style grid into the cells, press Solve, and every word of three letters or more that can be traced through neighbouring cells is listed, grouped by length so the big scorers sit at the top. Words can run up, down, sideways and diagonally, and each cell can be used once per word, just like the real game. It runs in your browser against our 359,039-word list.
How the Board Solver works
The solver starts a search from every cell and walks outward in all eight directions, building letter strings step by step. A walk keeps going only while the string it has built could still become a real word — behind the scenes it checks each partial string against the beginnings of words in the list, which prunes millions of dead ends and keeps the search fast even though a 4×4 board has an enormous number of possible paths. Every complete string of three or more letters that appears in the word list is recorded, and because the walk never revisits a cell within one word, every result is a word you could genuinely trace with your finger on the board.
How to use it
Click the first cell and type your board row by row — the cursor jumps to the next cell after each letter. Press Solve Board and read from the longest group down. In a hurry? Use Load example board to see a solved grid straight away, and Clear to start over. When you are checking a real game, work through the long-word groups first: in Boggle-style scoring, length is where the points are.
A worked example
The example board — S T A C / H E R T / D O G S / P I N E — contains 763 words: 156 of three letters, 218 of four, 192 of five, 114 of six, 52 of seven, 24 of eight, six of nine letters and a single ten-letter word, pignorated. The nine-letter group includes friendlier finds like strongest, estrogens and atropines, and everyday words run through every length: cat, dog, god, star, pine, target, honest, regions. Under classic Boggle scoring (1 point for 3–4 letters, 2 for 5, 3 for 6, 5 for 7, 11 for 8 or more) the words in this one board add up to 1,701 points — a reminder that the limit in a real round is your eyes, not the board.
Why boards hide so many words
Each cell touches up to eight neighbours, so paths multiply quickly: from the middle of the board a five-letter word can wander in thousands of directions. Vowels placed near the centre are the engine — in the example board the E, A, O and I sit within reach of almost every consonant cluster, which is why so many unrelated words (from cathodes to dingoes) share the same sixteen letters. When you design or judge a board, a solver pass like this is the honest way to check it is neither empty nor overloaded.
Limitations worth knowing
The solver handles the classic 4×4 grid only, not 5×5 or other shapes. Our word list is broader than the official dictionary of any particular board game, so a few obscure entries appear that a strict game would not accept — common words are always safe, strange ones deserve a second look. Boggle dice famously include a combined Qu face; this grid takes one letter per cell, so type Q and U into separate cells to approximate it, knowing a real Qu cube can also serve as Q alone.
Board Solver – frequently asked questions
Can words go in any direction?
Yes — horizontal, vertical and diagonal, forwards and backwards, turning as often as needed. The only rule is that a cell cannot be used twice inside the same word.
What is the shortest word it finds?
Three letters, matching standard Boggle-style rules. Two-letter strings are ignored even when they are real words.
Does it keep my board private?
Yes. After the word list loads once, everything runs on your device; your grid is never uploaded.
Can I use it to check a finished game?
That is one of its best uses — enter the board after the round and settle arguments about which long words were really there.
More word tools and lists
Browse the full collection on our Word Finder & Word Tools hub. Closest relatives: the Word Unscrambler for loose letters, the Wordfeud Helper for rack-based games, and the Word Cookies Answers solver for letter-bank puzzles.
Embed this tool on your website — free
Copy the code below to add this working tool to your own page. A small credit link stays with it — that’s all we ask.
<h2>Board Solver – 4×4 Letter Grid</h2>
<p class="sub">Type the 16 letters of your Boggle-style board and find every word hidden in it. Words run in any direction – up, down, sideways and diagonally – and each cell can be used once per word.</p>
<div class="grid">
<input type="text" maxlength="1" class="cell" data-i="0" autocomplete="off" spellcheck="false">
<input type="text" maxlength="1" class="cell" data-i="1" autocomplete="off" spellcheck="false">
<input type="text" maxlength="1" class="cell" data-i="2" autocomplete="off" spellcheck="false">
<input type="text" maxlength="1" class="cell" data-i="3" autocomplete="off" spellcheck="false">
<input type="text" maxlength="1" class="cell" data-i="4" autocomplete="off" spellcheck="false">
<input type="text" maxlength="1" class="cell" data-i="5" autocomplete="off" spellcheck="false">
<input type="text" maxlength="1" class="cell" data-i="6" autocomplete="off" spellcheck="false">
<input type="text" maxlength="1" class="cell" data-i="7" autocomplete="off" spellcheck="false">
<input type="text" maxlength="1" class="cell" data-i="8" autocomplete="off" spellcheck="false">
<input type="text" maxlength="1" class="cell" data-i="9" autocomplete="off" spellcheck="false">
<input type="text" maxlength="1" class="cell" data-i="10" autocomplete="off" spellcheck="false">
<input type="text" maxlength="1" class="cell" data-i="11" autocomplete="off" spellcheck="false">
<input type="text" maxlength="1" class="cell" data-i="12" autocomplete="off" spellcheck="false">
<input type="text" maxlength="1" class="cell" data-i="13" autocomplete="off" spellcheck="false">
<input type="text" maxlength="1" class="cell" data-i="14" autocomplete="off" spellcheck="false">
<input type="text" maxlength="1" class="cell" data-i="15" autocomplete="off" spellcheck="false">
</div>
<button id="go" type="button">Solve Board</button>
<button id="demo" type="button" class="alt">Load example board</button>
<button id="clear" type="button" class="alt">Clear</button>
<div id="status"></div>
<div id="results"></div>
</div>
<script>
// Board Solver core (Boggle-style 4×4) for IlmHunt Wave 1C.
// ilmBoardSolve uses a prefix set to prune the DFS. The node test verifies
// it against ilmBoardBrute (no pruning, independent enumeration, capped
// length) and against a per-word traceability checker.
// grid: array of 16 single letters, row-major. Words of 3+ letters that can
// be traced through adjacent cells (8 directions), each cell used once.
function ilmBoardSolve(grid, words) {
var set = {};
var prefixes = {};
for (var i = 0; i < words.length; i++) {
var w = words[i];
if (w.length < 3 || w.length > 16) continue;
set[w] = true;
for (var k = 1; k < w.length; k++) prefixes[w.slice(0, k)] = true;
}
var found = {};
var vis = new Array(16).fill(false);
function dfs(idx, cur) {
var w = cur + grid[idx];
if (w.length >= 3 && set[w]) found[w] = true;
if (w.length >= 16 || !prefixes[w]) return;
vis[idx] = true;
var r = Math.floor(idx / 4), c = idx % 4;
for (var dr = -1; dr <= 1; dr++) {
for (var dc = -1; dc <= 1; dc++) {
if (!dr && !dc) continue;
var nr = r + dr, nc = c + dc;
if (nr < 0 || nr > 3 || nc < 0 || nc > 3) continue;
var n = nr * 4 + nc;
if (!vis[n]) dfs(n, w);
}
}
vis[idx] = false;
}
for (var s = 0; s < 16; s++) dfs(s, '');
return Object.keys(found).sort(function (a, b) {
return b.length – a.length || (a < b ? -1 : a > b ? 1 : 0);
});
}
// Independent brute force: enumerate every simple path up to maxLen with NO
// prefix pruning, then intersect with the word set. Used only in tests.
function ilmBoardBrute(grid, words, maxLen) {
var set = {};
for (var i = 0; i < words.length; i++) {
var w = words[i];
if (w.length >= 3 && w.length <= maxLen) set[w] = true;
}
var found = {};
var vis = new Array(16).fill(false);
function dfs(idx, cur) {
var w = cur + grid[idx];
if (w.length >= 3 && set[w]) found[w] = true;
if (w.length >= maxLen) return;
vis[idx] = true;
var r = Math.floor(idx / 4), c = idx % 4;
for (var dr = -1; dr <= 1; dr++) {
for (var dc = -1; dc <= 1; dc++) {
if (!dr && !dc) continue;
var nr = r + dr, nc = c + dc;
if (nr < 0 || nr > 3 || nc < 0 || nc > 3) continue;
var n = nr * 4 + nc;
if (!vis[n]) dfs(n, w);
}
}
vis[idx] = false;
}
for (var s = 0; s < 16; s++) dfs(s, '');
return Object.keys(found);
}
// Independent per-word check: can `word` be traced on the grid?
function ilmTraceable(grid, word) {
var vis = new Array(16).fill(false);
function dfs(idx, pos) {
if (grid[idx] !== word[pos]) return false;
if (pos === word.length – 1) return true;
vis[idx] = true;
var r = Math.floor(idx / 4), c = idx % 4, ok = false;
for (var dr = -1; dr <= 1 && !ok; dr++) {
for (var dc = -1; dc <= 1 && !ok; dc++) {
if (!dr && !dc) continue;
var nr = r + dr, nc = c + dc;
if (nr < 0 || nr > 3 || nc < 0 || nc > 3) continue;
var n = nr * 4 + nc;
if (!vis[n] && dfs(n, pos + 1)) ok = true;
}
}
vis[idx] = false;
return ok;
}
for (var s = 0; s < 16; s++) { if (dfs(s, 0)) return true; }
return false;
}
if (typeof module !== 'undefined') {
module.exports = { ilmBoardSolve: ilmBoardSolve, ilmBoardBrute: ilmBoardBrute, ilmTraceable: ilmTraceable };
}
var WORDLIST_URL = 'https://ilmhunt.com/wp-content/uploads/2026/10/wordlist.txt';
var WORDS = null, LOADING = false;
function sendH(){ try { parent.postMessage({wpcId: 5212, 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; }
if (LOADING) { return; }
LOADING = true; 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.');
cb();
}).catch(function(){
LOADING = false;
st('Sorry – the word list could not be loaded. Check your connection and try again.');
});
}
function groupHtml(res, withScore){
if (!res.length) return '<p class="none">No words found. Check your letters and try again.</p>';
var html = '', curLen = -1;
res.forEach(function(x){
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++; });
html += '<div class="grp"><h3>' + curLen + ' letters – ' + n + ' word' + (n === 1 ? '' : 's') + '</h3>';
}
html += '<span class="chip">' + x.w + (withScore ? '<sup>' + x.s + '</sup>' : '') + '</span>';
});
return html + '</div>';
}
var DEMO = 'stachertdogspine';
function setGrid(str){
var cells = document.querySelectorAll('.cell');
cells.forEach(function(c, i){ c.value = str[i] || ''; });
}
function readGrid(){
var g = [];
document.querySelectorAll('.cell').forEach(function(c){ g.push((c.value || '').toLowerCase().replace(/[^a-z]/g, '')); });
return g;
}
function run(){
var g = readGrid();
if (g.some(function(x){ return x.length !== 1; })) { st('Fill every cell with exactly one letter first.'); return; }
ensureWords(function(){
var res = ilmBoardSolve(g, WORDS);
var objs = res.map(function(w){ return { w: w, s: 0 }; });
document.getElementById('results').innerHTML = groupHtml(objs, false);
st(res.length.toLocaleString('en-US') + ' words found in this board.');
sendH();
});
}
document.getElementById('go').addEventListener('click', run);
document.getElementById('demo').addEventListener('click', function(){ setGrid(DEMO); run(); });
document.getElementById('clear').addEventListener('click', function(){ setGrid(''); document.getElementById('results').innerHTML = ''; st(''); });
document.querySelectorAll('.cell').forEach(function(c, i, all){
c.addEventListener('input', function(){ if (c.value && i < 15) all[i + 1].focus(); });
});
setGrid(DEMO);
</script>
</body>
</html>
" id="wpc-frame-5212" class="wpc-embed-frame" style="width:100%;border:0;display:block;overflow:hidden;" scrolling="no"></iframe></div>
<p><script>(function(){var f=document.getElementById('wpc-frame-5212');function wpcResize(h){if(f){f.style.height=(h+24)+'px';}}window.addEventListener('message',function(e){if(e && e.data && e.data.wpcId===5212 && e.data.wpcH){wpcResize(e.data.wpcH);}});if(f){f.addEventListener('load',function(){wpcResize(460);});}})();</script></p>
<p><a href="https://ilmhunt.com/board-solver/" target="_blank" rel="noopener">Board Solver — Find Every Word in a 4×4 Letter Grid</a> by <a href="https://ilmhunt.com/" target="_blank" rel="noopener">IlmHunt</a> — free online tools</p>

Pingback: Carrom Tips for Beginners - Ilmhunt