About
What this is
lexodus shows how words travelled between 33 languages of Europe and its neighbours: which languages each one took words from, which languages took words from it, and the way each word came, step by step. Italian caffè, for example, came from Ottoman Turkish kahve, which came from Arabic qahwa; from Italian it went on to French, English, Dutch and Icelandic.
The 33 languages are Albanian, Arabic, Bulgarian, Catalan, Czech, Danish, Dutch, English, Estonian, Finnish, French, German, Greek, Hebrew, Hungarian, Icelandic, Italian, Latvian, Lithuanian, Maltese, Norwegian Bokmål, Persian, Polish, Portuguese, Romanian, Russian, Serbo-Croatian, Slovak, Slovene, Spanish, Swedish, Turkish and Ukrainian. Any of them can be put at the centre.
Where to start: the grid on the first page (who took from whom), the page of a language, a word and its tree, or the pages under Explore: hidden donors, most travelled words, doublets, round trips, word families, the comparison of two languages (with round trips between the two, cousin words and false loans) and what a language gave to the world. For a word picked at random, press Surprise me on the first page or in Search.
Where the data comes from
Every etymology comes from English Wiktionary, the free dictionary written by volunteers, as extracted by Wiktextract and published on kaikki.org. The file was downloaded on 18 October 2026 (Wiktionary dump of 2 September 2026).
Wiktionary content is available under the licence CC BY-SA 4.0. The tables of lexodus are derived from it and shared under the same licence, with credit to the Wiktionary contributors.
How a word's path is read
Wiktionary writes etymologies with small templates (“borrowed from”, “inherited from”, “calque of”…). lexodus reads them in order and builds a chain, from the language the word came from straight away back to the oldest word Wiktionary names.
Each step has a category:
- borrowed
- taken from another language (English pizza from Italian).
- learned Latin
- taken from written Latin, at any time (Italian nazione).
- inherited
- passed down from an older form of the language (Italian figlio from Latin filius). Not a borrowing.
- calque
- translated piece by piece (English bankrupt from Italian bancarotta).
- unspecified
- Wiktionary only says “from X”.
Borrowed, learned Latin and calque are counted as words “taken” (in the grid, in “took most from” and in the rankings); inherited and unspecified can be switched on in the language pages.
Three places on the chain have a name:
- direct language
- where the word came from straight away: Ottoman Turkish for Italian caffè. The grid and the language pages count each word here.
- second level
- the language one step before: Arabic for caffè. Opening a row of a language page shows it, for the same words.
- farthest origin
- the last step Wiktionary describes. Where Wiktionary splits a word into a base and an affix, the chain follows the base.
Stages of the same language (Middle English to English, Late Latin to Latin) are not counted as steps between languages. All the varieties of Latin (Classical, Late, Medieval, New…) count as one “Latin” unless you split them.
What the numbers are
The numbers are a snapshot of Wiktionary, not a measure of the vocabulary. They say what the editors of Wiktionary wrote about where words come from, not how many words a language really took or gave.
Coverage is very uneven. Each language page says how many of its entries have an etymology at all: good when 70% or more do (Finnish 97%, Polish 95%), fair between 30% and 70% (Italian 51%), poor below 30% (Arabic 20%, Maltese 10%). A language with few links did not necessarily take or give few words.
Romanian is a case apart. Its editors write “borrowed from French” even for international learned words, so French seems to have given Romanian about 28,000 words, more than any other pair. Romanian stays visible (its page, the grid, the lists), but it is left out of statistics and rankings as a language that took words. It still counts as an origin or a language in between. Romanian page.
Families of languages (Germanic) and reconstructed languages (Proto-Slavic) are hidden by default; on a language page they can be shown, and the farthest origins list them apart.
What is left out
- Dates. Wiktionary rarely says when a word arrived, so no dates are used.
- Proper names and inflected forms (plurals, verb forms).
- Etymologies written only in words, without templates (“from the name of the Venice ghetto”).
- Uncertain etymologies are not left out but marked: a word with two or more possible origins shows them side by side with “or” and a “?” in the lists, and it is not counted in the grid. Origins that the text itself calls unlikely are dropped.
- “Translingual” (scientific names of plants and animals) is not a language and is hidden by default.
Known limits
- Homographs in trees. Wiktionary links a borrowing to a spelling, not to a meaning. When one spelling has two etymologies (French café, the drink and the colour), the words taken from it can appear under the wrong one; the trees mark these words with “one of N origins of this spelling”.
- “Via” chains. Some etymologies say “from Arabic, via Spanish” without a template for each step: the language in between may be missing, and long chains can be noisy.
- Transliteration gaps. Words in another script have their transliteration in brackets, as Wiktionary gives it: قهوة (qahwa). It is automatic for Arabic, Persian, Russian or Greek, written by hand for Hebrew, and sometimes missing; then only the original is shown.
- Editors of different languages write differently, so numbers of two languages are not directly comparable.
- The meaning shown is the first English definition of the entry, cut at 120 characters: a definition, not a translation.
How the site is built
lexodus is a set of static pages: plain HTML, CSS and JavaScript, no libraries, no server, no cookies. The data was read from the Wiktextract file with Python scripts (in a separate project folder) and saved as JSON files: one file for each pair of languages with its words, one file per letter for the search and for the trees, and small files for the grid, the statistics and the Explore pages. Each page reads only the files it needs.
To update: run the processing again on a newer Wiktextract file, copy the export into data/ with scripts/aggiorna_dati.py (it also sets a new version number, so browsers do not keep old files) and publish. The code is on GitHub.
How it was built, in numbers
The same steps as above, with the numbers of this edition of the data.
- The source file
- English Wiktionary as extracted by Wiktextract and published on kaikki.org: the dump of 2 September 2026, downloaded on 18 October 2026. One file of 2.8 GB compressed, 23.9 GB once opened, with 10,913,997 lines, one for each entry of every language in Wiktionary.
- What was kept
- The entries of the 33 languages: about 6.9 million. Without inflected forms (plurals, verb forms) and proper names, 2,085,836 words remain (a word with two etymologies counts twice). 1,393,030 of them have an etymology, and 385,453 have at least one link to another language: these are the words of the site.
- How an etymology is read
- From the templates the editors write: borrowed, inherited, derived, calque, learned borrowing and a few more. Newer entries have an etymology tree, stored as data inside the entry: it is read as a whole, so a word like Italian zucchero goes back 7 steps, to Proto-Indo-European. The first language named is the direct one; the next ones are the steps before it, up to 12. Where Wiktionary splits a word into a base and an affix, the chain follows the base. Stages of the same language (Middle English to English) are not counted as steps. Every borrowing from Latin, at any stage, counts as learned Latin.
- What was corrected
- Origins that the text itself rejects (“not from”, “rather than from”) are dropped from the chain. In the trees, Wiktionary links a borrowing to a spelling, not to a meaning: when the spelling has more than one etymology and nothing tells which, the word is marked; 3,906 descendants are marked this way. 50 words appeared twice with the same etymology number and were numbered again, so each word has one place only.
- Transliteration
- Taken from Wiktionary, never made up. Words with and without one: Arabic 59,069 and 17, Russian 51,052 and 16, Greek 26,675 and 55.
- A check against Italian Wiktionary
- For Italian words, the direct language was compared with the one written in Italian Wiktionary, where both name one: they agree in 88.8% of cases (25,247 words out of 28,420).
- The files of the site
- About 24,000 JSON files, 656 MB in all: one file for each pair of languages with its words (22,623, with the squares of the grid), the trees (845 files) and the search index (60 files), plus small files for the grid, the statistics and the Explore pages.
- Time
- Reading the whole Wiktionary file takes about 3 minutes on an ordinary PC, with 10 processes working in parallel. Writing the files of the site takes about one more minute.
- What is not used
- Dates (Wiktionary rarely gives them), proper names, inflected forms. Romanian is shown everywhere but left out of statistics and rankings as a language that took words (see above).
Credits
- The etymologies: the contributors of English Wiktionary (CC BY-SA 4.0).
- The extraction: Wiktextract by Tatu Ylonen, files from kaikki.org.