An interactive typing tutor for four real Kannada layouts. Practise on your own physical keyboard, watch a virtual keyboard light up, and build typing speed - no installation of the actual keyboard layout required.
Full docs live in docs/: a tutorial for users, a layout data contract for maintainers, a walk-through for adding a new layout, a serve-and-publish guide, and an explanation of the two typing engines.
Included layouts:
| Layout | Type | What it is |
|---|---|---|
| ಕೆಜಿಪಿ (kgp) | keymap | The KPRao/KGP/Nudi family - type by sound (k→ಕ, A→ಾ, f→್). Built directly from the KPRao/KGP macOS keyboard layout. |
| InScript (inscript) | rule-based | The Government of India standard position-based layout. |
| InScript 2 (inscript2) | rule-based | The updated InScript standard with conjunct and ZWJ/ZWNJ shortcuts on a modifier layer. |
| Transliteration (transliteration) | rule-based | Phonetic/ITRANS-style typing (k a n n a D a → ಕನ್ನಡ). |
The app is split into a generic engine and pure-data layout definitions, so a new layout is just one JSON file plus one line in the registry.
Live structure (plain static files, no build step, no dependencies):
index.html - page markup
style.css - all styling
app.js - generic engine (two strategies) + tutor logic
data/layouts.json - registry: order, names, descriptions, tags
data/layouts/kgp.json - KGP keymap (actions/terminators + historic key seq)
data/layouts/inscript.json - InScript rules (ported from jquery.ime)
data/layouts/inscript2.json - InScript 2 rules (ported from jquery.ime)
data/layouts/transliteration.json - Phonetic transliteration rules (ported from jquery.ime)
- Push this repo's
mainbranch (keep the folder structure as-is -app.jsfetchesdata/layouts.jsonanddata/layouts/*.jsonby relative path). - In the repo, go to Settings → Pages.
- Under Build and deployment, set Source to
Deploy from a branch, pick your branch (usuallymain) and folder/ (root). - Save. GitHub will give you a URL like
https://<username>.github.io/<repo>/within a minute or two.
That's the whole setup - everything here is static HTML/CSS/JS, so there's no server, no npm install, no build step.
Opening index.html directly by double-clicking (file://…) will not work, because app.js loads the layout JSON via fetch(), which browsers block on the file:// protocol. Serve the folder instead:
python3 -m http.server 8080
# then open http://localhost:8080or any equivalent static server (npx serve, VS Code's Live Server extension, etc).
- Layout picker - in the header, across every tab. Your choice is remembered in
localStorage, the virtual keyboards re-render, and all three typing surfaces switch engines immediately. - Layout tab - the current layout's full keyboard (base + Shift legends), a reference strip for the historic/modifier entries (backquote
`on ಕೆಜಿಪಿ, ⌥ Alternate on the IME layouts), and a live test box that mirrors your physical keyboard. A digit switch on this tab toggles the number row between the layout's Kannada digits (೧೨೩) and Western digits (123). - Practice tab - a 5-level typing tutor (vowels → consonants → consonant+vowel combinations → words → sentences) with WPM, accuracy, and streak tracking. Targets are Kannada text; the current layout's engine decides what your keystrokes produce.
- Free Type tab - an open canvas with grapheme-aware Backspace (removes one full akshara at a time).
- Unicode tab - all 91 assigned codepoints in the Kannada block, showing whether the selected layout produces each on a key, via a modifier, or not at all (with the keystroke to type it).
- Layout data & review notes - each layout's
data/layouts/<id>.jsonalso carries afindingsarray: the per-layout audit trail (bugs found and fixed, design notes, scope decisions). Kept in the repo only; not surfaced in the portal UI.
data/layouts/kgp.jsonis a plain extraction of the.keylayoutfile'skeyMap,actions, andterminatorstables (US-ANSI printable keys, codes 0–51), plus the historic-letter sequence. It already patches the original file's&x200c;/&x200D;bugs.data/layouts/{inscript,inscript2,transliteration}.jsonare ports of the jquery.ime Kannada rules (Wikimedia), copied byte-for-byte and continuously verified against the upstream sources by a round-trip test. Two deliberate corrections: the InScriptFkey maps to ಌ (upstream shipped a wrong codepoint), and historic letters are documented on the Alternate/⌥ layer.
Each layout is pinned by a git tag so consumers can depend on a specific definition: kgp-1.0, inscript-1.0, inscript2-1.0, transliteration-1.0. Update a tag only when its layout data changes.
Layout files are plain JSON. The engine reads a small in-file contract:
- keymap files (
kgp):keymap0/keymap1(code →{type:'output',value}or{type:'state' …}),actions,terminators,historicPrefixCode/historicPrefixChar,historicSeq(keyed bycode*2 + shift). - IME files (the other three):
patterns/patterns_x/patterns_shiftwith jquery.ime semantics - 2-element rules[input, replacement], 3-element[input, contextRegex, replacement];maxKeyLengthandcontextLengthdefault to1/0if absent.
If the upstream data changes, re-port from the source rather than hand-editing - each file's findings array lists the known quirks the data already accounts for.