One script in your own Chrome tab reads the live lesson, works out the answer, and clicks. No API. No password. Nothing leaves the page.
Read the sourceDuolingo renders every exercise from a React component, and that component still holds the answer key. pwnlingo walks the fiber tree from the visible widget up to the challenge props, reads the correct answer, and does what a very fast, very bored student would do. A Claude session only appears when an exercise type shows up that the script has never seen.
The whole thing is one file. Solver families for exponentials, geometry, trigonometry, probability, statistics and 3D solids were appended one lesson at a time until the Math course ran out of units.
Puzzles hand over their solution in the same place, as a list of moves. The board is a Rive canvas that ignores synthetic events, so the script converts squares to screen pixels and a real mouse plays them.
Matches against Duolingo's bot get a small engine. It picks a move, then asks itself for a better one at greater depth, and keeps the deeper answer when the two disagree.
It started as a way to keep a streak alive during a busy week and turned into a study of how much of a gamified app is actually the client grading itself. Automated play is against Duolingo's terms, and the XP still ranks you against real people, so this is a curiosity to read, not a product to run.