u/loose_heron

Image 1 — etaerio
Image 2 — etaerio
Image 3 — etaerio
Image 4 — etaerio
Image 5 — etaerio
Image 6 — etaerio
Image 7 — etaerio

etaerio

Etaerio is the most playable bingo in CSW24, and is the name of my Scrabble word study app. This is designed to address my own wishes and those of others in this subreddit for what the Zyzzyva app could be. I hope some of you find this useful.

There are a lot of hastily designed apps out there currently, so this will be a long post to explain the thought that has been put into mine. Therefore, a TLDR:

  • dedicated UIs for desktop, mobile, and tablet
  • mobile-first approach to UI design to maximise space efficiency
  • lots of search capabilities, including special wildcards like @ for vowels, # for consonants, 1 for 1-point letters, etc.
  • it is extremely fast at searching for words
  • ranks words by playability order based on 100M Macondo games
  • it has dark mode!
  • designated quiz screen with built-in keyboard on tablet and mobile, and full hotkey support on desktop
  • 3 different quiz scheduling modes: Standard, FSRS, and Leitner
  • several different question types, which can be configured by word length
  • Windows, macOS, Linux, and Android installers can be downloaded from my GitHub

UI

Some of my main UI decisions include:

  • Search panel goes on the left, so that filters and word tables don't compete for vertical space.
  • Collapsible filter panel for desktop/tablet, mainly so that there is enough horizontal space for the display columns on tablet. The filter panel becomes a side drawer on mobile, which is accessed via the floating button.
  • Consistent approach to UI. For example, actions on the wordlist live on the right toolbar (floating menu button on mobile), while actions on individual words are always via right click (long-press on mobile).
  • Dedicated quiz screen. On mobile/tablet, this has a built-in keyboard, and the keys enable and disable helpfully. On desktop, there is full hotkey support. For missing-letter questions, you only need to type the missing letters rather than the whole word, allowing you to get through the questions more quickly.

Search

I've tried to pack as much functionality into the filter rows as I can to make it space-efficient on mobile. For example, the subanagram filter row has a toggle to change it to an anagram filter row. You can then use special wildcards like @ and # to search for specific numbers of vowels or consonants.

Meanwhile, the group filter includes filtering by pre-built hook groups, other lexicons, and user-created groups. If you want to use multiple group conditions, you can use the refine and combine buttons to chain searches for intersection (AND) and union (OR) operations.

There are lots of other search features too. For example, to reproduce Zyzzyva's high-fives list, set length to 5, input ^*|*^ to pattern match, and ! in anti-letter match. (^ and ! are wildcards for 4-5 and 8-10 letters, respectively, while | is an OR condition in pattern match.)

Searching is extremely fast in Etaerio. You can give it a subanagram string like ABC123@@##!????? with lots of wildcards, and it will instantly spit out over 150000 words.

You can also just ignore all the fancy search features and search by rank instead.

Ranks

I ran 100M Macondo games with each of the CSW24 and NWL23 lexicons, and totalled up the total equity contributions for each word for each lexicon. Issue is, I can't expose these wordlists in the app directly, since these are copyrighted. Also, I wanted a way to handle any lexicons you may want to import into the app.

Therefore, I overengineered a series of statistical models that use up to 10 features for each word. Most of the word rankings are based on direct lookups from the simulation data - the models are just used to fill in the gaps for words that didn't appear often enough. These features include the obvious, such as word probability, score, hooking capabilities, and various measures of word uniqueness, such as number of anagrams, anagram hooks, and surprisal-based scoring methods. These models are interesting in their own right (to me at least), so I may make a separate post on my methods. The main point is that you can import any English lexicon into the app, and it will give a fairly accurate ranking of which words to learn first. (You can also rank by probability instead, based on a Scrabble bag with 2 blanks.)

Quiz scheduling

There are three main scheduling modes:

  • Standard: words are presented in random order. Once all words have been seen at least once, you can choose to start reviewing the ones you missed, and this continues until all have been answered correctly.
  • FSRS: FSRS is a popular spaced-repetition system that tracks a difficulty and stability score for each word and attempts to present words just as you are beginning to forget them. Since questions in Etaerio can have multiple answers, I've had to adapt the FSRS-6 scheduler. In addition to the usual four FSRS states (New/Learning/Review/Relearning), Etaerio also uses an additional hidden Active/Inactive state to control the rate at which words are introduced to the main sampling pool (else it would tend to flood you with new words).
  • Leitner: This is similar to Zyzzyva's cardbox system. My version borrows the FSRS grading system to give you a bit more control: rate a question as Easy to advance it by two boxes, or Hard to keep it in the current box. It also supports short intervals measured in minutes or hours for when you are initially learning words.

Question types

Other study tools like Zyzzyva are often largely limited to anagram questions, which are not good for learning short words. Etaerio allows you to configure question types by word length. These include:

  • Patterns: one letter missing; for example, find all 2-letter words beginning with B, or ending in U.
  • Hooks: same as patterns, but either the first or last letter is missing, and the remaining letters form a valid word. Pattern questions usually have a bias toward hook questions, and you also have the option to have a mixture of anagram and hook questions.
  • Subanagrams: usually one more letter than required: for example, find all 3-letter words from a 4-letter rack.
  • Pattern-anagrams: A pattern with 7-letters missing, combined with a rack of 7-letters. For 8+ letters only. The subwords in the pattern will always be valid words in the lexicon, with a bias toward longer words where possible.
  • Anagrams with blanks: same as anagrams, but with a chance for a blank to appear in the rack. Racks with blanks in them can potentially have a very large number of solution words, so currently I've set it so that you'll only get a blank if there are no more than 5 solutions available.

Other features

  • Up to 15 symbol groups can be created per lexicon - these are mainly intended to denote (non) membership of different lexicons, but can be used for any purpose
  • Optional alphagram column with custom letter orders
  • Word analysis feature to quickly generate lists of anagrams, subanagrams, hooks, extensions, and more from a given word (not available on mobile)

Technical details

The app is built with Flutter/Rust. Unlike Zyzzyva, which seems to use SQL for all filtering (possibly because RAM was more limited when it was originally designed), Etaerio loads the lexicon into memory and takes advantage of Rust's fast looping. Whilst Zyzzyva seems to use a single flat SQL table for its database, Etaerio uses an in-memory combination of a word table, matrix of letter counts, and various indices for fast subanagram and letter filtering.

Etaerio is also space-efficient, since it uses a combination of efficient storage techniques (such as bitsets for the outer hooks), combined with computing what it needs only on demand. Therefore, Zyzzyva's full CSW24 lexicon database takes over 5 times as much disk space (101MB) than when imported into Etaerio (18MB). This might be part of the reason why the Zyzzyva mobile app has much more restrictive search features compared to the desktop version.

Installation

The Windows, macOS, Linux, and Android installers can be downloaded from my GitHub. The Windows and macOS installers are currently unsigned, so you may need to click through a warning. Also, note that the macOS and Linux ones are currently untested, so let me know if you encounter issues.

The app only comes with the ENABLE wordlist, so you'll need to import any other lexicons from files (which are admittedly slightly awkward to get hold of on mobile). Etaerio supports importing from .csv, .tsv, .txt, or Zyzzyva .db. The actual import process is fast, and it should take under 2 seconds to build the database for each lexicon.

There is a good amount of help text in the app, but it's a bit wordy, so let me know if you have any questions.

u/loose_heron — 2 days ago