Typing practice app with three modes:
classic: standard text typingracing: race opponents while typingmeteoriteRain: destroy falling word meteorites by typing them
git submodule update --init --recursive
npm install# local development (Vite on 3000 + API server on 3001)
npm run start:dev
# production build output to dist/
npm run build
# serve dist/ on 3000
npm run start:prodnpm start maps to npm run start:prod.
Runtime behavior is controlled by client/config.json:
gameType:classic,racing, ormeteoriteRainkeyboard: show/hide visual keyboardavailableKeys: allowed keys (empty array means all keys)showStats: show final stats dashboardrealTimeStats: enabled live metrics (speed,accuracy,time,errors,errorsLeft,chars)racing: mode-specific config (opponentSpeeds,mistakesAllowed)meteoriteRain: mode-specific config (meteoriteSpeed,spawnInterval,pointsPerChar,difficulty)
client/index.html: app shell and mode containersclient/typing-simulator.js: core gameplay and stats logicclient/typing-simulator.css: gameplay stylesclient/app.css: shared shell/layout stylesclient/help.js: help modal bootstrapclient/design-system/components/modal/modal.js: design-system modal used for helpclient/help-content.html: help text shown in the modalclient/text-to-input.txt: source text used for typingserver.js:/save-stats, production static hostingextract_solution.py: parses and printsclient/stats.txt
POST /save-stats- Body: plain text payload
- Persists results to
client/stats.txt.
- Help content is loaded from
client/help-content.htmland shown viaModal.createHelpModalfrom the design system when#btn-helpis clicked. - In development, Vite serves static assets and proxies
/save-statsto the API server.