Tactile vs keymaster
keymaster pioneered elegant minimal shortcuts
(key('⌘+shift+k', handler)) and simple named scopes. It’s also effectively unmaintained
(no release in roughly a decade) and built on the deprecated keyCode. If you’re here, you’re
probably migrating.
At a glance
Section titled “At a glance”| keymaster | Tactile | |
|---|---|---|
| Maintenance | dormant for ~10 years | active |
| Key model | keyCode (deprecated) |
event.key + event.code, hybrid |
| Scopes | key.setScope('issues') |
when expressions |
| Filter | global key.filter |
per-engine ignore |
| Query pressed state | key.isPressed(77) (by keyCode!) |
not exposed — rules + context instead |
| Sequences | ✗ | ✅ 'g i' |
| Conflicts | ✗ | detected + priority |
Migration
Section titled “Migration”keymaster’s scope model maps directly onto a context key:
// keymasterkey('⌘+k, ctrl+k', openPalette);key('j', 'issues', nextIssue);key.setScope('issues');key.unbind('j', 'issues');// Tactileconst kb = createKeybindingEngine();
kb.add({ id: 'palette', keys: 'mod+k', handler: openPalette }); // one string, both OSesconst off = kb.add({ id: 'next', keys: 'j', when: "scope == 'issues'", handler: nextIssue });kb.context.set('scope', 'issues'); // replaces key.setScopeoff(); // replaces key.unbindNotes:
⌘+k, ctrl+kalternatives collapse into the singlemod+kalias.- keymaster’s
key.filter(which you had to override to allow shortcuts in inputs) becomes the documentedignoreoption. isPressed-style polling has no direct equivalent; model modes as context keys instead — it’s declarative and introspectable.