npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, 👋, I’m Ryan Hefner  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you 🙏

© 2026 – Pkg Stats / Ryan Hefner

scrabble-dictionary

v1.0.2

Published

Scrabble word lists and tile distributions for multiple languages, as plain text and JSON data files.

Readme

scrabble-dictionary

Scrabble word lists and tile distributions for multiple languages, shipped as plain data files (no runtime code) so you can use them from any language or tool.

Structure

reference.json        index of every language/dictionary, with a description and a version
<lang>/                two-letter language code (en, fr, de, ...)
  <dictionary>.txt     one word per line, e.g. en/sowpods.txt, en/twl.txt
  tiles.json           letter -> { amount, points } tile distribution (omitted where no
                       reliable official distribution could be sourced — see "Tile
                       distributions" below)

reference.json looks like:

{
  "en": {
    "version": "1.0.0",
    "hasTiles": true,
    "dictionaries": {
      "sowpods": "Collins Scrabble Words (CSW, formerly SOWPODS) — ...",
      "twl": "NASPA Word List (NWL, formerly TWL/OTCWL/OWL) — ..."
    }
  }
}

Each dictionary key matches a <lang>/<dictionary>.txt file 1:1. version is bumped automatically per language whenever that language's files change in a merged PR (see "Versioning" below) — it is not the same as the npm package version in package.json.

Languages

| Code | Dictionaries | Tiles? | |---|---|---| | en | sowpods, twl | yes | | fr | ods8 | yes | | de | wordlist | yes | | es | file2017, fise2 | yes | | nl | letterlicious | yes | | pl | sjp | yes | | pt | wordlist | yes | | ro | loc5, loc6 | yes | | it | zinga | yes | | fa | moein | no | | tr | kelimelik, tla | no | | id | kbbi | no |

Sources

Word lists

| Lang | Dictionary | Source | |---|---|---| | en | sowpods | kamilmielnik/scrabble-dictionaries, originally wordgamedictionary.com | | en | twl | kamilmielnik/scrabble-dictionaries, originally wordgamedictionary.com | | fr | ods8 | kamilmielnik/scrabble-dictionaries, originally Thecoolsim/French-Scrabble-ODS8 | | de | wordlist | kamilmielnik/scrabble-dictionaries, originally hippler/german-wordlist (used by Tanglet) | | es | file2017 | kamilmielnik/scrabble-dictionaries — official FILE lexicon | | es | fise2 | kamilmielnik/scrabble-dictionaries — official FISE lexicon | | nl | letterlicious | letterlicious.com/data/Words_NL.txt, merged with 5+ letter words from OpenTaal/opentaal-wordlist to fill gaps such as present participles ("deelwoorden", e.g. spelend, etend, wonend) that the Letterlicious list lacks. 2/3/4-letter words were separately reconciled against scrabblewoord.nl's 2-letter list and the ISC Dutch SWL 3-letter/4-letter lists: missing valid short words (e.g. me, je, ik, we) were added, and 2-letter entries absent from both authoritative lists (cd, pc, pk, tv, wc — abbreviations, not real words) were removed. No 3/4-letter words were removed in this pass since the existing list has many entries the ISC lists don't cover and there's no reliable signal those are invalid. | | pl | sjp | kamilmielnik/scrabble-dictionaries, originally sjp.pl/sl/growy | | pt | wordlist | pythonprobr/palavras (derived from the LibreOffice pt_BR spell-check dictionary). Not the originally-suggested Kasama gist — that list strips all accents (e.g. "nao" instead of "não"), which is incorrect Portuguese spelling, so a properly-accented source was used instead. | | ro | loc5, loc6 | kamilmielnik/scrabble-dictionaries, originally dexonline.ro/scrabble | | it | zinga | scrabblewords/scrabblewords — Zingarelli-dictionary-based Italian Scrabble word list | | fa | moein | kamilmielnik/scrabble-dictionaries, originally MansourM/persian-to-persian-dictionary (Moein dictionary). Multi-word phrase entries were filtered out to keep single playable words. | | tr | kelimelik | kamilmielnik/scrabble-dictionaries — modeled on the Kelimelik database | | tr | tla | kamilmielnik/scrabble-dictionaries — Turkish Language Association (TDK) based, via kkrypt0nn/wordlists | | id | kbbi | aryakdaniswara/kbbi-v6-wordlist (KBBI v6.1.0). The raw list mixes in multi-word phrases, abbreviations and numerals; it was filtered down to single alphabetic words. |

Tile distributions

Sourced and cross-checked against Wikipedia: Scrabble letter distributions (official Mattel/Hasbro/Spear's-licensed editions), with every table re-summed to confirm it adds up to the documented total tile count before being committed.

tiles.json is intentionally omitted for Persian, Turkish, and Indonesian: no sufficiently credible, independently-corroborated official/standard tile distribution could be found for these languages (only fan-made or single-source data with material gaps or inconsistencies). If you have an authoritative source for one of these, contributions are welcome.

Licensing

The code in this repository (scripts, workflows) is MIT licensed. The bundled word lists come from third-party sources with their own terms, some of which are not explicitly stated by the original maintainers:

  • pt/wordlist.txt is MPL-2.0 (via pythonprobr/palavras, itself derived from LibreOffice's MPL-2.0-licensed pt_BR dictionary).
  • nl/letterlicious.txt includes words merged in from OpenTaal/opentaal-wordlist, licensed under Revised BSD License (3-clause) and/or CC BY 3.0, © OpenTaal (https://opentaal.org).
  • All other word lists: no explicit license is stated by their upstream source (see the table above). They are widely redistributed/archived as-is (e.g. by kamilmielnik/scrabble-dictionaries), but if you plan to redistribute or use this data commercially, verify the terms of the original source yourself first.

Versioning

Each language has its own version field in reference.json, independent of the npm package version. When a pull request changes any file inside a language folder (e.g. en/), a GitHub Action bumps that language's patch version automatically and pushes the bump onto the PR branch before merge — so the per-language version always reflects a real content change, not a manual/sometimes-forgotten step.

This only works automatically for PRs from branches within this repository (GitHub's GITHUB_TOKEN can't push to fork branches). For PRs from forks, bump version for any language you touched by hand before merging.

Repository setup (do once on GitHub)

This repo is meant to disallow direct pushes/merges to main — all changes go through PRs. After pushing this repo to GitHub:

  1. Settings → Branches → Add branch protection rule for main.
  2. Require a pull request before merging (disable direct pushes).
  3. Require status checks to pass before merging → select the Validate check.
  4. Do not allow bypassing the above settings (including for admins, if you want it strict).

Usage

No JS API is published — read the files directly:

const fs = require('fs');
const reference = JSON.parse(fs.readFileSync('node_modules/scrabble-dictionary/reference.json'));
const words = fs.readFileSync('node_modules/scrabble-dictionary/en/sowpods.txt', 'utf8').split('\n');
const tiles = JSON.parse(fs.readFileSync('node_modules/scrabble-dictionary/en/tiles.json'));

Contributing

Run npm run validate before opening a PR — it checks that reference.json stays consistent with the files on disk (every declared dictionary has a matching .txt file, every .txt file is declared, hasTiles matches whether tiles.json exists, and tiles.json values are well-formed).