Enoda
A macOS app for parsing and analysing classical and Homeric Greek, and classical Latin. In development: the Latin parser works, the Greek one is still being built.
ē-nōdō, āvī, ātum, 1, v. a. [nōdus, “knot”]. To free from knots, to disentangle, unravel. Transf., to make plain, to explain, to elucidate.
Condensed after Lewis & Short. Enoda comes from ē-nōdō. Parsing a sentence is untying it.
- Built with
- SwiftUI · rule-based NLP · Greek and Latin morphology · no AI, no model
- Latin parser
- Working, expanding
- Greek parser
- In development
- Platform
- macOS only
The problem
Translating classical texts closely means constantly stopping to look up a word, work out its parsing, or trace a construction back to a grammar reference. Not everyone has a classical dictionary or grammar to hand, and switching between the text and a separate reference breaks a kind of concentration that’s better spent on the text itself.
Why I built it
While studying for exams, I kept losing time hunting for a dictionary or a textbook every time I hit an unfamiliar word. Enoda started as a way to close that gap for myself: cut the time spent on lookup, without handing over the translation itself.
Why no AI?
This is the decision the whole app is built around, so it is worth being direct about it. Enoda doesn’t translate, and there is no model anywhere in it. Everything it tells you comes out of a rule-based parser working from morphology and syntax.
- Agency stays with the reader. A tool that hands you finished English removes the only part of translating that teaches you anything. Enoda gives you what the form is, and leaves what it means here to you.
- A rule gives the same answer twice, and can show its working. If Enoda calls something a genitive absolute, there is a rule behind that you can check. A model that is right most of the time is worse than useless when you are learning, because you can’t tell which time you are in.
- Ambiguity is information. Where a form genuinely has several possible parsings, Enoda shows all of them rather than picking the most likely one and hiding the rest. Deciding between them is the reading.
The cost of that decision is real, and it shows up in what I had to drop. See what I’ve learned below.
How it works
It works like the inline grammar checkers built into most word processors, but for classical languages instead of typos. Highlight a word or passage anywhere in a document or browser, and a pop-up appears right there, showing parsings and dictionary senses for the word, along with any constructions, literary devices, or idioms Enoda picks up nearby.
What it covers
| Language | Scope | Status |
|---|---|---|
| Classical Latin | Full morphological parsing, constructions, devices | Working |
| Classical Greek | Attic prose morphology and constructions | In development |
| Homeric Greek | Epic forms and dialect variants | In development |
| Ecclesiastical & Vulgate Latin | Later Latin forms and orthography | Planned |
macOS only for now. Windows and mobile builds come after the parsing is solid on one platform.
What the output looks like
Highlighting a word returns its headword, its full parsing, the senses that fit that form, and any construction or device Enoda recognises around it. Two examples of the shape of that output:
ἐπιδεδήμηκας
Plato, Ion 530a
- Headword
- ἐπιδημέω
- Parsing
- verb · 2nd person singular · perfect active indicative
- Senses
- to be at home, to come to stay in a place, to visit
- Note
- reduplicated perfect stem; the κ-perfect is regular for this verb
fracti bello fatisque repulsi
Virgil, Aeneid II.13
- Parsing
- fracti: perfect passive participle, nominative masculine plural, of frango
- Construction
- ablative of means × 2 (bello, fatis) governed by the two participles
- Device
- chiasmus across the line, participle–noun / noun–participle
Set out here as text; in the app this appears as a pop-up over whatever you are reading.
What I’ve learned
I originally wanted a rules-based system that could also produce a full trot, not just word-level parsing. A trot is an old classroom aid: a literal, word-by-word or clause-by-clause rendering set alongside the original, meant to get a student through the syntax quickly rather than to read well on its own. That’s different from a translation, which reworks the Latin or Greek into natural English and makes real judgment calls about tone, word order, and idiom. Building a trot mechanically, without those judgment calls, turned out to be close to impossible without leaning on AI or some form of machine learning. Since keeping agency with the translator mattered more than that feature, I dropped it rather than compromise.
Current status
Building out the Greek detection system, extending the existing rule-based Latin parser to cover classical and Homeric Greek.
Known limitations
- No translation output, and no trot. That is deliberate, and it is not coming back.
- Ambiguous forms return every parsing that fits, not a single best guess. On a heavily syncretic form that list can be long.
- Greek coverage is behind Latin: the Latin parser has been in use far longer.
- macOS only. No Windows, iOS or Android build yet.
- Constructions are detected from a fixed rule set, so an unusual or corrupt construction can go unrecognised rather than be flagged as odd.
What’s next
Expanding coverage to more forms of Latin and Greek, with Ecclesiastical and Vulgate Latin likely next. After that, Windows and mobile builds, once the core parsing is solid on macOS.
When it is ready
There is nothing to download yet. The Latin parser works and the Greek one is still being built. Leave your email for updates on Enoda, including when it’s usable.
Thanks. You’re on the list.
Occasional updates only. Unsubscribe anytime.
Related
See it applied to the texts: my translations of Plato, Thucydides, Catullus and Virgil, and the classics work on the writing page. Remeta is the other half of the same problem, vocabulary rather than grammar. On why a rule-based parser rather than a model, my essay on whether language acquisition is innate works through what large language models actually seem to learn.