A free, frequency-sorted word finder and word-list library for Wordle, Scrabble, Words With Friends, and crosswords. ~183,000 words, 2 to 20 letters, 1,732 statically generated pages.
Live preview (temporary, noindexed): https://niranjan-gopal.github.io/findfiveletterwords.com/
- Frequency order, not alphabetical. Every list is ranked by how often each word appears in the Norvig trillion-word corpus, so likely puzzle answers sit in the first rows.
- Five dictionaries behind one switch: combined tournament list (default), Wordle answers, Words With Friends (ENABLE), Scrabble US (TWL06), Scrabble UK (SOWPODS/CSW). Encoded as bitmask flags so the whole solver runs client-side from one small JSON per length.
- Accessibility-first UI: light/dark themes with muted dark-mode palette,
4-step text-size control, fully remappable keyboard shortcuts (
?opens the list), reduced-motion support, labelled controls throughout.
Astro 6 (fully static output) · Tailwind CSS 4 · no backend, no analytics scripts. The interactive finder is plain TypeScript in one inline module.
Requires Node >= 22.12.
npm install
npm run dev # localhost:4321
npm run build # production build (site: findfiveletterwords.com, base: /)
npm run previewnode scripts/build-wordlists.mjsDownloads (cached in scripts/raw/, gitignored) ENABLE1, TWL06
(norvig.com/ngrams/TWL06.txt -- the wordgamedictionary.com mirror is
truncated, do not use it), SOWPODS, the Wordle answer list, the Norvig
count_1w frequency table, and the LDNOOBW blocklist. Emits
src/data/words-N.json (page lists, ENABLE ∪ TWL) and src/data/dicts-N.json
(solver data with dictionary flags) for N = 2..20. Lengths 16-20 exist only in
ENABLE; Scrabble lists stop at the 15-square board.
.github/workflows/deploy.yml deploys on every push to main. It builds with
GITHUB_PAGES=true, which:
- sets
site: https://niranjan-gopal.github.io,base: /findfiveletterwords.com(the repo name must stayfindfiveletterwords.comfor the base to match); - adds
<meta name="robots" content="noindex, nofollow">to every page; - keeps every
<link rel="canonical">pointing athttps://findfiveletterwords.com; - overwrites
robots.txtwithDisallow: /.
So even if the preview stays up longer than planned, Google will not index it and it cannot create a duplicate of the future production site.
One-time repo setup: Settings → Pages → Source: GitHub Actions.
Unpublishing when the feedback round is over (manual, ~10 seconds):
gh api -X DELETE repos/niranjan-gopal/findfiveletterwords.com/pages
gh repo edit niranjan-gopal/findfiveletterwords.com --visibility private --accept-visibility-change-consequences- Buy
findfiveletterwords.com, create a Cloudflare Pages project, build commandnpm run build, outputdist-- without theGITHUB_PAGESenv var.basereturns to/and theurl()helper insrc/lib/url.tsbecomes a no-op; nothing else changes. - Redirect the
*.pages.devpreview subdomain to the custom domain (Bulk Redirects, or a_redirectsfile) so it never competes in search. - Google Search Console: verify the domain, submit
/sitemap-index.xml. - Set up
contact@findfiveletterwords.comemail forwarding. - Apply for AdSense once pages are indexed.
All internal links go through url() from src/lib/url.ts, which prefixes the
configured base. Markdown content keeps plain root-relative links; a rehype
plugin in astro.config.mjs prefixes those at build time. Canonical URLs are
built with canonicalUrl() and always point at the production domain.
scripts/build-wordlists.mjs word-data pipeline (run manually when sources change)
src/data/ generated words-N.json / dicts-N.json (committed)
src/lib/words.ts lengths, dictionaries, points tables
src/lib/pages.ts the 1,700-page programmatic page definitions
src/lib/url.ts base-path + canonical helpers
src/pages/data/ JSON endpoint serving dicts-N.json to the finder
src/layouts/BaseLayout.astro shell: header, ticker, footer, shortcuts, theming
src/content/blog/ editorial articles (Markdown)