A modern Manifest V3 browser extension for reading the visible Monkeytype test, typing at a configurable WPM, practicing controlled corrections, and optionally starting the next test.
MonkeyType Extension is a lightweight, local-only Chrome/Chromium extension wrapper for Monkeytype. It provides a polished popup for WPM, start delay, accuracy simulation, auto-restart, and a configurable start/stop keyboard shortcut. It does not collect credentials, send typed text to a server, or require Selenium, Python, or a separate driver.
Developer: Diwas Khatri
Project: github.com/DiwasKhatri07/monkeytype-extension
Responsible-use notice: Automating a typing test may violate the test website's terms or affect account results. Use this project only where automation is permitted. This extension intentionally does not include fingerprint spoofing, stealth, anti-detection, or bot-evasion features.
- Custom WPM: Set a typing speed from 10–400 WPM with a number field and slider.
- Optional start delay: Leave time to switch Monkeytype modes before the run begins.
- Accuracy practice: Enable correction simulation and choose 70–100% accuracy. The engine may type a wrong character, pause, press Backspace, and correct it.
- Auto-restart: Wait for the result state, locate a visible restart control, and safely begin the next test only when a fresh test is detected.
- Configurable shortcut: Click the shortcut field in the popup and press a modifier-based key combination to update the Chrome command.
- Reliable stop behavior: Stop button and shortcut cancellation invalidate the active run, including delayed starts and auto-restart waits.
- First-install credit: The first installation opens the developer GitHub profile, then the extension is ready to use.
- Local-only operation: Settings are stored in
chrome.storage.local; no remote API or login flow is included. - DOM-maintenance friendly: Page selectors are isolated in a small set of functions in
content.js.
- Download
MonkeyType-Extension-v1.0.0.zipfrom the latest release. - Extract the ZIP into a normal folder. The extracted folder must directly contain
manifest.json. - Open
chrome://extensionsin Chrome or a Chromium-based browser. - Turn on Developer mode.
- Click Load unpacked and select the extracted folder.
- Open Monkeytype, start a test, open the extension popup, and choose your settings.
After installing a new release, click Reload on the extension and refresh the Monkeytype tab. Chrome may keep an older content script in tabs that were already open.
- Open a Monkeytype test and wait until words are visible.
- Set WPM and, if needed, a Start delay.
- Enable Practice mistakes only for correction-practice behavior.
- Adjust Accuracy if practice mistakes are enabled.
- Optionally enable Auto-restart.
- Press Start typing, or use the configured shortcut. The default is
Ctrl+Shift+Yon Windows/Linux andCommand+Shift+Yon macOS. - Press Stop or the shortcut again to cancel.
flowchart LR
A[Popup settings] --> B[chrome.storage.local]
B --> C[Background service worker]
C --> D[Active Monkeytype tab]
D --> E[Read visible words]
E --> F[Dispatch keyboard/input events]
F --> G{Auto-restart?}
G -- No --> H[Show finished status]
G -- Yes --> I[Detect result screen]
I --> J[Click visible restart control]
J --> E
The content script reads the active and upcoming visible words from #words, finds the page input, and dispatches keyboard events with an input-event fallback. It stops when the run token is invalidated. Auto-restart is guarded by result detection, restart-button detection, and fresh-test detection so it does not blindly loop.
The page-specific selectors are deliberately isolated in content.js:
| Function | What to update |
|---|---|
readVisibleText() |
Word container, word item, letter nodes, and active-word class |
findInput() |
The active textarea, input, or contenteditable selector |
resultVisible() |
Result-screen selectors |
findRestartButton() |
Restart button selectors |
waitForFreshTest() |
Fresh-test readiness conditions |
fireKey() |
Keyboard and input event behavior |
After changing selectors:
- Go to
chrome://extensions. - Click Reload for MonkeyType Extension.
- Refresh the Monkeytype tab.
- Test at a low WPM with Auto-restart disabled.
- Inspect the popup status before enabling Auto-restart.
See DOM maintenance guide for a focused checklist.
.
├── manifest.json # MV3 metadata, permissions, command, popup
├── background.js # Global shortcut and first-install behavior
├── content.js # DOM reading, typing, stop, and restart engine
├── popup.html # Popup interface
├── popup.css # Popup visual system
├── popup.js # Settings, shortcut capture, and controls
├── assets/typing-preview.svg # Animated README preview asset
├── docs/DOM-MAINTENANCE.md # Selector update guide
├── LICENSE
└── MonkeyType-Extension-v1.0.0.zip
| Permission | Reason |
|---|---|
activeTab |
Communicate with the active Monkeytype tab after user interaction |
scripting |
Inject the content script into an already-open tab when needed |
storage |
Persist local settings and the selected shortcut |
| Monkeytype host permissions | Limit page access to Monkeytype domains |
No email, password, cookies, or typed text are transmitted by this project.
No build step is required. Edit the source files, reload the unpacked extension from chrome://extensions, refresh the Monkeytype tab, and test. Basic syntax checks:
node --check popup.js
node --check content.js
node --check background.js
node -e 'JSON.parse(require("fs").readFileSync("manifest.json"))'- Run the syntax checks above.
- Confirm
manifest.jsonis at the ZIP root. - Test Start, Stop, the configured shortcut, delayed start, and Auto-restart.
- Update the version in
manifest.json. - Create a versioned ZIP and GitHub release asset.
- Add release notes describing selector or behavior changes.
Created and maintained by Diwas Khatri. Inspired by the original OTAKUWeBer/MonkeyTypeBot project.
Licensed under the Apache License 2.0. See LICENSE.