{"id":51415746,"url":"https://github.com/ntplsrpp/thai-type","last_synced_at":"2026-07-04T19:01:01.210Z","repository":{"id":361717046,"uuid":"1255518679","full_name":"NTPLSRPP/thai-type","owner":"NTPLSRPP","description":"Thai touch-typing trainer — Monkeytype-style: typingth.com lessons, 3 keyboard layouts, 14 themes, live WPM/accuracy. Next.js 16 + React 19 + TypeScript.","archived":false,"fork":false,"pushed_at":"2026-05-31T23:51:23.000Z","size":2153,"stargazers_count":1,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-06-01T01:14:36.834Z","etag":null,"topics":["kedmanee","keyboard","monkeytype","nextjs","playwright","react","thai","thai-language","touch-typing","typescript","typing","typing-test","typing-tutor","vitest","zustand"],"latest_commit_sha":null,"homepage":"https://ntplsrpp.github.io/thai-type/","language":"TypeScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/NTPLSRPP.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":"AGENTS.md","dco":null,"cla":null}},"created_at":"2026-05-31T23:26:32.000Z","updated_at":"2026-05-31T23:51:27.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/NTPLSRPP/thai-type","commit_stats":null,"previous_names":["ntplsrpp/thai-type"],"tags_count":null,"template":false,"template_full_name":null,"purl":"pkg:github/NTPLSRPP/thai-type","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/NTPLSRPP%2Fthai-type","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/NTPLSRPP%2Fthai-type/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/NTPLSRPP%2Fthai-type/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/NTPLSRPP%2Fthai-type/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/NTPLSRPP","download_url":"https://codeload.github.com/NTPLSRPP/thai-type/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/NTPLSRPP%2Fthai-type/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":35132289,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-26T15:22:16.424Z","status":"online","status_checked_at":"2026-07-04T02:00:05.987Z","response_time":113,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["kedmanee","keyboard","monkeytype","nextjs","playwright","react","thai","thai-language","touch-typing","typescript","typing","typing-test","typing-tutor","vitest","zustand"],"created_at":"2026-07-04T19:01:00.244Z","updated_at":"2026-07-04T19:01:01.194Z","avatar_url":"https://github.com/NTPLSRPP.png","language":"TypeScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"# thai-type\n\n**English** · [ไทย](./README.th.md)\n\nA Thai touch-typing trainer in the spirit of Monkeytype — structured lessons, multiple keyboard layouts, live stats, and a deep set of customization and theming options. Built for learning the Thai keyboard from the home row up.\n\n**▶ Live demo: \u003chttps://ntplsrpp.github.io/thai-type/\u003e**\n\n![thai-type — test screen](docs/screenshots/home.png)\n\n\u003e Everything runs client-side; progress and settings persist in the browser (no backend, no account).\n\n## Features\n\n- **Typing engine** — character-level (code point) comparison with cluster-aware display via `Intl.Segmenter`, so Thai combining marks render attached to their base consonant while still being graded per keystroke.\n- **Lessons** — the full [typingth.com](https://www.typingth.com) curriculum flattened into chapters → sub-lessons; each sub-lesson is repeated 3× to complete. Jump to any lesson, \u003ckbd\u003espace\u003c/kbd\u003e for next, \u003ckbd\u003er\u003c/kbd\u003e to redo.\n- **Test mode** — time and word-count modes with a live WPM / accuracy readout, à la Monkeytype.\n- **Layouts** — Kedmanee, Pattachote, and Manoonchai, with correct per-key finger zones.\n- **On-screen keyboard** — full MacBook-style key field, shift legends, finger-zone coloring, next-key hint, and an error heatmap. Three sizes.\n- **Themes** — 14 built-in presets plus user-created themes (custom palette, caret, and uploaded background image stored in IndexedDB).\n- **Settings** — stop-on-error, no-backspace, blind mode, caret style, smooth caret, font + size, page width, sounds, and more — persisted to `localStorage` with schema-versioned migration.\n\n## Screens\n\n| Lessons | Test |\n|---|---|\n| [![lessons](docs/screenshots/lessons.png)](docs/screenshots/lessons.png) | [![themes](docs/screenshots/theme-chisa.png)](docs/screenshots/theme-chisa.png) |\n\n## Tech stack\n\n- **Next.js 16** (App Router, Turbopack) · **React 19** · **TypeScript**\n- **Zustand** for state · `localStorage` + **IndexedDB** (`idb-keyval`) for persistence\n- **Vitest** + **@testing-library/react** (unit/component) · **Playwright** (e2e)\n- Fonts via `next/font` (Inter for UI, Noto Sans Thai for typing)\n\n## Getting started\n\nRequires Node 20+ (developed on Node 22).\n\n```bash\nnpm install\nnpm run dev\n```\n\nOpen \u003chttp://localhost:3000\u003e.\n\n## Scripts\n\n| Script | What it does |\n|---|---|\n| `npm run dev` | Dev server (Turbopack) |\n| `npm run build` | Production build |\n| `npm start` | Serve the production build |\n| `npm run lint` | ESLint |\n| `npm test` | Unit + component tests (Vitest) |\n| `npm run test:watch` | Vitest watch mode |\n| `npm run e2e` | Playwright end-to-end tests |\n\n## Project layout\n\n```\napp/            routes: / (test), /lessons, /lessons/[id], /themes, /stats, /settings\ncomponents/     UI — Keyboard, Words, SubLessonRunner, TestScreen, SettingsPanel, …\nlib/\n  engine/       typing engine, metrics, per-key stats\n  layouts/      Kedmanee / Pattachote / Manoonchai + key→char resolution\n  curriculum/   typingth chapters and sub-lessons\n  theme/        presets, theme types, applier\n  storage/      settings schema, versioned persistence\nstores/         Zustand stores (settings, stats, key model, lesson progress)\ntests/          Vitest unit + component tests\ne2e/            Playwright specs\n```\n\n## Testing\n\n```bash\nnpm test     # Vitest — engine, layouts, curriculum, stores, components\nnpm run e2e  # Playwright — lessons, layout switching, theming, stats flows\n```\n\n## Notes\n\n- The bundled wallpaper art (`public/themes/`) and one remote wallpaper URL are third-party images used for the Hatsune Miku / Chisa preset themes; replace them with your own assets for redistribution.\n- This is not the Next.js you may know — it targets Next 16; check `node_modules/next/dist/docs/` for version-specific APIs before changing framework code.\n\n## License\n\n[MIT](./LICENSE) © NTPLSRPP. The MIT license covers this project's source; bundled third-party wallpaper art (see Notes) is not covered and remains owned by its respective creators.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fntplsrpp%2Fthai-type","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fntplsrpp%2Fthai-type","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fntplsrpp%2Fthai-type/lists"}