Projects

Word puzzles, crosswords, interactive fiction, and data-driven tools — here are some projects I’ve built and written in the Puzzles & Games space.

Letter Purrfect

Daily word game · 2026–present

Letter Purrfect is a cozy daily word game reminiscent of a crossword mini with a Spelling Bee twist. I envisioned it as a bite-size puzzle meant to appeal to crossword solvers, but with a different type of check on each square and a unique “aha moment.”

I created and developed the concept, built the web app, and write each day’s puzzle by hand; the illustrious Anna Hurley provided the cat art. I also send out a weekly newsletter with constructor notes, bonus answers, and game development insights.

Crosswords

Crossword construction · 2020–present

I write crosswords for a wide variety of publications:

Spread the Word(list)

Tools for constructors · 2021–present

Spread the Word(list) is a free suite of tools for crossword construction that Brooke Husic and I launched in 2021 and continue to expand, with the goal of helping new constructors create clean and accessible crosswords.

The tools are widely used by the crossword community and include a data-informed wordlist, an answer search tool to see historical occurrences, and a visualizer that loads a crossword file and highlights its answers according to various attributes.

The Imposter

Interactive fiction piece · 2018

A man wanders the streets of Paris after a personal tragedy.

The Imposter is a piece of interactive flash fiction I wrote in the Windrift framework, where the story advances as you choose words inside the prose itself rather than from a menu of actions.

It was entered in Spring Thing 2018 and is listed on IFDB. It’s free to play on this site.

IF Recommender

Game recommendation app · 2026–present

I built an IF Recommender as a Gradio app that provides a list of recommended interactive fiction games based on an input game, author, reviewer profile, or “vibe” of favorite systems, genres/tags, and authors.

A deep learning framework runs each input through a two-tower encoder to pull a longlist of candidates from a shared embedding space, then scores each candidate against the query with a cross-encoder.

The data comes from IFDB via quarterly database dumps published to the IF Archive, with a usable index of ~10K games.