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 sourceLive replay of real solved exercises, cycling tracks — no screenshot, it actually plays the move.
Duolingo 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.
A small iOS/macOS app polls the runner over the LAN or the open internet. Chess renders as a real animated board with real chess pieces, sliding move to move, not a screenshot; other tracks show a live screenshot instead. Track, XP, streak, hearts, league, and a real per-puzzle progress bar sit in a frosted glass panel below the board. Pause the runner from the app, switch tracks (any of ~35 languages, plus math and music) from its Track menu, no terminal needed.
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.