GRIP - Enhanced Macro Sequencer
The free macro sequencer for World of Warcraft. No paywalls. Every feature included.
v2.3.14New in v2.3.14
Key Down Casting Turns Itself On NEW
The macro engine only steps forward when the game is set to cast on key press. That is the ActionButtonUseKeyDown setting, and while it sits at 0 a sequence looks like it does nothing at all. Nearly every report of the addon doing nothing came down to that one value. EMS now sets it on at every login, so a fresh install just works and you don't have to go hunting through the game settings first. Its row is gone from the CVar Health dashboard, since a setting the addon requires and keeps on for you isn't a recommendation.
New in v2.3.13
The Dashboard Gets Sliders and Search NEW
The CVar Health dashboard has a search box: type part of a CVar name or label and the tree jumps to the row. A show-only-issues filter hides the green rows, and the section counts are coloured so a section with a bad row reads red before you expand it. Numeric CVars are sliders you drag instead of dropdowns, fifty of them, and on/off CVars are tickboxes; the fix control spans the full row width. The graphics dropdowns read their tier names from the game's own strings, so shadow quality, SSAO, liquid detail, outline mode and texture resolution match WoW's System menu. The registry grows to 255 game variables across 14 sections, up from 212: a new Combat Audio section, nameplate content toggles, accessibility motion and vision rows, raid graphics mirrors, and dragonriding comfort toggles.
New in v2.3.12
Delves Get a Profile NEW
Delves ran the General CVar baseline -- the context system detected Delves, DelvesLow and DelvesHigh, but no built-in profile was mapped to them. The fifth built-in profile turns enemy minion nameplates on, raises the nameplate ranges to 41 yards, and widens the soft-target interact arc, with all three delve contexts routed to it. If you mapped your own profile to the base Delves context before this release, the built-in tier entries resolve first now; map DelvesLow and DelvesHigh yourself to keep your setup -- your own mapping on a tiered key still wins. The SQW Optimizer's latency ring also draws a trend line in the CVar health subpanel: the last 10 samples with the newest highlighted, plus the session low and high.
New in v2.3.11
The Dashboard Keeps Score NEW
The CVar Health score keeps history: one snapshot per login, another whenever the score moves, and a trend line under the header score with the range beside it. The Raiding section gains a Raid Spell Density row -- with raid-specific graphics settings on, the RAID-prefixed mirror governs spell density in raids, so you could raid at the default density while every row showed green; the new row recommends 1 and joins the score and auto-fix. The raid and PvP profiles apply nameplate stacking masks, the header computes its category and CVar counts from the registry instead of a hard-coded string that had drifted, garbled Korean text reads as Korean again, and the Disable button no longer opens rename mode when clicked at its left edge.
New in v2.3.10
Rows That Render NEW
The Spell Cache Viewer's Spells tab painted every row blank, and so did the Remote Browser (/gems browse). Rows in both are plain buttons that arrive without backdrop methods, and the row setup called one of those methods before it existed, which killed the rest of the row before the icon, name and spell id landed. The Spells tab had not painted a row since v1.7.0-Beta. With the rows up, the spell rename behind them works: renames and Clear Overrides apply to the live cache instead of waiting for a reload, a renamed spell re-sorts into its new alphabetical slot, and renaming a spell onto another spell's exact name no longer leaves that second spell unfindable by name after you clear the override. Also in this release: the Set Keybind button no longer stays greyed out for good after you create a sequence in combat, and /gems test no longer burns your first-open tutorial or leaves the window oversized afterwards.
New in v2.3.9
Clear Means Clear NEW
Keybind fixes for per-loadout mode. Clear now removes a bind made before per-loadout keybinds were switched on, instead of claiming there was no keybinding and leaving the key alive. Suppressing a key in the active loadout hides it in the Current Keybind box, the sequence list, the step tooltip, and the tracker -- not just in the live driver. Clearing a per-spec key sweeps its suppress markers so a later rebind of the same key is not silently hidden, and the conflict warning on key capture reads the merged view, so it sees loadout binds and stays quiet about suppressed keys. The in-game test runner now flags a category filter that matches nothing instead of printing a green zero-test summary.
New in v2.3.8
No Silent Interleave NEW
An interleave action set to fire every N steps used to compile to nothing when N was larger than its block, so it never fired and said nothing about it. The editor and validation now warn when an interval overruns its block, name the action, give the block's step count, and suggest the Repeat count that would make it fit. Lowering the interval below the block's step count or raising the block's Repeat both clear it.
New in v2.3.7
Right Icon, Right Count NEW
A Priority or Reverse Priority sequence repeats its early steps as it runs, so four steps you wrote actually run as ten. EMS was reading the step icon off the four you wrote while the sequence sat on one of the ten it runs, so the macro stub and the action bar showed the wrong spell on most presses, the tracker rendered "7/4", and the spoken step announcement called out the wrong step name against the wrong total. Icon, step counter and speech all count the steps that actually run now, and hand-advancing a sequence wraps in the right place. Sequential and Random sequences were never affected.
Authored Step Order for Plugins NEW
A new API:GetAuthoredSteps(name) returns a sequence's steps in the order they were written, before loops unroll and interleave copies are inserted. It pairs with API:GetSequenceSteps, which is the order they run in. SEQUENCE_STEP_ADVANCED and API:GetSequenceList now ship a step index and a step count in the same domain, so mapping one onto the other no longer yields the wrong spell.
New in v2.3.6
Sturdier Editing, Truer Imports NEW
The Source tab no longer drops your frame rate on a large sequence or throws a validation error, and a sequence that contains a loop now saves instead of failing on the word repeat. Disabled steps inside a Loop or IF node stay out of the compiled macro, and a corrupted sequence entry is skipped and reported instead of crashing the editor, the compiler, or the repair scan at login. Imported sequences track their source more closely: a Priority loop keeps its weighted pattern, an interval-less edge repeat compiles in place, and an empty cast-sequence line is dropped with a warning. The CVar Dashboard gains a NamePlate Stacking recommendation, and spell validation waits until you leave combat before it pings.
New in v2.3.5
Multi-Select Steps NEW
The flat step list now takes more than one step at once. Ctrl-click toggles a step, shift-click grabs the range from your last pick, and a plain click goes back to one. With a group selected, Duplicate copies the whole block and Delete clears it, each as a single undo, and the right-click menu carries the same bulk actions. Outline and action-tree sequences keep single-select for now.
New in v2.3.4
Rename Keeps Everything NEW
Renaming a sequence no longer wipes its identity. The verification badge, fork history, privacy mode, macro dependencies, sound cues, and (from the list) its Conditions assignments carry through a rename, and its hold-mode keybind follows it. A rename never changes a sequence's signature, so a verified sequence stays verified. Plugin-created sequences can no longer be renamed by hand, so a plugin keeps control of what it owns.
Talent Strings Stick NEW
An imported talent loadout string now shows in the metadata editor and survives saving, renaming, and duplicating. The plugin API's GetSequenceInfo reports the talent string plus four more fields.
Conditions Cleanup NEW
Setting up Conditions no longer leaves the step list stacked over the other tabs -- it stays hidden until you return to the Steps tab. The All button confirms once and lists every version it will change, and the All, None, and Default Version controls gained tooltips. Fixed: the metadata panel no longer runs its dependency list into the changelog row, and a German typo in the Conditions conflict message.
New in v2.3.3
Exports That Tell the Whole Story NEW
Every export string now carries when it was made, the addon and game version, author, class and spec, talents, spells used, and what the sequence depends on -- so sharing sites can fill in a post straight from the paste string. Exporter identity follows your privacy mode.
Collections Carry Everything NEW
Sequences inside a collection export travel with the same details as single exports, and sending a sequence to another player bundles the macros it needs. Fixed: sequences imported from a collection keep their verification badge and fork history.
New in v2.3.2
Load-on-Demand Locale Bundle NEW
The spell-name translations behind cross-language sharing now live in a companion addon, GRIP-EMS_LocaleNames. It ships in the same download and loads only when a sequence needs a name from another class or language -- about a megabyte less in the base addon at login. Leave it enabled.
GRIP Category NEW
The AddOns list groups the whole GRIP family under a GRIP category, with the locale bundle nested under EMS. The cursor overlay is also built on first enable instead of at every login.
New in v2.3.0
Live-Version Quick-Swap NEW
Pin a sequence's version to lock it as the live one until you clear the pin, regardless of what your context or talents would otherwise pick. Badges show which version is live.
Spell Picker Inserts at Your Cursor NEW
Picking a spell drops it where your cursor is and replaces a highlighted selection, instead of appending at the end of the box.
Plugin Action Bars (API v3) NEW
Addon authors can put a sequence on an action bar -- read its per-step spell data, create and pick up its macro, and register a /gems subcommand. Nothing changes unless you run a plugin that uses it.
New in v2.2.0
Plugin Support NEW
Other addons can extend GRIP-EMS through a public API -- adding import and export formats, settings and a settings panel, variables, conditions, and step functions, and mounting their own panel in the editor. A plugin's export format appears in the export window's format picker. If you do not run a plugin that uses it, nothing changes.
Context-Switch Self-Heal NEW
Sequences recover their loop and branch grouping after a context switch, not just a reload, so swapping versions when you enter a dungeon or arena keeps the structure.
New in v2.1.28
Drag a Step Into a Loop NEW
Drop a step onto a loop's row in the step list, or drag it into a loop open in the detail pane, and the step moves inside the loop. Undo puts it back, and a drop that would nest too deep is refused with a hint.
Macro Steps Refresh Themselves NEW
A step you built from one of your macros can update after you edit that macro, so you do not have to open the step and click Refresh. Off by default; turn it on in Settings.
New in v2.1.27
Last-Updated Sort Fixed NEW
Sorting your sequences by Last Updated could error out when an older sequence stored its timestamp as text. Every timestamp now reads the same way, so the list sorts cleanly no matter how old the sequence is.
All Classes List Refreshed NEW
The cross-class spell list the conditional picker browses is rebuilt against the current 12.0.7 client, so spells from every class match today's game data.
Installation
Addon Manager (recommended)
Search for GRIP - Enhanced Macro Sequencer or GRIP-EMS in any of these addon managers:
- CurseForge (via the CurseForge app or Overwolf)
- Wago Addons (via the Wago app)
- WoWUp
- WoWInterface
Manual Install
- Download the latest release from CurseForge or Wago.
- Extract the
GRIP-EMSfolder into:World of Warcraft/_retail_/Interface/AddOns/GRIP-EMS/ - Restart WoW or type
/reloadin chat.
Requirements
- World of Warcraft Retail (12.0.1+)
- No required dependencies
Quick Start
Get your first rotation running in five steps:
Open the editor
Type /gems in chat to open the sequence editor.
Create a sequence
Click New and give your sequence a name.
Add your spells
Type one spell per step. Press Tab for spell autocomplete from your spellbook.
Save and bind
Click Save , switch to the Keybind tab, and press your desired key.
Play
Find a target and start pressing your keybind. Your rotation fires automatically, one spell per press.
Migration
GRIP-EMS imports sequences from other macro sequencer addons. Everything transfers: sequences, variables, step functions, metadata, multi-version data, and context overrides.
In-Game Migration
If your old addon is still installed:
- Open GRIP-EMS with
/gems - Click Migrate in the sequence list
- Everything transfers automatically with a report in chat
Clipboard Import
- Export a sequence from your old addon to clipboard
- In GRIP-EMS, run
/gems import - Paste the string into the import window
- Pick which sequences to import. Conflicts are colour-coded with skip, replace, and rename options per item.
Core Concepts
Sequence
A sequence is an ordered list of macro steps. Each step is a line of WoW macro text (up to 255 characters). When you press the keybind, the addon fires the current step and advances to the next one.
Step Function
The step function controls the order in which steps execute:
- Sequential -- the default. Step 1, then 2, then 3, then back to 1.
- Priority -- always tries step 1 first. Falls through to step 2 if step 1 fails (spell on cooldown, out of range, etc.), then step 3, and so on.
- Reverse Priority -- same as Priority but starting from the last step.
- Random -- picks a random step each press.
Reset Conditions
Reset conditions send the sequencer back to step 1. You can combine them:
- combat -- reset when you leave combat
- target -- reset when your target changes
- gear -- reset on equipment change
- spec -- reset on spec change
- N (number) -- reset after N seconds idle
Example: target/combat/5 resets on target change, combat end, or 5 seconds idle.
Macro Stub
Each sequence creates a SecureActionButton (macro stub) at load time. This is the button that WoW fires when you press the keybind. The addon updates its macro text each keypress to point to the current step.
Variables
Account-wide ~varname~ substitution in macro text. Variables can be plain text or Lua functions that re-evaluate on events. Use them to share common fragments across sequences.
The Editor
Open the editor with /gems. The editor supports up to 4 simultaneous windows so you can compare and edit multiple sequences side by side.
- Syntax highlighting with 6 configurable editor colours
- Undo/redo per window (Ctrl+Z / Ctrl+Y)
- Spell picker dropdown with condition builder
- Metadata editor: Author, Description, Help Text, Help Link
- Sort sequences by name, class, or recently updated
- Side-by-side sequence comparison with colour-coded diff
- Stale spell detection: flags renamed or removed spells
Editor Tabs
The Steps tab is where you build your rotation. Each line is one macro step.
- Type a spell name and press Tab for autocomplete from your spellbook
- Drag steps to reorder using the handle on the left
- Right-click a step (nested steps under If and Loop nodes too) to disable or re-enable it -- a disabled step keeps its slot, shows greyed, and is skipped at run time
- Each step shows a live character count (green under 200, yellow 200-240, red 241-255)
- The interleave spinner appears on Action nodes -- set an interval to weave that spell every N steps
- KeyPress/KeyRelease editor for per-step prefix/suffix macrotext
- Working-copy editing: Save or Discard when you are ready
Assign a keybind to this sequence. Binds are stored per-spec -- and per talent loadout within the spec -- and auto-switch on spec or loadout change.
- Press the key you want to bind
- Vehicle and pet battle keybind slots available (12 + 6)
- Gamepad support with ConsolePort detection
View the generated macro text for each step. Useful for debugging why a step might not fire correctly.
- Shows the final 255-char macro per step
- Rotation preview: icon strip or text list
- Copy to clipboard from text mode
Manage variables used in this sequence. Variables use ~varname~ syntax and get substituted at runtime.
- Plain text variables for shared macro fragments
- Lua function variables with event-driven re-evaluation
- Full WoW macro syntax support
Configure which contexts (raid, dungeon, PvP, etc.) activate this sequence version. See the Context System section for the full list of 53 context types.
- Collapsible groups with Select All / Clear All
- Per-context variable overrides
- Visual fallback chain indicator
View and edit the raw serialised data for this sequence. For advanced users who want to inspect or manually tweak the underlying data structure.
Hierarchical Actions
Beyond simple linear step lists, GRIP-EMS supports a hierarchical action tree with nesting. The visual node editor lets you build control flow structures.
Node Types
- Action -- a single macro step (the leaf node)
- Loop -- repeats its children a set number of times or indefinitely
- Repeat -- runs its children N times then moves on
- Conditional -- evaluates a Lua condition before running children
- If / ElseIf / Else -- branching logic with multiple condition paths
If / Else Conditional Branching
An If node compiles a True branch and a False branch into a single chunk of WoW macro conditional text. The macro engine evaluates the condition you typed in the Cond box at runtime and runs whichever branch matches. EMS v2.1.0 fixed multi-action branches and automatic DeMorgan negation; earlier versions silently dropped all but the first action of each branch.
Out-of-combat examples
Mount toggle. Shift held casts the utility spell, otherwise summon a mount.
- Cond:
mod:shift - True: Aspect of the Cheetah
- False: Reins of the Crimson Deathcharger
/cast [mod:shift] Aspect of the Cheetah; Reins of the Crimson Deathcharger
Indoor fallback. One-sided If with no True branch. The compiler emits an explicitly negated condition so the mount only fires outdoors.
- Cond:
indoors - True: (empty)
- False: Reins of the Crimson Deathcharger
/cast [noindoors] Reins of the Crimson Deathcharger
Profession dailies. Different commands per branch, so the compiler splits into two lines.
- Cond:
mounted - True: /dismount
- False: /cast Mining
/dismount [mounted]
/cast [nomounted] Mining
In-combat examples
Modifier burst. Shift swaps the filler for a cooldown.
- Cond:
mod:shift - True: Bestial Wrath
- False: Cobra Shot
/cast [mod:shift] Bestial Wrath; Cobra Shot
Target-aware cast. Damage on hostile targets, heal on friendly.
- Cond:
harm - True: Cobra Shot
- False: Mend Pet
/cast [harm] Cobra Shot; Mend Pet
Pet-aware Hunter. The production sequence shipped in v2.0.x and now under regression coverage.
- Cond:
nopet - True: Revive Pet (spell ID 982)
- False: Barbed Shot (spell ID 217200)
/cast [nopet] 982; 217200
Condition cheat sheet
Conditionals players reach for first. The spec doc has the full catalogue.
mod:shift- True while shift is held. Variants for ctrl, alt, and L/R sided forms.
combat- True while in combat.
nocombat- True while out of combat.
harm- True when the current target is hostile.
help- True when the current target is friendly.
mounted- True while mounted.
indoors- True while inside a building or cave.
advflyable- True in zones where Skyriding is allowed (added 10.0.7).
stealth- True while in stealth (Rogue, Feral Druid, etc.).
nopet- True when no pet is active. Hunters and Warlocks use this for revive/summon fallbacks.
spec:N- True when current spec index matches N. Use slash for OR groups, e.g.
spec:1/3. pvpcombat- True while in PvP combat with another player. Counts PvP-flagged combat NPCs in arenas and battlegrounds. Does not trigger on NPC combat in war-mode open world.
Full list with patch history at the WoW conditional reference.
DeMorgan negation
If the True branch is empty, the compiler emits an explicitly negated condition for the False branch instead of an empty first clause with a semicolon fall-through. The shorter form [noindoors] mount compiles to a single bracket with the negated condition; the alternative [indoors] ; mount would compile to a two-clause macro with an empty first clause, which is harder to read and provides no behavioural advantage. The full DeMorgan rule set lives in spec section 5.
Path indicator
The editor shows a small badge next to the Cond box label. The label tells you which compile path the node took: Single line, Two-line split, Per-step, or Optimised fall-through. The Compiled Output preview pane shows the literal macrotext the engine will see. If you set a multi-action True branch and the badge reads Per-step, that is the expected path.
Interleave / Weave
Set an interval (2-50) on any Action node to weave it every N steps. For example, if you set a trinket use to interval 5, the compiler inserts it every 5th step.
The compiler works in two phases:
- Flatten -- expand Loop, Repeat, and Conditional nodes into a linear step list
- Interleave -- insert weaved actions at their configured intervals
Interleave works inside Loop blocks. The editor shows an [IL:N] indicator on interleaved rows in the step list.
The ActionCompiler walks the tree depth-first. Each leaf Action node becomes a step. Loop and Repeat nodes multiply their children. Conditional and If/Else nodes evaluate at compile time if the condition is static, or produce a conditional macro line otherwise.
After flattening, the interleave pass scans for nodes with an Interval property and inserts them at the specified positions. The final output is a standard step list that the sequencing engine processes normally.
Sequencing Engine
Execution Flow
- You press the keybind
- The engine reads the current step from the active sequence
- The step function decides which step to fire (Sequential, Priority, etc.)
- The macro stub text is updated with the chosen step
- WoW fires the SecureActionButton, casting the spell
- The engine advances to the next step (or resets based on reset conditions)
Icon Resolution
The engine resolves spell icons through a pipeline:
- Check for a user-defined icon override in the sequence metadata
- Parse the current step for a /cast or /use command
- Look up the spell ID in the spell cache
- Query GetSpellTexture for the icon path
- Fall back to the default question-mark icon if all else fails
Macro Generation
Each step is a WoW macro line with a 255-character hard limit (enforced by Blizzard). The engine handles:
- Variable substitution (
~varname~replaced at runtime) - KeyPress/KeyRelease prefix and suffix text
- Conditional compilation from hierarchical action nodes
Hold to Freeze
Hold a modifier to pause the active sequence on its current step. The engine stops advancing while the modifier is down and continues from the same step when you let go. Enable it and pick the modifier (Shift, Control, or Alt) under /gems settings -> Hold to Freeze. Useful for sitting on a proc or saving a cooldown for a burst window.
Variant Indicators
Sequences that branch on modifier keys or combat state show a coloured indicator on the action button, so the live variant is visible without opening the editor. The indicator follows whichever variant is currently active.
Tempo Advisor
The Tempo Advisor analyses your sequence to recommend an optimal click rate (milliseconds between keypresses). It starts with a theoretical estimate and gets more accurate as it learns from your actual play data.
4-Phase System
1 Phase 1: Spell Classification
The advisor categorises every spell in your sequence into one of 7 timing categories: OFF_GCD (instant, no cooldown trigger), ON_GCD_INSTANT (triggers the GCD but casts instantly), ON_GCD_CAST (has a cast time on the GCD), LONG_CAST (cast time longer than the GCD), CHANNEL (channelled spell), PAUSE_CLICKS (wait step), UNKNOWN (spell data not yet cached).
2 Phase 2: Theoretical Analysis
Using the spell categories, the advisor builds a transition graph between steps. It calculates the expected time between keypresses by simulating each step transition and summing GCD durations, cast times, and off-GCD windows.
3 Phase 3: Empirical Learning
After 30 play samples from the ExecutionTracer, the advisor blends real data into the recommendation. The mix is 70% theoretical / 30% empirical. Stale CLEU data is detected and discarded automatically.
4 Phase 4: Stored Recommendations
Each sequence stores its own recommendation (recommended MS, sample count, blend ratio). Recommendations update adaptively as you play, and persist across sessions.
Faster/Slower Overlay
A movable dark-themed widget that shows:
- Your current MS setting vs the recommended MS
- A delta bar showing how far off you are
- Confidence level: Estimated (under 30 samples) or Calibrated (30+ samples)
- Optional CPS sparkline (10-bar rolling chart) showing your actual clicks per second
- Off-GCD step count for the active sequence
The overlay is draggable. Reposition it wherever works best for your UI.
Audio Alerts
When enabled, the advisor plays a subtle sound if your click rate drifts too far from the recommendation. This is opt-in via Settings.
Slash Commands
| Command | Description |
|---|---|
/gems fs |
Show current Tempo Advisor status |
/gems fs on |
Enable the Faster/Slower overlay |
/gems fs off |
Disable the overlay |
/gems fs reset |
Clear stored data and start fresh |
The advisor builds an NxN matrix where N is the number of steps. Each cell represents the expected time (in ms) transitioning from step i to step j. For Sequential step function, only the diagonal+1 cells matter. For Priority, the entire first row is weighted heavily since step 1 is always attempted first.
Off-GCD spells get a near-zero transition time. Channelled spells use their full channel duration. The final recommendation is the weighted average across all likely transitions, plus a configurable buffer.
| Setting | Description | Default |
|---|---|---|
| Mode | Off / Overlay / Auto-Set | Overlay |
| Buffer | Extra MS padding on the recommendation | 10 |
| Sparkline | Show CPS sparkline on the overlay | On |
| Audio Alerts | Sound on tempo mismatch | Off |
| Hold Mode CVar | Let the advisor manage Hold to Cast | Off |
Context System
GRIP-EMS detects 53 context types across 7 groups. When you enter a raid, dungeon, arena, battleground, or delve, the addon automatically switches to the matching sequence version if one exists.
Context Types
Content
Rated PvP
Arena Maps
Battleground Maps
Auto-Detection
The detection system reads instance info, map data, difficulty IDs, and keystone level to determine the current context. It checks on zone change, difficulty change, and group roster update.
Per-Context Variable Overrides
In the Context tab of the editor, you can override variables for specific contexts. For example, you might swap a trinket-use variable for a different trinket in M+ vs raid.
Fallback Chains
If no exact context match exists, the system falls back through a priority chain. For example, M+ High falls back to M+ Mid, then M+ Low, then Dungeon Mythic, then the default version. The editor shows a visual fallback chain indicator.
Import and Export
Clipboard Import
- Run
/gems importto open the import window - Paste your sequence string (GRIP1, legacy, or raw macrotext)
- GRIP-EMS auto-detects the format
- A preview shows each sequence with metadata (author, spec, icon)
Import Preview
The preview window shows:
- Sequence name, step count, step function, and metadata
- Conflict detection: if a sequence name already exists, you get skip/replace/rename options
- Compare option: side-by-side diff against the existing sequence
- Disable toggle: import a sequence as dormant (useful for testing)
Collection Import
A single import string can contain multiple sequences and their dependent variables. GRIP-EMS resolves transitive variable dependencies so nothing gets left behind.
Spell Names Across Languages and Classes
Imported and shared sequences cast correctly on any game-client language. Spell steps are stored language-neutral and render in your client's language, so a sequence written on an English client works on a German one without hand-translating each line.
Sequences from another class resolve too: a built-in cross-class spell catalogue turns the other class's spell names into castable lines. Hero-talent override abilities keep their names when an override cannot be resolved yet, and pet abilities imported as raw numbers are recovered back to their names automatically.
Export
/gems export <name>-- copy a single sequence to clipboard/gems exportall-- open a multi-select export window, pick sequences to export as a collection- The export metadata editor lets you set collection name, author, description, and embed a talent string
- Single-sequence export auto-detects variable dependencies
- Every export string carries full sequence details -- author, class and spec, talents, spells used, and dependencies -- so sharing sites can fill in a post straight from the string
Text Export
A human-readable format for forum and Discord posts. Shows metadata, numbered steps, KeyPress/KeyRelease lines, and variables with event names. Paste it anywhere text works.
Raw Macrotext Import
Paste plain /cast lines and GRIP-EMS auto-parses them into steps. No need to wrap them in any special format.
Tracker HUD
A movable icon overlay showing your active sequences during gameplay.
Visibility Modes
- Always -- visible at all times
- In Combat -- appears when you enter combat, hides when you leave
- Has Target -- visible when you have a target selected
- Never -- completely hidden
Cycle through modes with /gems tracker.
Features
- Dynamic spell icon for the current step
- Step counter (e.g. 3/8) per icon
- Active-sequence highlight on last-pressed
- Keybind text overlay
- Scale slider in Settings
Positioning
Drag the tracker to any screen position. Lock it in place with /gems tracker lock. Unlock with the same command.
Macro Recorder
Capture your spell casts and build a sequence automatically.
How to Record
- Type
/gems recordto start recording - Play your rotation normally -- each spell you cast is captured as a step
- Type
/gems recordagain to stop - The recorded sequence appears in your editor, ready to save and bind
What Gets Captured
- Every successful spell cast while recording is active
- Spells are recorded as
/cast SpellNamesteps - The step function defaults to Sequential
- You can edit the result after recording to add conditions, variables, or change the step function
Good Uses
- Discovering your natural rotation before fine-tuning in the editor
- Quick prototyping -- record a rough version, then polish it
- Checking which spells you actually press during a fight
Remote Browser
Browse sequences shared by other players in your group.
How to Use
- Type
/gems browseto open the browser window - See sequences from party and raid members who also run GRIP-EMS
- Click a sequence to preview its steps, metadata, and step function
- Click Import to add it to your library
Bandwidth
The browser uses metadata-only sync by default. Only sequence names, authors, and spec info are sent over the addon channel. Full sequence data is fetched on-demand when you click to preview, keeping the bandwidth footprint minimal.
Availability
Only players in your current party or raid who also run GRIP-EMS are visible. The list refreshes automatically when group composition changes.
Keybindings
Per-Spec Storage
Keybinds are stored per-spec. When you switch specs, your binds switch automatically. Your Protection Paladin binds stay separate from your Retribution binds.
Per-Loadout Keybinds
Within a spec, each talent loadout can hold its own keybind for the same sequence. Swap loadouts and the keybind set swaps with it, the same way spec binds do on spec change.
Slash Commands
| Command | Description |
|---|---|
/gems bind <name> <key> |
Bind a key to a sequence |
/gems unbind <name> |
Remove the keybind |
/gems binds |
List all keybinds for the current spec |
Vehicle and Pet Battle Binds
GRIP-EMS provides 12 vehicle/override bar keybind slots and 6 pet battle action buttons (abilities, swap, pass, forfeit). These are separate from your normal rotation binds and activate automatically when you enter a vehicle or pet battle.
Skyriding
Sequence keys stay live on a skyriding mount when the game's Auto Dismount in Flight option is on. Press a bound key with an attackable living target and you dismount and cast that step in one press. With no target, or a friendly one, the press falls through to whatever that key drives on the skyriding bar, so steering and mount abilities keep working. With Auto Dismount in Flight off, keys suspend while mounted instead.
Druids get the same behaviour in skyriding Travel Form when Auto Unshift is also on: the keypress cancels the form and casts.
Dismount signals are not fully reliable -- the game occasionally skips the bar-change event, which used to leave a key dead on foot until a reload. An out-of-combat watchdog now reconciles the keybind layers against what is actually true (mounted, gliding, in a vehicle, in a pet battle) and restores your binds automatically. Vehicle keybinds also work under action bar addons like ElvUI and Bartender.
Gamepad Support
Controller and gamepad keybinds are supported with ConsolePort detection. If you use a gamepad, GRIP-EMS detects ConsolePort and maps binds to controller buttons.
How Macro Stubs Work
When you bind a key, GRIP-EMS creates a SecureActionButton (macro stub) and assigns it to that key. The binding is a temporary override -- it never touches your saved WoW keybinds. In vehicles and pet battles the overrides suspend automatically; while skyriding, keys stay live for dismount-to-cast when Auto Dismount in Flight is on (see Skyriding above).
Accessibility
GRIP-EMS aims to be usable for players who rely on screen readers, play one-handed, play with tremor, play with low vision, or avoid motion in the UI. Settings live under the Accessibility subpanel at /gems settings -> Accessibility. Design vocabulary follows AbleGamers APX (Accessible Player Experiences). The in-game panel is modelled on Elder Scrolls Online's Accessibility Mode: one place, grouped by population.
One-click Accessibility Mode
A single toggle in the Accessibility subpanel turns on speech, reduce-motion, the High-Contrast palette, editor scale 1.25x, large-target density, the cursor overlay, and Simplified Mode together. Toggling it off restores your prior state, not the defaults; EMS snapshots whatever you had set before the preset turned things on.
On the first login after installation, EMS reads Blizzard's accessibility CVars (colorblindMode, cameraBobbing, gamepad-detected) and pre-applies matching EMS settings. This is one-shot. If your Blizzard settings change later, you can re-run the mirror from the Accessibility subpanel.
Vision
- Screen readers via Blizzard's built-in text-to-speech (
C_VoiceChat.SpeakText). Speaks the current step label when a sequence advances. One-shot in-game toast if no voice is configured. - A chat-frame emitter pipes the same state messages into a user-selected chat frame (default hidden frame 9). BlindSlash, NVDA bridges, and other screen-reader relays can dock that frame and read from it.
- Editor scale slider from 0.8x to 2.0x in 0.05 steps. MainFrame drag-resize from 720x460 up to 1600x720.
- High-contrast focus ring on every focusable widget (4-edge texture, 2 px thick, 2 px outset).
- Font switch via LibSharedMedia with Atkinson Hyperlegible bundled.
- Three palette presets (Default, High Contrast, Deuteranopia-safe), seeded from Blizzard's
colorblindModeCVar on first login. An 8-type colourblind matrix layers on top, with a 0-100% strength slider and a live 5-colour preview swatch. - No repeating flashes anywhere in the addon. Animations audited against WCAG 2.3.1.
Motion and vestibular
The reduce-motion toggle disables the two animation sites in the addon: the Tempo overlay alert pulse, and the Tracker fade-in on sequence change.
Motor
- Keyboard-first navigation using Tab / Shift+Tab / arrow keys / Enter / Esc. Every non-EditBox widget is reachable.
- Numbered hotkeys: 1..6 and Alt+1..6 jump to editor tabs.
- Resizable main window with a bottom-right drag grip.
- Spell, item, macro, and slash-command pickers across 14 filter modes, so long macro strings never need manual typing.
- Large-target density mode expands click rectangles to at least 44x44 px (WCAG 2.5.5 AAA) on action buttons, checkboxes, and tab strips.
- Cursor enhancement overlay with ring or crosshair shape, three sizes (1.0x / 1.5x / 2.0x), colour tied to the active contrast palette.
- Simplified Mode for switch input, eye trackers with dwell-click, sip-and-puff, and head tracking. Collapses SequenceEditor to 2 tabs and a 3-button column (Run / Unlock editor / Close), and locks the key set to Enter / Space / Tab / Shift+Tab / Esc. A 500 ms post-acceptance delay (250..1500 ms slider) blocks accidental double-fires. Toggle from the subpanel, the Accessibility Mode preset, or
/gems simplified. A single/reloadafter the first enable produces the cleanest layout; same-session toggles apply best-effort live. - Undo and Redo across the sequence editor, step list, popup editor, and repair frame. Ctrl+Z / Ctrl+Y / Ctrl+Shift+Z in each.
Cognitive, new players, ESL
- Opt-in first-run tutorial. Skippable and replayable.
- Help popovers on every SequenceEditor section. A
?icon opens a short tooltip-anchored guide. - Plain-language tooltip text across validation messages and slash-command output.
- Sequence metadata fields (Author, Description, Help Text, Help Link) so authors can embed guidance that travels with the export.
Audio
Sound cues for validation errors, validation success, import-related info, and step advance. Four semantic cues routed through LibSharedMedia, so any sound installed by SharedMedia, WeakAuras, ElvUI, or similar is pickable per cue. Channel selection (Master / SFX / Ambience / Dialog). Opt-in, off by default.
A visual-flash complement to sound cues is available for Deaf and hard-of-hearing players: an 80x80 frame at top-centre of the screen flashes red / green / cyan / gold for the matching cue, sustained 0.6 seconds. The visual toggle is independent of the sound toggle, so users can run audio-off and visual-on or both together.
Theming
A bounded subpanel covers the everyday controls: global font, editor scale, validation-badge palette, border and background opacity, per-panel alpha. A full per-element editor lives at /gems theme. The full editor exposes 45 element classes across Panels, Overlays, Rows, Buttons, Text, Emphasis, and Global. Five user-named preset slots, plus copy-to-all-profiles. Themes can be shared via chat link.
The theming apply engine uses two patterns. Persistent UI (panels, singleton overlays, the focus ring) is frame-registered: EMS holds a reference to the widget and re-skins it directly when the theme changes. Transient and construction-time UI (rows, buttons, text FontStrings, emphasis state modifiers, the global addon font) is consumer-lookup: the widget reads its spec from the current theme at the moment it renders. Both patterns produce identical visible theming. Consumer-lookup classes are not unbound and are not reserved; they apply at a different point in the widget's lifecycle.
Five overlay classes are reserved in the taxonomy for features not yet shipped in v2.0.0: overlay.toast.info, overlay.toast.error, overlay.modal.dim, overlay.tooltip, overlay.dragPreview. Their specs are in place so future work can bind them without a taxonomy change. One panel class, panel.profileMgr, is a Blizzard-owned surface (the AceDBOptions profile picker); EMS cannot currently reach a frame handle for it, so its theming is deferred until that handle is exposed.
Feedback panel
Four buttons under /gems -> Accessibility -> Feedback link to AbleGamers APX, the Game Accessibility Guidelines, a Netflix documentary on accessible play in WoW, and the support Discord. WoW has no browser-launch API, so each button opens a static-popup edit box with the URL pre-selected for Ctrl+C copy.
Compatibility with other accessibility addons
| Addon | Coexists | Notes |
|---|---|---|
| BlindSlash | Yes | EMS TTS speaks step announcements. The chat-frame emitter pipes state into a dedicated chat-frame slot (default frame 9) for BlindSlash to parse. |
| ConsolePort | Yes | Detected at login via the gamepad-detected flag. The keybind UI accepts gamepad buttons without extra config. |
| DialogueUI | Yes | No shared UI surface. |
| Leatrix Plus | Yes | No shared UI surface. Leatrix's own cursor-enhancement options are a good choice for users who want more cursor textures than EMS ships. |
| ElvUI | Yes | EMS owns its own frames. Anchor MainFrame inside an ElvUI layout normally. |
| WeakAuras | Yes | No shared UI surface. No taint interaction. |
| Atkinson Hyperlegible (font addon) | Yes | EMS bundles an in-app font switch via LibSharedMedia with Atkinson Hyperlegible included. Third-party font addons still coexist. |
What EMS cannot do
These are capabilities the addon API does not expose. They are structural limits, not deferred features.
- Native screen-reader integration (NVDA / JAWS / VoiceOver). WoW does not expose its UI to Windows UIAutomation, Apple Accessibility, or any assistive-technology framework. Screen readers see WoW as opaque pixels. EMS compensates with the TTS output and the chat-frame emitter above.
- Macro-pacing slowdown. Macro cadence is global-cooldown-bound. Slowing it below the GCD breaks the rotation.
- Voice input or speech-to-sequence. No WoW API for speech recognition. Users route through Dragon or Talon as keyboard bridges; EMS sees those bridges as regular keyboard input.
- Orientation and reflow (WCAG 1.3.4, 1.4.10). WoW is landscape-only with a fixed UI layout. The CSS-reflow concept does not map.
- Detection of specific assistive tech (switch controllers, eye trackers, individual screen-reader brands). Those devices emit regular keyboard or mouse events through their driver; WoW cannot tell them apart. EMS exposes what Blizzard CVars reveal (
colorblindMode, reduced-motion proxies, gamepad-detected) and stops there.
Slash commands
| Command | Description |
|---|---|
/gems settings | Open settings, then click Accessibility |
/gems simplified | Toggle Simplified Mode |
/gems theme | Open the per-element Theming editor |
Feedback and reporting
The support Discord at discord.gg/temptingus is the primary channel. Accessibility reports go in the addon thread. The Feedback panel inside /gems -> Accessibility surfaces the same link plus the three external standards EMS draws from.
References
- ZeniMax ESO Accessibility Player Guide
- AbleGamers APX Design Patterns
- Game Accessibility Guidelines
- WCAG 2.2 Success Criteria 2.3.1 (Three Flashes), 2.4.7 (Focus Visible), 2.5.5 (Target Size Enhanced)
CVar Dashboard
A management panel for 212 WoW console variables across 13 sections. Each variable has a recommended value and the dashboard tracks how far your settings deviate from optimal.
Health Score
A weighted 0-100 score summarising your CVar health. Critical settings (like SpellQueueWindow or maxfps) carry more weight than cosmetic ones. The score updates live as you change values.
Auto-Switching Profiles
Five built-in profiles switch automatically based on detected content:
- Raid -- optimised for 10-30 player instances
- M+ -- tuned for Mythic+ dungeons
- Delves -- minion nameplates and interact tuning for delve runs
- Solo -- balanced for world content and questing
- PvP -- low-latency settings for arenas and battlegrounds
Custom Profiles
Create, clone, rename, and delete your own profiles. Useful if the built-in presets do not match your hardware or preferences.
Profile Map Editor
Maps each of the 53 context keys to a CVar profile. When the context system detects a zone change, the matching profile activates automatically.
Fix Controls
- Per-CVar auto-fix opt-in (set a variable to auto-correct on login)
- Fix All Critical -- reset all high-weight variables to recommended
- Per-section Fix All -- correct everything in one section at once
What Changed
On login, the dashboard detects which CVars changed since your last session and highlights them. Useful for catching settings that external addons or game patches might have modified.
SQW Optimiser
Dynamic SpellQueueWindow optimisation that adjusts your spell queue timing in real time based on measured network latency.
How It Works
WoW has a console variable called SpellQueueWindow that controls how many milliseconds early you can queue your next spell cast. Too low and you clip GCDs. Too high and you lose reaction time.
The SQW Optimiser continuously measures your latency using EWMA (Exponentially Weighted Moving Average) smoothing with outlier rejection, then sets the SpellQueueWindow to an optimal value.
Formula
SpellQueueWindow = clamp(ewma_latency + buffer, 50, 400)
- ewma_latency -- smoothed average of recent latency samples
- buffer -- configurable padding (default 20ms)
- clamp -- hard floor of 50ms, ceiling of 400ms
Dashboard Integration
When enabled, the CVar Dashboard shows a Managed badge on SpellQueueWindow and skips it in the health score calculation (since the optimiser is handling it).
Logout Restore
On logout, the optimiser restores SpellQueueWindow to its pre-optimisation value so your setting is clean if you disable the addon later.
Slash Commands
| Command | Description |
|---|---|
/gems sqw |
Show current SQW status and values |
Repair Module
Automated diagnostics for your sequences with one-click fixes.
How to Use
/gems repair <name>-- analyse a single sequence/gems repairall-- analyse every sequence- The editor shows a health score badge per sequence in the list
13 Diagnostic Categories
Fix All
After running a repair, click Fix All to apply all safe fixes in one click. Fixes that might change behaviour (like removing duplicate steps) are marked for review.
Quality Gating
Before exporting or sending a sequence, GRIP-EMS runs a quick repair check. If issues are found, you get a warning with the option to fix before sharing.
Spell Cache Viewer
Browse the cached spell data that the sequencing engine uses for icon resolution, autocomplete, and spell validation.
How to Use
- Type
/gems spellcacheto open the viewer - Search by spell name or spell ID
- See cached data: icon texture, cast time, cooldown, GCD category, and spell school
What the Cache Contains
The spell cache stores data for every spell referenced in your sequences plus spells from your current spellbook. It populates on login and updates when you change spec or talents.
Debugging Icons
If a spell icon is not resolving correctly in the tracker or action bar, check the spell cache viewer. Common issues:
- Spell ID mismatch (renamed spell in a patch)
- Missing cache entry (force a refresh with
/gems revalidate) - Ambiguous spell name shared across multiple spells
Tempo Advisor Integration
The Tempo Advisor reads cast time and GCD category from the spell cache to classify each step. If a spell shows as UNKNOWN in the advisor, check whether the cache has data for that spell ID.
Debug and Diagnostics
Tools for troubleshooting when something is not working as expected.
Debug Mode
/gems debug -- toggle debug mode. When on, the engine prints every decision to chat: which step was selected, why, and what macro text was generated.
Debug Window
/gems debugwindow -- open a scrollback window (500-message buffer) that collects debug output without flooding your chat frame.
Execution Tracer
The execution tracer records per-step data (timestamp, step index, spell name, cast result, GCD state, and latency) and feeds it into the Tempo Advisor for empirical learning. It activates automatically when the Tempo Advisor is enabled.
Other Commands
| Command | Description |
|---|---|
/gems diag |
Print a diagnostic summary to chat |
/gems mapinfo |
Show current content detection data |
/gems test |
Run the in-game test suite |
/gems status |
Show addon version and sequence count |
Reporting a Bug
When something needs a developer's eyes, your settings file is the fastest way to get it fixed. The file is GRIP-EMS.lua, with GRIP-EMS.lua.bak next to it as the previous save.
Find it from the Battle.net app: pick World of Warcraft, click the gear next to Play, and choose Show in Explorer (Reveal in Finder on Mac). Then open:
_retail_\WTF\Account\<ACCOUNT>\<Realm>\<Character>\SavedVariables\
Keybinds and settings are stored per character, so use the folder for the character it happened on. <ACCOUNT> is either a Battle.net number like 123456#1 or an account name in capitals.
If your sequence keybinds disappeared, capture it the moment it happens: type /reload, then copy both GRIP-EMS.lua and GRIP-EMS.lua.bak out of that folder before you log in again -- logging back in overwrites the .bak. Send both files unedited. With /gems debug on, the keybind-loss guard: line in chat names which path triggered it.
UI Tour
Click the numbered hotspots below to explore each area of the editor interface.
Sequence List
The left panel shows all your sequences. Each entry displays the sequence name, spec icon, and a health score badge from the Repair Module. Click to select, right-click for options (rename, delete, enable/disable).
Steps Tab
Your rotation steps, one per row. Drag the handle to reorder. Each step shows a character count and spell icon. Action nodes with Interleave display an [IL:N] indicator and spinner control.
Toolbar
Create, delete, import, export, and open settings. The toolbar also has undo/redo buttons and a search field for filtering the sequence list.
Keybind Tab
Assign a per-spec keybind. Press the key you want, and it binds immediately. Toggle between normal, vehicle, and pet battle bind slots.
Context Tab
Pick which contexts (raid, dungeon, PvP, etc.) activate this sequence version. 53 context types in collapsible groups with Select All / Clear All.
Tracker HUD
A preview of the floating combat overlay. Shows the sequence icon, step counter, and keybind label. Drag to reposition in-game.
Tempo Advisor Overlay
The Faster/Slower widget. Shows your current MS vs recommended MS, a delta bar, CPS sparkline, and confidence level (Estimated or Calibrated).
Keyboard Shortcuts
| Key | Action |
|---|---|
| Ctrl+Z | Undo |
| Ctrl+Y | Redo |
| Tab | Spell autocomplete |
| Ctrl+S | Save sequence |
| Delete | Remove selected step |
Sequence Builder
Build a sequence right here in the guide and see how it works. The live preview shows the execution order, and each step has a character counter.
Step Functions
Sequential
Step 1, 2, 3, ... N, then back to 1. The default and most common.
Priority
Always tries step 1 first. Falls through if the spell cannot cast.
Reverse Priority
Same as Priority but starts from the last step.
Random
Picks a random step each keypress. Fun for fishing macros.
Execution Preview
Type some steps above to see the preview.
Import Walkthrough
Walk through the 4-stage import process step by step.
Stage 1: Paste
Run /gems import and paste your sequence string. GRIP-EMS auto-detects the format (GRIP1, legacy, or raw macrotext).
Stage 2: Preview
The preview shows each detected sequence with metadata.
Stage 3: Conflicts
If a sequence name already exists, you choose per-sequence:
You can also toggle Import as disabled to bring the sequence in without activating it.
Stage 4: Complete
Import summary showing what was added.
Import Complete
1 sequence imported, 0 skipped, 0 renamed
Slash Commands
All 42 slash commands at a glance. Type /gems help in-game for a quick reference.
| Command | Description | Category |
|---|---|---|
/gems |
Toggle the sequence editor | Basic |
/gems help |
Show all available commands | Basic |
/gems open |
Open the editor (alias) | Basic |
/gems status |
Show addon version and sequence count | Basic |
/gems settings |
Open the settings panel | Basic |
/gems guide |
Open the interactive tutorial | Basic |
/gems resetui |
Reset window position and size to defaults | Basic |
/gems create |
Create a new sequence | Sequences |
/gems delete <name> |
Delete a sequence by name /gems delete BM_ST |
Sequences |
/gems list |
List all stored sequences | Sequences |
/gems reset <name> |
Reset a sequence to step 1 | Sequences |
/gems validate |
Check all sequences for stale or unknown spells | Sequences |
/gems revalidate |
Force re-tag all sequences with spell IDs | Sequences |
/gems bind <name> <key> |
Bind a key to a sequence /gems bind BM_ST F5 |
Keybinds |
/gems unbind <name> |
Remove keybind from a sequence | Keybinds |
/gems binds |
Show all keybinds for the current spec | Keybinds |
/gems import |
Open the import paste window | Import/Export |
/gems export <name> |
Export a sequence to clipboard | Import/Export |
/gems exportall |
Open multi-select export window | Import/Export |
/gems migrate |
Migrate sequences from a compatible sequencer | Import/Export |
/gems send <name> <target> |
Send a sequence to a player /gems send BM_ST Targettoon |
Sharing |
/gems accept |
Accept the last received sequence | Sharing |
/gems block <player> |
Block a player from P2P sharing | Sharing |
/gems unblock <player> |
Unblock a player | Sharing |
/gems blocklist |
List all blocked players | Sharing |
/gems browse |
Open the remote macro browser | Sharing |
/gems tracker |
Cycle tracker visibility modes | UI |
/gems tracker lock |
Lock or unlock tracker position | UI |
/gems cvar |
Open the CVar Dashboard /gems cvar reset, /gems cvar profile |
UI |
/gems spellcache |
Open the spell cache viewer | UI |
/gems fs |
Tempo Advisor status /gems fs on, /gems fs off, /gems fs reset |
UI |
/gems msadvisor |
Analyse sequence timing for optimal click rate | UI |
/gems debug |
Toggle debug mode | Diagnostics |
/gems debugwindow |
Toggle the debug window | Diagnostics |
/gems diag |
Print a diagnostic summary to chat | Diagnostics |
/gems test |
Run the in-game test suite | Diagnostics |
/gems repair <name> |
Analyse and repair a sequence /gems repair BM_ST |
Diagnostics |
/gems repairall |
Analyse and repair all sequences | Diagnostics |
/gems mapinfo |
Show current content detection data | Diagnostics |
/gems testlocale |
Run locale translation round-trip test | Developer |
/gems compress |
Compress a sequence string | Developer |
/gems decompress |
Decompress a sequence string | Developer |
Common Workflows
/gems-- open the editor- Click New , name your sequence
- Add steps in the Steps tab (one spell per line, Tab for autocomplete)
- Save, switch to Keybind tab, press your key
- Test on a target dummy and adjust
- Ask your friend to
/gems export <name> - They paste the string in Discord/party chat
- You run
/gems import, paste the string - Preview, resolve conflicts, and import
- Enable Tempo Advisor:
/gems fs on - Play your rotation for a few minutes
- Watch the Faster/Slower overlay for guidance
- After 30 samples it switches to Calibrated mode
- Adjust your MS slider to match the recommendation
Plugin API
Third-party addons can register sequences with GRIP-EMS through the plugin API.
Registration
GRIPEMS:RegisterPlugin("MyAddon", sequenceTable)
The sequenceTable is a Lua table of sequences following the standard GRIP-EMS format. Each entry must have a name, steps, and step function at minimum.
Callback
GRIPEMS:OnPluginLoaded(function(addonName) -- plugin is ready end)
Fires after GRIP-EMS loads and processes the registered sequences. Use it to apply any post-registration setup.
Format Requirements
- Each sequence needs:
name,steps(array of strings),stepFunction(string) - Optional:
author,specID,icon,resetConditions,helpText - Steps must be valid WoW macro text, 255 characters or fewer each
Settings Reference
All settings grouped by panel. Open settings with /gems settings.
The Accessibility subpanel (one-click preset, speech, reduce motion, contrast preset, density, cursor overlay, simplified mode, sound cues, theming, flicker-safe palette) is documented separately. See the Accessibility section above for the full list and design rationale.
General
Hold to Freeze
Tracker
Profiles
Sharing
CVar Dashboard
SQW Optimiser
Faster/Slower
Debug
Roadmap
Feature timeline for GRIP-EMS. Everything marked SHIPPED is available now.
| Version | Features | Status |
|---|---|---|
| v1.0 | Sequencing engine, visual editor, 4 step functions | SHIPPED |
| v1.1 | Multi-version sequences, context auto-switching | SHIPPED |
| v1.2 | P2P sharing, chat links, block list | SHIPPED |
| v1.3 | Variables, Lua function vars, event-driven re-evaluation | SHIPPED |
| v1.4 | Tracker HUD, 4 visibility modes, scale/lock | SHIPPED |
| v1.5 | Per-spec keybinds, vehicle/pet battle support, gamepad | SHIPPED |
| v1.6 | Multi-window editor, syntax highlighting, spell autocomplete | SHIPPED |
| v1.7 | Hierarchical actions, macro recorder, 11-language localisation | SHIPPED |
| v1.7.1 | Sharing controls, plugin API, repair module | SHIPPED |
| v1.8 | Action bar integration, side-by-side diff, metadata editor | SHIPPED |
| v1.9.0 | CVar Dashboard, SQW Optimiser, spell cache viewer | SHIPPED |
| v1.9.1 | Tempo Advisor, Interleave/Weave, import quality, text export | SHIPPED |
| v2.0 | Accessibility suite: one-click mode, theming editor, keyboard navigation, simplified mode | SHIPPED |
| v2.1.0 | If/Else action nodes, sequence authorship, cross-class spell catalogue | SHIPPED |
| v2.1.8 | In-combat variables, hold to freeze, disable a step, per-loadout keybinds, variant indicators | SHIPPED |
| v2.1.9 - v2.1.12 | Editor scroll and drag fixes, locale auto-translate, cross-class spell resolution, Loop and If duplicate preservation | SHIPPED |
| v2.1.13 - v2.1.16 | Skyriding keybind overhaul: dismount-to-cast, druid forms, exit watchdog, bar-addon compatibility | SHIPPED |
| v2.1.17 | Reloading during an arena or Mythic+ run no longer leaves sequences dormant until the match ends; clicking a greyed-out row re-activates it properly. Import preview corruption false alarms removed. ACCESSIBILITY.md ships in the download again. | SHIPPED |
| v2.1.18 | Vanishing sequence keybinds now warn and offer /gems binds restore; dismounting into combat while skyriding restores your keys right away. Importing an older sequence no longer errors and keeps its structure. Simplified Mode and the in-game test suite fixed. | SHIPPED |
| v2.1.19 | Library migration fixed after the source sequencer's update hid its runtime data. Imported and received sequences keep author, signature, and edit chain; Forge-exported strings import with the source labelled. Starter Build keybind-loss closed, the Variants tab draws and names its target version, and variable saves keep every field. | SHIPPED |
| v2.1.20 | Fresh-login skyride keys heal at takeoff, and the Keybinds tab warns when another addon contends vehicle or pet battle keys. ENTER and SPACE reach the game when keyboard navigation targets nothing, popups gain full keyboard handling with larger targets, and cross-class Mindbender references resolve again. | SHIPPED |
| v2.1.21 | Interleaved steps space against their original positions, fixing rotations that drifted out of order and the keybind stalls that came with them. Western-locale text gains a parity backfill. | SHIPPED |
| v2.1.22 | A sequence whose steps are all interleave actions no longer loses its base rotation on import; EMS detects the case, warns, and offers a one-click fix. Click Rate tooltips corrected across every locale, and user-facing text moves to British spelling. | SHIPPED |
| v2.1.23 | Imported bare-name macro steps inline the bundled macro body and auto-heal on login, so a shared sequence runs without hunting for a matching macro. Disabled steps stay disabled through import instead of switching back on. | SHIPPED |
| v2.1.24 | Skyriding keys yield to the sequence layer cleanly, cast buttons register for click steps, and VK-only keys cast by name when auto-dismount is off. The client build 12.0.7 joins the supported list. | SHIPPED |
| v2.1.25 | Priority and Reverse Priority loops honour their Repeat count instead of firing once. A multi-version sequence keeps its macro on your action bar when the active version changes, rather than orphaning the copy you dragged there. | SHIPPED |
| v2.1.26 | A [nochanneling] step tag joins [channeling] in the Spell Picker. The CVar-change chat notice is off by default, the per-step edit box grows taller before it scrolls, native exports record their EMS version, and the rotation preview follows a Loop's Repeat count and step function. | SHIPPED |
| v2.1.27 | Sorting sequences by Last Updated no longer errors on older text timestamps. The cross-class All Classes list is rebuilt against the current 12.0.7 client. | SHIPPED |
| v2.1.28 | Drag a step into a loop to nest it, by dropping it on the loop's row or into a loop open in the detail pane, with undo and a depth-limit refusal. Macro-reference steps can refresh themselves after you edit the underlying macro, off by default. Step-list drag lands where you point again, and an If that only fills its Else branch respects the nesting limit. | SHIPPED |
| v2.2.0 | A plugin API lets other addons extend GRIP-EMS -- import and export formats, settings and panels, variables, conditions, and step functions; a plugin's export format shows in the export picker. The loop-and-branch self-heal also runs on context switches now, so swapping versions on entering a dungeon or arena keeps step grouping. | SHIPPED |
| v2.3.0 | Quick-swap the live version of a sequence with a pin, plus badges showing which is live. Keyboard navigation reaches the Keybind tab, Export window, and Theming editor. The spell picker inserts at the cursor and replaces a highlighted selection. Plugin API v3 lets addons drive action bars -- per-step spell data, the sequence macro, and a /gems subcommand. | SHIPPED |
| v2.3.1 | Native exports carry build context (class, spec, and talent loadout) plus a per-sequence changelog field, both travelling on export and import. The verified badge signs the full macro content now, so a tampered sequence reads as tampered and cross-language imports no longer false-flag. A context-switch Lua error on versions with no steps is fixed. | SHIPPED |
| v2.3.2 | Cross-language spell-name data moved to a load-on-demand companion addon shipping in the same download, keeping about a megabyte out of the base load. The cursor overlay is built on first enable instead of at every login. The AddOns list groups the GRIP family under a GRIP category with the locale bundle nested under EMS. | SHIPPED |
| v2.3.3 | Every export string carries the full story -- author, class, spec, talents, what it casts and what it needs -- so sharing sites can fill a post straight from the paste string, and collections carry the same per-sequence detail as single exports. Player-to-player sends bundle the macros a sequence depends on, and the exporter identity follows your privacy mode. | SHIPPED |
| v2.3.4 | Renaming a sequence keeps its identity: verification badge, fork history, privacy mode, macro dependencies, sound cues, Conditions assignments and hold-mode keybind all carry through. Imported talent strings survive saving, renaming and duplicating. Plugin-created sequences can no longer be renamed by hand. | SHIPPED |
| v2.3.5 | The flat step list takes more than one step at a time. Ctrl-click toggles a step, shift-click grabs the range from your last pick, and a plain click goes back to one. Duplicate and Delete act on the whole block as a single undo. Outline and action-tree sequences keep single-select. | SHIPPED |
| v2.3.6 | The Source tab stays responsive on large sequences and saves a sequence that contains a loop. Disabled steps inside a Loop or IF node stay out of the compiled macro, and a corrupted sequence entry is skipped and reported instead of crashing the editor at login. Imports track their source more closely, and the CVar Dashboard gains a NamePlate Stacking recommendation. | SHIPPED |
| v2.3.7 | The step index and the step count finally agree. Priority and Reverse Priority sequences stop showing the wrong spell on the macro stub and action bar, the tracker stops rendering "7/4", and the spoken step announcement names the step being cast. A new API:GetAuthoredSteps accessor gives plugins the authored base order. | SHIPPED |
| v2.3.8 | An interleave whose interval overruns its block no longer compiles to nothing in silence. The editor warns, names the action and the block's step count, and suggests the Repeat that would make it fit. | SHIPPED |
| v2.3.9 | Keybind fixes for per-loadout mode: Clear removes a per-spec bind instead of claiming there is none, suppressed keys stop rendering across the UI, clearing a key sweeps its suppress markers, and the conflict warning reads the merged view. The test runner flags a filter that matches nothing. | SHIPPED |
| v2.3.10 | Spell Cache Viewer and Remote Browser rows render instead of painting blank, and the spell rename behind them applies to the live cache. The Set Keybind button no longer sticks greyed out after an in-combat create. | SHIPPED |
| v2.3.11 | The CVar Health score keeps a login-to-login history with a trend line, the Raiding section models Raid Spell Density, the raid and PvP profiles carry nameplate stacking masks, and the header counts categories and CVars from the registry. Garbled Korean locale text restored. | SHIPPED |
| v2.3.12 | Delves get the fifth built-in CVar profile with all three delve contexts mapped to it, and the SQW Optimizer's latency ring draws a trend line in the CVar health subpanel. | SHIPPED |
| v2.3.13 | The CVar Health registry grows to 255 variables across 14 sections with a new Combat Audio section, the dashboard gains search and a show-only-issues filter, numeric CVars become sliders and on/off CVars tickboxes, and the graphics dropdowns read their tier names from the game's own strings. | SHIPPED |
| v2.3.14 | Key Down Casting is set on at every login so a fresh install works without changing a game setting first, and its CVar Health row is removed. | SHIPPED |
| Next | Accessibility verification pass, locale translation batches | PLANNED |
Glossary
A hierarchical building block in the visual editor: Action, Loop, Repeat, Conditional, If/ElseIf/Else.
Tempo Advisor confidence level after collecting 30+ play samples.
The process of flattening a hierarchical action tree into a linear step list for the sequencing engine.
A game situation (raid tier, dungeon difficulty, PvP mode, etc.) that can trigger automatic version switching.
Clicks Per Second. Shown in the Tempo Advisor sparkline overlay.
Console Variable. A WoW client setting stored by the game engine.
Tempo Advisor confidence level before 30 play samples are collected.
Exponentially Weighted Moving Average. Used by the SQW Optimiser to smooth latency data.
Global Cooldown. The minimum time between most spell casts, usually 1.5 seconds before haste.
The native serialisation format for GRIP-EMS sequences. A compressed Lua table string.
A 0-100 quality rating. The CVar Dashboard and Repair Module both generate health scores.
A compile-time weave that injects a spell every N steps into the rotation.
A SecureActionButton created at load time to execute a sequence. Keybinds attach to these.
A spell that can be cast without triggering the Global Cooldown.
Player-to-Player. Direct sequence sharing via whisper, party, or raid chat.
A step function that always tries step 1 first, then step 2 if step 1 fails, and so on.
A saved set of CVar values. The CVar Dashboard supports 5 auto-switching profiles plus custom ones.
An event that sends the sequencer back to step 1: combat, target, gear, spec, or idle timer.
The default step function. Advances one step per keypress, then loops to step 1.
A WoW CVar controlling how early your next spell can be queued (in milliseconds).
The algorithm deciding which step fires next: Sequential, Priority, ReversePriority, or Random.
Per-sequence click rate analysis with a Faster/Slower overlay. Learns from your play data.
Synonym for Interleave. Set an interval on an Action node to weave it every N steps.
FAQ
No. GRIP-EMS fires one spell per keypress using standard WoW macro API calls. You press the button; the addon picks which spell to cast. This is the same mechanism Blizzard provides for castsequence macros.
Every feature ships free. No Patreon tier-gating, no premium version. If you want to say thanks, there is a PayPal sponsor link on CurseForge.
Yes. Use /gems import, paste the string, and GRIP-EMS auto-detects the format. Alternatively, if the old addon is still installed, use /gems migrate to transfer everything in one click.
GRIP-EMS stores keybinds per-spec. Switch back to the original spec and your binds will reappear. You can also run /gems binds to see what is currently bound.
Yes. Use /gems send <name> <player> to send directly, or /gems export to copy the string to clipboard for Discord or forum posting. Friends can also click the chat link to accept immediately.
WoW enforces a 255-character limit on each SecureActionButton macro. GRIP-EMS shows a live character counter in the editor so you can see how close each step is to the limit.
Make sure action bar icon integration is enabled in Settings. GRIP-EMS supports Blizzard, ElvUI, and Bartender4 action bars. If you use a different bar addon, the icon may not update automatically.
Yes. Create a healing sequence with your heal spells, and use Priority step function if you want the addon to always try your strongest heal first. Variables and context switching work the same way for healers.
It starts with a theoretical estimate right away. After 30 play samples it blends in your actual data (70% theory, 30% empirical). You can see the confidence level (Estimated vs Calibrated) on the overlay.
Run /gems fs reset to clear the stored data and start fresh. You can also turn it off entirely with /gems fs off.
No. It only changes client-side console variables. If something feels wrong, open the dashboard and click Fix All Critical to revert to recommended values. The What Changed panel on login shows exactly what was modified.
The CVar Dashboard has a per-CVar reset button and a section-level Fix All button. For a full Blizzard default reset, type /console cvar_default in chat.
Yes. The Accessibility subpanel covers screen-reader support via a chat-frame emitter, three palette presets plus an 8-type colourblind matrix, a flicker-safe palette for photosensitivity, large-target density mode, Simplified Mode for switch input and eye trackers, and a one-click Accessibility preset. See the Accessibility section above for the full feature list and the compatibility matrix.