Skip to the content

Changelog

Every release, in plain language.

Including the things that were wrong and got fixed, because a changelog that only contains good news is not a changelog.

Version 2.5.0, September 2026

The release where somebody can pay.

  • An audit of both plugins found there was no payment code in either of them. The membership plugin wrote its own row, the app read that row live on every request, and between the two there was no record of a sale, no receipt, no reaction to a card being declined, and no way for anybody who already had an account to start paying, because every price on the site pointed at a signup form that refuses to render for a signed in person. A trial converted on day zero or it never converted at all.
  • Four events now turn into a record the product owns: a sale, a renewal, a declined card, a cancellation. A cancelled subscription keeps its plan until the period runs out, because somebody who paid for a year and cancelled in month two has bought ten more months. A declined card gets a grace period rather than being cut off the same hour, since cards fail because they expired and the person usually fixes it the next day.
  • Your account is a page now. Your plan, your renewal date, every payment with a reference to quote to a finance office, and the way out. The terms have promised cancelling in two clicks and producing an invoice since the first release, and there was nowhere on the site that did either. That is not a missing feature, it is four promises the product could not keep.
  • Five of the ten things the plans page sells were not enforced anywhere. A free account could open a second language, set its own pace to two hundred new words a day, read every story past the twelve it is allowed, and make as many decks as it liked. Story access in particular was a disabled attribute in the browser and nothing behind it.
  • A membership level nobody mapped granted a paid plan, and saving the settings could blank the level map entirely, silently moving every Teacher and School customer to Learner while they carried on paying.
  • Class join codes, so a student joins with a code instead of a teacher making thirty accounts by hand. Ten characters rather than six, revocable, rate limited, and a full class refuses politely.
  • Fixed: an interrupted library load permanently skipped languages on the next update and then reported itself up to date. Fixed: rebuilding the shared decks zeroed every teacher assignment, on every update. Fixed: opening a gradebook performed hundreds of database writes, which on a two hundred seat class was about four thousand eight hundred. Fixed: two settings stores that disagreed, so the new words a day setting saved, said Saved, and changed nothing for ever. Fixed: two streak counters, so a learner on a thirty day streak was told they had none.
  • Six settings were deleted rather than faked. A switch that does nothing is a lie the product tells every time somebody flips it. Thirty five that were also dead now work, the whole accessibility group among them.
  • 1,590 more words, 27,489 in all. 1,450 more written hooks, 10,978 in all. 140 more graded stories, 1,615 in all, carrying 8,040 challenges.

Version 2.4.0, September 2026

More of everything, and one class of card that could not be used.

  • 1,590 new words, taking the library to 25,899. All of them from the concrete middle of each language: what is in a kitchen drawer, what a plumber says, what is written on a form at a doctor's surgery, what you say when the bus is late. Every one arrives with a sentence and a translation, because the tool that adds a word now refuses a word without one.
  • Seven hundred and forty of them arrived unusable and the harness caught it. Japanese, Korean, Mandarin, Russian and Arabic each carry a roman spelling on every card, which is what a learner reads before the script is fluent and what the search box matches on a keyboard with no Cyrillic. The new entries had none. Five checks went red at once, which is the harness doing exactly its job, and the fix went into the tool rather than a spreadsheet: a word is added complete or it is not added.
  • 9,528 written hooks, up from 6,768. The Mandarin set passed a thousand.
  • One sound can no longer point at two words. A batch gave harina, flour, the keyword arena, and arena is itself a Spanish word in the same list meaning sand. Two white powders, one sound, both on flashcards. It would have shipped in silence, because the only thing checked until now was that a word had not been hooked twice.
  • 1,475 graded stories, up from 1,197, carrying 7,272 challenges and 1,432,847 characters of reading. A lending register, a night train's announcements, nine receipts found in a coat lining, a chess game annotated in words because half the club never learned notation.
  • Forty five more drawings, so nine in ten hooks now show a real object rather than a letter. The words that were missing were not exotic: bath, boots, coins, crowd, family, food, lips, mother, stomach, trousers, village. Six of the new matches were confident and wrong in the usual way, and were caught the usual way, by rendering the set and reading it: body found a page layout diagram, child a car seat, pages the Google Pages wordmark, neck a vampire bite, pole a dance pole, animal a stretched hide.

Version 2.3.1, September 2026

A published page can still be unreachable.

  • Two addresses on this site, About and The method, were sending visitors to the home page. Both pages existed, both were published, both were correct, and every link pointing at them was right. Something sitting in front of WordPress was answering first, which nothing inside WordPress can see.
  • The Pages screen can now go and ask. It loads every address from the browser, the way a visitor would, and says which ones open where they should and which ones end up somewhere else. Checking this from PHP would have been useless: a server fetching its own pages often never leaves the machine, and the layer that breaks addresses is exactly the layer it skips.
  • It also flags a page WordPress has quietly moved. If something else already owned a slug, WordPress hands out the next one free, and a page serving from a second address while every link in the footer points at the first is a fault that looks like nothing at all.

Version 2.3.0, September 2026

Every word gets a sentence.

  • Twenty four thousand three hundred and nine example sentences, up from one thousand eight hundred and twenty five. Ninety three per cent of the library had a meaning and nothing else. A meaning tells a learner what a word points at; a sentence tells them what it does, which case it takes, what it sits beside, and whether it is the word anybody would actually use. Every word in every one of the ten languages now carries one, with a translation beside it.
  • They carry the grammar rather than only the meaning. The German entries show the case the verb governs, the Russian ones the case the preposition takes, the Chinese ones the right measure word, the Japanese ones the politeness a learner at that band would meet. That is the half a dictionary gloss cannot give you.
  • You can hear the sentence now, not only the word. A sentence is where the liaison, the tone sandhi, the pitch accent and the swallowed vowels live, and none of that is audible in a word said on its own.
  • 6,768 written hooks, up from 2,718, and 1,197 graded stories, up from 933, carrying 5,797 challenges and 1,090,824 characters of graded reading between them. The new stories are shaped as things people actually read: a lost property ledger, a tide table, eight voicemails, a night porter's handover book, a translator's afterword.
  • The word "hand-written" is gone from the product. Every hook in the shipped set was written by a model, including the first two thousand seven hundred, and this site called them hand-written and counted them under that name. The distinction the product draws is real and worth keeping: one hook was composed one at a time and checked before it shipped, the other is assembled from a sound match while the learner waits. That is written against from the sound engine. Neither is a person typing, the two counts are still never added together, and the harness fails the build if the old word comes back.
  • Fixed: an upgrade could not have delivered any of this. The top up added rows that were missing and skipped rows that were already there, which is right for a word and wrong for everything attached to one. Almost every word that just gained a sentence was already in every existing database, so an upgrade would have added nothing and reported success.

Version 2.2.1, September 2026

The home page was serving the sign-in screen.

  • A site set up by following the old instruction to make a page containing the app shortcode ends up with a page called Home whose body is the app. When the site plugin later builds its pages it adopts whatever is already sitting at that address, so that page became the marketing home and the app at the same time, and its body said app. The release before this one had just taught the template to check for the app before the marketing pages, which is right for the app page and was wrong for this one, and the home page quietly stopped existing. The header was there, the footer was there, nothing errored anywhere.
  • The page map now outranks the page body. A page the map has given to a marketing route is that route, and a leftover shortcode in it does not overrule that. The body is still read for a page the map knows nothing about, which is how a page somebody made by hand is found.
  • Updating cleans the stray shortcode out of any marketing page that has one, so nothing has to be done by hand. Nothing is lost: a page the plugin owns holds a marker, and the words live in the plugin.
  • The harness covers it now. It could not see it before for two reasons worth writing down: it had no way to put a body on a page at all, and its stand-in for WordPress counted the marker shortcode as the app shortcode because one name is a prefix of the other. Both are fixed.

Version 2.2.0, September 2026

The drawings.

  • The memory images were built here, by hand, one path at a time, and they looked it: a hen that read as a blob, and a fire and a water drop that were the same teardrop in two colours. A memory image the learner finds embarrassing is a memory image they stop using, so this was a product failure rather than a matter of taste.
  • Nine hundred and ninety objects now come from four openly licensed libraries and ship inside the plugin: Phosphor and Tabler under MIT, Material Design Icons under Apache 2.0, and Game Icons under Creative Commons Attribution 3.0, whose contributors are credited by name. Nothing is fetched. The pictures still work offline and still print.
  • Each one is refitted rather than dropped in: measured by the extent of its actual ink rather than its stated box, scaled to one optical size and centred. Four libraries have four ideas about margins, and that measuring step is most of why they read as one set.
  • The gender cue is a cue again. Masculine was seven teardrops and feminine was three wavy lines, so fire and water were the same shape and colour was the only thing telling them apart. It is a real flame, a real drop and a real snowflake now, in a badge, so it survives being colour blind and survives being printed.
  • A name match is not a meaning match. Searching those libraries for "net" finds the .NET logo, for "brake" an ABS warning lamp, for "juice" a bottle of poison and for "chalk" a chalk outline of a murder victim. Every one is confident, plausible and completely wrong, and would have gone onto a flashcard. The whole set was rendered as a contact sheet and read by eye, and eighty nine words were corrected by hand.
  • Thirty eight words still have no picture, because nothing in any of the four libraries depicts a giraffe, an onion or a waffle. Those get a lettermark, which is the honest answer.

Version 2.1.2, September 2026

The update that never updated the library.

  • The library only ever loaded when the plugin was first switched on. Uploading a new version healed the shape of the database and left its contents exactly as they were, so a site set up at an early version kept that version's words for ever. Nothing errored, every screen worked, and the product was simply a fraction of the one in the download. A site set up before the library grew was short more than twenty two thousand words, every phrase, and most of the stories.
  • The symptom that finally made it visible was an empty phrasebook, because phrases arrived in a version later than the one that site had been set up at. The course screen reading "0 of 114 words started" a few releases earlier was the same fault wearing a different hat.
  • Content now carries its own version number, separate from the one that tracks the shape of the database, and an update brings the library up to it. One language per pass with the progress written down, so a shared host that will not give you thirty seconds finishes the job across several requests instead of timing out in the middle of the same one for ever. Every importer skips what it already has, so nothing is duplicated and nobody's cards, hooks or history are touched.
  • None of it happens in a visitor's page view. Heavy work in a page load is exactly how an update took this website down in 1.5.0, and a fix for one bug is not worth causing the other. The version is written before the work rather than after it, so a request that runs out of memory leaves one failed upgrade rather than a site that retries the same doomed step for ever.
  • The app says so while it is happening, in one line at the top of the screen, and an empty phrasebook now says why it is empty rather than counting to nought over a paragraph about how the sections are arranged. Zero of something is almost never a fact worth stating on its own.
  • A ninth harness, 62 checks, on the thing none of the others could see: not what the importer imports, but where the work is allowed to happen and in what order it records itself. Reverting either fix turns it red.

Version 2.1.1, September 2026

The app page was showing a marketing placeholder instead of the app.

  • The app page sits in the same list as the marketing pages, because that list is how both plugins find it, so the router claimed it as a marketing page. The template then looked for something to draw, found nothing, and fell back to a placeholder. The page loaded, the heading was right, the navigation was right, nothing errored anywhere, and the product was simply not on it.
  • Every existing harness rendered each page by asking the content renderer for it directly, which is the exact request the template must never make for this page, so none of them could see it. The new one tests the decision rather than the output: given a page, which branch does the site take.
  • That harness also guards the claims that go stale. The features page still advertised eight kinds of exercise when there are fifteen, and the readme still said thirty eight pages when there are forty three. Both were fixed and both are checked on every run now, with the changelog exempt, because an old figure here is history rather than a claim.

Version 2.1.0, September 2026

Content, control, and the parts of the algorithm nobody usually exposes.

  • The reading library went from 83 graded stories to 933, which is 809,208 characters across the ten languages, from 252 at A1 to 90 at C1. Written to a spec, set in the places the languages are actually spoken, and validated before any of them landed.
  • A harness now reads all of them: 21,447 checks. It found 83 defects in the 83 stories that predate it, including the subtlest one there is, which is a gloss key written in the dictionary form while the story carries an inflected form. That gloss does nothing at all, and the only person who ever finds out is the reader who taps the word and gets nothing back. All 83 are fixed.
  • The drawing engine went from 345 symbols to 1,027, so most hooks now draw a real object rather than a lettermark. The checker also caught a fault older than this round: 21 symbols set the same attribute twice, which makes a browser silently drop the override the author wrote.
  • Sixty four settings in nine groups, up from eleven switches. They are declared once, with types, bounds and an explanation each, and the settings screen draws itself from that declaration. Anything that plausibly differs between languages is stored per language.
  • The scheduler now fits itself to each learner after four hundred reviews, and keeps the fit only when it beats the shipped weights by more than half a per cent. There is a screen showing target recall against actual recall, so the whole thing can be checked rather than trusted.
  • A reference library: the seven hundred written rules, searchable and out of course order, plus a page on the writing system for the five languages where the script is the barrier, and pronunciation notes for all ten.
  • A real phrasebook, arranging the 2,578 phrases by the situation you are standing in rather than by what they are about.

Version 2.0.0, September 2026

The course. A rebuild rather than a release.

  • The old path was a list of subject-and-level buckets with a progress bar on it. A bucket is not a course. There is now a written course of seventy units per language, seven hundred in all, and every unit is one grammar point that somebody sat down and wrote: what the rule is, the part of it that actually trips people up, worked examples, and drills. 3,494 examples and 2,196 drills across the ten languages.
  • Every one of those seven hundred rules has a memory hook of its own. Mnemonics are normally used for vocabulary; grammar is harder to hold and almost nobody writes hooks for it. This is the part of the product that does not exist anywhere else.
  • The course covers the whole library rather than a sample of it. Seventy units of a dozen words each would be seven hundred words out of 24,309, so the rest of the vocabulary is dealt out across the same units as extension lessons. That is 8,005 lessons and 40,025 levels, and every word in the library sits inside one of them.
  • Fifteen kinds of exercise instead of eight, including two that test the mnemonic itself, in both directions. Until now the hook was offered and never checked, which meant nobody found out when one was not working.
  • Four-strand mastery. Seeing a word, producing it, hearing it and writing it are four abilities and they come apart, which is why people finish a course, read a menu, and freeze in a shop. Each is now a separate memory with its own schedule, and a word is finished when the weakest of the four is safe rather than the strongest.
  • A tutor that answers with or without a model connected. Why an answer was wrong, a question box for the language, a conversation partner held to the words you already know, a story written for your exact vocabulary, and the pattern in your mistakes named. With no key each of those still answers, from the written rules and your own history, and the screen says which it is.

Removed in this release

  • The old path, its endpoints and its code. Two systems that can disagree about what a learner should do next is worse than either of them on its own.

Version 1.6.0, September 2026

The course now covers the library instead of a sample of it.

  • The learning path was a fixed list of thirty two units, so it stopped at a few hundred words no matter how much vocabulary sat behind it. On a library of 24,309 words the screen read "0 of 114 words started", which is a course pretending to be a curriculum. The units are now generated from the library itself, one per subject per level. Spanish is 55 units and 3,323 words, the smallest language is 1,907, and across the ten the path covers 24,222 words rather than 776.
  • A unit opens the next one at sixty per cent of its words or thirty words, whichever comes first, so a three hundred word unit never becomes a wall you have to finish before anything else appears.
  • Phrases have their own screen. There were 2,578 phrases, collocations and idioms in the library and no way to reach them on their own.
  • The drawing engine went from 194 symbols to 345. Hooks that draw a real object rather than a lettermark rose from 55 to 58 per cent of the written set, and from 19 to 34 per cent of the engine-written ones.
  • Thirty six more graded stories, taking the total from 47 to 83, between seven and eleven per language.

Fixed in this release

  • The story length check was rejecting full Chinese stories at 144 characters. Two hundred characters is an assumption about the Latin alphabet; Chinese, Japanese and Korean are now held to 150.

Version 1.5.0, September 2026

Staying logged in, and an update that could take the site down.

  • The header now knows whether you are signed in. Signed in it offers Open the app and Log out; signed out it offers Log in and Start free. It used to say "Log in" to everybody, including people who already were, and never linked to the app at all.
  • You stay logged in. Remember me is ticked for you, a remembered session lasts a term, and an unremembered one survives a weekend. Being signed out twice a week is enough friction to end a daily habit, which is the one thing this product exists to build.
  • The app uses the full width of the window rather than the reading column the marketing pages use. Word lists, gradebooks and stats tables were being squeezed into a third of a wide screen.
  • The hook library shows the drawing beside every hook, using the app plugin's own imagery engine rather than a second copy of it that could drift.

Fixed in this release

  • An update could take the whole site down. The upgrade routine ran inside visitors' page loads and only recorded success at the end, so if it ran out of time on shared hosting, every following request tried the whole thing again and the site never recovered. It now runs only in the admin, records the version before the work rather than after it, and is wrapped so a failure is a failure of that routine rather than of the website.
  • Finding the app page cost sixty database queries on every page view whenever the setting was empty. It is now one query, remembered for the request.

Version 1.4.0, September 2026

A way in, and the hook drawn rather than described.

  • Every hook is now a picture as well as a sentence. A memory image only works if you can see it, and describing one in words suits people who visualise easily and nobody else. The object is read out of the hook and drawn, with the gender cue as the weather around it: fire for masculine, water for feminine, ice for neuter, doubled for plural. The same word draws the same scene on every device, for ever, because a mnemonic that changes is not a mnemonic.
  • Where a hook names nothing drawable, it says so with a lettermark rather than inventing an unrelated shape. A picture that has nothing to do with the word is worse than no picture.
  • A learning path, and the option to narrow a session to one subject and level rather than taking whatever happens to be due.
  • A profile screen. Your name, your email, your plan and the languages you are learning all came back from the server from the first version, and there was no screen that showed any of it.

Fixed in this release

  • There was no way into the app. The app page had to be created by hand and nothing said so, so on a fresh install logging in returned you to the home page with no error anywhere. The site now builds the page at /app/, both plugins are pointed at it automatically, and a page you made yourself is found by its shortcode.
  • Logging in landed on the WordPress dashboard rather than the app. An administrator who asks for the dashboard still gets it.

Version 1.3.0, September 2026

A much larger library, and two harnesses that prove it.

  • The word library grew from 2,444 to 24,309 entries across the same ten languages, and the written hook set from 253 to 2,718. Every language now sits between 1,900 and 3,300 words, so none of them is a token entry.
  • Most of the new material went into the parts of the library that were empty rather than the parts that were already full: advanced verbs and adjectives, and roughly 1,900 everyday phrases, collocations and idioms, where the lists previously held nothing but greetings.
  • A new lexicon harness reads every entry and checks fourteen things about it, including that the term is written in its own script, that every noun in a gendered language carries a gender, that no meaning is written in the target language, and that every example sentence actually contains the word it is meant to demonstrate.
  • A new hook harness reads every written hook and checks that its word exists, that its picture is long enough to be a picture, and that its example and translation are in the right languages. Both harnesses have to be green before a release exists.
  • The harnesses found sixteen classes of real error in the entries that already shipped, and several hundred draft hooks were rejected during this round for pictures too thin to hold anything. All of them were rewritten rather than let through.

Version 1.2.0, September 2026

Signing up, taking money, and a great deal more content.

  • You can now actually make an account. The Start free button used to point at the WordPress registration screen, which is switched off on a fresh install and finishes on a dashboard. It now points at a real form that makes the account, signs you in and opens the app.
  • The library roughly doubled: 2,444 words, 253 written hooks, 32 graded stories.
  • A blog with nine long pieces in it, rather than a page saying nothing has been written yet.
  • Pictures. All of them drawn in vector from the palette: article covers, letterform specimens from the ten writing systems, the keyword method as a diagram, a memory palace cut open, and the classroom report drawn as thirty dots.
  • The hook library now shows a free sample without an account and the rest with one. It used to show every hook to everybody, which was generous and is still available as a setting.

Version 1.1.0, September 2026

A redesign rather than a feature release. Nothing in the product changed; everything you look at did.

  • A bright palette. Electric violet, yellow, coral, mint and sky over a deep grape, in place of the warm gold and black we launched with.
  • Ten band colours instead of four, spread across every page.
  • Motion: things arrive as you scroll, a ticker of real words from the library runs under the first screen, the numbers count up, the forgetting curve draws itself, and one section holds a visual still while four steps scroll past it.
  • All of that sits behind a reduced motion preference, and the test suite now reads the stylesheet on every run to prove that none of it escaped.
  • A rewritten home page, about twice as long, that runs the whole argument rather than three cards and a button.

Fixed in this release

  • A full width button in the pricing table was rendering at its natural width. The button helper was being handed a second class attribute, and a browser keeps the first and drops the second without complaining.
  • The primary button on a solid violet band was white on yellow, which measures 1.4 to 1. Found by the contrast check rather than by looking at it.
  • On a phone, two of the scroll animations pushed the page ten pixels wider than the window and gave every affected page a sideways scroll.

Version 1.0.0, September 2026

The first release. Ten languages, the hook engine, FSRS scheduling, stories, palaces, classes and the gradebook.

  • Keyword hook engine with four sources and a sound-alike fallback that needs no API key
  • FSRS 4.5 scheduling, server authoritative, with learning steps
  • Eight review styles, with the gentle ones reserved for cards still being learned
  • Story reader with tap to gloss, read aloud and per story challenges
  • Memory palace builder with a guided walk
  • Classes, five kinds of assignment, gradebook and the trouble words report
  • Progress screens with a thirty day forecast
  • Installable on phone and desktop, CSV import and JSON export

Fixed before launch

  • The memory palace editor threw away a typed name when a room was added. Caught by the browser test suite, not by a person.
  • Every primary button on the site rendered as an ordinary one because a base style out-specified the variant. Now measured on every test run rather than eyeballed.
  • Joining words were being given forced picture mnemonics. They now get an honest usage note instead.
This page is updated on the day a version ships, not at the end of a quarter.

Start with ten words tonight

Thirty days free, no card. When the trial ends the account drops to the free limits and nothing is deleted.