Legal
Licences and credits
Effective October 23, 2026
Wordtide's dictionaries and word filters are built only from public-domain and openly licensed lists. Thank you to everyone who made them.
This page is in English; it is the binding version.
# Word-list sources and licenses
Rule (see repo `CLAUDE.md`): every game dictionary must come from a source a closed-source, ad-funded
commercial game may ship: public domain / CC0 / BSD / MIT / CC BY / MPL (the MPL option of multi-licensed
Hunspell dictionaries). CC BY-SA only when no alternative exists, and then the derived word file is
published as-is with attribution. Never official tournament lists (ODS, FISE, OSPS, TWL/NWL, Collins ...)
and nothing "non-commercial". Letter values/tile weights are generated from our own lists
(`scripts/letters.ts`), never copied from commercial games.
Raw downloads live in `data/raw/` (gitignored), are pinned by sha256 in `scripts/sources.lock.json`
(`scripts/fetch-sources.ts`) and are treated as untrusted text. Hunspell `.dic/.aff` files are expanded by our
own expander (`scripts/hunspell.ts`; `unmunch` is not installed). Retrieval date for everything below: 2026-10-22.
LibreOffice/dictionaries commit: `67032ee957631908098a72edf48dc81cac27e369` (master, 2026-09-21).
## English (en) - ENABLE
- Source: ENABLE2K word list, https://raw.githubusercontent.com/dolph/dictionary/master/enable1.txt
- License: public domain. Output: `data/words.txt` (unchanged by the language pipeline).
## Blocklists - LDNOOBW
- Source: https://github.com/LDNOOBW/List-of-Dirty-Naughty-Obscene-and-Otherwise-Bad-Words, commit `5faf2ba42d7b1c0977169ec3611df25a3c08eb13`
- License: CC BY 4.0. Attribution: "List of Dirty, Naughty, Obscene, and Otherwise Bad Words" contributors (LDNOOBW).
- Used for en, es, pt, fr, de, it, nl, pl, tr, ru (exact + simple-inflection blocking). No list exists upstream
for uk and id: those use only our manual `data/<code>/blocklist-extra.txt`. Over-blocked everyday words are
restored per language in `data/<code>/allowlist.txt`.
- Wave C/D: LDNOOBW also used for ar, ko, ja (katakana entries only; kanji entries cannot match kana tiles), cs, hu,
sv, da, nb (`no`), fi, fil, fa, th. LDNOOBW `hi` is romanised and cannot match Devanagari. vi, hi, ro, sk, ca, hr, sl,
lt, lv, et, ms, sw, af, el, he, bn, ta (and ja readings) use a SHORT manual `blocklist-extra.txt` written without a
native speaker - **each needs native-speaker review before launch**.
## Blocklists - Wiktionary offensive senses (added 2026-10-22)
- Every language read from a kaikki.org (Wiktionary) extract also blocks words whose EVERY sense, across all of the
word's entries, is tagged vulgar / offensive / slur (not derogatory/pejorative, which also tag ordinary disapproving words) (a word with any neutral entry, e.g.
Finnish muna = egg, Indonesian kampung = village, stays). Their forms are blocked with them.
- Languages without LDNOOBW whose word list is not from Wiktionary read the English-Wiktionary entries of the language
ONLY for these tags (`tagsFrom` in `scripts/sources.ts`): ro (Romanian), sk (Slovak), hr (Serbo-Croatian `sh`),
lt (Lithuanian), el (Greek), uk (Ukrainian). No word is added from them, so the word lists keep their licence.
- License of the tags: CC BY-SA 4.0 (Wiktionary contributors; kaikki.org / wiktextract). Counts in `stats.json`
(`wiktionaryOffensive`).
## Hand-written additions - `data/<code>/include.txt`
- Everyday words a source lacks (weekday names that a source lists only as capitalised names, numerals, ...), written
by us: our own work, no third-party licence. Each line must be playable or the build fails; they skip the 2-letter
corpus gate but not the blocklist.
## Everyday-word probe - `test/probe/<code>.txt`
- ~300 common words per language (numbers, colours, family, body, food, animals, days, verbs, adjectives + common
inflections), written by us; `node scripts/probe-coverage.ts --missing` reports the share each list accepts.
`node scripts/audit-junk.ts --samples` reports sizes, long words, 2-letter and vowel-less entries.
## Frequency ranking (cap only) - FrequencyWords
- Source: https://github.com/hermitdave/FrequencyWords, commit `525f9b560de45753a5ea01069454e72e9aa541c6`, `content/2018/<lang>/<lang>_full.txt`
- License: content CC BY-SA 4.0 (derived from OpenSubtitles), code MIT. Attribution: Hermit Dave.
- Use: ONLY to (a) rank expanded forms when a list exceeds the 400,000-word cap and (b) require 2-letter words to
be common words (abbreviation filter). No frequency data is shipped. Because the selection of the capped lists
and the id/de/it lists is derived from CC BY-SA material, those word files are published as-is with this attribution.
## Spanish (es)
- Source: RLA-ES `es_ES` dictionary via LibreOffice/dictionaries `es/` (upstream https://github.com/sbosio/rla-es)
- License: tri-license GPL-3+ / LGPL-3+ / MPL-1.1+ (file `LICENSE.md`, `README_hunspell_es.txt`); **we use the MPL-1.1 option**.
- Output: 58,221 stems expanded to 659,206 forms, capped to 400,000 (attested forms first, then headwords).
## Portuguese, Brazil (pt)
- Source: Brazilian Portuguese `pt_BR` (Raimundo Moura and team) via LibreOffice/dictionaries `pt_BR/`
- License: "LGPLv3 and Mozilla Public License" (`README_pt_BR.txt`); **we use the MPL option**.- Output: 309,931 stems -> 10.4 M raw forms (very productive derivational affixes) -> 400,000 (see quality notes).
## French (fr)
- Source: Dicollecte / Grammalecte French dictionary v7.7, https://grammalecte.net/ via LibreOffice/dictionaries `fr_FR/dictionaries/`
- License: MPL-2.0 (`README_dict_fr.txt`).
- Output: 84,161 stems -> 462,659 forms -> 400,000.
## German (de)
- Source: English Wiktionary German entries (headwords + inflected forms), kaikki.org extract
https://kaikki.org/dictionary/German/ (Wiktextract); sha256 in `sources.lock.json`.
- License: CC BY-SA 4.0 (+GFDL). Attribution: Wiktionary contributors; extraction by Tatu Ylonen (kaikki.org / wiktextract).
- Why: the only complete German Hunspell dictionaries (igerman98 / LibreOffice `de_*_frami`) are GPL-2/3 (and LGPL for
the thesaurus), with no MPL/BSD/CC BY option. No permissive German word list of comparable size was found.
The derived `data/de/words.txt` is published as-is under CC BY-SA 4.0 with this attribution.
## Italian (it)
- Source: English Wiktionary Italian entries, kaikki.org extract https://kaikki.org/dictionary/Italian/
- License: CC BY-SA 4.0 (+GFDL); same attribution/publishing terms as German.
- Why: the LibreOffice `it_IT` dictionary (Pescetti) is GPL-3 only. Derived `data/it/words.txt` published as-is.
## Dutch (nl)
- Source: OpenTaal `nl_NL` via LibreOffice/dictionaries `nl_NL/` (upstream https://github.com/OpenTaal/opentaal-hunspell)
- License: Revised BSD (3-clause) and/or CC BY 3.0, user's choice (`LICENSE.txt`); **we use BSD-3-Clause**.
Copyright OpenTaal; keep the notice.
- Output: 172,401 stems -> 247,460 words (no cap needed).
## Polish (pl)
- Source: sjp.pl spelling dictionary (generated 2017-05-14, maintainer Marek Futrega) via LibreOffice/dictionaries `pl_PL/`
(upstream https://sjp.pl/slownik/en/). NOT the sjp.pl tournament list.
- License: GPL / LGPL / MPL / Apache-2.0 / CC BY-SA multi-license (`README_en.txt`); **we use the MPL option**.
- Output: 348,901 stems -> 4.16 M forms -> 400,000 (attested forms by corpus frequency; see quality notes).
## Turkish (tr)
- Source: `tr_TR` (hunspell-tr, Harun Resit Zafer) via LibreOffice/dictionaries `tr_TR/`
- License: MPL-2.0 (`README.txt`, `LICENSE`). (Upstream hunspell-tr repository is MIT.)
- Output: 75,909 stems, suffix chaining limited to 2 levels -> 5.75 M forms -> 400,000 (attested first).
## Indonesian (id)
- Source: English Wiktionary Indonesian entries, kaikki.org extract https://kaikki.org/dictionary/Indonesian/
- License: CC BY-SA 4.0 (+GFDL); published as-is with attribution.
- Why: the Indonesian Hunspell dictionary is GPL-2 only; no permissive list found.
- Also the Indonesian Wiktionary (id.wiktionary.org) Indonesian entries, kaikki.org extract
https://kaikki.org/idwiktionary/Bahasa%20Indonesia/ (same CC BY-SA 4.0 terms), merged in 2026-10-22.
## Russian (ru)
- Source: `ru_RU` by Alexander I. Lebedev via LibreOffice/dictionaries `ru_RU/`
- License: BSD-3-Clause-style (Copyright 1997-2008 Alexander I. Lebedev; modified versions must be marked as such;
name may not be used to endorse). Notice reproduced in `README_ru_RU.txt`. Modified: lowercase/alphabet/blocklist/cap filtering.
- Output: 146,269 stems -> 1.42 M forms -> 400,000.
## Ukrainian (uk)
- Source: `uk_UA` (Andriy Rysin, based on https://github.com/brown-uk/dict_uk) via LibreOffice/dictionaries `uk_UA/`
- License: MPL-1.1 per `README_uk_UA.txt`. (dict_uk itself is also offered under other licenses; we rely on the MPL statement
of the LibreOffice package.)
- Output: 350,658 stems -> 3.23 M forms -> 400,000 (only ~51k attested in the small uk frequency corpus; the rest are headwords).
# Wave C / Wave D sources (retrieved 2026-10-22)
Tile models and script decisions: `docs/scripts.md`. Word counts, readiness (`ready`, false below 30,000 words) and
caps are in each `data/<code>/stats.json`. Every Wiktionary-derived (CC BY-SA 4.0) list below is used only because no
permissively licensed list of usable size was found (reason given per language); its `words.txt` is published as-is
under CC BY-SA 4.0 with the attribution "Wiktionary contributors; extraction by Tatu Ylonen (kaikki.org / wiktextract)".
Kaikki files are pinned by sha256 in `scripts/sources.lock.json`.
## Permissive sources
- **Arabic (ar)** - Ayaspell `ar` via LibreOffice `ar/`. `COPYING.txt`: "GPL 2.0/LGPL 2.1/MPL 1.1 tri-license"; **we use
MPL-1.1**. Expanded with AF flag aliases; forms with 2+ affixes kept only if attested in the corpus; capped 400k.
- **Japanese (ja)** - Mozc OSS dictionary `src/data/dictionary_oss/` (google/mozc `f183d4d3a7ba139d7cb2252c05f608e9f8266aef`).
`README.txt`: vocabulary from IPAdic (NAIST licence: "Use, reproduction, and distribution ... is permitted", notice +
ICOT no-warranty paragraphs must be kept), Okinawa dictionary ("Public Domain Data"), Google additions under Mozc's
BSD-3-Clause. Keep the IPAdic/ICOT notice with the shipped list. Only kana readings are used. Chosen over JMdict
(CC BY-SA 4.0) because it is permissive. English-Wiktionary Japanese entries (kaikki.org, CC BY-SA 4.0) are read only to
decide whether a surface that is also a name (港, 朝日, トマト) or a の compound (男の子) is a common word; no word is
taken from them. Base (dictionary) forms only: conjugations are not listed.
- **Romanian (ro)** - Rospell 3.3.10 `ro_RO` via LibreOffice `ro/`; `README_EN.txt`: GPL-2/LGPL-2.1/MPL-1.1 tri-license;
**MPL-1.1** (`COPYING.MPL`).
- **Slovak (sk)** - sk-spell `sk_SK` via LibreOffice `sk_SK/`; `README_en.txt`: GPL-2 / LGPL-2.1 / MPL-1.1, "you can
select one"; **MPL-1.1**.
- **Hungarian (hu)** - Magyar Ispell 1.9 `hu_HU` via LibreOffice `hu_HU/`; `README_hu_HU.txt`: MPLv2 or LGPLv3+; **MPL-2.0**.
One suffix level; every affixed form must be attested in the frequency corpus (full expansion exceeds 16 M forms).
- **Swedish (sv)** - SALDO morphology `saldom.xml` (Sprakbanken Text, University of Gothenburg; Borin, Forsberg,
Lonngren), https://spraakbanken.gu.se/en/resources/saldom - licence **CC BY 4.0** (resource page). Proper nouns
(`pm*`), abbreviations (`*a`), multiword units (`*m`) and compound-only forms (`c`, `ci`, `cm`, `sms`) dropped.
Attribution required: "SALDO, Sprakbanken Text, University of Gothenburg, CC BY 4.0".
- **Danish (da)** - Stavekontrolden 2.9.101 `da_DK` (Foreningen for frit tilgaengelige sprogvaerktoejer) via LibreOffice;
`README_da_DK.txt`: GPL-2.0 / LGPL-2.1 / MPL-1.1; **MPL-1.1**. Based on data from Det Danske Sprog- og Litteraturselskab.
- **Norwegian Bokmal (nb)** - `nb_NO.dic` 3.0 (Lars Bungum) via LibreOffice `no/`, read as a full-form word list.
`README`: word lists from Ordbanken (Nasjonalbiblioteket, **CC BY 4.0**) + 2018-2024 new-word lists (CLARINO Bergen /
Sprakbanken, **CLARIN PUB +BY**, attribution) + words of the year (Spraakradet, facts). The affix file is GPL-2 and is
**not used**. Attribution: Nasjonalbiblioteket - Ordbanken; CLARINO Bergen / Sprakbanken. HUMAN CHECK: confirm CLARIN
PUB +BY permits commercial use (it is a public, attribution-only licence category).
- **Croatian (hr)** - hr-hunspell `hr_HR` via LibreOffice; `README_hr_HR.txt`: GPL 2.0/LGPL 2.1/MPL 1.1 tri-license; **MPL-1.1**.
- **Lithuanian (lt)** - ispell-lt `lt_LT` via LibreOffice; `COPYING`: BSD-3-Clause (Copyright 2000-2020 Albertas Agejevas
and contributors) - keep the notice. Forms with 2+ affixes only if attested.
- **Greek (el)** - elspell 0.9 `el_GR` via LibreOffice; `README_el_GR.txt`: MPL 1.1/GPL 2.0/LGPL 2.1; **MPL-1.1**.
- **Persian (fa)** - Lilak (Mostafa Sedaghat Joo) `fa-IR` via LibreOffice; `LICENSE`: **Apache-2.0** (keep the notice).
- **Tamil (ta)** - corpus-based `ta_IN` (Ve. Elanjelian, Thamizha) via LibreOffice; the package's `COPYING` is
**MPL-1.1**. Corpus-derived: contains some proper nouns (no case to filter them) - native review. The .dic lacks many
basic stems (கண், பால், கடல்), so English-Wiktionary Tamil entries (kaikki.org, CC BY-SA 4.0) are merged in; the
combined `ta/words.txt` is therefore published as-is under CC BY-SA 4.0 with the Wiktionary attribution.
- **Thai (th)** - PyThaiNLP `words_th.txt` (PyThaiNLP/pythainlp `8b2b9a6d0f69846364f37e8c16ffc31177f6151c`);
`corpus_license.md`: created by PyThaiNLP and released under **CC0-1.0**.
## Wiktionary (CC BY-SA 4.0) - no permissive alternative
- **Korean (ko)** - LibreOffice `ko_KR` is GPL-3.0; upstream hunspell-dict-ko states most word data (NIKL) is CC BY-SA 4.0.
Capped at 240,000 words (by corpus frequency) to keep the jamo file under 8 MB.
- **Vietnamese (vi)** - LibreOffice `vi_VN` (Ho Ngoc Duc list) is GPLv2 only. English Wiktionary + Vietnamese Wiktionary
(vi.wiktionary.org, kaikki.org extract https://kaikki.org/viwiktionary/Ti%E1%BA%BFng%20Vi%E1%BB%87t/, CC BY-SA 4.0)
merged 2026-10-23: 33.1k words after tone folding, `ready: true`. Blocklist: `blocklist-extra.txt` + `blockstems.txt`.
- **Hindi (hi)** - LibreOffice `hi_IN` (aspell-hi) is GPL-2. `include.txt` adds ~65 everyday words (our own list) that
Wiktionary lacks; `blockstems.txt` blocks vulgar stems in every form, `allowlist.txt` keeps the clean look-alikes.
- **Czech (cs)** - LibreOffice `cs_CZ` is GNU GPL.
- **Finnish (fi)** - no Finnish Hunspell in LibreOffice (Voikko is GPL). The Kotus "Nykysuomen sanalista" is offered
under LGPL / EUPL / CC BY 3.0 per its web page and the ISLRN registry, but the downloadable files carry only LGPL/EUPL
texts and kaino.kotus.fi returns HTTP 403 to us. HUMAN: confirm the CC BY option on kotus.fi; then switch fi to
Kotus lemmas (+ our own inflection) and drop the CC BY-SA dependency. Inflected forms are kept only when attested in the
frequency corpus (the full tables exceed 16 M forms).
- **Catalan (ca)** - LibreOffice/Softcatala `ca` is LGPL/GPL only.
- **Slovene (sl)** - LibreOffice `sl_SI` is GPL/LGPL; Sloleks 3.0 (larger) is also CC BY-SA 4.0 - candidate upgrade.
- **Latvian (lv)** - LibreOffice `lv_LV` is LGPL-2.1; Tezaurs.lv is CC BY-SA.
- **Estonian (et)** - LibreOffice `et_EE` is LGPL + EKI licence.
- **Malay (ms)** - no Malay Hunspell in LibreOffice. English Wiktionary + Malay Wiktionary (ms.wiktionary.org, kaikki.org
extract https://kaikki.org/mswiktionary/Bahasa%20Melayu/, CC BY-SA 4.0) merged; still small (12.4k, `ready: false`,
basic verbs such as membeli/menulis missing). Hunspell `ms_MY` is GFDL + GPL (Fedora/CentOS hunspell-ms spec), not
usable. A meN-/ber-/di-/-kan affix expansion gated by FrequencyWords attestation reaches only ~24k and needs native
review: not served until a clean source or a reviewed expansion exists.
- **Filipino (fil)** - English Wiktionary Tagalog (`tl`); no Tagalog Hunspell in LibreOffice.
- **Swahili (sw)** - LibreOffice `sw_TZ` is LGPL. No FrequencyWords list: 2-letter words kept only as headwords.
- **Afrikaans (af)** - LibreOffice `af_ZA` is LGPL-2.1. Only 9.9k words: `ready: false`.
- **Hebrew (he)** - LibreOffice `he_IL` (Hspell) is AGPL-3.
- **Bengali (bn)** - LibreOffice `bn_BD` is GPL-2.
## Considered and rejected
- JMdict/EDRDG (ja): CC BY-SA 4.0; Mozc's permissive IPAdic-derived dictionary used instead.
- LibreOffice sv_SE (LGPL-3), ca (LGPL/GPL), cs_CZ (GPL), sl_SI (GPL/LGPL), lv_LV (LGPL), et_EE (LGPL + EKI), sw_TZ (LGPL),
af_ZA (LGPL), he_IL (AGPL), hi_IN (GPL), bn_BD (GPL), th_TH (LGPL), vi (GPL-2), ko_KR (GPL-3): no MPL/BSD/CC BY option.