About this word unscrambler

A small, fast, dependency-free tool for one job: given a set of letters, list every word a large English dictionary contains that can be built from them. No account, no upload, and nothing you type is ever recorded.

Why it exists

Unscrambling by brute force — generating every ordering of a set of letters and checking each against a dictionary — stops being practical well before a real tile rack's worth of letters. Seven letters have over five thousand orderings; ten have over three million. A tool that actually needs to be instant on every keystroke can't work that way, so this one doesn't: it checks a letter count, not an ordering, against every dictionary word. That approach also does something brute force can't do cheaply — it naturally finds every shorter word buildable from a subset of your letters too, not just full anagrams of everything you typed.

How the matching is implemented

Your letters become a 26-slot count — how many As, Bs, Cs you have — plus a wildcard count capped at two. For each candidate word, the same kind of count is built, and one comparison decides whether it matches: for every letter the word needs, is there enough of it in your bag, with any shortfall covered by a wildcard?

bag = { a: 1, c: 1, e: 1, l: 1, t: 2 } // from "cattle" word "tact" needs { a:1, c:1, t:2 } every need <= bag[letter] -> match, no wildcard needed word "cutlet" needs { c:1, e:1, l:1, t:2, u:1 } "u" needed but not in bag -> 1 short -> needs exactly 1 wildcard to match

This is a single pass over the dictionary — no permutation generation, no recursion, no factorial term anywhere. Filters (starts-with, ends-with, contains, exact length) are cheap string checks applied to the same pass, and results are grouped by length as the dictionary is walked, which comes out already alphabetical within each length because the underlying word list is sorted alphabetically end to end.

Because the per-word letter counts don't change between searches, they're computed once per page load and reused on every keystroke — only the comparison against your current letters runs each time, which is what keeps the tool responsive against roughly 204,000 words on every character you type.

How it was verified

The solver's logic lives in a standalone module with no DOM or network access, which means it can be exercised directly under Node.js, outside a browser. Before shipping, it was checked against fixed cases with known-correct answers:

Verification cases and results
InputChecksResult
"cat" against a small word listFinds cat, act, at; rejects dog and tack (needs a k)pass
"aa" against a list containing "aardvark""aardvark" needs three As; two-A input correctly rejects itpass
"c?t" (one wildcard)Finds cat, cot, cut — every letter the wildcard could becomepass
A word list with a duplicate entryResult list contains each matching word exactly oncepass
Result orderingLongest length first; alphabetical within each lengthpass
Full ~204,000-word list, 12 tiles + 2 wildcards, no filtersCompletes well under 50ms on a cold (uncached) runpass

Three wildcards typed in also stayed capped at two used, with a note shown rather than a silent change in behaviour; invalid characters (digits, punctuation) were checked to be ignored rather than crashing the search or matching incorrectly.

Where the dictionary comes from

The word list is shared across this site's word-game tools and derived locally from a public-domain reference dictionary (the traditional Unix web2 word list), filtered to lowercase entries of 2–15 letters with proper nouns removed, then sorted and de-duplicated. It is roughly 204,000 words. It is a general English list, not any single game's official tournament dictionary — see the limitations on the main tool page for what that means in practice.

How the site is built

  • Static HTML, one small stylesheet, one small script pair. No framework, no build step, no bundler.
  • The word list loads once as a static file alongside the page. Every search after that runs against the in-memory copy already in your browser — there is no server call for a search.
  • System font stack. Your operating system's UI font, so nothing has to download and nothing shifts as it loads.
  • Nothing you type is transmitted. Letters you enter are never uploaded to anything. The one place data leaves the page at all is an explicit click on a result word, which copies that single word to your own clipboard — a device-local action, not a network request.
  • Dark mode follows your system setting via prefers-color-scheme.

Scope and honesty about limits

This is a general-dictionary letter matcher, not a certified word-game reference. It does not know any specific game's official word list, does not track turn scoring or board state, and does not claim a word is legal in any particular game — only that it exists in the dictionary this tool searches. For anything you're about to play competitively, that dictionary's own official word checker is the authority, not this page.