A browser-based virtual guitar that maps your QWERTY keyboard to a 6-chord strum machine.
Four rows become four strings. Six columns become six chords. Real strum detection.
No install. No account. No samples. Karplus-Strong synthesis in a tab.
For when a guitar is out of reach.
Built for: music beginners learning chords · DAW producers sketching ideas · late-night jammers without a guitar · music teachers looking for a browser chord tool.
Strumming Am → C → Em → G → Dm → F, then a quick Am–F–C–G progression. All sound generated live in the browser via Karplus-Strong synthesis — no samples, no downloads.
Try it live — no install. Or run locally:
git clone https://github.com/kimhinton/keystrum.git
cd keystrum
pnpm install
pnpm run dev # → http://localhost:3000Requires pnpm ≥ 10 and Node ≥ 22. Press a column of keys (e.g. 2 W S X) → hear a C major chord.
![]() |
![]() |
| Practice mode — three folk songs with strum · hold · mute lanes. | Chord dictionary — six open-position chords, each on its own keyboard column. |
keystrum lets you practice guitar chords without a guitar. It's not a guitar simulator, not a toy piano — it's a dedicated strum machine built for the QWERTY keyboard you already have.
Your keyboard has four usable rows. Each row becomes a string. Each vertical column maps to a chord. Sweep a column top-to-bottom fast — that's a strum. The sound is generated live via Karplus-Strong physical-modeling synthesis, the same algorithm used for real plucked-string sounds. No samples, no downloads.
Am C Em G Dm F
┌──────┬──────┬──────┬──────┬──────┬──────┐
E4 │ 1 │ 2 │ 3 │ 4 │ 5 │ 6 │ ← highest pitch
├──────┼──────┼──────┼──────┼──────┼──────┤
B3 │ Q │ W │ E │ R │ T │ Y │
├──────┼──────┼──────┼──────┼──────┼──────┤
G3 │ A │ S │ D │ F │ G │ H │
├──────┼──────┼──────┼──────┼──────┼──────┤
D3 │ Z │ X │ C │ V │ B │ N │ ← lowest pitch
└──────┴──────┴──────┴──────┴──────┴──────┘
Mute keys: J K L ;
Hit 2 → W → S → X fast. You just strummed a C major chord.
|
Strum Detection 6 Diatonic Chords Karplus-Strong Synthesis |
Practice Mode Palm Mute Score Sharing |
Music beginners learning chords. You hear "just practice your chord changes" and you don't own a guitar yet — or you do, but you're on the subway or in a hotel. keystrum gives you the six most common chords in C major / A minor on the keyboard in front of you. The muscle memory translates back to a real guitar: same chord progressions, same strum timing, same mute feel.
DAW producers sketching ideas. You're in Logic or Ableton, you want to hear an Am–F–C–G progression before you commit to a MIDI pattern. Open a tab, hit 1 q a z → you hear Am. No plugin loading, no sample library scanning. Karplus-Strong produces an acoustic-guitar tone live in Web Audio.
Late-night jammers without a guitar at hand. Your guitar is in the other room, the amp is off, the roommate is asleep. keystrum is a full-volume practice rig through headphones with real chord voicings and real strum detection. Sweep the column fast — it strums. Sweep slow — it picks.
Music teachers looking for a browser chord tool. Classroom Chromebooks don't have guitars, but every Chromebook has a keyboard. keystrum opens in any browser with no install, no login, no data stored on servers. Point a student's URL at keystrum.app/play and they have a chord trainer with three folk songs and progressive difficulty.
| keystrum | Yousician | Fender Play | Online piano apps | Static chord charts | |
|---|---|---|---|---|---|
| Hardware needed | Keyboard only | Real guitar | Real guitar | Keyboard | None |
| Sound output | Karplus-Strong synth | Real (mic input) | Video lessons | Sampled piano | Silent |
| Strum mechanic | Column sweep <90 ms | N/A | N/A | Single notes only | None |
| Practice songs | 3 folk (free) | 1500+ (paid) | Curated (paid) | Varies | None |
| Account required | No | Yes | Yes | Often | No |
| Install | Browser tab | iOS/Android/desktop | iOS/Android | Browser tab | Browser/PDF |
| Cost | Free, MIT licensed | $20/mo | $10/mo | Free–paid | Free |
| Offline-capable | After first load (PWA) | App-only | App-only | Varies | PDF only |
| Stores user data | localStorage only | Cloud account | Cloud account | Varies | None |
keystrum is not a replacement for a real instrument. It targets one specific gap: muscle-memory practice for diatonic chord changes when no guitar is at hand.
- Yousician / Fender Play / Simply Guitar — keep them for structured lessons. keystrum is for 5-minute chord-change drills when your guitar is out of reach.
- Static chord charts (Ultimate-Guitar / Chordify) — keystrum adds audio and a strum mechanic; sweep the columns instead of imagining the sound.
- A real guitar — please don't migrate away. keystrum is a complement, not a replacement.
Three songs with progressive difficulty:
| Song | BPM | Time Sig | Difficulty | Mute Keys | Description |
|---|---|---|---|---|---|
| House of the Rising Sun | 72 | 4/4 | Easy | J | Am–C–Dm–F progression, single strums to pairs |
| Scarborough Fair | 92 | 3/4 | Medium | J, K | Dorian waltz, introduces second mute key |
| Greensleeves | 100 | 3/4 | Medium | J, K, L | Full 6-chord usage, three mute keys |
Each song has two verses: Verse 1 teaches the pattern sparse. Verse 2 plays it full.
| Layer | Technology |
|---|---|
| Framework | Next.js 16 + React 19 |
| Styling | Tailwind CSS 4 + shadcn/ui |
| Audio | Web Audio API — Karplus-Strong physical modeling synthesis |
| State | Zustand with localStorage persistence |
| Language | TypeScript (strict) |
| Deploy | Static export → any CDN (Cloudflare Pages, Vercel, Netlify) |
keystrum's audio synthesis and keyboard mapping are factored into independently importable packages so you can drop the strum machine into any browser app without pulling in Next.js or React.
| Package | Description | Runtime deps |
|---|---|---|
@keystrum/synth |
Karplus-Strong physical-modeling synthesis for the Web Audio API. Configurable decay, brightness, pluck position. | None |
@keystrum/layout |
QWERTY → guitar-string mapping and open-position chord definitions. Pure data, no DOM. | None |
pnpm add @keystrum/synth @keystrum/layoutimport { GuitarSynth } from "@keystrum/synth";
import { DEFAULT_CHORD_COLUMNS, getChordFrequencies } from "@keystrum/layout";
const synth = new GuitarSynth();
const am = DEFAULT_CHORD_COLUMNS[0]!; // { name: "Am", label: "A minor", ... }
const freqs = getChordFrequencies(am); // [82.4, 110, 146.8, 220]
// downstroke: pluck each string 30 ms apart
freqs.forEach((freq, i) => setTimeout(() => synth.pluck(freq), i * 30));Each package publishes its own dist/ and ships independently — pull only what you need.
src/
├── app/ # Next.js App Router pages
│ ├── page.tsx # Landing — hero + live instrument
│ ├── play/ # Practice mode (song list + gameplay)
│ │ ├── page.tsx # Song selection
│ │ └── [song]/page.tsx # Game screen
│ ├── chords/ # Chord dictionary
│ │ ├── page.tsx # All 6 chords
│ │ └── [name]/page.tsx # Individual chord detail
│ └── share/ # Score sharing
├── components/
│ ├── game/ # GameRunner (918L), GameStage SVG (987L), SongCard
│ └── keyboard-guitar/ # Interactive keyboard on homepage
└── lib/
├── audio/ # Karplus-Strong synth engine (148L)
├── game/ # Types, songs, judgment, Zustand store
└── keyboard/ # Layout mapping, chord presets, chord theory
pnpm run build # Static export → out/
pnpm run lint # ESLint
pnpm exec tsc --noEmit # Type checkThe out/ directory is a static site — deploy to any hosting.
Nothing to feature yet — keystrum is brand-new. If you build something on top of it (a teaching tool, a chord trainer, a <KeystrumKeyboard /> embed in your own site, a Capacitor mobile build, anything), please open a showcase issue and we'll list it here with credit.
Singapore-based solo developer maintaining two MIT-licensed open-source projects: keystrum and endpulse. Built keystrum after looking up chord trainers and finding only $20/mo apps or static PDF chord charts — the gap deserved a free, browser-based, no-account alternative.
This is a Pre-product-market-fit project. There is no Pro tier and there will not be one. There are no ads, no analytics SaaS account, no email list, no push notifications. The maintainer surface area is one person, so contributions land best as small, scoped issues rather than cold DMs. Response window is 24–48 hours (see CONTRIBUTING.md § Response time).
If keystrum disappeared tomorrow, would you be very disappointed? If yes, open a show-and-tell discussion — that's the only acquisition channel that's open right now.
keystrum has no ads, no push notifications, no forced daily missions, no streak guilt, no shame counters. The only nudge is a soft 25-minute break reminder, dismissible. See CONTRIBUTING.md § Wellbeing principles for the full design principles.
Contributions welcome. See CONTRIBUTING.md for setup, code style, and how to add songs.

