100% vibed
A from-scratch macOS screensaver that shows a rotating triplet — primary, secondary, tertiary — pulled from a CSV.
Built to replace Apple's Word of the Day screensaver. Recent security measures made it hard to resign and "tamper with" the integrity of Apple screensavers.
I use it to learn Japanese vocab.
The kit deliberately uses the names primary / secondary / tertiary instead of kanji / kana / meaning. Any triplet works:
| Use case | Primary | Secondary | Tertiary |
|---|---|---|---|
| Japanese vocabulary | kanji | reading | meaning |
| English vocabulary | headword | pronunciation | definition |
| Korean vocabulary | hangul | romanization | meaning |
| Code review prompts | title | summary | detail |
You don't have to fill the three types because of optional vars.
Requirements: Xcode 15+ (or matching Swift toolchain) on macOS 13 or later.
scripts/import_csv.sh Samples/sample.csv # produces build/wordlist.json
scripts/build_saver.sh # produces build/CustomWordOfTheDay.saver
scripts/install.sh # copies the .saver into ~/Library/Screen Savers/
scripts/install.sh opens the Wallpaper / Screen Saver pane at the end — pick Custom Word of the Day from the list.
xcrun swift scripts/render_preview.swift build/CustomWordOfTheDay.saver /tmp/preview.png
xcrun swift scripts/render_grid.swift build/CustomWordOfTheDay.saver /tmp/grid.png
These load the bundle, instantiate the ScreenSaverView subclass offscreen, tick a few frames, and write a PNG so you can eyeball the layout without activating the live screensaver.
The screensaver is macOS-only — that's a platform limitation, not a code limitation. WordOfTheDayKit has no AppKit / UIKit imports, so it compiles unchanged into an iOS target. To build an iOS app that shows the same content:
- Add
WordOfTheDayKitto your iOS project (thePackage.swiftalready lists.iOS(.v16)as a supported platform). - Build your own SwiftUI / UIKit view that reads from
JSONWordListorCSVWordListand renders withEntrySelector.
The boundary is intentional: the kit owns the data and selection logic, the platform owns the rendering.
Three columns, UTF-8, no header row required:
猫,ねこ,cat
書き初め,かきぞめ,"first calligraphy of the new year, traditionally Jan. 2"
Fields with commas, quotes, or newlines must be quoted; embed quotes by doubling them ("").