Put a QR code on a screen. Anyone scans it and their phone instantly becomes a keyboard, gyro mouse, and buttons for it — no app to download, nothing to pair.
Point your phone camera at the code. Your phone opens a controller; move the pad or type, and it happens here — encrypted end to end.
waiting for a phone…
Three parties, and you only build one of them.
Your screen — a web page, a TV, a kiosk, a microcontroller — displays a qrkeyboard QR.
The phone opens our hosted controller. No install, no account, no pairing dance.
Keystrokes, pointer motion and taps arrive in your code — encrypted so even we can't read them.
Input can include passwords. So the security isn't a bolt-on — it's the architecture.
Every keystroke and movement is encrypted between the phone and your screen with AES-256-GCM. The relay only ever sees ciphertext.
The encryption key lives only in the QR and never reaches our servers. Blindness is structural, not a promise.
Make a QR public but control restricted: a PIN (via the SPAKE2 protocol) gates who can drive the screen — and can't be brute-forced.
Only someone who can see your QR can connect. Single-use, time-limited pairing; per-device credentials.
Anywhere there's a screen and no good keyboard.
Type search and passwords, point with the gyro — replace the awful remote.
Visitors use their own phone instead of a shared touchscreen. Touchless and hygienic.
A slide clicker with a laser-pointer gyro cursor; control decks and production surfaces.
Give any ESP32 / Raspberry Pi project a keyboard without wiring one up.
Turn every phone in the room into a controller or a buzzer — no app to install.
People use a device already tuned to their needs to drive an untailored public screen.
One script tag on the web, or a simple HTTP/WebSocket API from anything. We host the phone side; you handle the events.
<script src="https://qrkeyboard.com/v1.js"></script>
<div id="qrkb"></div>
<script>
const kb = QRKeyboard.create({
el: '#qrkb',
caps: ['keyboard','gyro','buttons']
});
kb.on('key', e => type(e.text));
kb.on('move', e => moveCursor(e.dx, e.dy));
kb.on('button', e => click(e.button, e.down));
</script>
That's the whole integration. The QR renders itself, pairs through our relay, and events start flowing. Not on the web? Talk to the same HTTP/WebSocket API from a microcontroller or anything else.
No app for your users. No servers for you. Free to start; end-to-end encryption is always on.
Free to use, with no usage limits — the whole product, security included. You only pay to put your own brand on it and unlock team & automation features.
The full thing: keyboard, gyro mouse, buttons, PIN access control, and end-to-end encryption. No signup, no caps, and we can never read your input. For everyone, forever — hobby or production.
Your logo and colours on the controller (drop the qrkeyboard mark), a custom QR domain, plus webhooks, analytics, SSO and audit logs for teams. You pay only for the extras you add — never for the core or the security.
Security is never a paid feature. The free tier is the full product; payment adds branding and team/automation features on top.