Macro picker search has a 100ms debounce on text input. Typing a multi-character search no longer rebuilds the full row list on each keystroke.
GRIP-EMS v2.0.3
Released May 9, 2026. 25 entries in the author's notes.
Every entry
The author's own words, complete. Long sections are sorted into areas by LazyGrip.
Added
10Macros, export, import and sharing9
Macro action type in the + Add menu. Opens a picker that lists your account-level WoW macros, per-character WoW macros, and EMS-stored macros (de-duped on name). Selecting a macro inlines its body into the step; the step still fires the inlined body at runtime, so deleting or renaming the source macro after authoring does not break the step.
Drift indicator on macro-reference steps. When the source /macro body changes, a yellow indicator appears in the detail pane with a Refresh button that re-pulls the live body. No auto-sync -- changes only land when you click Refresh.
Source-missing state on macro-reference steps. If you delete the source macro from /macro, the detail pane shows a hint and disables Refresh; the step continues to fire from the cached body.
Bundled macros from external-sequencer COLLECTION exports (paste-import + slash-import + in-game migrate). When an imported sequence references a macro by bare name and the export bundle includes the macro body, the macro is recreated in your /macro list so the step resolves correctly.
New macro storage: GRIP_EMS_DB.macros (account scope) and GRIP_EMS_CHAR.macros (per-character scope). Lazily initialized on first import.
Import warnings for missing dependencies. When an imported sequence's metadata declares a macro or sub-sequence dependency that is not present in the import bundle and not in your existing macros / sequences, the import summary names the missing dependency.
Slot-exhaustion warning on macro creation. When MAX_ACCOUNT or MAX_CHARACTER macro slots are full, the import surfaces a per-macro warning with the slot count instead of dropping the macro silently.
Reading of MetaData.HelpTxt, MetaData.Help, MetaData.Helplink, and MetaData.LastUpdated from imported sequences (clipboard paste path). Author description, author link, and original export timestamp are now preserved.
Recognition of MetaData.Normal as a fallback for MetaData.Default in imported sequences (newer external-sequencer alias).
Everything else1
Per-character bucket migration from external-sequencer storage for the active character.
Changed
2Macro picker auto-focuses the search box when opened.
Fixed
10Macros, export, import and sharing3
BackdropTemplate on the macro-reference body preview frame. The first picker selection no longer raises a nil-call from UI:ApplyBackdrop.
Row-click on a macro-reference step in the outline opens the detail pane (the body is read-only, so the inline edit path is not useful for this step type).
Recursive AceGUI:Release in the macro picker close path. MacroPicker._finish now clears the frame reference before calling Release so the OnClose guard short-circuits.
Repair and spell warnings3
Engine.lua:91 attempt-to-call-a-nil-value during multi-delete. Engine:SubstituteVariables now type-guards non-string input. SpellValidator:ValidateSequence and RepairAnalyzer:CheckPostSub coerce step values via SpellCache:StepToString before passing them to substitution. Reported by Pershizzle.
Nameless unclickable rows after /reload. Engine:RestoreSavedSequences drops sequences with non-string or empty keys instead of restoring them as ghost rows. SequenceList:InitRow stores _seqData immediately after setting the name so OnClick survives downstream validation errors. Existing corruption auto-cleans on the next /reload.
Defensive pcall wraps around SpellValidator:ValidateSequence and RepairAnalyzer:Analyze inside InitRow. A single bad sequence cannot break the visible row list anymore. Failures fall back to safe defaults (staleCount = 0, healthScore = 100) with a debug log entry.
Saving, naming and editing2
Keyboard Delete on action-tree nodes. The keyboard shortcut previously called the flat-mode delete path; now branches based on whether the editor is in flat or tree mode and uses the matching delete primitive.
Doubled "v" in version display. Core.lua strips a leading v or V from the packager-substituted tag value before assigning to GRIPEMS.version. MainFrame title bar, Minimap tooltip, and Remote Browser version labels now show the correct single-v prefix.
Resets and modifiers1
Detail pane Del button on leaf step types. ACTION, Pause, and Embed steps now remove themselves when Del is clicked from the detail pane (previously the button only worked on container children, so leaf steps required closing the detail pane and using the outline Del). Loop and If container child-deletion behavior unchanged.
Languages1
Type-guarded coercion across the bug class at every reachable string-method and concat call site. Sequences with table-shaped steps or keyPress / keyRelease values from older imports no longer raise during analysis, display, or compilation. Added guards in SubstituteVariables, CompileSteps, ResolveFitAndExpand, BuildStubBody, TranslateMacrotext, ResolveSpellIDsInText, ValidateStep, ExtractAllSpells, ExtractSpellsFromStep, RepairAnalyzer (CheckLimits / CheckVariables / CheckReadiness / CheckStateSync / CheckCrossSeq + their fix lambdas), StepListView (display + drag-ghost paths), and Defaults:NodeSummary.
Internal
3Grab it
Release notes written by Sataana and reproduced here with his permission.