A no-build typing speed test made with HTML, CSS and vanilla JavaScript. Benchmark your typing speed, watch real-time performance analytics, and help improve the experience. This repository is intentionally shipped with defects for a workshop, hackathon, or contribution event.
- Fork this repository (or create a new repository and upload these files).
- Open
index.htmlin a browser, or run it with VS Code Live Server. - Press Start test and type the passage.
- Find an issue, reproduce it, and submit a fix with a short explanation and test steps.
There is no build step and no dependency installation. GitHub Pages can host it as a static site.
| Level | Focus Areas | What you'll practise |
|---|---|---|
| 🟢 Easy | UI contrast, basic event handling, counter displays, documentation | CSS variables, input events, DOM basics |
| 🟡 Medium | Calculation algorithms, timer lifecycles, paste handling, state persistence | State machines, timing, input edge cases, canvas |
| 🔴 Hard | Concurrency, race condition mitigation, replay modes, visual data mapping | Event timing, async flows, replay engines, data viz |
- 15 / 30 / 60 second rounds
- Passage randomisation and per-character highlighting
- Live WPM, accuracy, error count, and personal best display
- Light/dark theme control
- Live WPM speed progression graph
- Per-key error keyboard heatmap
- Ghost mode entry point (currently a placeholder page)
- Responsive layout and keyboard-friendly controls
Some of these features are intentionally imperfect. That's the challenge: the UI may look finished while the implementation needs investigation.
This application is intentionally shipped with multiple subtle defects and performance quirks across timer lifecycle handling, user input edge cases, score metrics, and visual rendering.
Instead of a pre-defined checklist, contributors are challenged to hunt, reproduce, and report defects like a real QA engineer and open-source contributor:
- Test the Application: Play rounds of 15s, 30s, and 60s. Try rapid typing, pasting text, backspacing, switching themes mid-game, restarting abruptly, and testing at the zero-second mark.
- Investigate the Code: Dig into
script.jsandstyle.cssto locate where logic breaks down or state desynchronizes. - Report the Defect: If you discover an unlisted bug, open a Bug Report using our issue template with reproduction steps.
- Get Mentor Approval: Mentors will verify your findings, assign the difficulty tier (
level:mediumorlevel:hard), and give you the green light to claim and fix it!
Note: Starter beginner-friendly issues (level:easy) are listed on the Issues Tab to help you get your first PR merged.
AI assistance is prohibited for every part of this KeyRush challenge. This includes using AI to inspect the repository, identify or diagnose defects, suggest fixes, generate or edit code, create tests, review a proposed solution, or implement any feature—even partially.
Do not upload, paste, or otherwise provide KeyRush source code, screenshots, bug descriptions, or challenge materials to AI tools. Disable AI coding agents, AI autocomplete, and AI code-review features while working on this challenge.
You may use ordinary editors, browser developer tools, debuggers, and official language/API documentation. Submissions must represent your own independent work. Review CONTRIBUTING.md for full submission evidence requirements and live verification policies.
This repository is an official project for FOSSSoC Season 1 (November Phase) hosted by TKM FOSS.
- 🌐 Live Demo: https://tkmfoss.github.io/BrokenKey/
- 📋 Active Issues: Browse open challenges on the Issues Tab (tagged
soc-s1).
- Browse open issues tagged with
soc-s1. - Comment
/claimon an unassigned issue. - Our automated bot will immediately assign you if you meet the eligibility criteria.
⚠️ 1-Issue Rule: You can only have ONE active claimed issue at any time across all FOSSSoC repositories. You must have your pull request merged or closed before claiming another.- ⏳ Tiered Inactivity Window: You have 3 days (72 hours) for Easy issues, and 5 days (120 hours) for Medium and Hard issues to open a pull request. If no PR is opened within this window, the bot automatically unassigns the issue to keep opportunities open for others.
Found an unlisted bug, edge case, or have an idea for an awesome new feature (e.g., sound effects, custom passages, accessibility improvements, word-count mode)? You are strongly encouraged to propose it!
Before creating a new issue, search the Issues Tab and Pull Requests Tab to make sure someone else hasn't already reported, claimed, or fixed it. Duplicate issues will be closed.
- Go to New Issue.
- Choose either Bug Report or Feature Proposal.
- Use a clear, conventional title:
- For bugs:
fix(scope): concise description of the defect(e.g.,fix(audio): keystroke audio clips during rapid typing) - For features:
feat(scope): concise description of the proposal(e.g.,feat(ui): add audio click toggle for keystrokes)
- For bugs:
- Fill out all template sections: steps to reproduce, expected vs observed behavior, relevant files, and your proposed approach.
- A project mentor will review your proposal to verify that it is constructive, non-trivial, and fits the challenge.
- If approved, the mentor will tag your issue with:
soc-s1label (mandatory for automated leaderboard tracking).- The appropriate difficulty tier:
level:easy(10 pts),level:medium(25 pts), orlevel:hard(50 pts).
⚠️ IMPORTANT: Do not start coding or submit a PR until a mentor has reviewed and labeled the issue! PRs linked to unapproved or unlabeled issues cannot be scored by the automated leaderboard.
- As soon as the mentor adds the labels, comment
/claimon the issue to assign yourself. - The standard 1-Issue Rule applies (you cannot claim if you already have an active assigned issue).
- Your tiered inactivity clock (3 days for Easy, 5 days for Medium/Hard) begins once assigned.
- Fork this repository to your personal GitHub account.
- Clone your fork locally and create a descriptive branch:
git checkout -b fix/accuracy-counter
- Test your changes locally by opening
index.htmlin your browser. - Commit your changes with clear commit messages and push to your fork.
- Open a Pull Request targeting
mainoftkmfoss/BrokenKey. - 🔗 CRITICAL: Include
Fixes #<issue_number>in your pull request description (e.g.,Fixes #2). This automatically links the issue, closes it upon merge, and ensures the automated leaderboard tracks your score!
| Difficulty | Tag | Points | Description |
|---|---|---|---|
| 🟢 Easy | level:easy |
10 pts | Great for getting started |
| 🟡 Medium | level:medium |
25 pts | State, lifecycle, and event edge cases |
| 🔴 Hard | level:hard |
50 pts | Concurrency, replay modes, visual data mapping |
- ⚡ Early Bird Bonus: +5 bonus points for PRs opened during Week 1 (November 1 – November 7).
- 🌟 Quality Bonus: +5 bonus points for clean, well-documented code with thorough PR descriptions (awarded via
quality:excellentlabel). - 🛑 Repository Cap: Maximum of 5 scored PRs per repository.
MIT License. This workshop challenge is based on the original project at ankeshbit/typing-speed.