lexodus

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

Known limits

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