Skip to content
tactile

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.

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

keymaster’s scope model maps directly onto a context key:

// keymaster
key('⌘+k, ctrl+k', openPalette);
key('j', 'issues', nextIssue);
key.setScope('issues');
key.unbind('j', 'issues');
// Tactile
const kb = createKeybindingEngine();
kb.add({ id: 'palette', keys: 'mod+k', handler: openPalette }); // one string, both OSes
const off = kb.add({ id: 'next', keys: 'j', when: "scope == 'issues'", handler: nextIssue });
kb.context.set('scope', 'issues'); // replaces key.setScope
off(); // replaces key.unbind

Notes:

  • ⌘+k, ctrl+k alternatives collapse into the single mod+k alias.
  • keymaster’s key.filter (which you had to override to allow shortcuts in inputs) becomes the documented ignore option.
  • isPressed-style polling has no direct equivalent; model modes as context keys instead — it’s declarative and introspectable.