Now in public beta · Windows

Macros
for the modern era.

Record macros in 10 seconds. Remap anything per-app. Bind custom HID buttons. Script the rest with a full JS runtime and an AI assistant that knows your API — all from one app.

Windows 10/11Rust engineNative-thread timingSigned auto-updates
pkPowerKeys
1
Profiles
Photoshop
C:\Program Files\Adobe\Photoshop\Photoshop.exe
Macros
Export for Web
12 events2.1s
Ctrl+Alt+SOnce
Logi MX · btn4Once
Flatten + Save As
6 events0.8s
Ctrl+Shift+Alt+SOnce
Quick Actions
Brush size +Photoshop action]
Brush size −Photoshop action[
Adobe Photoshop1 macro2 scriptsProduction
v1.2.0 · a3f9e2c
Per-app hotkey scopes Monaco editor + AI Community marketplace Fine-grained permissions Ctrl+K command palette Macro pad / HID support Foot pedal triggers Signed auto-updates

Start simple.
Go as deep as you want.

Most automation tools force a choice: easy or powerful. PowerKeys gives you both in the same app, side by side.

Step 01 01
Record a macro
Click Record, do the thing, click Stop. PowerKeys captures every keystroke and mouse event with millisecond timing. No configuration. 10 seconds.
0 events
Press Record and perform actions
Step 02 02
Remap anything
Bind any key to any key or shortcut, per-app. CapsLock → Escape globally. F13 → Save in Photoshop. Side mouse button → Back in Chrome.
CapsLockEscapeGlobal
F13Ctrl+Shift+SPhotoshop.exe
Side Mouse 1Alt+Leftchrome.exe
Step 03 03
Script everything
A full JavaScript runtime with a Monaco editor, first-party APIs for keyboard, mouse, windows, HID devices, and an AI assistant that writes code for you.
Hotkey.Register("Ctrl+Shift+1", function () {
  Keyboard.Type("Hello, PowerKeys!");
});
// Works in any focused app, globally.

Built for the details.

Every surface is designed for power users who live in their tools.

Steps
EventKey / ValueDelay
⋮⋮KeyPressCtrl0ms×
⋮⋮KeyPressShift4ms×
⋮⋮KeyPressS8ms×
⋮⋮KeyReleaseS120ms×
⋮⋮Wait500ms×
⋮⋮TypeScreenshot saved0ms×
Triggers
F12OnceBlockAll applications
Ctrl+Shift+PToggleBlockPhotoshop.exe
Stream Deck · btn 3OnceBlockHID · 0FD9:0063
Last run2 min ago
Run count47
Duration1.24s avg

Scripts ship their own UI.

Toggles, sliders, text inputs, dropdowns, hotkey captures, color and file pickers, data grids — drawn with a handful of API calls. No HTML, no framework, no build step.

Enable Script
On
Speed · 42
Character Name
Run Mode
var tabs = UI.AddTabGroup();
var t = tabs.AddTab("Inputs");
t.AddToggle("opt_enabled", "Enable Script");
t.AddSlider("opt_speed", 1, 100, "Speed");
t.AddTextInput("opt_name", "Character Name");
t.AddDropdown("opt_mode", "Run Mode", ["Aggressive", "Defensive", "Passive"]);
var tools = tabs.AddTab("Macro Tools" );
tools.AddHotkeyCapture("opt_trigger", "Start Hotkey", "F4");
tools.AddColorPicker("opt_color", "Target Color", "#FF0000");
tools.AddFilePicker("opt_image", "Template Image");
var data = tabs.AddTab("Data");
data.AddDataGrid("opt_grid", [...]);
// Every widget is reactive. Read values with grid.GetValue().

Type short. Send long.

Register abbreviations that expand anywhere in Windows. Static replacements for your email signature, dynamic callbacks for timestamps, counters, and clipboard transforms.

Hotstring.Register("btw", "by the way");
Any text field
Hotstring.Register("now", () => new Date(). toLocaleTimeString());
Any text field

Hit Ctrl+K.
Do anything.

Run any macro, open any script, jump to settings, search the marketplace. Fuzzy matching, keyboard-first, always one shortcut away.

Actions
New MacroCtrl+N
New ScriptCtrl+Shift+N
Reload Scripts
Macros
Run Last MacroCtrl+R
Navigation
Open Marketplace
Preferences
Toggle Theme

The hard parts of AHK, already solved.

No COM objects. No custom parsers. No hand-rolled retry loops. PowerKeys ships a curated JS standard library so you're writing glue, not plumbing.

AutoHotkey v2 POST clipboard to an API, notify on success
F13::{
  text := A_Clipboard
  ; no native HTTP — COM required
  whr := ComObject("Msxml2.XMLHTTP.6.0")
  whr.open("POST", "https://api/share", false)
  whr.setRequestHeader("Content-Type", "application/json")
  body := '{"text":"' . StrReplace(text, '"', '\"') . '"}'
  whr.send(body)
  if (whr.status = 200)
    TrayTip("Shared", "Copied link")
}
PowerKeys Same task, standard library
Hotkey.Register("F13", async () => {
  const res = await HTTP.Post("https://api/share", {
    json: { text: Clipboard.Text },
  });
  if (res.ok) UI.Notify("Shared", "Copied link");
});

Everything you'd otherwise build yourself

Each module is a normal JS import, with TypeScript types and fine-grained, per-script permissions.

Keyboard
Type strings, press keys, send hotkey chords with sub-millisecond timing.
Mouse
Move, click, drag, scroll — absolute or relative, with easing.
Window
Find, focus, move, resize, enumerate, and WaitFor() any window.
Hotkey
Register triggers for keys, HID buttons, mouse, and dials — all from script.
Hotstring
Text expansion with callbacks. Pull values from state, time, or clipboard.
HID
Read raw reports, bind button/dial/axis events, target a single device by id.
UI
Build inputs, pickers, toggles, data grids, and notifications from script.
Clipboard
Read and write text, images, and files; preserve across script steps.
Screen
Pixel reads, region capture, multi-monitor geometry. OCR via marketplace.
HTTP
fetch-style GET/POST/JSON and streaming. Per-host permission allowlist.
State
Persistent key-value store. Survives restarts, scoped per script.
Time
Sleep, timers, intervals, debounce — async and cancellable.
Console
Structured log, error, and table output into the script console.
Process
Spawn processes, read stdout/stderr, pipe data, auto-kill on script exit.
Devices
Enumerate keyboards, mice, and HIDs; read vendor/product/path info.
Image
Load, diff, and template-match regions for on-screen triggers.

Full module reference in the docs — import paths, permissions, and TypeScript types.

Rust under the hood.

Every key press, every hotkey dispatch, every sleep runs on a native thread in Rust. Your JavaScript configures the engine — it doesn't sit on the hot path.

Frame-perfect timing
Batch sequences are compiled down to a native event stream — holds, presses, and sleeps are scheduled on a dedicated thread with zero JS overhead per event.
Keyboard.Sequence()
  .Hold("Ctrl")
  .Press("A")
  .Sleep(10)
  .Press("C")
  .Release("Ctrl")
  .Send();
Every HID button is a trigger
Stream Deck keys, foot pedals, macro pads, gaming-mouse side buttons, Logi MX scroll wheels — press the button, the app captures its HID path, and you bind it to a macro, a quick action, or a script. No vendor driver, no second launcher.
Macro trigger Stream Deck · btn 3
Quick action Logi MX · btn 4
Script Hotkey.Register({hid:"0FD9:0063", button:3}, …)
Signed auto-updates
Every release ships as a code-signed NSIS installer over the Cloudflare CDN. The app pulls a signed manifest, verifies the signature, and installs in the background.
Authenticode-signed · SHA-256
Delta manifests · no telemetry

Security you can see.

Every script declares what it needs. You grant it, you can revoke it. No hidden access, ever.

Permission manifests
Before any marketplace script installs, a plain-English manifest shows exactly what it can access — keyboard, mouse, clipboard, HID devices, screen capture, and which network hosts.
Permissions requested
Keyboard ✓ granted
Mouse ✓ granted
HID devices ✓ granted
Clipboard ✓ granted
Network → api.example.com ✓ granted
Screen ✗ denied
Panic key
Ctrl+Alt+Delete suspends every running macro and script instantly. A banner appears offering to Resume All when you're ready.
All automation suspended
2 macros and 1 script were stopped. Press Resume to continue.
Network allowlists
Scripts declare each host they can reach. A wildcard (*) triggers an explicit warning before install — the UI flags it as "classic exfiltration risk."
api.github.com ✓ allowed
hooks.slack.com ✓ allowed
* (any host) ⚠ flagged
Windows · Beta · Free during early access

AutoHotkey for
the modern era.

The power of scripting with the polish of a 2026 desktop app.
Grab the latest Windows build — it's free while in beta.

Product updates

Optional: leave your email to hear about releases and new features. We won't spam you.