{"id":23813601,"url":"https://github.com/kamilmielnik/scrabble-solver","last_synced_at":"2026-04-26T23:01:30.069Z","repository":{"id":24566440,"uuid":"101936721","full_name":"kamilmielnik/scrabble-solver","owner":"kamilmielnik","description":"Free, open-source, cross-platform, multi-language analysis tool for Scrabble, Scrabble Duel, Super Scrabble, Letter League, Literaki, and Kelimelik. Quickly find the top-scoring words using the given board and tiles. Available in 8 languages.","archived":false,"fork":false,"pushed_at":"2025-03-29T20:24:18.000Z","size":31136,"stargazers_count":108,"open_issues_count":47,"forks_count":25,"subscribers_count":5,"default_branch":"master","last_synced_at":"2025-04-12T06:17:25.862Z","etag":null,"topics":["crossword","discord-letter-league","kelimelik","letter-league","literaki","literaxx","next","nextjs","nodejs","quackle","react","rtl","scrabble","scrabble-dictionary","scrabble-duel","scrabble-game","scrabble-solver","scrabble-word-finder","solver","super-scrabble"],"latest_commit_sha":null,"homepage":"https://scrabble-solver.org","language":"TypeScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"other","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/kamilmielnik.png","metadata":{"files":{"readme":"README.md","changelog":"HISTORY.md","contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2017-08-30T23:05:15.000Z","updated_at":"2025-04-10T20:55:22.000Z","dependencies_parsed_at":"2024-04-15T19:25:33.008Z","dependency_job_id":"9c138147-b20e-4c7d-9004-e10ca27b137a","html_url":"https://github.com/kamilmielnik/scrabble-solver","commit_stats":{"total_commits":2286,"total_committers":9,"mean_commits":254.0,"dds":0.3363954505686789,"last_synced_commit":"4c23b3525f7cb2b1fae4ec0d9271cffab810f7d3"},"previous_names":[],"tags_count":148,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/kamilmielnik%2Fscrabble-solver","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/kamilmielnik%2Fscrabble-solver/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/kamilmielnik%2Fscrabble-solver/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/kamilmielnik%2Fscrabble-solver/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/kamilmielnik","download_url":"https://codeload.github.com/kamilmielnik/scrabble-solver/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":248525141,"owners_count":21118620,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["crossword","discord-letter-league","kelimelik","letter-league","literaki","literaxx","next","nextjs","nodejs","quackle","react","rtl","scrabble","scrabble-dictionary","scrabble-duel","scrabble-game","scrabble-solver","scrabble-word-finder","solver","super-scrabble"],"created_at":"2025-01-02T03:19:56.363Z","updated_at":"2026-04-26T23:01:30.059Z","avatar_url":"https://github.com/kamilmielnik.png","language":"TypeScript","funding_links":[],"categories":["TypeScript"],"sub_categories":[],"readme":"\u003cdiv align=\"center\"\u003e\n  \u003cp\u003e\n    \u003ca href=\"https://scrabble-solver.org\"\u003e\n      \u003cimg alt=\"Scrabble Solver logo\" height=\"120\" src=\"https://raw.githubusercontent.com/kamilmielnik/scrabble-solver/master/packages/scrabble-solver/public/logo.svg\" /\u003e\n    \u003c/a\u003e\n  \u003c/p\u003e\n\n  \u003cp\u003e\n    Free, open-source, cross-platform, multi-language analysis tool for \u003ca href=\"https://en.wikipedia.org/wiki/Scrabble\"\u003eScrabble\u003c/a\u003e, \u003ca href=\"https://www.scopely.com/en/games/scrabble-go\"\u003eScrabble Duel\u003c/a\u003e, \u003ca href=\"https://en.wikipedia.org/wiki/Super_Scrabble\"\u003eSuper Scrabble\u003c/a\u003e, \u003ca href=\"https://support-apps.discord.com/hc/en-us/articles/26502196674583-Letter-League-FAQ\"\u003eLetter League\u003c/a\u003e, \u003ca href=\"https://www.nytimes.com/games/crossplay\"\u003eCrossplay\u003c/a\u003e, \u003ca href=\"https://pl.wikipedia.org/wiki/Literaki\"\u003eLiteraki\u003c/a\u003e \u0026amp; \u003ca href=\"https://play.google.com/store/apps/details?id=com.he2apps.kelimelik\"\u003eKelimelik\u003c/a\u003e\n  \u003c/p\u003e\n\n  \u003cp\u003e\n    Quickly find the top-scoring words using the given board and tiles\n  \u003c/p\u003e\n\n  \u003cp\u003e\n    Available at \u003ca href=\"https://scrabble-solver.org\"\u003ehttps://scrabble-solver.org\u003c/a\u003e in 8 languages\n  \u003c/p\u003e\n\n  \u003cp\u003e\n    You can \u003ca href=\"#run\"\u003erun\u003c/a\u003e it on your machine: \u003ccode\u003enpx scrabble-solver@latest\u003c/code\u003e\n  \u003c/p\u003e\n\n  \u003cp\u003e\n    \u003cimg height=\"32\" src=\"https://raw.githubusercontent.com/twitter/twemoji/master/assets/svg/1f1ec-1f1e7.svg\" alt=\"Flag of United Kingdom\" title=\"English (GB)\" /\u003e\n    \u003cimg height=\"32\" src=\"https://raw.githubusercontent.com/twitter/twemoji/master/assets/svg/1f1fa-1f1f8.svg\" alt=\"Flag of United States\" title=\"English (US)\" /\u003e\n    \u003cimg height=\"32\" src=\"https://raw.githubusercontent.com/twitter/twemoji/master/assets/svg/1f1eb-1f1f7.svg\" alt=\"Flag of France\" title=\"French\" /\u003e\n    \u003cimg height=\"32\" src=\"https://raw.githubusercontent.com/twitter/twemoji/master/assets/svg/1f1e9-1f1ea.svg\" alt=\"Flag of Germany\" title=\"German\" /\u003e\n    \u003cimg height=\"32\" src=\"https://raw.githubusercontent.com/twitter/twemoji/master/assets/svg/1f1ee-1f1f7.svg\" alt=\"Flag of Iran\" title=\"Persian\" /\u003e\n    \u003cimg height=\"32\" src=\"https://raw.githubusercontent.com/twitter/twemoji/master/assets/svg/1f1f5-1f1f1.svg\" alt=\"Flag of Poland\" title=\"Polish\" /\u003e\n    \u003cimg height=\"32\" src=\"https://raw.githubusercontent.com/twitter/twemoji/master/assets/svg/1f1f7-1f1f4.svg\" alt=\"Flag of Romania\" title=\"Romanian\" /\u003e\n    \u003cimg height=\"32\" src=\"https://raw.githubusercontent.com/twitter/twemoji/master/assets/svg/1f1ea-1f1f8.svg\" alt=\"Flag of Spain\" title=\"Spanish\" /\u003e\n    \u003cimg height=\"32\" src=\"https://raw.githubusercontent.com/twitter/twemoji/master/assets/svg/1f1f9-1f1f7.svg\" alt=\"Flag of Turkey\" title=\"Turkish\" /\u003e\n  \u003c/p\u003e\n\n  \u003cp\u003e\n    \u003cimg src=\"https://img.shields.io/github/package-json/v/kamilmielnik/scrabble-solver\" alt=\"Version\" /\u003e\n    \u003cimg src=\"https://img.shields.io/npm/l/scrabble-solver\" alt=\"License\" /\u003e\n    \u003cimg src=\"https://img.shields.io/node/v/scrabble-solver\" alt=\"Node version\" /\u003e\n  \u003c/p\u003e\n\n  \u003cp\u003e\n    \u003cimg src=\"https://github.com/kamilmielnik/scrabble-solver/actions/workflows/build.yml/badge.svg\" alt=\"Build\" /\u003e\n    \u003cimg src=\"https://github.com/kamilmielnik/scrabble-solver/actions/workflows/jest.yml/badge.svg\" alt=\"Jest Tests\" /\u003e\n    \u003cimg src=\"https://github.com/kamilmielnik/scrabble-solver/actions/workflows/cypress.yml/badge.svg\" alt=\"Cypress Tests\" /\u003e\n    \u003cimg src=\"https://github.com/kamilmielnik/scrabble-solver/actions/workflows/oxlint.yml/badge.svg\" alt=\"Oxlint\" /\u003e\n    \u003cimg src=\"https://github.com/kamilmielnik/scrabble-solver/actions/workflows/oxfmt.yml/badge.svg\" alt=\"Oxfmt\" /\u003e\n    \u003cimg src=\"https://github.com/kamilmielnik/scrabble-solver/actions/workflows/npx.yml/badge.svg\" alt=\"npx\" /\u003e\n  \u003c/p\u003e\n\n  \u003cimg alt=\"Screencast GIF showing user interface when solving for oxyphenbutazone, which is a top-scoring word in English version of Scrabble\" src=\"https://raw.githubusercontent.com/kamilmielnik/scrabble-solver/master/screencast.gif\" /\u003e\n\u003c/div\u003e\n\n# scrabble-solver\n\n## Table of contents\n\n1. [Dictionaries](#dictionaries)\n2. [Run](#run)\n3. [Uninstall](#uninstall)\n4. [Develop](#develop)\n   1. [Setup](#setup)\n   2. [Run app dev server](#run-app-dev-server)\n   3. [Rebuild the entire project](#rebuild-the-entire-project)\n   4. [Rebuild a single package](#rebuild-a-single-package)\n   5. [Add a new language](#add-a-new-language)\n5. [Tech stack](#tech-stack)\n6. [Related projects](#related-projects)\n7. [Media](#media)\n\n## Dictionaries\n\nSome of the word lists below are sourced from the companion repository [kamilmielnik/scrabble-dictionaries](https://github.com/kamilmielnik/scrabble-dictionaries).\n\n| Language    | Word list                                                                                                                                                                                               | Word definitions                                     | [Highest-scoring word](https://codesandbox.io/s/highest-scoring-words-in-scrabble-vbj1ns?file=/src/index.js) |\n| ----------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ---------------------------------------------------- | ------------------------------------------------------------------------------------------------------------ |\n| 🇬🇧 English  | [💾](https://raw.githubusercontent.com/kamilmielnik/scrabble-dictionaries/refs/heads/master/english/sowpods.txt) [SOWPODS](https://en.wikipedia.org/wiki/Collins_Scrabble_Words)                        | [Merriam-Webster](https://www.merriam-webster.com/)  | oxyphenbutazone (1458)                                                                                       |\n| 🇺🇸 English  | [💾](https://raw.githubusercontent.com/kamilmielnik/scrabble-dictionaries/refs/heads/master/english/twl06.txt) [TWL06](https://en.wikipedia.org/wiki/NASPA_Word_List)                                   | [Merriam-Webster](https://www.merriam-webster.com/)  | oxyphenbutazone (1458)                                                                                       |\n| 🇫🇷 French   | [💾](https://raw.githubusercontent.com/Thecoolsim/French-Scrabble-ODS8/main/French%20ODS%20dictionary.txt) [ODS8](https://github.com/Thecoolsim/French-Scrabble-ODS8)                                   | [CNRTL](https://www.cnrtl.fr/)                       | schizothymiques (1566)                                                                                       |\n| 🇩🇪 German   | [💾](https://raw.githubusercontent.com/hippler/german-wordlist/master/words.txt) [hippler/german-wordlist](https://github.com/hippler/german-wordlist)                                                  | [DWDS](https://www.dwds.de)                          | polytoxikomanem (1512)                                                                                       |\n| 🇮🇷 Persian  | [💾](https://raw.githubusercontent.com/MansourM/persian-to-persian-dictionary/main/moein/words.txt) [MansourM/persian-to-persian-dictionary](https://github.com/MansourM/persian-to-persian-dictionary) | [واژه یاب](https://vajehyab.com)                     | ‏(756) اگزیستانسیالیست                                                                                       |\n| 🇵🇱 Polish   | [💾](https://sjp.pl/slownik/growy/) [SJP.PL](https://sjp.pl/slownik/dp.phtml)                                                                                                                           | [SJP.PL](https://sjp.pl)                             | współposiądźmyż (1512)                                                                                       |\n| 🇷🇴 Romanian | [💾](https://dexonline.ro/static/download/scrabble/loc-flexiuni-5.0.zip) [LOC 5](https://dexonline.ro/scrabble)                                                                                         | [dexonline](https://dexonline.ro/)                   | luxemburghezele (1944)                                                                                       |\n| 🇪🇸 Spanish  | [💾](https://github.com/kamilmielnik/scrabble-dictionaries/blob/master/spanish/file-2017.txt) [FILE 2017](https://www.facebook.com/Escrablistica)                                                       | [Diccionarios.com](https://www.diccionarios.com/)    | flexibilizabais (1323)                                                                                       |\n| 🇹🇷 Turkish  | [💾](https://github.com/kamilmielnik/scrabble-dictionaries/blob/master/turkish/kelimelik.txt) Turkish                                                                                                   | [Türk Dil Kurumu Sözlükleri](https://sozluk.gov.tr/) | peygamberdevesi (1323)                                                                                       |\n\n## Run\n\nYou can run Scrabble Solver on your machine - all you need is [Node.js](https://nodejs.org/) 24 or later.\n\n```Shell\nnpx scrabble-solver@latest\n```\n\nGive it a while to install and download dictionaries. When it's done it will automatically open http://localhost:3333/ in your browser.\n\nHit \u003ckbd\u003eCtrl\u003c/kbd\u003e + \u003ckbd\u003eC\u003c/kbd\u003e in your terminal to exit the app and shut down the server.\n\n## Uninstall\n\nDictionaries and logs are stored in `$HOME/.scrabble-solver`.\n`$HOME` location is acquired using [`os.homedir()`](https://nodejs.org/api/os.html#oshomedir).\n\n```Shell\nrm -rf $HOME/.scrabble-solver\n```\n\n## Develop\n\nThese steps are required only if you want to make changes to the source code.\n\n### Setup\n\nOne-time project setup.\n\n```Shell\ngit clone https://github.com/kamilmielnik/scrabble-solver.git\ncd scrabble-solver\nnpm install\nnpm run build\n```\n\n### Run app dev server\n\nThe following command will serve the app at http://localhost:3000/.\n\n```Shell\nnpm run dev\n```\n\nNote: hot code reload works only for the [`scrabble-solver`](https://github.com/kamilmielnik/scrabble-solver/tree/master/packages/scrabble-solver) package. If you make changes to any other package, you will need to rebuild it ([see below](#rebuild-a-single-package)).\n\n### Rebuild the entire project\n\n```Shell\nnpm run build\n```\n\n### Rebuild a single package\n\nFor convenience, here's a list of commands to rebuild every package individually.\n\n```Shell\nnpm run build -w @scrabble-solver/configs\nnpm run build -w @scrabble-solver/constants\nnpm run build -w @scrabble-solver/dictionaries\nnpm run build -w @scrabble-solver/logger\nnpm run build -w @scrabble-solver/scrabble-solver\nnpm run build -w @scrabble-solver/solver\nnpm run build -w @scrabble-solver/types\nnpm run build -w @scrabble-solver/word-definitions\nnpm run build -w @scrabble-solver/word-lists\n```\n\n### Add a new language\n\n1. Find and download a flag representing the locale in an SVG format\n   - I usually find them at https://commons.wikimedia.org/\n2. Rename the file to `FlagXX.svg` and put it in [packages/scrabble-solver/src/icons](https://github.com/kamilmielnik/scrabble-solver/tree/master/packages/scrabble-solver/src/icons)\n3. Export the SVG file in [packages/scrabble-solver/src/icons/index.ts](https://github.com/kamilmielnik/scrabble-solver/blob/master/packages/scrabble-solver/src/icons/index.ts)\n4. Add IETF language tag for the new locale in [packages/types/src/Locale.ts](https://github.com/kamilmielnik/scrabble-solver/blob/master/packages/types/src/Locale.ts)\n5. Rebuild the types package\n   ```Shell\n   npm run build -w @scrabble-solver/types\n   ```\n6. Add locale configuration in [packages/scrabble-solver/src/i18n/constants.ts](https://github.com/kamilmielnik/scrabble-solver/blob/master/packages/scrabble-solver/src/i18n/constants.ts)\n7. Update locale-detecting code in [packages/scrabble-solver/src/state/settings/lib.ts](https://github.com/kamilmielnik/scrabble-solver/blob/master/packages/scrabble-solver/src/state/settings/lib.ts)\n8. Add game configs for the new locale in [packages/configs/src/languages](https://github.com/kamilmielnik/scrabble-solver/blob/master/packages/configs/src/languages)\n9. Add an export for these locale configs in [packages/configs/src/languages/index.ts](https://github.com/kamilmielnik/scrabble-solver/blob/master/packages/configs/src/languages/index.ts)\n10. Add a translation file in [packages/scrabble-solver/src/i18n/languages](https://github.com/kamilmielnik/scrabble-solver/tree/master/packages/scrabble-solver/src/i18n/languages) and fill it with translations\n    - Copy any existing file, e.g. `english.json` and modify it\n11. Add an entry for the translations in [packages/scrabble-solver/src/i18n/i18n.ts](https://github.com/kamilmielnik/scrabble-solver/tree/master/packages/scrabble-solver/src/i18n/i18n.ts)\n12. Add a function to fetch the list of words in the new locale in [packages/word-lists/src/getWordList.ts](https://github.com/kamilmielnik/scrabble-solver/blob/master/packages/word-lists/src/getWordList.ts)\n13. Add a function to fetch the word definition in the new locale in [packages/word-definitions/src/crawl.ts](https://github.com/kamilmielnik/scrabble-solver/blob/master/packages/word-definitions/src/crawl.ts)\n14. Add a function to parse the word definition crawled in the previous step in [packages/word-definitions/src/parse.ts](https://github.com/kamilmielnik/scrabble-solver/blob/master/packages/word-definitions/src/parse.ts)\n    - Bonus points for adding tests in [packages/word-definitions/src/parse.test.ts](https://github.com/kamilmielnik/scrabble-solver/blob/master/packages/word-definitions/src/parse.test.ts)\n15. Add a transliteration function in [packages/scrabble-solver/src/lib/localeTransliterate.ts](https://github.com/kamilmielnik/scrabble-solver/blob/master/packages/scrabble-solver/src/lib/localeTransliterate.ts)\n\n## Tech stack\n\n- [TypeScript](https://www.typescriptlang.org/)\n- [Node.js](https://nodejs.org/)\n- [Next.js](https://nextjs.org/)\n- [Express](https://expressjs.com/)\n- [Workbox](https://developer.chrome.com/docs/workbox/)\n- [React](https://reactjs.org/)\n- [Redux](https://redux.js.org/)\n- [Redux Toolkit](https://redux-toolkit.js.org/)\n- [Redux-Saga](https://redux-saga.js.org/)\n- [SCSS](https://sass-lang.com/)\n- [CSS Modules](https://github.com/css-modules/css-modules)\n- [include-media](https://eduardoboucas.github.io/include-media/)\n- [Lerna](https://lerna.js.org/)\n- [Cypress](https://www.cypress.io/)\n- [Jest](https://jestjs.io/)\n- [Oxlint](https://oxc.rs/docs/guide/usage/linter)\n- [Oxfmt](https://oxc.rs/docs/guide/usage/formatter)\n\n## Related projects\n\n### Lexatious\n\nThe user interface and source code for the web front end of Lexatious is based on Scrabble Solver.\n\n- Web: https://lexatious.com\n- GitHub: https://github.com/ericgjackson/lexatious_web\n\n## Media\n\n- [5 Free Scrabble Solver Websites To Quickly Find Top Scoring Words](https://www.ilovefreesoftware.com/05/featured/free-scrabble-solver-websites-to-quickly-find-top-scoring-words.html)\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fkamilmielnik%2Fscrabble-solver","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fkamilmielnik%2Fscrabble-solver","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fkamilmielnik%2Fscrabble-solver/lists"}