Inspiration
I built this for myself first. When I started studying for the GRE I kept a list of every word I missed on practice questions, and instead of buying a deck I wrote my own flashcards, one card per miss, with a definition and a trick to remember it. Building the tool while I studied turned out to be most of the studying. I also tracked how I did on each word, which told me where to spend time.
Somewhere in there I noticed I was learning some words faster than others, and the fast ones were the ones with a cousin in Spanish or Portuguese. I grew up bilingual, and a word like "credulous" is easy when you already have "crédulo." So I translated the whole deck into Spanish and Portuguese, and added Italian because it shares the same roots, on the theory that someone out there studying for the GRE without English as a first language might get the same shortcut I did.
I never planned to make money from it, and it doesn't. I wanted to publish it and hope it helped someone. It's been used by about a thousand people a month since, which has been nice to watch.
What it is
fluenteGRE is 1,184 GRE words in 31 sets. Every card has the word, its part of speech, a definition, a memory trick, and the same three things in Spanish, Portuguese, and Italian. You flip a card, rate it Again, Hard, Good, or Easy, and move on.
There's a quiz mode with three kinds of questions, a browse view that groups all the words into 23 themes like "Truth vs. Deception" and "Speech & Communication," and a progress page with a streak, mastery counts, and a per-word table of how you've been doing. There's no signup. Your progress lives in your browser and never leaves it.
A working card with six words from set 1. Ratings order the deck the way the real app does.
How it works
The whole app is one HTML file with no framework and no build step. The deck is data inside the file, about a megabyte and a half of it, and the app is around two and a half thousand lines of plain JavaScript. Routes like /flashcards/set/12 are handled in the browser, and the site is served as static files from Cloudflare.
Review order is a weighted shuffle, not a calendar. Each word carries its last rating, and that rating sets its weight: words you marked Again come first, then unseen, then Hard, then Good, and Easy words sink to the bottom. A session covers the whole set in that order, with a little randomness so it never feels fixed, and a card you rate Again comes back a few positions later in the same session. A word counts as mastered once your Easy and Good ratings outweigh the Hard and Again ones by enough.
The Spanish, Portuguese, and Italian on every card, the translation, the definition, and the trick, were generated with Claude, set by set, from my English deck.
Progress is a small object per word in localStorage: how many times you've seen it, how you rated it each time, and when. That's the entire backend.
The hardest problem
Making the second three languages feel like part of the card and not a footnote. Each language needed not just the translation but its own definition and its own memory trick, written the way that language thinks. That tripled the deck and made the back of every card long, which is where most of the layout work went.
What broke
The back of a card with four languages of tricks on it overflowed the fixed card height, and the card jumped on flip. The fix measures each face and animates the height between them.
Routing on Cloudflare took four tries. The app wants every path to load the same file so it can route in the browser, and the static pages for each language want to be real files, and a catch-all rule that satisfied one broke the other.
Building the tool while I studied was the studying. Writing the cards taught me more than flipping them.