GRIP - Enhanced Macro Sequencer
The free macro sequencer for World of Warcraft. No paywalls. Every feature included.
v1.9.1New in v1.9.1
Tempo Advisor NEW
Per-sequence click rate analysis with adaptive learning. A movable overlay tells you when to speed up or slow down.
Interleave / Weave NEW
Set an interval on any Action node and the compiler weaves it every N steps into your rotation automatically.
Import Quality NEW
Checksum validation, disable toggle, Pause/Pet/Toy import fixes, and clipboard metadata reading.
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 color-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 color-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
- 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 auto-switch on spec 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 serialized 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 catalog.
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 behavioral 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 Optimized 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 NEW
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
Tempo Advisor NEW
The Tempo Advisor analyzes 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 categorizes 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 (channeled 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. Channeled 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
- DJB2 checksum validation: green check if valid, yellow warning on mismatch, skipped if the source has no checksum
- 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.
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
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.
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.
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. When the addon disables (vehicles, skyriding), the overrides suspend automatically.
Accessibility NEW
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 colorblind matrix layers on top, with a 0-100% strength slider and a live 5-color 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), color 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-center 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 213 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 summarizing 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
Four built-in profiles switch automatically based on detected content:
- Raid -- optimized for 10-30 player instances
- M+ -- tuned for Mythic+ dungeons
- 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 Optimizer
Dynamic SpellQueueWindow optimization 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 Optimizer 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 optimizer is handling it).
Logout Restore
On logout, the optimizer restores SpellQueueWindow to its pre-optimization 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>-- analyze a single sequence/gems repairall-- analyze 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 behavior (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 |
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 and checksum status.
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 |
Analyze 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> |
Analyze and repair a sequence /gems repair BM_ST |
Diagnostics |
/gems repairall |
Analyze 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
Tracker
Profiles
Sharing
CVar Dashboard
SQW Optimizer
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 localization | 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 Optimizer, spell cache viewer | SHIPPED |
| v1.9.1 | Tempo Advisor, Interleave/Weave, import quality, text export | SHIPPED |
| v2.0 | CVar profile export/import, SQW sparkline, advanced triggers | 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.
A fast hash function used for checksum validation during sequence import.
Tempo Advisor confidence level before 30 play samples are collected.
Exponentially Weighted Moving Average. Used by the SQW Optimizer to smooth latency data.
Global Cooldown. The minimum time between most spell casts, usually 1.5 seconds before haste.
The native serialization 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 4 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 colorblind 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, or ACCESSIBILITY.md on GitHub for the compatibility matrix.