Everything that went into these translations, and everything we used to check them, is downloadable here. The goal is not just trust — it is replication. Take the texts, run the checks, copy the pipeline, and put another ancient author back in circulation.
The original-language sources we translated from (public domain: Perseus Digital Library, Niese's Josephus, Cohn-Wendland's Philo, the Latin Library), the classic public-domain English translations we measured against (also free — they are monuments, and deserve reading), and our own editions:
| Work | Original language | Classic translation | Plainspoken (ours) |
|---|---|---|---|
| Homer — The Iliad | TXT · 1.2 MB | TXT · 796 KB | TXT · EPUB |
| Homer — The Odyssey | TXT · 961 KB | TXT · 653 KB | TXT · EPUB |
| Hesiod | TXT · 169 KB | TXT · 145 KB | TXT · EPUB |
| Herodotus — The Histories | TXT · 2.6 MB | TXT · 1.5 MB | TXT · EPUB |
| Plato | TXT · 6.4 MB | TXT · 5.2 MB | TXT · EPUB |
| Plutarch — The Moralia | TXT · 14.2 MB | TXT · 4.0 MB | TXT · EPUB |
| Josephus | TXT · 6.3 MB | TXT · 4.2 MB | TXT · EPUB |
| Philo of Alexandria | TXT · 5.7 MB | TXT · 4.4 MB | TXT · EPUB |
| Seneca — Letters | TXT · 815 KB | — | TXT · EPUB |
All source and classic-translation files are public domain. Our translations are free to read and share; see the colophon for the method and disclosure.
A runnable Jupyter notebook that recomputes the quality-page numbers live against this site — archaism rates, independence scans, completeness gates. Open it in Google Colab and press run.
📋 Download replication.ipynb Open Colab → upload itimport requests, re, statistics
BASE = "https://scriptorium-press.pages.dev"
def fetch(path):
r = requests.get(f"{BASE}/{path}"); r.raise_for_status(); return r.text
def words(t): return re.sub(r"[^a-z0-9 ]", " ", t.lower()).split()
ARCH = re.compile(r"(thee|thou|thy|thine|hath|doth|dost|unto|wherefore|thereof|therein|whither|"
r"thither|hither|verily|spake|saith|shalt|wilt|ye|nay|forsooth|whosoever|peradventure|"
r"howbeit|betwixt|nigh)", re.I)
for label, path in [("Macaulay 1890", "sources/herodotus-old-translation.txt"),
("Plainspoken 2026", "books/herodotus.txt")]:
t = fetch(path); n = len(t.split())
print(f"{label}: {len(ARCH.findall(t))/n*10000:.1f} archaisms per 10k words ({n:,} words)")def shared_runs(a, b, n=8):
wa, wb = words(a), words(b)
grams = set(tuple(wb[i:i+n]) for i in range(len(wb)-n+1))
runs, i = 0, 0
while i < len(wa)-n+1:
if tuple(wa[i:i+n]) in grams:
j = i+n
while j < len(wa) and tuple(wa[j-n+1:j+1]) in grams: j += 1
runs += 1; i = j
else: i += 1
return runs
ours = fetch("books/hesiod.txt"); pd_old = fetch("sources/hesiod-old-translation.txt")
print("Hesiod, ours vs Evelyn-White (1914):", shared_runs(ours, pd_old), "shared 8-word runs (site claim: 0)")import json as _json
man = _json.loads(fetch("browse.json"))
for slug in ["herodotus", "hesiod"]:
total = sum(w["w"] for w in man[slug])
print(f"{slug}: {len(man[slug])} works, {total:,} English words — per-work word counts in browse.json")
print("Full per-section source/English alignment data: the sources/*.txt and books/*.txt pairs above.")The whole pipeline runs on Claude Code, Anthropic's agent harness. The pieces you need to replicate it:
The division of labor came from head-to-head trials, not assumption — the full story is in the colophon, and the measured results in the quality page. If you build one of these for another author or another language, we would genuinely love to hear about it.
All ~260 hours of audio were generated locally on one consumer GPU (an RTX 3060) with Kokoro-82M, an open-weight text-to-speech model. Nothing here needs a cloud service or a paid API. The full recipe:
SOCRATES:, CRITO: …) and a fixed cast table gives each speaker one of 2–4 distinct Kokoro voices, so conversations are listenable as conversations. Narrative works use a single narrator voice.ffprobe measures each part's exact duration into audio-manifest.json. The site's player uses it to present one continuous whole-book timeline: dragging the slider picks the right part and an offset does the rest. (We built that because free static hosts often ignore HTTP Range requests, which breaks native audio seeking.)Kokoro is Apache-licensed and runs from Python in a few lines (pip install kokoro soundfile, then
generate 24 kHz audio and pipe it through ffmpeg -ac 1 -ar 24000 -b:a 48k). One mid-range GPU renders
speech at several times real-time, so a full ancient library is a weekend of compute, not a studio budget.