An exhaustive interpretation of the Greek scriptures, not a translation.
Every load-bearing word is opened to the full range its lexicon gives it and left open. No single English equivalent is chosen, because choosing one is where the meaning goes. It follows the intent of the Amplified Bible but carries it all the way through, with far more verbosity, to stop concepts falling out of the English.
The Old Testament is read from the Greek — the Septuagint, never the Masoretic Hebrew —
so that when the New Testament quotes it, the quotation is visible on the page rather than
buried in a footnote. Ἐν ἀρχῇ opens Genesis 1:1 and John 1:1 alike, and the reading text
says so.
The editorial rules are in CLAUDE.md. This file covers how the thing is built.
Four things, in this order:
- Greek — the source line, unmodified.
- Notes — lexical range, verbal aspect, grammar English can't reproduce, and Hebrew↔Greek divergences. Terse and factual; no devotional register.
- Unanchored — headwords removed entirely. The reader rebuilds the referent from the gloss-chain alone.
- Anchored — the conventional headword kept, with the chain trailing behind it.
The rendered page shows the last three side by side, with the Greek above them and a control that closes the word spaces — scriptio continua, which is what a fourth-century reader actually met on the page.
| edition | source in this repo | |
|---|---|---|
| Old Testament | Septuagint, Rahlfs 1935 | sources/LXX-Rahlfs-1935/ |
| New Testament | SBLGNT | sources/sblgnt/ |
Python 3, standard library only — no dependencies.
Build site/index.html from the data:
python build/render.pyCheck a chapter before committing it:
python build/validate.py -vConfirm the render still matches the baseline byte-for-byte:
python build/render.py --check reference/gold-standard.htmldata/<BOOK>/<chapter>.json source of truth — a JSON array, one object per verse
build/render.py data -> site/index.html
build/validate.py mechanical checks; run before committing
templates/page.html the page shell (masthead, CSS, controls, footer, script)
templates/verse.html one verse section — the three-panel layout
site/ generated output — never hand-edit
reference/gold-standard.html the rendering baseline; regenerate, don't edit
reference/lexicon-notes.md recurring gloss-chains, reused verbatim across books
sources/ the Greek source editions (see Licensing below)
CLAUDE.md editorial conventions
Content lives in JSON and the HTML is generated. Nothing is hand-written per chapter — otherwise the conventions drift between files and can't be checked mechanically.
{
"ref": "GEN 1:1",
"greek": "Ἐν ἀρχῇ ἐποίησεν ὁ θεὸς τὸν οὐρανὸν καὶ τὴν γῆν.",
"hint": "The oldest manuscripts carry no spaces, no accents, no lower case.",
"notes": [
{ "lemma": "ἐν ἀρχῇ", "flag": null, "text": "ἀρχή holds together two things…" },
{ "lemma": "ἐποίησεν", "flag": "divergence", "text": "Aorist of ποιέω…" }
],
"unanchored": "Within, inside of, and by means of the first moment…",
"anchored": "In the beginning — within, inside of, and by means of…",
"names": []
}flag is one of null, divergence, not in this text, name, variant.
Optional keys: notes_sub and banner override the per-book defaults in render.py;
demo turns the section into a standalone convention demonstration (used for John 1:6,
which is where the naming rule is shown, since none of the four prologue verses contains a
proper name).
Three conventions inside the JSON strings, all expanded in one place in render.py, so the
data stays free of HTML:
| written | becomes |
|---|---|
*emphasis* |
<em>emphasis</em> |
[[flag]] |
the note's flag badge at that position — a note with a flag and no marker gets it prepended |
[[name:Ἰωάννης]] |
the name span and its gloss, drawn from the verse's names list |
[[flag]] is positional because Genesis 1:1 puts its divergence badge mid-note rather
than at the head. [[name:…]] resolves to the Greek transliteration in the unanchored panel
and the conventional English form in the anchored one, so the two-form rule is mechanical
rather than retyped:
"names": [{
"greek": "Ἰωάννης",
"unanchored": "Iōannēs",
"anchored": "John",
"gloss": "(Ἰωάννης, from Hebrew Yôḥānān, \"Yah has shown favour\")"
}]One chapter per session. Commit per chapter, with the reference as the message.
- Read
reference/lexicon-notes.mdfirst and reuse existing gloss-chains verbatim. ἀρχή must read the same way in Genesis 1:1 and John 1:1 — that consistency is what makes the quotation visible. If a recurring word has no entry, establish one and add it before continuing. - Write
data/<BOOK>/<chapter>.json. - Add the chapter to
PAGEinbuild/render.py, and the book toBOOKSand toEDITIONSinbuild/validate.pyif it is new. - Append any newly-established gloss-chains to
reference/lexicon-notes.md. - Run
python build/validate.pyand fix what it reports. - Run
python build/render.py.
| check | what it does |
|---|---|
fields |
four fields present and non-empty; notes well-formed; flag in the permitted vocabulary; every [[name:…]]/[[flag]] marker resolvable |
names |
every proper name in the Greek glossed on first occurrence in the chapter, in both reading texts, and bare thereafter |
banned |
no phrase from BANNED_PHRASES in either reading text |
anchors |
no headword from ANCHORS in the unanchored text |
greek |
the Greek matches the source edition character-for-character |
BANNED_PHRASES and ANCHORS are maintained editorial lists at the top of
build/validate.py. They grow as chapters are written.
Two things worth knowing before editing them:
- Anchor words legitimately appear inside gloss-chains.
unfurnishedis the anchor for ἀκατασκεύαστος and a link in its own chain. Writing anchors as full phrases (the Word, notWord) resolves most apparent collisions;allowhandles the rest. - Banned phrases are checked against the reading texts only. The notes are exactly where those phrases are supposed to be named and refused — Genesis 1:2 says in its apparatus that face of the waters is not in this text.
Proper names are detected as capitalised words that are not sentence-initial, since both
editions capitalise only sentence starts and names. Inflected forms are matched to the
nominative in names on a shared accent-stripped prefix, so Ἰωάννου finds Ἰωάννης.
validate.py checks the Greek character-for-character for the New Testament, but for the
Old Testament it can only check word forms. It prints a standing note saying so rather
than reporting a clean pass.
The reason is structural. Every freely redistributable digital Rahlfs text descends from the
CCAT/CATSS lxxmorph
database, which is a word-level morphological analysis in betacode and carries no sentence
punctuation and no capitalisation. This was confirmed against three independent
redistributions — the eliranwong data in
sources/, the CenterBLC TextFabric edition, and Blue
Letter Bible's LXX, which credits CCAT. None carries pointing.
So the punctuation in data/GEN/*.json currently rests on editorial judgement, not on a
source. Three ways to close that gap, none yet taken:
- Rahlfs–Hanhart (2006) — punctuated, but under Deutsche Bibelgesellschaft copyright and available only through Logos, Accordance and similar. Not redistributable here.
- The printed 1935 edition — scanned on the Internet Archive. Transcribing the pointing per chapter as it is written is feasible at one chapter per session, and is the only route that verifies against this edition.
- Swete as a witness —
eliranwong/LXX-Swete-1930ships01-Swete_word_with_punctuations.csvalongside a00-Swete_versification.csvwith the same word-index layout as the Rahlfs data already insources/, so it drops in with little work. It really is punctuated — Genesis 1:1 endsγῆν.and 1:2 runsἀκατασκεύαστος, … ἀβύσσου· … ὕδατος.
The Swete route carries a caveat worth stating plainly: Swete is a different edition, a
diplomatic text of Codex Vaticanus rather than Rahlfs' eclectic one. It can serve as a
witness that flags where our pointing looks unusual, but it cannot become the base text
without quietly making the Old Testament a hybrid — the kind of drift the project's rules
exist to prevent. It already disagrees with the current data at Genesis 1:2, reading
ἀβύσσου· where we have ἀβύσσου,.
Two layers, because the code and the interpretive work want different terms:
| what | covers | licence |
|---|---|---|
| Code | build/, templates/ |
MIT — LICENSE |
| Content | data/, reference/, site/, and the docs |
CC BY-SA 4.0 — LICENSE-CONTENT |
The content licence covers this project's own contributions — the notes, the gloss-chains, and the two reading texts. The Greek source lines are quotations from the editions below and stay under their terms.
sources/ is not committed. The Septuagint data is CC BY-NC-SA 4.0, whose NonCommercial
and ShareAlike terms would otherwise propagate to the whole distribution, and its upstream
gates access behind a CCAT user declaration that an open repository would bypass.
sources/README.md has fetch instructions; without the sources the
greek check reports SKIP and the other four still run.
| source | licence |
|---|---|
| SBLGNT | CC BY 4.0 — attribution only; commercial use fine. © 2010 SBL and Logos Bible Software, ed. Michael W. Holmes |
| LXX-Rahlfs-1935 | CC BY-NC-SA 4.0 © 2017 Eliran Wong, from CCAT/CATSS (Univ. of Pennsylvania), itself derived from the TLG with UBS permissions |
Full attributions, and the reasoning about the Greek quoted in data/, are in
NOTICE.md.