keybr.com: Adaptive Touch Typing Trainer with Per-Key Statistics
The smartest way to learn touch typing and improve your typing speed.
At a glance
- What is it?
- keybr.com is an open-source adaptive typing trainer that tracks every keystroke, generates lessons focused on the specific keys each user struggles with, and predicts how many lessons remain before a target speed is reached. The source code is available under the GNU AGPL v3 and can be self-hosted using Docker or Node directly.
- Who is it for?
- keybr.com is a solid choice for anyone serious about improving touch typing speed who wants a tool that adjusts its lessons based on their actual weak keys rather than presenting a fixed curriculum. It is also the right choice for self-hosters who want to run the full application with their own database and without sharing data with a third party.
- Can I use it commercially?
- Yes, with strict conditions. AGPL-3.0 is a network copyleft licence: if people use a modified version over a network, for example as a hosted service, you must offer them its source code under the same licence.
- Is it still maintained?
- Yes. The repository last received commits 3 days ago.
- What is it written in?
- Mainly TypeScript, according to GitHub's language statistics.
Answers come from the project's GitHub data, last synced on October 1, 2026, and from our analysis. They are not legal advice.
Editorial analysis
What Makes keybr.com Different from a Standard Typing Test
Standard typing tests present a fixed text and measure words per minute. keybr.com takes a different approach: it tracks every individual keystroke and builds per-key statistics for each user. From those statistics, it automatically generates lessons that emphasise the letters and bigrams where the user makes the most errors or types most slowly. The README describes this feedback loop as the core differentiator: 'keybr.com offers a few unique features.' The system starts with a small set of the most frequent letters in the user's selected language, then adds new letters one by one as the user reaches the target speed with the current set. This staged expansion means a new user is never overwhelmed by the full alphabet at once. The README also describes a prediction feature: the system estimates how many more lessons the user will need to complete before reaching their configured target speed, which gives learners a concrete milestone to work toward rather than an open-ended practice session.
Per-Key Statistics and the Lesson Generation Algorithm
The statistical backbone of keybr.com is its per-keystroke tracking. For every key the user presses, the system records whether the key was correct, how long it took, and the context of the surrounding characters. These metrics accumulate over sessions and form the basis for the lesson generator's decisions about which letters to include in the next practice text. Letters where accuracy is consistently low or speed is consistently below the target receive more exposure in subsequent lessons. The README describes an automatic expansion mechanism: once a user reaches the target speed on the current letter set, a new letter is added. This means the practice text is never a generic sample sentence but a specifically constructed sequence optimised for that user's current weaknesses. The profile page, which the README describes as offering detailed graphs of learning progress, visualises this data over time and shows the improvement curve for each key.
Self-Hosting with Docker
The repository includes a Dockerfile and docker-compose.yaml for self-hosting. The Dockerfile builds the application in a Node 26 image:
npm ci
npm run compile && npm run buildThe docker-compose.yaml exposes port 3000 and requires two volume mounts: a data directory for persistent storage and a .env file at a fixed path inside the container:
services:
keybr:
build:
dockerfile: ./Dockerfile
volumes:
- /path/to/data_dir:~/.local/state/keybr
- /path/to/data_dir/.env:/etc/keybr/env
ports:
- 30044:3000
restart: unless-stoppedThe .env.example file documents the required environment variables. The minimal configuration sets `APP_URL`, `COOKIE_DOMAIN`, `COOKIE_SECURE`, and `DATA_DIR`. The database defaults to SQLite with a local file path:
DATABASE_CLIENT=sqlite
DATABASE_FILENAME=~/.local/state/keybr/database.sqliteMail configuration is optional but required for email-based authentication flows. For local development without Docker, the package.json start script is `npm run start`, and `npm run start-docker` is the production path that initialises the database before starting the server.
Repository Structure and Technology Stack
keybr.com is a TypeScript monorepo managed with npm workspaces. The package.json lists the workspace root and two workspace groups: packages/* and scripts. Build tooling uses Webpack for bundling, Lage for task orchestration across the monorepo, and ESLint and Stylelint for linting. The HTTP server uses a custom framework called @fastr/core, visible in the package.json dependencies, rather than Express or Fastify. The packages/ directory contains the individual modules of the application: each key metric calculation, lesson generator component, and UI component lives in its own package. The repository also includes documentation in docs/ covering how to add a custom keyboard layout and how to add a new language. Both docs are relevant to contributors who want to extend coverage: the README explicitly calls out keyboard and language additions as a contribution path open to the community.
Licence Implications for Self-Hosting and Modification
keybr.com is licensed under the GNU Affero General Public License v3.0 (AGPL-3.0). The AGPL differs from the standard GPL in a specific and consequential way: it requires that anyone who deploys the software as a network service make the source code of any modifications available to users of that service. For a self-hoster running the application privately without modifications, this is not a concern. For a company that modifies keybr.com and deploys it as a publicly accessible service, AGPL-3.0 requires releasing those modifications. This is a hard constraint for operators who want to build a proprietary product on top of the keybr.com codebase. The hosted version at www.keybr.com runs the upstream code under these terms.
Limitations and What the README Does Not Cover
The README does not document rollback procedures for the database, which matters for self-hosters who want to apply or revert migrations safely. It also does not describe what happens when a user clears their browser data: since the self-hosted version uses a database for user accounts, data should persist across sessions, but the README does not explicitly confirm this for all storage configurations. The keybr.com lesson generator is optimised for Roman-script keyboard layouts; the README describes a process for adding custom keyboard layouts and languages, but this requires contributing to the repository rather than being a runtime configuration option. The application does not document a REST API for programmatic access to per-key statistics, so integrating keybr.com data into an external dashboard would require reading directly from the SQLite database. The AGPL-3.0 licence is worth noting for commercial operators: any public deployment of a modified version of keybr.com must release the modified source to users of that service. The monorepo structure, with packages/ containing individual module packages and scripts/ for build utilities, means a contributor needs to understand the Lage task runner and npm workspaces to build and test a single package in isolation.
Editorial conclusion
keybr.com is a solid choice for anyone serious about improving touch typing speed who wants a tool that adjusts its lessons based on their actual weak keys rather than presenting a fixed curriculum. It is also the right choice for self-hosters who want to run the full application with their own database and without sharing data with a third party. The AGPL-3.0 licence requires that any public deployment of a modified version release the source, which is a constraint for commercial operators. Before self-hosting, verify the Node 26 requirement and set up a SQLite or compatible database using the variables in .env.example.
Frequently asked questions
What is keybr?
keybr.com is an adaptive touch typing trainer that generates lessons based on per-key statistics tracked for each user. It starts with the most frequent letters in the selected language, adds more letters as the user reaches the target speed, and predicts how many lessons remain before the goal is reached.
Is keybr.com free?
The hosted service at www.keybr.com is free to use. The source code is open under the GNU AGPL v3.0, and anyone can self-host the full application using the Dockerfile and docker-compose.yaml in the repository.
Is keybr.com safe to use?
The source code is publicly available under AGPL-3.0, so the implementation can be audited. For self-hosters, the application stores user data in a local SQLite file or another configured database. The .env.example in the repository documents all the configuration variables the application uses.
Official sources
Add this badge to your README
If you maintain this project, the badge below links readers to this analysis and shows its maintenance status from the daily GitHub snapshot. Paste the markdown into your README; add ?metric=license or ?metric=stars to the image URL for a different field.
[](https://hysenlabs.com/projects/aradzie-keybr-com)