Skip to content

Instantly share code, notes, and snippets.

@jsomers
Last active October 20, 2025 16:33
Show Gist options
  • Select an option

  • Save jsomers/c317e362a8ec181d0293 to your computer and use it in GitHub Desktop.

Select an option

Save jsomers/c317e362a8ec181d0293 to your computer and use it in GitHub Desktop.
How to use a custom word list with OS X's "Word of the Day" screensaver

OS X's "Word of the Day" screensaver is a great way to passively learn words:

But I've always thought that its word list kind of stunk—it was full of obscure words that I could never really see myself using. I'd prefer something like Norman Schur's 1000 Most Important Words. What if you could plug your own word list into the screensaver?

On a rather obscure comment thread, someone explained where you might find the word list that Apple uses to power the screensaver. It is at /System/Library/Graphics/Quartz\ Composer\ Plug-Ins/WOTD.plugin/Contents/Resources/NOAD_wotd_list.txt. The file looks like this:

m_en_us1282510	quinsy
m_en_us1273791	orbicular
m_en_us1220945	alimony
m_en_us1250517	genome
m_en_us1275124	palimpsest
m_en_us1246836	fibrillate
m_en_us1304617	volant
m_en_us1248876	fraudulent
m_en_us1264803	lunette
m_en_us1244369	entrepot

It is a list of tab-separated entries. On the right you have the word, and on the left, what looks like an ID. But what's it an ID for, and how would you be able to find it for another word not already on the list?

As you might expect, the ID refers to an entry in Apple's default dictionary, the "New Oxford American Dictionary". (That's what "NOAD" stands for in the word-list path above.)

I've played around with Apple's built-in dictionary files before—for my post, "You're probably using the wrong dictionary". You can find them at /Library/Dictionaries. Unfortunately, when you dig around in the dictionary packages, you find promising files—like /Library/Dictionaries/New\ Oxford\ American\ Dictionary.dictionary/Contents/EntryID.data—but these turn out to be in a custom binary format. How to parse them?

A fellow named Joseph Gentle, in a series of blog posts, shows how to get at the underlying data. In his "Apple dictionaries, part 2" post, he points to code that unpacks the binary file into XML. Using the dedict.c and strip.c files found here, and following Gentle's example, I used the following bash commands to get at the NOAD's XML (these commands are run from the directory where you downloaded the dedict.c and strip.c files):

clang dedict.c -Wall -lz -o dedict
clang strip.c -Wall -lz -o strip
./dedict "New Oxford American Dictionary" | ./strip > dict.xml

When I head-ed the first few lines of the dict.xml file, I saw something promising, with entries that looked like this:

<d:entry xmlns:d="http://www.apple.com/DTDs/DictionaryService-1.0.rng" id="m_en_us1219333" d:title="abode" class="entry">

Notice that id param... it's an identifier that looks exactly like the one in the screensaver word list!

I wrote the following Ruby script to parse the XML, and then, using my own word list, create a new screensaver file that maps my own words to their IDs in the dictionary:

raw = File.open("./dict.xml").read
my_words = File.open("./word_list.csv").readlines.map { |line| line.split(',')[1] }

word_id_map = {}

raw.scan(/<d:entry .*? id="(.*?)" d:title="(.*?)" class="entry">/).each do |entry|
  word_id_map[entry[1]] = entry[0]
end

my_words.each do |word|
  if id = word_id_map[word]
    puts [id, word].join('	')
  end
end

When I replaced the original screensaver file with this new one, it worked. I now have a "Word of the Day" screensaver that gives definitions for the words I chose.

@dsernst
Copy link

dsernst commented Jun 28, 2015

Thank you!

Warning to others: Watch out that your "favorite text editor" doesn't auto convert tabs to space. It will cause the Word of the Day plugin to immediately crash, without helpful error messages.

@codycodes
Copy link

Very cool stuff! I'm happy to have some useful words showing up on my screen now 👍 . Well, eventually I want to extend this to learning about stenotype chords, but for now, after reading your linked blog post I feel it'd be good to spend some time learning Norman Schur's 1000 most important words, so that I can improve my lexicon.

@drjasonharrison
Copy link

If you're more comfortable with the terminal, and save the word-list.txt file to your Desktop:
cd /System/Library/Graphics/Quartz\ Composer\ Plug-Ins/WOTD.plugin/Contents/Resources/ sudo mv NOAD_wotd_list.txt NOAD_wotd_list.txt.bak sudo cp ~/Desktop/word-list.txt NOAD_wotd_list.txt

@joelbrostrom
Copy link

Could some one make a list off common, yet not overly common, developer terms and acronyms?
It would be a great way to learn tech lingo without thinking about it.
Examples:
IDE
API
:
Fork
Rebase
:
Coupeling
Modualar
:
REST
Asynchronous
:
Etc...

Please PM me if this already exists or if some one actually make it!

@krtenn
Copy link

krtenn commented Nov 30, 2017

Awesome this works thank you to jsomers and drjasonharrison for the details. New word list is 50x better.

@latelylk
Copy link

Hey I can't find this world list to edit on Mac OS High Sierra - do you know if this method is outdated? Thanks for the stuff

@avdyushin
Copy link

Now it's here /System/Library/Screen\ Savers/Word\ of\ the\ Day.saver/Contents/Resources/WordLists/ and in .plist format.

@garfieldnate
Copy link

I poked around in the system calls in the screensaver binary and found references to a "Lexicon Framework" and to a "Linguistic Data Framework", including calls to methods that create language models, iterate over all words in a linguistic data set, and retrieve probabilities for words. I don't know what data source is used for it (maybe all of the text in the dictionary definitions?), but my suspicion is that the screensaver builds a language model from some corpus and then chooses several thousand middling-probability words to go in the candidate list of words of the day. It would be interesting to gain access to these API's somehow.

@pvaelli
Copy link

pvaelli commented Aug 26, 2019

Can we convert the word list above to a .plist format and replace the file in the directory listed by avdyushin? Currently running mac os mojave 10.14.6

@osoyer
Copy link

osoyer commented Dec 11, 2021

Hi Jsomers. Thanks for this wonderful post. I had a similar idea recently, but not for displaying set words, but rather a new list completely. I'm a system biologist, so my idea was to display a gene list of a given organism (as a nerd or outreach feat.).

Looking into your solution, I realise it would only work with the built-in dictionary. In my case, I would have to change both the word list (with gene names) and also the dictionary (with the explanations of the genes, e.g. what they do).

Any ideas on how to create a new dictionary? I looked under 'dictionary' content, but couldn't quite find them there. Also, while I was able to change contents of a word list ".plist" file, creating a new one under "Word of the day" package seems not allowed (even with 'sudo')....any comments/pointers regarding any of this?

@mmccool
Copy link

mmccool commented Jul 10, 2023

Thanks, this is interesting. Now to adapt to my use case: reviewing Japanese vocabulary. The Japanese dictionary provided has a bunch of super-weird and useless words (many used only in writing, for example) when what I really want is review words from the JLPT (Japanese Language Proficiency Test) which from the Japanese person's point of view are really boring and common words. It would also be nice to have both English and Japanese definitions of the meanings. Anyway... to do that I need not only a custom word list but a custom dictionary. But I guess I will start by trying to use a custom word list with the standard dictionary (which only had definitions in Japanese). I'm sure doing even just that I will run in to exciting problems with using UTF encodings, etc...

Anyway, my use case seems similar to some of the above who want custom dictionaries. I may just give up on this and see if I can find - even if I have to pay for it - a customizable screensaver. Anyone know of one?

@vpnry
Copy link

vpnry commented Oct 20, 2025

I checked the directory /System/Library/Screen Savers on macOS Sequoia 15.7.1, and it contains the following:

➜  Screen Savers tree -L 2
.
├── Default Collections
│   └── 4 - Colors
├── FloatingMessage.saver
│   └── Contents
└── Random.saver
    └── Contents

It appears that the location of the word list has changed in this version of macOS.

Does anyone know the new path in macOS Sequoia 15.7.1?

@drjasonharrison
Copy link

Wow, system integrity protection and other macOS things made this more challenging than I expected. I tried a brute force sudo find / -name "wotd" and then realized that Activity Monitor.app might be helpful. After selecting the Word of the Day screensaver in System Settings.app, I got the list of open files for the Word of the Day (Screen Saver (System Settings)). I deleted fonts and system appearances from this list:

/System/Library/ExtensionKit/Extensions/Word of the Day.appex/Contents/MacOS/Word of the Day
/Library/Preferences/Logging/.plist-cache.8Jt8vRyY
/System/Library/ExtensionKit/Extensions/Word of the Day.appex/Contents/Resources/InfoPlist.loctable
/System/Library/Frameworks/CoreServices.framework/Versions/A/Frameworks/DictionaryServices.framework/Versions/A/Resources/Localizable.loctable
/System/Library/AssetsV2/com_apple_MobileAsset_DictionaryServices_dictionaryOSX/928817800cd8e62612c2824a90e05374c06b93fb.asset/AssetData/New Oxford American Dictionary.dictionary/Contents/Resources/en.lproj/InfoPlist.strings
/System/Library/AssetsV2/com_apple_MobileAsset_DictionaryServices_dictionaryOSX/d0ffc0c9bdceb38c5ae756d59fdd7b575a5b6725.asset/AssetData/Oxford American Writer's Thesaurus.dictionary/Contents/Resources/en.lproj/InfoPlist.strings
/System/Library/AssetsV2/com_apple_MobileAsset_DictionaryServices_dictionaryOSX/65460bfb23db12024fc484eff165d6320f752eed.asset/AssetData/Apple Dictionary.dictionary/Contents/Resources/en.lproj/InfoPlist.strings
/System/Library/ExtensionKit/Extensions/Word of the Day.appex/Contents/Resources/Localizable.loctable
/System/Library/ExtensionKit/Extensions/Word of the Day.appex/Contents/Resources/ConfigureSheet.loctable
/System/Library/AssetsV2/com_apple_MobileAsset_DictionaryServices_dictionaryOSX/928817800cd8e62612c2824a90e05374c06b93fb.asset/AssetData/New Oxford American Dictionary.dictionary/Contents/Resources/KeyText.index
/System/Library/AssetsV2/com_apple_MobileAsset_DictionaryServices_dictionaryOSX/928817800cd8e62612c2824a90e05374c06b93fb.asset/AssetData/New Oxford American Dictionary.dictionary/Contents/Resources/KeyText.data
/System/Library/AssetsV2/com_apple_MobileAsset_DictionaryServices_dictionaryOSX/928817800cd8e62612c2824a90e05374c06b93fb.asset/AssetData/New Oxford American Dictionary.dictionary/Contents/Resources/Body.data
/System/Library/LinguisticData/Latn/Dict2.dat
/System/Library/LinguisticData/Latn/Dict1.dat

So maybe one of those files? Note that if you quit System Settings.app, the process Word of the Day (Screen Saver (System Settings)) exits. You may need to start the screensaver, use ssh or sleep, and lsof to get the list of files.

@vpnry
Copy link

vpnry commented Oct 20, 2025

@drjasonharrison: 👍
Thank for your efforts. Based on your work, I checked a few files, and I found:

/System/Library/ExtensionKit/Extensions/Word of the Day.appex/Contents/Resources/WordLists/WotD_info_NOAD.plist

I viewed the file via:

plutil -p "/System/Library/ExtensionKit/Extensions/Word of the Day.appex/Contents/Resources/WordLists/WotD_info_NOAD.plist" > ~/Downloads/list.txt

The output list.txt looks promissing:

{
  "DCSWotDDictionaryID" => "com.apple.dictionary.NOAD"
  "DCSWotDDictionaryName" => "New Oxford American Dictionary"
  "DCSWotDEntries" => [
    0 => {
      "DCSWotDEntryHeadword" => "abacus"
      "DCSWotDEntryID" => "m_en_gbus0000780"
    }
    1 => {
      "DCSWotDEntryHeadword" => "abattoir"
      "DCSWotDEntryID" => "m_en_gbus0000950"
    }
    ...

PS: I gave up finding for the file list this afternoon and ended up doing a vibe coding with Claude — created my own macOS.saver.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment