Beinecke MS 408 · research log · October 2026
Trying to decode the Voynich manuscript
Four rounds of computational attempts used letter substitutions, cipher solvers, 46 languages and medieval texts. Every method was tested on hidden-key ciphers before it was trusted. This page summarises what was tested and what the manuscript turned out to be like.
Five findings
The share of next-word dependence the manuscript keeps between words two apart. Every one of 46 languages keeps 33–76%.
How often a word is followed by itself, compared with chance. Every language avoids this (0.42× or less), except Indonesian, whose hyphenated doubled words were split into separate words.
Words that differ by these glyphs occur in the same contexts, like interchangeable spellings. The preferred spelling drifts by section.
A simple chain predicting each glyph from the previous four, trained on the manuscript, reproduces almost every word-sequence statistic measured.
The number of language models with which the best cipher solver found a message. The same solver recovered 93–99% of letters from hidden test ciphers in six languages, including 15th-century German herbal text.
The clearest result
Dependence kept between words two apart, as a share of next-word dependence
Show the data table
| Text | Next word (bits) | Two apart (bits) | Share kept |
|---|---|---|---|
| Tagalog | 0.874 | 0.662 | 76% |
| Albanian | 0.777 | 0.508 | 65% |
| Japanese | 1.545 | 1.009 | 65% |
| Esperanto | 0.838 | 0.488 | 58% |
| Somali | 0.905 | 0.514 | 57% |
| Polish | 0.653 | 0.362 | 55% |
| English | 1.048 | 0.576 | 55% |
| Czech | 0.612 | 0.336 | 55% |
| Romani | 0.992 | 0.542 | 55% |
| French | 1.010 | 0.552 | 55% |
| Portuguese | 0.748 | 0.407 | 54% |
| Cebuano | 0.914 | 0.489 | 54% |
| Lithuanian | 0.568 | 0.302 | 53% |
| Maori | 1.100 | 0.572 | 52% |
| Greek | 0.980 | 0.504 | 51% |
| Spanish | 0.947 | 0.481 | 51% |
| Malagasy | 1.058 | 0.535 | 51% |
| Hindi | 1.098 | 0.549 | 50% |
| Romanian | 1.071 | 0.529 | 49% |
| Latin | 0.508 | 0.248 | 49% |
| German | 0.843 | 0.410 | 49% |
| Italian | 0.815 | 0.396 | 49% |
| Syriac | 0.693 | 0.332 | 48% |
| Coptic | 0.743 | 0.354 | 48% |
| Turkish | 0.711 | 0.338 | 48% |
| Nahuatl | 0.831 | 0.393 | 47% |
| Q'eqchi' | 1.044 | 0.493 | 47% |
| Finnish | 0.751 | 0.355 | 47% |
| Hebrew | 0.664 | 0.310 | 47% |
| Arabic | 0.690 | 0.316 | 46% |
| Basque | 0.620 | 0.282 | 46% |
| Armenian | 0.646 | 0.286 | 44% |
| Korean | 0.618 | 0.267 | 43% |
| Cherokee | 0.495 | 0.209 | 42% |
| Estonian | 0.751 | 0.312 | 42% |
| Swahili | 0.780 | 0.323 | 41% |
| Zulu | 0.644 | 0.264 | 41% |
| Indonesian | 1.096 | 0.447 | 41% |
| Thai | 1.439 | 0.581 | 40% |
| Shona | 0.733 | 0.290 | 40% |
| Quichua | 0.654 | 0.252 | 38% |
| Amharic | 0.614 | 0.229 | 37% |
| Vietnamese | 1.453 | 0.539 | 37% |
| Farsi | 0.773 | 0.259 | 34% |
| Chinese | 1.627 | 0.536 | 33% |
| Hungarian | 0.576 | 0.188 | 33% |
| Voynich, as written | 0.119 | 0.001 | 0% |
| Voynich, variant spellings merged | 0.184 | 0.017 | 9% |
| Timm–Schinner generator (no message) | 0.067 | -0.019 | none |
| Greshko Naibbe cipher of Latin | 0.102 | -0.005 | none |
| Glyph chain, 4 glyphs of memory | 0.033 | -0.022 | none |
Any reading that turns each Voynich word into a word of a language inherits this property. The decoded text would have no grammar linking words beyond their immediate neighbours, and no language tested behaves like that. In practice, word-for-word "translations" of the manuscript cannot be ordinary prose in any of these languages.
What the manuscript's word stream looks like
| Text | Same word twice, per 1,000 pairs | vs chance | Two apart (bits) | Glyph link across the space (bits) |
|---|---|---|---|---|
| Voynich manuscript (paragraph text) | 9.7 | 1.19 | 0.00 | 0.176 |
| Latin prose (Secretum secretorum) | 0.3 | 0.02 | 0.125 | 0.038 |
| Croatian Bible | 0.6 | 0.07 | 0.282 | — |
| Timm–Schinner generator (no message) | 10.2 | 0.80 | −0.02 | 0.012 |
| Greshko's Naibbe cipher (Latin message) | 1.4 | 0.31 | −0.01 | 0.002 |
| Glyph chain, 4 glyphs of memory | 4.2 | 1.25 | −0.02 | 0.182 |
The glyph link across the space is the mutual information between a word's last glyph and the next word's first, above a shuffle. In the manuscript, after -y the next word starts with qo- 1.65 times as often as chance and with a- 0.14 times. A short glyph chain reproduces this; neither published model does.
Decoding attempts
| Approach | On hidden-key controls | On the manuscript |
|---|---|---|
| Letter-for-letter substitution into Latin, Italian, English, Spanish (48 configurations) | 98–100% of letters | No readable text; entropy far too low for any of them |
| Each word = one or two letters, fixed word divisions (Naibbe type) | 99.8–99.9% | Real text no better than shuffled text |
| Same, with the word division learned together with the key | 93–99% in six languages | Nothing with 35 Bible languages, period German (1460–1543 and Middle High German), Old Czech, Middle English, Old Occitan, Latin, Italian; per section; right-to-left; line by line |
| Cluster the word pieces, then solve as a substitution cipher | 70% of letters | Real text no better than shuffled text |
| Words of 1–3 pieces with null fillers | Failed its own control (collapsed into nulls) | Not used |
| Calibration: a known Latin cipher solved with the wrong language | +0.58 to +1.10 bits/word above shuffled | Manuscript with the same five models: +0.04 to +0.39 |
Outside proposals checked
ZFD, "15th-century Croatian apothecary shorthand"
ZFD decodes each Voynich word through a fixed glyph-to-sound table, so its "Croatian" inherits the manuscript's statistics. Its decoded text keeps almost no link two words apart (0.038 bits, against 0.282 in real Croatian). It repeats words immediately 19 times as often as real Croatian, and 66% of its English glosses are "?". Its validation score ignores word order, so a shuffled manuscript would score the same.
"Mostly Hebrew, words written right to left"
Letter for letter, the manuscript is far more predictable than written Hebrew: 2.2 bits per glyph against 3.4, in either reading direction. Hebrew words link two apart (0.315 bits); the manuscript's do not. Hebrew as a cipher plaintext was also tested in the solver sweep and gave nothing.
What could still change this
- A crib: one plaintext word securely tied to a Voynich word. The Latin-script German on f116v is the only candidate and it is weak.
- Physical evidence: multispectral imaging, erasures, the original page order.
- Untested cipher designs: pieces standing for syllables, or rules that change with position in the line. Without a crib, the space of such designs is effectively unlimited.
The simpler explanation, a text written by a short-memory procedure whose spelling habits drifted over time, now fits the measurements at least as well as any cipher tested. That is not proof that the text is meaningless.
Reports and code
- Attempt 1 — first statistics and reading guide (Markdown)
- Attempt 2 — letter-for-letter substitution searches (Markdown)
- Attempt 3 — word-level tests and a structure-aware cipher solver (Markdown)
- Attempt 4 — 46 languages, period corpora, three new solvers, outside claims (Markdown)
- Illustrated English reading guide (PDF): describes what the pictures show; it does not translate the text.
- Code and results (zip): Python and Node.js, standard libraries only, plus every solver log, key and statistics file.
Data used, not redistributed here (the scripts download it):
- Takahashi (IT) and Zandbergen–Landini (ZL) transliterations (voynich.nu);
- Lindemann–Bowern historical corpora;
- parallel Bible corpus (christos-c/bible-corpus);
- HistCorp period German and Czech (Zenodo 10013189, CC BY 4.0);
- COMETA Old Occitan (Zenodo 15300719, CC BY 4.0);
- Timm and Schinner's generator sample (TorstenTimm/SelfCitationTextgenerator);
- Greshko's Naibbe ciphertext (greshko/naibbe-cipher).