Skip to content

Releases: johnbindel/streamdeck-keyhold

v1.3.0

Choose a tag to compare

@github-actions github-actions released this 22 Jul 18:02
048bfc8

Download com.johnbindel.keyhold.streamDeckPlugin below and double-click it to install.

Now requires Stream Deck 6.9 or later. Elgato's Marketplace requires plugins to declare SDK version 3, which in turn requires app version 6.9. That combination is also what makes a plugin eligible for Marketplace DRM — file encryption and tamper checking.

Nothing about how the plugin behaves changes. If you are on an older Stream Deck, 1.2.0 remains available and works.

Released builds no longer run with the Node debugger enabled. The manifest asked for --inspect, which opened a debugger port on every user's machine — a development convenience that should not have shipped.

v1.2.0

Choose a tag to compare

@github-actions github-actions released this 22 Jul 17:36
2344632

Download com.johnbindel.keyhold.streamDeckPlugin below and double-click it to install.

Recording a hotkey no longer fires it

The point of this plugin is to send a combination another app is listening for — and until now, recording one triggered it. Pressing ⌃⌥⌘T in the settings ran whatever ⌃⌥⌘T was bound to instead of recording it, which is exactly the hotkey you were trying to configure.

The settings panel is a web view, so by the time a keystroke arrives the system has already acted on it; nothing in the page can undo that. The plugin's helper now takes the keyboard while you are recording, swallows every key, and reports what it saw. Combinations the system would otherwise eat outright, like ⌘Tab, are recordable too, and the left or right modifier you actually pressed is the one that gets stored.

The keyboard is always given back: when you finish, when the settings close, and after fifteen seconds regardless. Without Accessibility permission on macOS the recorder falls back to the old behaviour, which still handles combinations that are not already shortcuts.

Three new actions

  • Toggle Hold — press once to start holding, press again to let go. For long dictation, or when holding a pedal down is uncomfortable. It lights up while running and lets go by itself after five minutes if you forget.
  • Timed Tap — one press, held for a time you set. For apps that ignore a key sent and released in the same instant.
  • Repeat Key — sends the combination over and over while you hold the button, rather than holding it, for apps and games that act on each keypress.

Also

Hold Key now shows when it is holding, using the same lit state as Toggle Hold.

The settings panel opens with one field instead of five. The before/after release hotkeys and their pauses moved behind Release options, since most setups need none of them.

A correctly sized plugin icon — the manifest pointed at a 28px image for a slot that wants 256px.


macOS is tested and in daily use. The Windows build compiles in CI but has never been run on real hardware, and this release added an entirely new keyboard hook there. If you try it, please open an issue either way.

v1.1.0

Choose a tag to compare

@github-actions github-actions released this 22 Jul 15:37
0447945

Download com.johnbindel.keyhold.streamDeckPlugin below and double-click it to install.

A hotkey can now be tapped before or after the hold is released

The old single Release slot could only fire once the hold was already gone, which is the wrong moment for apps whose stop shortcut has to arrive while the talk key is still down. There are now two optional slots, Before release and After release — use either, both, or neither.

Buttons configured before this release keep their behaviour: the old setting means after.

Two optional pauses either side of letting go

0 by default. Raise them if the target app misses a hotkey landing in the same instant as the release. Pause before on its own also keeps the hold down for a moment after you let go, which can stop a dictation app clipping your last word.

Fixed: two buttons held at once fought over the keyboard

The helper had a single hold slot, so pressing a second button released the first one's keys, and the first button's key-up then released the second one's. Holds are now tracked per action, and a key or modifier both want stays down until the last one lets go.

Fixed: a lost key-up could leave a key down indefinitely

Stream Deck can swallow the key-up when the profile changes or the device is unplugged mid-hold. The plugin now releases when the button goes away, and every hold has a five-minute deadline as a backstop.

A new icon

Drawn as a vector and rendered to each size it is used at. The image on the key was previously a 20x20 file that the device scaled to 144px, which is why it looked rough on hardware.

Key names read the way macOS writes them

↩ ⌤ ␣ ⇥ ⎋ ⌫ ⌦ ↖ ↘ ⇞ ⇟, and numpad Enter is recorded as its own key rather than folded into Return.


macOS is tested and in daily use. The Windows build compiles in CI but has never been run on real hardware, and this release touched the Windows helper more than usual. If you try it, please open an issue either way.

v1.0.2

Choose a tag to compare

@github-actions github-actions released this 22 Jul 03:16

What’s new

  • Record hold and optional release combinations directly in the property inspector
  • Tap the release combination automatically when the Stream Deck button or pedal is released
  • Record Enter, function/navigation/punctuation keys, regular combinations, or modifier-only shortcuts
  • Preserve left/right modifier identity on macOS and Windows
  • Use native macOS modifier glyphs and clear either recorded field with ×

Release tooling

package.json is now the version source of truth. Local and CI packaging generate the Stream Deck manifest version from it and tagged builds verify that the tag matches.

v1.0.1

Choose a tag to compare

@github-actions github-actions released this 12 Jul 18:01
ci: grant contents:write so the release can be created

The default GITHUB_TOKEN is read-only. Both helpers built and the plugin packed,
but attaching to the release 403'd with "Resource not accessible by integration".