Everything it touches turns to gold. A Chrome extension (Manifest V3) that solves Duolingo lessons and stories and runs an Auto Grind that takes every node on your path to Legendary.
- Auto Grind (“Gild everything”). Reads your whole learning path, finishes the lessons you haven't done, then runs Legendary on every
skill,storyandpracticenode, from the first unit to the last (Spaced Repetition practices included: Midas fills in the skill list the Duolingo website leaves empty). It checks that each node really turned legendary and retries once. It stops on its own when nothing is left, or when you press Stop. It is built to run unattended:- if the tab reloads mid-run, it picks up where it stopped; it also reloads the page by itself every hour (between nodes) and whenever the path gets stuck;
- if the next lesson node doesn't show up on the page (it happens in background tabs), it opens the lesson by its direct address; if the page shows a different node as active (another tab moved the course on), it reloads once to get a fresh path;
- a speaking exercise that can't be skipped makes it leave the lesson and reload; after 3 tries on the same node it moves on and comes back at the hourly restart;
- a background watchdog reloads the tab right away if Chrome's Energy Saver freezes it, or after 4 minutes if the page hangs;
- if the grind stops without Stop being pressed, it starts again by itself: every 10 minutes Midas checks it, and if the grind tab was closed or the browser was restarted it opens Duolingo in a background tab (without taking focus); if the tab is still open but the grind stopped, it reloads it; if there's no progress for 15 minutes it treats the grind as stuck and reloads. Every restart goes to the log with date, time and reason. Switch: Restart automatically if it stops (on by default, in the HUD and the popup); after an update the grind comes back right away;
- only one Duolingo tab grinds at a time, and when Duolingo asks for a streak goal it picks the highest one.
- on a brand-new course it answers Duolingo's welcome questions by itself (lowest level, start from scratch) and goes straight into the first lesson.
- the HUD shows how long is left: the estimate follows the real pace of the last 90 minutes (reloads and stuck speaking exercises included), counts down every second while the grind runs and shows the pace in steps per hour.
- Lesson solver. 35+ challenge types (translate, match, tap/cloze, listen, select, complete, order…), plus a generic fallback that logs any new type it meets so it can be added. Typed answers only go into the challenge that is on screen (not the one still animating out), so neither the previous exercise nor another Duolingo extension on the page gets in the way.
- Story solver. Multiple choice, select phrase, arrange, gap fill, point-to-phrase and match.
- In-page HUD. A gold crown in the corner of Duolingo opens a draggable, resizable panel (shadow DOM, Duolingo's own colors) with live progress, current lesson controls, settings and log.
- Speed presets. Rage (0 ms, as fast as possible), Legit (about 2.5 s between actions with human-like variation) or Manual (pick your own delay and humanizing).
- PT / EN / ES and light / dark themes, shared between the HUD and the popup. The first run follows the browser language (anything other than Portuguese or Spanish falls back to English); the flags in the HUD and popup header switch it.
- First-run tutorial and what's new. A 5-step tutorial on first install, What's new in vX.Y.Z once per version (skipping versions shows every change in between), and New version vX.Y.Z with a summary and an Update button. They show up by themselves as a box at the bottom center of the Duolingo page (it never covers the next node on the path), with no dark overlay, so the site stays clickable and a running grind isn't affected. ? in the HUD and popup header reopens the tutorial.
- Report a bug. A bug button next to Check for updates (HUD and popup) opens a card where you describe what happened. It attaches a diagnostic with no account data (version, browser, grind state and speed, current node, progress, recent log lines, never your user, e-mail, token or cookies) and opens a prefilled GitHub issue, or copies the full report to paste anywhere.
| Key | Action |
|---|---|
Ctrl+Enter |
solve and continue |
Alt+Enter |
solve only |
Alt+S |
skip challenge |
Alt+L |
solve the whole lesson / story |
Alt+G |
toggle Auto Grind |
Alt+X |
stop |
Alt+H |
show / hide the HUD |
Works on Chrome, Edge, Brave, Opera GX and Firefox 140+ (one package for all of them).
Chrome, Edge, Brave, Opera GX
- Download midas-vX.Y.Z.zip from the latest release and extract it to a folder you'll keep (e.g.
Documents\Midas). Don't move or delete it later: the browser loads the extension from it. - Open
COMO-INSTALAR.htmlin that folder for the illustrated guide (Portuguese, English, Spanish), or: - Open the extensions page (
chrome://extensions,edge://extensions,brave://extensionsoropera://extensions), turn on Developer mode, click Load unpacked and pick the folder that hasmanifest.json. From a clone of this repo, load theextension/folder. - Open (or reload) duolingo.com.
Firefox 140+
- When a release has midas-vX.Y.Z.xpi (signed by Mozilla for self-distribution), click it and confirm; it updates itself through
firefox/updates.json. - Without an
.xpiyet:about:debugging→ This Firefox → Load Temporary Add-on → pickmanifest.jsonin the unzipped folder (it's removed when Firefox closes).
Keep Duolingo in its own visible window while grinding: Chrome throttles timers in background tabs and the grind slows down a lot. If Chrome's Energy Saver is on (Settings → Performance), it can freeze a background Duolingo tab; Midas reloads it and carries on, but turning Energy Saver off avoids the interruptions.
While Duolingo is open, Midas checks this repo's releases by itself: when the page opens, every 30 minutes and whenever you come back to the tab (at most once every 10 minutes); Check for updates (bottom of the HUD and the popup) is just a backup. When there's a new version, a box shows up right away, without reloading, with what changed (from extension/src/changelog/, in your language). The ✕ only postpones it for 1 hour (or until you open the browser again). A release marked URGENTE (for a serious bug) shows the box without ✕ and pauses Midas until you update. Click Update to download the zip, extract it over the same folder, and within a minute Midas notices the new files and reloads itself together with the Duolingo tab; a running Auto Grind keeps going.
extension/
├── manifest.json
├── src/unload.js MAIN world, document_start: no "Reload site?" prompt when Midas reloads the page mid-grind
├── src/main.js MAIN world: solvers, lesson/story player, grind loop
├── src/hud.js MAIN world: in-page HUD (closed shadow DOM)
├── src/bridge.js ISOLATED world: chrome.storage ⇄ page via CustomEvent
├── src/i18n.js PT / EN / ES strings
├── src/support.js "Support ♥" box: Pix BR Code + QR built offline, GitHub Sponsors link
├── src/vendor/qrcode.js qrcode-generator (MIT), local copy, kept off window
├── src/background.js toolbar badge, update checks, reloads itself when new files land, frozen-tab watchdog, auto-restart if the grind stops
├── COMO-INSTALAR.html install / update guide (PT / EN / ES), guia/guia.js
└── popup/ toolbar popup
Plain JavaScript, no build step. A few choices worth pointing out:
- Small footprint on the page. Content scripts are declared with
world: "MAIN", so there's no injected<script>tag, no iframe and noweb_accessible_resources. Nothing enumerable is added towindow; shared objects live underSymbol.for(...)keys. - Answers come from the challenge object Duolingo already loaded, read through React fiber, not from guessing on the DOM. The "already answered" check is keyed on the identity of that object, which fixed a race where Duolingo swapped challenges faster than the loop tick.
- Legendary practice nodes only get credited if their section is loaded first, so the grind loads it before opening the Legendary session.
- Context-invalidated guard. After an extension update, an old tab's bridge stops talking to
chrome.*quietly and the HUD offers a reload, instead of throwing errors.
Measured on a live account: a Legendary skill went 17/17 with no mistakes in about 26 s.
speak,characterTraceandcharacterWritechallenges are skipped (in Legendary a skip counts as a mistake).- Chests on the path are opened by clicking them, so they need the path to be drawn on the page; there is no direct address for them.
This project is free and always will be. If it helps you, you can support it on GitHub Sponsors (one-time or monthly). 🇧🇷 In Brazil? Pix: fa525dad-afca-4683-845d-eee7225a53e3
In Midas itself there's an optional Support ♥ button in the footer of the HUD and the popup: Pix for Brazil (QR code and copy-and-paste code, R$ 5 / 10 / 25 or any amount) or GitHub Sponsors for everyone else. It changes nothing in Midas, makes no network request and tracks nothing; the QR code is drawn locally.
Midas is my own rewrite. Ideas and the starting point came from the Apache-2.0 Autolingo lineage (originally by 2-X / Kris, adapted by Smint and krisl). The Pix QR code uses qrcode-generator by Kazuhiko Arase (MIT). See NOTICE.
Personal project, not affiliated with or endorsed by Duolingo. Automating lessons goes against Duolingo's Terms of Service and can get an account flagged or banned. Use it on your own account and at your own risk.
Apache License 2.0 · made by André Miller Fleck (Dreds)

