Skip to content

Repository files navigation

Midnight Simple Unit Frames logo

Midnight Simple Unit Frames

Clean, highly configurable unit frames, group frames, castbars and auras for World of Warcraft Retail.

Download MSUF on CurseForgeDownload MSUF on Wago AddonsJoin the MSUF Discord

MSUF version 6.0 RC18World of Warcraft Retail 12.1Latest GitHub commit

Important

6.0 RC18 is a prerelease build. Release candidates continue to use the Beta channel on addon platforms until the final 6.0 release.

What is MSUF?

Midnight Simple Unit Frames (MSUF) is a complete, customizable replacement for Blizzard's unit and group frames. It brings player, target, focus, focus-target, boss, party and raid frames together with castbars, auras and class resources in one consistent interface.

MSUF is made for players who want clear combat information, extensive visual control and a lightweight event-driven runtime. The full configuration UI and the optional Assistant load only when requested.

Signature per-frame Fill Direction: MSUF lets each Unit Frame fill its Health and Power bars horizontally from left to right or right to left, or vertically from bottom to top or top to bottom. This per-frame combination of vertical and mirrored bar layouts is a level of control not currently offered by other unit-frame addons.

Basic features

  • Custom Player, Target, Focus, Focus Target, Pet, Target-of-Target and Boss frames
  • Party, Raid and Mythic Raid group frames
  • Configurable health, power, absorb and heal-absorb displays
  • Per-frame horizontal and vertical Health/Power fill directions in all four directions
  • Player, Target, Focus and Boss castbars
  • Buffs, debuffs, defensive auras, private auras and spell indicators
  • 2D and class-icon portraits with multiple shapes and placements
  • Custom name, health, power, status and castbar text
  • Class colors, reaction colors, custom colors, gradients, fonts and textures
  • Aggro, dispel, purge, range, role, leader, raid-marker and status indicators
  • Class Power displays for class resources
  • Full Edit Mode positioning, previews, snapping and layer controls
  • Profiles, specialization switching and profile import/export
  • Searchable options, guided setup and recovery tools
  • Optional Masque, LibSharedMedia and Clique integration

Feature highlights

AreaHighlights
Unit FramesPlayer, Target, Focus, Focus Target, Pet, Target-of-Target and Boss frames with configurable health, power, text, portraits, colors, textures, layers and status indicators. Every frame can fill its Health and Power bars horizontally or vertically in either direction.
Group FramesParty, Raid and Mythic Raid layouts with role/status indicators, range fading, spell indicators, healer tools and native private-aura support.
Auras 3Blizzard-native 12.1 aura containers, custom spell matching, per-lane filters, icon shapes, cooldown text, growth/layout controls and portrait tracking.
CastbarsPlayer, Target, Focus and Boss castbars with interrupt feedback, channel support, configurable text/icons, rounded styling and secret-safe timing paths.
Edit ModeLive frame positioning, draggable elements, previews, snapping, layer controls and direct navigation to the matching setting.
ProfilesSpecialization-aware profiles, copy tools and robust import/export including migration from legacy 5.x profiles.

More included

  • Configurable Class Power displays, including an optional Guardian Druid Ironfur tracker
  • SharedMedia textures and fonts, Masque support and Clique compatibility
  • Searchable, load-on-demand options with guided setup and recovery tools
  • Optional load-on-demand MSUF Assistant for local feature help and safe setting changes
  • Twelve included locales: English, German, French, Spanish, Italian, Portuguese, Russian, Korean and Simplified/Traditional Chinese
  • Performance-oriented event routing designed to stay quiet when features are disabled

Install and open

  1. Install MSUF through CurseForge or Wago Addons.
  2. For a manual installation, keep all three packaged folders together in World of Warcraft/_retail_/Interface/AddOns:
    • MidnightSimpleUnitFrames
    • MidnightSimpleUnitFrames_Options
    • MidnightSimpleUnitFrames_Assistant
  3. Reload the game and type /msuf to open the configuration menu.

The Core addon runs normally without opening Options or the Assistant. Both companions are loaded on demand.

Compatibility

GameWorld of Warcraft Retail
Interface versions12.0.7 and 12.1.0
Current source version6.0 RC18
Main command/msuf
Optional integrationsMasque, LibSharedMedia, Clique and WagoAnalytics

Developer APIs

Only APIs documented in this section are stable integration contracts. Arbitrary MSUF_* globals, frame registries, runtime namespaces and saved variables are implementation details.

MSUF.API.Nicknames V1 lets another addon provide display names for MSUF unit and group frames without frame hooks. It is event-driven: there is no polling, ticker or idle OnUpdate; providers and nickname refreshes never run in combat. Changes reported in combat are coalesced and applied once after PLAYER_REGEN_ENABLED.

localOWNER="YourAddon"localPRIORITY=50localMSUF=_G.MSUFlocalAPI=MSUFandMSUF.APIandMSUF.API.NicknameslocalfunctionResolveNickname(unit, nativeName, fullName)
localnickname=YourAddon:GetNickname(unit)
returnnickname~=nativeNameandnicknameornilendlocalfunctionSetNicknameProviderEnabled(enabled)
ifnot (APIandAPI.GetVersion() >=1) thenreturnendifenabledthenAPI.RegisterProvider(OWNER, ResolveNickname, PRIORITY)
elseAPI.UnregisterProvider(OWNER)
endendlocalfunctionNotifyNicknamesChanged(unit)
ifAPIandAPI.IsProviderRegistered(OWNER) thenAPI.NotifyChanged(OWNER, unit)
endend

Add ## OptionalDeps: MidnightSimpleUnitFrames when MSUF should load before the provider. RegisterProvider(owner, resolver, priority) accepts an optional numeric priority; higher priorities run first. Use UnregisterProvider(owner) when the integration is disabled. Call the enable function once after loading the provider's persisted state, and call the change notification with the changed unit token. Omit the unit only for bulk database changes or enabled-state changes that affect every displayed name.

Edit Mode provider integration

MSUF_EditModeAPI V1 lets another addon expose its own movable frames inside MSUF Edit Mode. The provider keeps ownership of frame creation, saved positions, profiles, anchors and protected-frame operations; MSUF supplies the mover, selection, grid/snap, arrow nudge, Undo/Redo and Save/Discard shell.

Feature-detect and register after adding the same optional dependency:

localEditMode=_G.MSUF_EditModeAPIifnotEditModeorEditMode.GetVersion() <1thenreturnendlocalok, reason=EditMode.RegisterElements("YourAddon", {
{
id="main",
label="Your Addon Frames",
group="Your Addon",
order=100,
getFrame=function()
returnYourAddon.GetMovableContainer()
end,
getPosition=function()
localpoint, relativeToName, relativePoint, x, y=YourAddon.GetPosition()
return {
point=point,
relativeToName=relativeToName,
relativePoint=relativePoint,
offsetX=x,
offsetY=y,
}
end,
setPosition=function(position, changeReason)
returnYourAddon.SetPosition(position, changeReason)
end,
-- Optional links/actions shown by the MSUF-owned popup.openSettings=YourAddon.OpenSettings,
resetPosition=YourAddon.ResetPosition,
},
})
ifnotokthenprint("YourAddon: MSUF Edit Mode registration failed: " ..tostring(reason))
end

Each id is stable within its owner and represents one independently movable frame or container. A provider may instead implement the advanced transaction callbacks captureState, restoreState, and movePosition when a simple position table is insufficient.

Notify MSUF only after an event changes availability or geometry:

MSUF_EditModeAPI.RefreshElement("YourAddon", "main")
-- or refresh every registered element owned by the addon:MSUF_EditModeAPI.RefreshOwner("YourAddon")

These are cold event notifications, not per-frame APIs. Registration installs no polling, ticker, global hook, or idle OnUpdate. Configuration writes are rejected during combat, and providers must enforce their own protected-frame rules inside callbacks. Dynamic teardown uses UnregisterElement("YourAddon", "main") or UnregisterOwner("YourAddon").

Support development

If MSUF improves your UI, you can support continued development through any of the links below. These are the same official links shown inside the MSUF Dashboard.

Support MSUF on PatreonSupport MSUF with PayPalSupport MSUF on Ko-fi

Patreon · PayPal · Ko-fi

Community and feedback

Join the MSUF DiscordView the MSUF source on GitHub

  • Ask questions, share profiles and report gameplay issues on the MSUF Discord.
  • Report reproducible bugs through GitHub Issues.
  • Browse and share community profiles through Wago.

When reporting a bug, please include your MSUF version, WoW client version, affected frame and exact reproduction steps.


Made for players who want powerful frames without a heavy runtime.

About

Midnight Simple Unit Frames is a lightweight unitframe addon focused on a clean, readable layout

Resources

Stars

9 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { // Add copy buttons to all
 blocks
(function() {
function addCopyButtons() {
document.querySelectorAll('pre code').forEach(function(codeBlock) {
if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;
codeBlock.parentElement.setAttribute('data-copy-added', 'true');
var btn = document.createElement('button');
btn.textContent = 'Copy';
btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';
btn.onmouseover = function() { this.style.opacity = '1'; };
btn.onmouseout = function() { this.style.opacity = '0.7'; };
btn.onclick = function() {
navigator.clipboard.writeText(codeBlock.textContent).then(function() {
btn.textContent = 'Copied!';
setTimeout(function() { btn.textContent = 'Copy'; }, 1500);
});
};
codeBlock.parentElement.style.position = 'relative';
codeBlock.parentElement.appendChild(btn);
});
}
addCopyButtons();
// Re-run on dynamic content
var observer = new MutationObserver(addCopyButtons);
observer.observe(document.body, { childList: true, subtree: true });
})();
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
GitHub - Mapkov2/MidnightSimpleUnitFrames: Midnight Simple Unit Frames is a lightweight unitframe addon focused on a clean, readable layout · GitHub
Skip to content

Repository files navigation

Midnight Simple Unit Frames logo

Midnight Simple Unit Frames

Clean, highly configurable unit frames, group frames, castbars and auras for World of Warcraft Retail.

Download MSUF on CurseForgeDownload MSUF on Wago AddonsJoin the MSUF Discord

MSUF version 6.0 RC18World of Warcraft Retail 12.1Latest GitHub commit

Important

6.0 RC18 is a prerelease build. Release candidates continue to use the Beta channel on addon platforms until the final 6.0 release.

What is MSUF?

Midnight Simple Unit Frames (MSUF) is a complete, customizable replacement for Blizzard's unit and group frames. It brings player, target, focus, focus-target, boss, party and raid frames together with castbars, auras and class resources in one consistent interface.

MSUF is made for players who want clear combat information, extensive visual control and a lightweight event-driven runtime. The full configuration UI and the optional Assistant load only when requested.

Signature per-frame Fill Direction: MSUF lets each Unit Frame fill its Health and Power bars horizontally from left to right or right to left, or vertically from bottom to top or top to bottom. This per-frame combination of vertical and mirrored bar layouts is a level of control not currently offered by other unit-frame addons.

Basic features

  • Custom Player, Target, Focus, Focus Target, Pet, Target-of-Target and Boss frames
  • Party, Raid and Mythic Raid group frames
  • Configurable health, power, absorb and heal-absorb displays
  • Per-frame horizontal and vertical Health/Power fill directions in all four directions
  • Player, Target, Focus and Boss castbars
  • Buffs, debuffs, defensive auras, private auras and spell indicators
  • 2D and class-icon portraits with multiple shapes and placements
  • Custom name, health, power, status and castbar text
  • Class colors, reaction colors, custom colors, gradients, fonts and textures
  • Aggro, dispel, purge, range, role, leader, raid-marker and status indicators
  • Class Power displays for class resources
  • Full Edit Mode positioning, previews, snapping and layer controls
  • Profiles, specialization switching and profile import/export
  • Searchable options, guided setup and recovery tools
  • Optional Masque, LibSharedMedia and Clique integration

Feature highlights

AreaHighlights
Unit FramesPlayer, Target, Focus, Focus Target, Pet, Target-of-Target and Boss frames with configurable health, power, text, portraits, colors, textures, layers and status indicators. Every frame can fill its Health and Power bars horizontally or vertically in either direction.
Group FramesParty, Raid and Mythic Raid layouts with role/status indicators, range fading, spell indicators, healer tools and native private-aura support.
Auras 3Blizzard-native 12.1 aura containers, custom spell matching, per-lane filters, icon shapes, cooldown text, growth/layout controls and portrait tracking.
CastbarsPlayer, Target, Focus and Boss castbars with interrupt feedback, channel support, configurable text/icons, rounded styling and secret-safe timing paths.
Edit ModeLive frame positioning, draggable elements, previews, snapping, layer controls and direct navigation to the matching setting.
ProfilesSpecialization-aware profiles, copy tools and robust import/export including migration from legacy 5.x profiles.

More included

  • Configurable Class Power displays, including an optional Guardian Druid Ironfur tracker
  • SharedMedia textures and fonts, Masque support and Clique compatibility
  • Searchable, load-on-demand options with guided setup and recovery tools
  • Optional load-on-demand MSUF Assistant for local feature help and safe setting changes
  • Twelve included locales: English, German, French, Spanish, Italian, Portuguese, Russian, Korean and Simplified/Traditional Chinese
  • Performance-oriented event routing designed to stay quiet when features are disabled

Install and open

  1. Install MSUF through CurseForge or Wago Addons.
  2. For a manual installation, keep all three packaged folders together in World of Warcraft/_retail_/Interface/AddOns:
    • MidnightSimpleUnitFrames
    • MidnightSimpleUnitFrames_Options
    • MidnightSimpleUnitFrames_Assistant
  3. Reload the game and type /msuf to open the configuration menu.

The Core addon runs normally without opening Options or the Assistant. Both companions are loaded on demand.

Compatibility

GameWorld of Warcraft Retail
Interface versions12.0.7 and 12.1.0
Current source version6.0 RC18
Main command/msuf
Optional integrationsMasque, LibSharedMedia, Clique and WagoAnalytics

Developer APIs

Only APIs documented in this section are stable integration contracts. Arbitrary MSUF_* globals, frame registries, runtime namespaces and saved variables are implementation details.

MSUF.API.Nicknames V1 lets another addon provide display names for MSUF unit and group frames without frame hooks. It is event-driven: there is no polling, ticker or idle OnUpdate; providers and nickname refreshes never run in combat. Changes reported in combat are coalesced and applied once after PLAYER_REGEN_ENABLED.

localOWNER="YourAddon"localPRIORITY=50localMSUF=_G.MSUFlocalAPI=MSUFandMSUF.APIandMSUF.API.NicknameslocalfunctionResolveNickname(unit, nativeName, fullName)
localnickname=YourAddon:GetNickname(unit)
returnnickname~=nativeNameandnicknameornilendlocalfunctionSetNicknameProviderEnabled(enabled)
ifnot (APIandAPI.GetVersion() >=1) thenreturnendifenabledthenAPI.RegisterProvider(OWNER, ResolveNickname, PRIORITY)
elseAPI.UnregisterProvider(OWNER)
endendlocalfunctionNotifyNicknamesChanged(unit)
ifAPIandAPI.IsProviderRegistered(OWNER) thenAPI.NotifyChanged(OWNER, unit)
endend

Add ## OptionalDeps: MidnightSimpleUnitFrames when MSUF should load before the provider. RegisterProvider(owner, resolver, priority) accepts an optional numeric priority; higher priorities run first. Use UnregisterProvider(owner) when the integration is disabled. Call the enable function once after loading the provider's persisted state, and call the change notification with the changed unit token. Omit the unit only for bulk database changes or enabled-state changes that affect every displayed name.

Edit Mode provider integration

MSUF_EditModeAPI V1 lets another addon expose its own movable frames inside MSUF Edit Mode. The provider keeps ownership of frame creation, saved positions, profiles, anchors and protected-frame operations; MSUF supplies the mover, selection, grid/snap, arrow nudge, Undo/Redo and Save/Discard shell.

Feature-detect and register after adding the same optional dependency:

localEditMode=_G.MSUF_EditModeAPIifnotEditModeorEditMode.GetVersion() <1thenreturnendlocalok, reason=EditMode.RegisterElements("YourAddon", {
{
id="main",
label="Your Addon Frames",
group="Your Addon",
order=100,
getFrame=function()
returnYourAddon.GetMovableContainer()
end,
getPosition=function()
localpoint, relativeToName, relativePoint, x, y=YourAddon.GetPosition()
return {
point=point,
relativeToName=relativeToName,
relativePoint=relativePoint,
offsetX=x,
offsetY=y,
}
end,
setPosition=function(position, changeReason)
returnYourAddon.SetPosition(position, changeReason)
end,
-- Optional links/actions shown by the MSUF-owned popup.openSettings=YourAddon.OpenSettings,
resetPosition=YourAddon.ResetPosition,
},
})
ifnotokthenprint("YourAddon: MSUF Edit Mode registration failed: " ..tostring(reason))
end

Each id is stable within its owner and represents one independently movable frame or container. A provider may instead implement the advanced transaction callbacks captureState, restoreState, and movePosition when a simple position table is insufficient.

Notify MSUF only after an event changes availability or geometry:

MSUF_EditModeAPI.RefreshElement("YourAddon", "main")
-- or refresh every registered element owned by the addon:MSUF_EditModeAPI.RefreshOwner("YourAddon")

These are cold event notifications, not per-frame APIs. Registration installs no polling, ticker, global hook, or idle OnUpdate. Configuration writes are rejected during combat, and providers must enforce their own protected-frame rules inside callbacks. Dynamic teardown uses UnregisterElement("YourAddon", "main") or UnregisterOwner("YourAddon").

Support development

If MSUF improves your UI, you can support continued development through any of the links below. These are the same official links shown inside the MSUF Dashboard.

Support MSUF on PatreonSupport MSUF with PayPalSupport MSUF on Ko-fi

Patreon · PayPal · Ko-fi

Community and feedback

Join the MSUF DiscordView the MSUF source on GitHub

  • Ask questions, share profiles and report gameplay issues on the MSUF Discord.
  • Report reproducible bugs through GitHub Issues.
  • Browse and share community profiles through Wago.

When reporting a bug, please include your MSUF version, WoW client version, affected frame and exact reproduction steps.


Made for players who want powerful frames without a heavy runtime.

About

Midnight Simple Unit Frames is a lightweight unitframe addon focused on a clean, readable layout

Resources

Stars

9 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { // Force GitHub README to respect dark mode (function() { var style = document.createElement('style'); style.textContent = ' .markdown-body { color-scheme: dark light; } .markdown-body pre { background: #161b22 !important; } .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; } .markdown-body table th, .markdown-body table td { border-color: #30363d !important; } .markdown-body img { background: #0d1117; } .markdown-body blockquote { border-left-color: #8b949e; } .markdown-body hr { border-color: #30363d; } '; document.head.appendChild(style); })(); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' GitHub - Mapkov2/MidnightSimpleUnitFrames: Midnight Simple Unit Frames is a lightweight unitframe addon focused on a clean, readable layout · GitHub
Skip to content

Repository files navigation

Midnight Simple Unit Frames logo

Midnight Simple Unit Frames

Clean, highly configurable unit frames, group frames, castbars and auras for World of Warcraft Retail.

Download MSUF on CurseForgeDownload MSUF on Wago AddonsJoin the MSUF Discord

MSUF version 6.0 RC18World of Warcraft Retail 12.1Latest GitHub commit

Important

6.0 RC18 is a prerelease build. Release candidates continue to use the Beta channel on addon platforms until the final 6.0 release.

What is MSUF?

Midnight Simple Unit Frames (MSUF) is a complete, customizable replacement for Blizzard's unit and group frames. It brings player, target, focus, focus-target, boss, party and raid frames together with castbars, auras and class resources in one consistent interface.

MSUF is made for players who want clear combat information, extensive visual control and a lightweight event-driven runtime. The full configuration UI and the optional Assistant load only when requested.

Signature per-frame Fill Direction: MSUF lets each Unit Frame fill its Health and Power bars horizontally from left to right or right to left, or vertically from bottom to top or top to bottom. This per-frame combination of vertical and mirrored bar layouts is a level of control not currently offered by other unit-frame addons.

Basic features

  • Custom Player, Target, Focus, Focus Target, Pet, Target-of-Target and Boss frames
  • Party, Raid and Mythic Raid group frames
  • Configurable health, power, absorb and heal-absorb displays
  • Per-frame horizontal and vertical Health/Power fill directions in all four directions
  • Player, Target, Focus and Boss castbars
  • Buffs, debuffs, defensive auras, private auras and spell indicators
  • 2D and class-icon portraits with multiple shapes and placements
  • Custom name, health, power, status and castbar text
  • Class colors, reaction colors, custom colors, gradients, fonts and textures
  • Aggro, dispel, purge, range, role, leader, raid-marker and status indicators
  • Class Power displays for class resources
  • Full Edit Mode positioning, previews, snapping and layer controls
  • Profiles, specialization switching and profile import/export
  • Searchable options, guided setup and recovery tools
  • Optional Masque, LibSharedMedia and Clique integration

Feature highlights

AreaHighlights
Unit FramesPlayer, Target, Focus, Focus Target, Pet, Target-of-Target and Boss frames with configurable health, power, text, portraits, colors, textures, layers and status indicators. Every frame can fill its Health and Power bars horizontally or vertically in either direction.
Group FramesParty, Raid and Mythic Raid layouts with role/status indicators, range fading, spell indicators, healer tools and native private-aura support.
Auras 3Blizzard-native 12.1 aura containers, custom spell matching, per-lane filters, icon shapes, cooldown text, growth/layout controls and portrait tracking.
CastbarsPlayer, Target, Focus and Boss castbars with interrupt feedback, channel support, configurable text/icons, rounded styling and secret-safe timing paths.
Edit ModeLive frame positioning, draggable elements, previews, snapping, layer controls and direct navigation to the matching setting.
ProfilesSpecialization-aware profiles, copy tools and robust import/export including migration from legacy 5.x profiles.

More included

  • Configurable Class Power displays, including an optional Guardian Druid Ironfur tracker
  • SharedMedia textures and fonts, Masque support and Clique compatibility
  • Searchable, load-on-demand options with guided setup and recovery tools
  • Optional load-on-demand MSUF Assistant for local feature help and safe setting changes
  • Twelve included locales: English, German, French, Spanish, Italian, Portuguese, Russian, Korean and Simplified/Traditional Chinese
  • Performance-oriented event routing designed to stay quiet when features are disabled

Install and open

  1. Install MSUF through CurseForge or Wago Addons.
  2. For a manual installation, keep all three packaged folders together in World of Warcraft/_retail_/Interface/AddOns:
    • MidnightSimpleUnitFrames
    • MidnightSimpleUnitFrames_Options
    • MidnightSimpleUnitFrames_Assistant
  3. Reload the game and type /msuf to open the configuration menu.

The Core addon runs normally without opening Options or the Assistant. Both companions are loaded on demand.

Compatibility

GameWorld of Warcraft Retail
Interface versions12.0.7 and 12.1.0
Current source version6.0 RC18
Main command/msuf
Optional integrationsMasque, LibSharedMedia, Clique and WagoAnalytics

Developer APIs

Only APIs documented in this section are stable integration contracts. Arbitrary MSUF_* globals, frame registries, runtime namespaces and saved variables are implementation details.

MSUF.API.Nicknames V1 lets another addon provide display names for MSUF unit and group frames without frame hooks. It is event-driven: there is no polling, ticker or idle OnUpdate; providers and nickname refreshes never run in combat. Changes reported in combat are coalesced and applied once after PLAYER_REGEN_ENABLED.

localOWNER="YourAddon"localPRIORITY=50localMSUF=_G.MSUFlocalAPI=MSUFandMSUF.APIandMSUF.API.NicknameslocalfunctionResolveNickname(unit, nativeName, fullName)
localnickname=YourAddon:GetNickname(unit)
returnnickname~=nativeNameandnicknameornilendlocalfunctionSetNicknameProviderEnabled(enabled)
ifnot (APIandAPI.GetVersion() >=1) thenreturnendifenabledthenAPI.RegisterProvider(OWNER, ResolveNickname, PRIORITY)
elseAPI.UnregisterProvider(OWNER)
endendlocalfunctionNotifyNicknamesChanged(unit)
ifAPIandAPI.IsProviderRegistered(OWNER) thenAPI.NotifyChanged(OWNER, unit)
endend

Add ## OptionalDeps: MidnightSimpleUnitFrames when MSUF should load before the provider. RegisterProvider(owner, resolver, priority) accepts an optional numeric priority; higher priorities run first. Use UnregisterProvider(owner) when the integration is disabled. Call the enable function once after loading the provider's persisted state, and call the change notification with the changed unit token. Omit the unit only for bulk database changes or enabled-state changes that affect every displayed name.

Edit Mode provider integration

MSUF_EditModeAPI V1 lets another addon expose its own movable frames inside MSUF Edit Mode. The provider keeps ownership of frame creation, saved positions, profiles, anchors and protected-frame operations; MSUF supplies the mover, selection, grid/snap, arrow nudge, Undo/Redo and Save/Discard shell.

Feature-detect and register after adding the same optional dependency:

localEditMode=_G.MSUF_EditModeAPIifnotEditModeorEditMode.GetVersion() <1thenreturnendlocalok, reason=EditMode.RegisterElements("YourAddon", {
{
id="main",
label="Your Addon Frames",
group="Your Addon",
order=100,
getFrame=function()
returnYourAddon.GetMovableContainer()
end,
getPosition=function()
localpoint, relativeToName, relativePoint, x, y=YourAddon.GetPosition()
return {
point=point,
relativeToName=relativeToName,
relativePoint=relativePoint,
offsetX=x,
offsetY=y,
}
end,
setPosition=function(position, changeReason)
returnYourAddon.SetPosition(position, changeReason)
end,
-- Optional links/actions shown by the MSUF-owned popup.openSettings=YourAddon.OpenSettings,
resetPosition=YourAddon.ResetPosition,
},
})
ifnotokthenprint("YourAddon: MSUF Edit Mode registration failed: " ..tostring(reason))
end

Each id is stable within its owner and represents one independently movable frame or container. A provider may instead implement the advanced transaction callbacks captureState, restoreState, and movePosition when a simple position table is insufficient.

Notify MSUF only after an event changes availability or geometry:

MSUF_EditModeAPI.RefreshElement("YourAddon", "main")
-- or refresh every registered element owned by the addon:MSUF_EditModeAPI.RefreshOwner("YourAddon")

These are cold event notifications, not per-frame APIs. Registration installs no polling, ticker, global hook, or idle OnUpdate. Configuration writes are rejected during combat, and providers must enforce their own protected-frame rules inside callbacks. Dynamic teardown uses UnregisterElement("YourAddon", "main") or UnregisterOwner("YourAddon").

Support development

If MSUF improves your UI, you can support continued development through any of the links below. These are the same official links shown inside the MSUF Dashboard.

Support MSUF on PatreonSupport MSUF with PayPalSupport MSUF on Ko-fi

Patreon · PayPal · Ko-fi

Community and feedback

Join the MSUF DiscordView the MSUF source on GitHub

  • Ask questions, share profiles and report gameplay issues on the MSUF Discord.
  • Report reproducible bugs through GitHub Issues.
  • Browse and share community profiles through Wago.

When reporting a bug, please include your MSUF version, WoW client version, affected frame and exact reproduction steps.


Made for players who want powerful frames without a heavy runtime.

About

Midnight Simple Unit Frames is a lightweight unitframe addon focused on a clean, readable layout

Resources

Stars

9 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { // Highlight search terms from Google/DuckDuckGo/Bing referrer (function() { var ref = document.referrer; var terms = []; if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) { var url = new URL(ref); var q = url.searchParams.get('q') || url.searchParams.get('p'); if (q) { terms = q.split(/\s+/).filter(function(t) { return t.length > 2; }); } } if (terms.length === 0) return; var style = document.createElement('style'); style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }'; document.head.appendChild(style); function highlight(node) { if (node.nodeType === 3) { // text node var text = node.textContent; var found = false; terms.forEach(function(term) { var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\]\\]/g, '\\') + ')', 'gi'); if (regex.test(text)) { found = true; var frag = document.createDocumentFragment(); var parts = text.split(regex); parts.forEach(function(part, i) { if (i % 2 === 0) { frag.appendChild(document.createTextNode(part)); } else { var span = document.createElement('span'); span.className = 'userscript-highlight'; span.textContent = part; frag.appendChild(span); } }); node.parentNode.replaceChild(frag, node); } }); } else if (node.nodeType === 1 && node.childNodes) { // element var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT']; if (!skipTags.includes(node.tagName)) { Array.from(node.childNodes).forEach(highlight); } } } highlight(document.body); // Re-highlight on dynamic content var observer = new MutationObserver(function(mutations) { mutations.forEach(function(m) { m.addedNodes.forEach(function(node) { if (node.nodeType === 1 || node.nodeType === 3) highlight(node); }); }); }); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' GitHub - Mapkov2/MidnightSimpleUnitFrames: Midnight Simple Unit Frames is a lightweight unitframe addon focused on a clean, readable layout · GitHub
Skip to content

Repository files navigation

Midnight Simple Unit Frames logo

Midnight Simple Unit Frames

Clean, highly configurable unit frames, group frames, castbars and auras for World of Warcraft Retail.

Download MSUF on CurseForgeDownload MSUF on Wago AddonsJoin the MSUF Discord

MSUF version 6.0 RC18World of Warcraft Retail 12.1Latest GitHub commit

Important

6.0 RC18 is a prerelease build. Release candidates continue to use the Beta channel on addon platforms until the final 6.0 release.

What is MSUF?

Midnight Simple Unit Frames (MSUF) is a complete, customizable replacement for Blizzard's unit and group frames. It brings player, target, focus, focus-target, boss, party and raid frames together with castbars, auras and class resources in one consistent interface.

MSUF is made for players who want clear combat information, extensive visual control and a lightweight event-driven runtime. The full configuration UI and the optional Assistant load only when requested.

Signature per-frame Fill Direction: MSUF lets each Unit Frame fill its Health and Power bars horizontally from left to right or right to left, or vertically from bottom to top or top to bottom. This per-frame combination of vertical and mirrored bar layouts is a level of control not currently offered by other unit-frame addons.

Basic features

  • Custom Player, Target, Focus, Focus Target, Pet, Target-of-Target and Boss frames
  • Party, Raid and Mythic Raid group frames
  • Configurable health, power, absorb and heal-absorb displays
  • Per-frame horizontal and vertical Health/Power fill directions in all four directions
  • Player, Target, Focus and Boss castbars
  • Buffs, debuffs, defensive auras, private auras and spell indicators
  • 2D and class-icon portraits with multiple shapes and placements
  • Custom name, health, power, status and castbar text
  • Class colors, reaction colors, custom colors, gradients, fonts and textures
  • Aggro, dispel, purge, range, role, leader, raid-marker and status indicators
  • Class Power displays for class resources
  • Full Edit Mode positioning, previews, snapping and layer controls
  • Profiles, specialization switching and profile import/export
  • Searchable options, guided setup and recovery tools
  • Optional Masque, LibSharedMedia and Clique integration

Feature highlights

AreaHighlights
Unit FramesPlayer, Target, Focus, Focus Target, Pet, Target-of-Target and Boss frames with configurable health, power, text, portraits, colors, textures, layers and status indicators. Every frame can fill its Health and Power bars horizontally or vertically in either direction.
Group FramesParty, Raid and Mythic Raid layouts with role/status indicators, range fading, spell indicators, healer tools and native private-aura support.
Auras 3Blizzard-native 12.1 aura containers, custom spell matching, per-lane filters, icon shapes, cooldown text, growth/layout controls and portrait tracking.
CastbarsPlayer, Target, Focus and Boss castbars with interrupt feedback, channel support, configurable text/icons, rounded styling and secret-safe timing paths.
Edit ModeLive frame positioning, draggable elements, previews, snapping, layer controls and direct navigation to the matching setting.
ProfilesSpecialization-aware profiles, copy tools and robust import/export including migration from legacy 5.x profiles.

More included

  • Configurable Class Power displays, including an optional Guardian Druid Ironfur tracker
  • SharedMedia textures and fonts, Masque support and Clique compatibility
  • Searchable, load-on-demand options with guided setup and recovery tools
  • Optional load-on-demand MSUF Assistant for local feature help and safe setting changes
  • Twelve included locales: English, German, French, Spanish, Italian, Portuguese, Russian, Korean and Simplified/Traditional Chinese
  • Performance-oriented event routing designed to stay quiet when features are disabled

Install and open

  1. Install MSUF through CurseForge or Wago Addons.
  2. For a manual installation, keep all three packaged folders together in World of Warcraft/_retail_/Interface/AddOns:
    • MidnightSimpleUnitFrames
    • MidnightSimpleUnitFrames_Options
    • MidnightSimpleUnitFrames_Assistant
  3. Reload the game and type /msuf to open the configuration menu.

The Core addon runs normally without opening Options or the Assistant. Both companions are loaded on demand.

Compatibility

GameWorld of Warcraft Retail
Interface versions12.0.7 and 12.1.0
Current source version6.0 RC18
Main command/msuf
Optional integrationsMasque, LibSharedMedia, Clique and WagoAnalytics

Developer APIs

Only APIs documented in this section are stable integration contracts. Arbitrary MSUF_* globals, frame registries, runtime namespaces and saved variables are implementation details.

MSUF.API.Nicknames V1 lets another addon provide display names for MSUF unit and group frames without frame hooks. It is event-driven: there is no polling, ticker or idle OnUpdate; providers and nickname refreshes never run in combat. Changes reported in combat are coalesced and applied once after PLAYER_REGEN_ENABLED.

localOWNER="YourAddon"localPRIORITY=50localMSUF=_G.MSUFlocalAPI=MSUFandMSUF.APIandMSUF.API.NicknameslocalfunctionResolveNickname(unit, nativeName, fullName)
localnickname=YourAddon:GetNickname(unit)
returnnickname~=nativeNameandnicknameornilendlocalfunctionSetNicknameProviderEnabled(enabled)
ifnot (APIandAPI.GetVersion() >=1) thenreturnendifenabledthenAPI.RegisterProvider(OWNER, ResolveNickname, PRIORITY)
elseAPI.UnregisterProvider(OWNER)
endendlocalfunctionNotifyNicknamesChanged(unit)
ifAPIandAPI.IsProviderRegistered(OWNER) thenAPI.NotifyChanged(OWNER, unit)
endend

Add ## OptionalDeps: MidnightSimpleUnitFrames when MSUF should load before the provider. RegisterProvider(owner, resolver, priority) accepts an optional numeric priority; higher priorities run first. Use UnregisterProvider(owner) when the integration is disabled. Call the enable function once after loading the provider's persisted state, and call the change notification with the changed unit token. Omit the unit only for bulk database changes or enabled-state changes that affect every displayed name.

Edit Mode provider integration

MSUF_EditModeAPI V1 lets another addon expose its own movable frames inside MSUF Edit Mode. The provider keeps ownership of frame creation, saved positions, profiles, anchors and protected-frame operations; MSUF supplies the mover, selection, grid/snap, arrow nudge, Undo/Redo and Save/Discard shell.

Feature-detect and register after adding the same optional dependency:

localEditMode=_G.MSUF_EditModeAPIifnotEditModeorEditMode.GetVersion() <1thenreturnendlocalok, reason=EditMode.RegisterElements("YourAddon", {
{
id="main",
label="Your Addon Frames",
group="Your Addon",
order=100,
getFrame=function()
returnYourAddon.GetMovableContainer()
end,
getPosition=function()
localpoint, relativeToName, relativePoint, x, y=YourAddon.GetPosition()
return {
point=point,
relativeToName=relativeToName,
relativePoint=relativePoint,
offsetX=x,
offsetY=y,
}
end,
setPosition=function(position, changeReason)
returnYourAddon.SetPosition(position, changeReason)
end,
-- Optional links/actions shown by the MSUF-owned popup.openSettings=YourAddon.OpenSettings,
resetPosition=YourAddon.ResetPosition,
},
})
ifnotokthenprint("YourAddon: MSUF Edit Mode registration failed: " ..tostring(reason))
end

Each id is stable within its owner and represents one independently movable frame or container. A provider may instead implement the advanced transaction callbacks captureState, restoreState, and movePosition when a simple position table is insufficient.

Notify MSUF only after an event changes availability or geometry:

MSUF_EditModeAPI.RefreshElement("YourAddon", "main")
-- or refresh every registered element owned by the addon:MSUF_EditModeAPI.RefreshOwner("YourAddon")

These are cold event notifications, not per-frame APIs. Registration installs no polling, ticker, global hook, or idle OnUpdate. Configuration writes are rejected during combat, and providers must enforce their own protected-frame rules inside callbacks. Dynamic teardown uses UnregisterElement("YourAddon", "main") or UnregisterOwner("YourAddon").

Support development

If MSUF improves your UI, you can support continued development through any of the links below. These are the same official links shown inside the MSUF Dashboard.

Support MSUF on PatreonSupport MSUF with PayPalSupport MSUF on Ko-fi

Patreon · PayPal · Ko-fi

Community and feedback

Join the MSUF DiscordView the MSUF source on GitHub

  • Ask questions, share profiles and report gameplay issues on the MSUF Discord.
  • Report reproducible bugs through GitHub Issues.
  • Browse and share community profiles through Wago.

When reporting a bug, please include your MSUF version, WoW client version, affected frame and exact reproduction steps.


Made for players who want powerful frames without a heavy runtime.

About

Midnight Simple Unit Frames is a lightweight unitframe addon focused on a clean, readable layout

Resources

Stars

9 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { // Strip utm_, fbclid, gclid, etc. from all links on page (function() { var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content', 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid', 'ref', 'ref_src', 'source', 'medium', 'campaign']; function cleanUrl(url) { try { var u = new URL(url, window.location.origin); var changed = false; trackingParams.forEach(function(p) { if (u.searchParams.has(p)) { u.searchParams.delete(p); changed = true; } }); return changed ? u.toString() : url; } catch (e) { return url; } } function cleanLinks() { document.querySelectorAll('a[href]').forEach(function(a) { var clean = cleanUrl(a.href); if (clean !== a.href) a.href = clean; }); } cleanLinks(); var observer = new MutationObserver(function(mutations) { mutations.forEach(function(m) { m.addedNodes.forEach(function(node) { if (node.nodeType === 1) { if (node.tagName === 'A') cleanLinks(); node.querySelectorAll('a[href]').forEach(function(a) { var clean = cleanUrl(a.href); if (clean !== a.href) a.href = clean; }); } }); }); }); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + ' GitHub - Mapkov2/MidnightSimpleUnitFrames: Midnight Simple Unit Frames is a lightweight unitframe addon focused on a clean, readable layout · GitHub
Skip to content

Repository files navigation

Midnight Simple Unit Frames logo

Midnight Simple Unit Frames

Clean, highly configurable unit frames, group frames, castbars and auras for World of Warcraft Retail.

Download MSUF on CurseForgeDownload MSUF on Wago AddonsJoin the MSUF Discord

MSUF version 6.0 RC18World of Warcraft Retail 12.1Latest GitHub commit

Important

6.0 RC18 is a prerelease build. Release candidates continue to use the Beta channel on addon platforms until the final 6.0 release.

What is MSUF?

Midnight Simple Unit Frames (MSUF) is a complete, customizable replacement for Blizzard's unit and group frames. It brings player, target, focus, focus-target, boss, party and raid frames together with castbars, auras and class resources in one consistent interface.

MSUF is made for players who want clear combat information, extensive visual control and a lightweight event-driven runtime. The full configuration UI and the optional Assistant load only when requested.

Signature per-frame Fill Direction: MSUF lets each Unit Frame fill its Health and Power bars horizontally from left to right or right to left, or vertically from bottom to top or top to bottom. This per-frame combination of vertical and mirrored bar layouts is a level of control not currently offered by other unit-frame addons.

Basic features

  • Custom Player, Target, Focus, Focus Target, Pet, Target-of-Target and Boss frames
  • Party, Raid and Mythic Raid group frames
  • Configurable health, power, absorb and heal-absorb displays
  • Per-frame horizontal and vertical Health/Power fill directions in all four directions
  • Player, Target, Focus and Boss castbars
  • Buffs, debuffs, defensive auras, private auras and spell indicators
  • 2D and class-icon portraits with multiple shapes and placements
  • Custom name, health, power, status and castbar text
  • Class colors, reaction colors, custom colors, gradients, fonts and textures
  • Aggro, dispel, purge, range, role, leader, raid-marker and status indicators
  • Class Power displays for class resources
  • Full Edit Mode positioning, previews, snapping and layer controls
  • Profiles, specialization switching and profile import/export
  • Searchable options, guided setup and recovery tools
  • Optional Masque, LibSharedMedia and Clique integration

Feature highlights

AreaHighlights
Unit FramesPlayer, Target, Focus, Focus Target, Pet, Target-of-Target and Boss frames with configurable health, power, text, portraits, colors, textures, layers and status indicators. Every frame can fill its Health and Power bars horizontally or vertically in either direction.
Group FramesParty, Raid and Mythic Raid layouts with role/status indicators, range fading, spell indicators, healer tools and native private-aura support.
Auras 3Blizzard-native 12.1 aura containers, custom spell matching, per-lane filters, icon shapes, cooldown text, growth/layout controls and portrait tracking.
CastbarsPlayer, Target, Focus and Boss castbars with interrupt feedback, channel support, configurable text/icons, rounded styling and secret-safe timing paths.
Edit ModeLive frame positioning, draggable elements, previews, snapping, layer controls and direct navigation to the matching setting.
ProfilesSpecialization-aware profiles, copy tools and robust import/export including migration from legacy 5.x profiles.

More included

  • Configurable Class Power displays, including an optional Guardian Druid Ironfur tracker
  • SharedMedia textures and fonts, Masque support and Clique compatibility
  • Searchable, load-on-demand options with guided setup and recovery tools
  • Optional load-on-demand MSUF Assistant for local feature help and safe setting changes
  • Twelve included locales: English, German, French, Spanish, Italian, Portuguese, Russian, Korean and Simplified/Traditional Chinese
  • Performance-oriented event routing designed to stay quiet when features are disabled

Install and open

  1. Install MSUF through CurseForge or Wago Addons.
  2. For a manual installation, keep all three packaged folders together in World of Warcraft/_retail_/Interface/AddOns:
    • MidnightSimpleUnitFrames
    • MidnightSimpleUnitFrames_Options
    • MidnightSimpleUnitFrames_Assistant
  3. Reload the game and type /msuf to open the configuration menu.

The Core addon runs normally without opening Options or the Assistant. Both companions are loaded on demand.

Compatibility

GameWorld of Warcraft Retail
Interface versions12.0.7 and 12.1.0
Current source version6.0 RC18
Main command/msuf
Optional integrationsMasque, LibSharedMedia, Clique and WagoAnalytics

Developer APIs

Only APIs documented in this section are stable integration contracts. Arbitrary MSUF_* globals, frame registries, runtime namespaces and saved variables are implementation details.

MSUF.API.Nicknames V1 lets another addon provide display names for MSUF unit and group frames without frame hooks. It is event-driven: there is no polling, ticker or idle OnUpdate; providers and nickname refreshes never run in combat. Changes reported in combat are coalesced and applied once after PLAYER_REGEN_ENABLED.

localOWNER="YourAddon"localPRIORITY=50localMSUF=_G.MSUFlocalAPI=MSUFandMSUF.APIandMSUF.API.NicknameslocalfunctionResolveNickname(unit, nativeName, fullName)
localnickname=YourAddon:GetNickname(unit)
returnnickname~=nativeNameandnicknameornilendlocalfunctionSetNicknameProviderEnabled(enabled)
ifnot (APIandAPI.GetVersion() >=1) thenreturnendifenabledthenAPI.RegisterProvider(OWNER, ResolveNickname, PRIORITY)
elseAPI.UnregisterProvider(OWNER)
endendlocalfunctionNotifyNicknamesChanged(unit)
ifAPIandAPI.IsProviderRegistered(OWNER) thenAPI.NotifyChanged(OWNER, unit)
endend

Add ## OptionalDeps: MidnightSimpleUnitFrames when MSUF should load before the provider. RegisterProvider(owner, resolver, priority) accepts an optional numeric priority; higher priorities run first. Use UnregisterProvider(owner) when the integration is disabled. Call the enable function once after loading the provider's persisted state, and call the change notification with the changed unit token. Omit the unit only for bulk database changes or enabled-state changes that affect every displayed name.

Edit Mode provider integration

MSUF_EditModeAPI V1 lets another addon expose its own movable frames inside MSUF Edit Mode. The provider keeps ownership of frame creation, saved positions, profiles, anchors and protected-frame operations; MSUF supplies the mover, selection, grid/snap, arrow nudge, Undo/Redo and Save/Discard shell.

Feature-detect and register after adding the same optional dependency:

localEditMode=_G.MSUF_EditModeAPIifnotEditModeorEditMode.GetVersion() <1thenreturnendlocalok, reason=EditMode.RegisterElements("YourAddon", {
{
id="main",
label="Your Addon Frames",
group="Your Addon",
order=100,
getFrame=function()
returnYourAddon.GetMovableContainer()
end,
getPosition=function()
localpoint, relativeToName, relativePoint, x, y=YourAddon.GetPosition()
return {
point=point,
relativeToName=relativeToName,
relativePoint=relativePoint,
offsetX=x,
offsetY=y,
}
end,
setPosition=function(position, changeReason)
returnYourAddon.SetPosition(position, changeReason)
end,
-- Optional links/actions shown by the MSUF-owned popup.openSettings=YourAddon.OpenSettings,
resetPosition=YourAddon.ResetPosition,
},
})
ifnotokthenprint("YourAddon: MSUF Edit Mode registration failed: " ..tostring(reason))
end

Each id is stable within its owner and represents one independently movable frame or container. A provider may instead implement the advanced transaction callbacks captureState, restoreState, and movePosition when a simple position table is insufficient.

Notify MSUF only after an event changes availability or geometry:

MSUF_EditModeAPI.RefreshElement("YourAddon", "main")
-- or refresh every registered element owned by the addon:MSUF_EditModeAPI.RefreshOwner("YourAddon")

These are cold event notifications, not per-frame APIs. Registration installs no polling, ticker, global hook, or idle OnUpdate. Configuration writes are rejected during combat, and providers must enforce their own protected-frame rules inside callbacks. Dynamic teardown uses UnregisterElement("YourAddon", "main") or UnregisterOwner("YourAddon").

Support development

If MSUF improves your UI, you can support continued development through any of the links below. These are the same official links shown inside the MSUF Dashboard.

Support MSUF on PatreonSupport MSUF with PayPalSupport MSUF on Ko-fi

Patreon · PayPal · Ko-fi

Community and feedback

Join the MSUF DiscordView the MSUF source on GitHub

  • Ask questions, share profiles and report gameplay issues on the MSUF Discord.
  • Report reproducible bugs through GitHub Issues.
  • Browse and share community profiles through Wago.

When reporting a bug, please include your MSUF version, WoW client version, affected frame and exact reproduction steps.


Made for players who want powerful frames without a heavy runtime.

About

Midnight Simple Unit Frames is a lightweight unitframe addon focused on a clean, readable layout

Resources

Stars

9 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { // Auto-enable theater mode on YouTube (function() { function tryTheater() { var btn = document.querySelector('button[aria-label="Theater mode"], ytd-player #player button[title="Theater mode"]'); if (btn && !btn.classList.contains('activated')) { btn.click(); } } // Try immediately tryTheater(); // Try after navigation (SPA) var lastUrl = location.href; setInterval(function() { if (location.href !== lastUrl) { lastUrl = location.href; setTimeout(tryTheater, 500); } }, 1000); // Also try on player load var observer = new MutationObserver(tryTheater); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' GitHub - Mapkov2/MidnightSimpleUnitFrames: Midnight Simple Unit Frames is a lightweight unitframe addon focused on a clean, readable layout · GitHub
Skip to content

Repository files navigation

Midnight Simple Unit Frames logo

Midnight Simple Unit Frames

Clean, highly configurable unit frames, group frames, castbars and auras for World of Warcraft Retail.

Download MSUF on CurseForgeDownload MSUF on Wago AddonsJoin the MSUF Discord

MSUF version 6.0 RC18World of Warcraft Retail 12.1Latest GitHub commit

Important

6.0 RC18 is a prerelease build. Release candidates continue to use the Beta channel on addon platforms until the final 6.0 release.

What is MSUF?

Midnight Simple Unit Frames (MSUF) is a complete, customizable replacement for Blizzard's unit and group frames. It brings player, target, focus, focus-target, boss, party and raid frames together with castbars, auras and class resources in one consistent interface.

MSUF is made for players who want clear combat information, extensive visual control and a lightweight event-driven runtime. The full configuration UI and the optional Assistant load only when requested.

Signature per-frame Fill Direction: MSUF lets each Unit Frame fill its Health and Power bars horizontally from left to right or right to left, or vertically from bottom to top or top to bottom. This per-frame combination of vertical and mirrored bar layouts is a level of control not currently offered by other unit-frame addons.

Basic features

  • Custom Player, Target, Focus, Focus Target, Pet, Target-of-Target and Boss frames
  • Party, Raid and Mythic Raid group frames
  • Configurable health, power, absorb and heal-absorb displays
  • Per-frame horizontal and vertical Health/Power fill directions in all four directions
  • Player, Target, Focus and Boss castbars
  • Buffs, debuffs, defensive auras, private auras and spell indicators
  • 2D and class-icon portraits with multiple shapes and placements
  • Custom name, health, power, status and castbar text
  • Class colors, reaction colors, custom colors, gradients, fonts and textures
  • Aggro, dispel, purge, range, role, leader, raid-marker and status indicators
  • Class Power displays for class resources
  • Full Edit Mode positioning, previews, snapping and layer controls
  • Profiles, specialization switching and profile import/export
  • Searchable options, guided setup and recovery tools
  • Optional Masque, LibSharedMedia and Clique integration

Feature highlights

AreaHighlights
Unit FramesPlayer, Target, Focus, Focus Target, Pet, Target-of-Target and Boss frames with configurable health, power, text, portraits, colors, textures, layers and status indicators. Every frame can fill its Health and Power bars horizontally or vertically in either direction.
Group FramesParty, Raid and Mythic Raid layouts with role/status indicators, range fading, spell indicators, healer tools and native private-aura support.
Auras 3Blizzard-native 12.1 aura containers, custom spell matching, per-lane filters, icon shapes, cooldown text, growth/layout controls and portrait tracking.
CastbarsPlayer, Target, Focus and Boss castbars with interrupt feedback, channel support, configurable text/icons, rounded styling and secret-safe timing paths.
Edit ModeLive frame positioning, draggable elements, previews, snapping, layer controls and direct navigation to the matching setting.
ProfilesSpecialization-aware profiles, copy tools and robust import/export including migration from legacy 5.x profiles.

More included

  • Configurable Class Power displays, including an optional Guardian Druid Ironfur tracker
  • SharedMedia textures and fonts, Masque support and Clique compatibility
  • Searchable, load-on-demand options with guided setup and recovery tools
  • Optional load-on-demand MSUF Assistant for local feature help and safe setting changes
  • Twelve included locales: English, German, French, Spanish, Italian, Portuguese, Russian, Korean and Simplified/Traditional Chinese
  • Performance-oriented event routing designed to stay quiet when features are disabled

Install and open

  1. Install MSUF through CurseForge or Wago Addons.
  2. For a manual installation, keep all three packaged folders together in World of Warcraft/_retail_/Interface/AddOns:
    • MidnightSimpleUnitFrames
    • MidnightSimpleUnitFrames_Options
    • MidnightSimpleUnitFrames_Assistant
  3. Reload the game and type /msuf to open the configuration menu.

The Core addon runs normally without opening Options or the Assistant. Both companions are loaded on demand.

Compatibility

GameWorld of Warcraft Retail
Interface versions12.0.7 and 12.1.0
Current source version6.0 RC18
Main command/msuf
Optional integrationsMasque, LibSharedMedia, Clique and WagoAnalytics

Developer APIs

Only APIs documented in this section are stable integration contracts. Arbitrary MSUF_* globals, frame registries, runtime namespaces and saved variables are implementation details.

MSUF.API.Nicknames V1 lets another addon provide display names for MSUF unit and group frames without frame hooks. It is event-driven: there is no polling, ticker or idle OnUpdate; providers and nickname refreshes never run in combat. Changes reported in combat are coalesced and applied once after PLAYER_REGEN_ENABLED.

localOWNER="YourAddon"localPRIORITY=50localMSUF=_G.MSUFlocalAPI=MSUFandMSUF.APIandMSUF.API.NicknameslocalfunctionResolveNickname(unit, nativeName, fullName)
localnickname=YourAddon:GetNickname(unit)
returnnickname~=nativeNameandnicknameornilendlocalfunctionSetNicknameProviderEnabled(enabled)
ifnot (APIandAPI.GetVersion() >=1) thenreturnendifenabledthenAPI.RegisterProvider(OWNER, ResolveNickname, PRIORITY)
elseAPI.UnregisterProvider(OWNER)
endendlocalfunctionNotifyNicknamesChanged(unit)
ifAPIandAPI.IsProviderRegistered(OWNER) thenAPI.NotifyChanged(OWNER, unit)
endend

Add ## OptionalDeps: MidnightSimpleUnitFrames when MSUF should load before the provider. RegisterProvider(owner, resolver, priority) accepts an optional numeric priority; higher priorities run first. Use UnregisterProvider(owner) when the integration is disabled. Call the enable function once after loading the provider's persisted state, and call the change notification with the changed unit token. Omit the unit only for bulk database changes or enabled-state changes that affect every displayed name.

Edit Mode provider integration

MSUF_EditModeAPI V1 lets another addon expose its own movable frames inside MSUF Edit Mode. The provider keeps ownership of frame creation, saved positions, profiles, anchors and protected-frame operations; MSUF supplies the mover, selection, grid/snap, arrow nudge, Undo/Redo and Save/Discard shell.

Feature-detect and register after adding the same optional dependency:

localEditMode=_G.MSUF_EditModeAPIifnotEditModeorEditMode.GetVersion() <1thenreturnendlocalok, reason=EditMode.RegisterElements("YourAddon", {
{
id="main",
label="Your Addon Frames",
group="Your Addon",
order=100,
getFrame=function()
returnYourAddon.GetMovableContainer()
end,
getPosition=function()
localpoint, relativeToName, relativePoint, x, y=YourAddon.GetPosition()
return {
point=point,
relativeToName=relativeToName,
relativePoint=relativePoint,
offsetX=x,
offsetY=y,
}
end,
setPosition=function(position, changeReason)
returnYourAddon.SetPosition(position, changeReason)
end,
-- Optional links/actions shown by the MSUF-owned popup.openSettings=YourAddon.OpenSettings,
resetPosition=YourAddon.ResetPosition,
},
})
ifnotokthenprint("YourAddon: MSUF Edit Mode registration failed: " ..tostring(reason))
end

Each id is stable within its owner and represents one independently movable frame or container. A provider may instead implement the advanced transaction callbacks captureState, restoreState, and movePosition when a simple position table is insufficient.

Notify MSUF only after an event changes availability or geometry:

MSUF_EditModeAPI.RefreshElement("YourAddon", "main")
-- or refresh every registered element owned by the addon:MSUF_EditModeAPI.RefreshOwner("YourAddon")

These are cold event notifications, not per-frame APIs. Registration installs no polling, ticker, global hook, or idle OnUpdate. Configuration writes are rejected during combat, and providers must enforce their own protected-frame rules inside callbacks. Dynamic teardown uses UnregisterElement("YourAddon", "main") or UnregisterOwner("YourAddon").

Support development

If MSUF improves your UI, you can support continued development through any of the links below. These are the same official links shown inside the MSUF Dashboard.

Support MSUF on PatreonSupport MSUF with PayPalSupport MSUF on Ko-fi

Patreon · PayPal · Ko-fi

Community and feedback

Join the MSUF DiscordView the MSUF source on GitHub

  • Ask questions, share profiles and report gameplay issues on the MSUF Discord.
  • Report reproducible bugs through GitHub Issues.
  • Browse and share community profiles through Wago.

When reporting a bug, please include your MSUF version, WoW client version, affected frame and exact reproduction steps.


Made for players who want powerful frames without a heavy runtime.

About

Midnight Simple Unit Frames is a lightweight unitframe addon focused on a clean, readable layout

Resources

Stars

9 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { // Remove or un-stick sticky/fixed headers that block content (function() { function unstick() { document.querySelectorAll('header, nav, [role="banner"], .header, .navbar, .sticky, .fixed-top, [style*="position: fixed"], [style*="position:sticky"]').forEach(function(el) { if (el.style.position === 'fixed' || el.style.position === 'sticky' || getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') { el.style.position = 'static'; el.style.top = 'auto'; el.style.zIndex = 'auto'; } }); } unstick(); var observer = new MutationObserver(unstick); observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] }); })(); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' GitHub - Mapkov2/MidnightSimpleUnitFrames: Midnight Simple Unit Frames is a lightweight unitframe addon focused on a clean, readable layout · GitHub
Skip to content

Repository files navigation

Midnight Simple Unit Frames logo

Midnight Simple Unit Frames

Clean, highly configurable unit frames, group frames, castbars and auras for World of Warcraft Retail.

Download MSUF on CurseForgeDownload MSUF on Wago AddonsJoin the MSUF Discord

MSUF version 6.0 RC18World of Warcraft Retail 12.1Latest GitHub commit

Important

6.0 RC18 is a prerelease build. Release candidates continue to use the Beta channel on addon platforms until the final 6.0 release.

What is MSUF?

Midnight Simple Unit Frames (MSUF) is a complete, customizable replacement for Blizzard's unit and group frames. It brings player, target, focus, focus-target, boss, party and raid frames together with castbars, auras and class resources in one consistent interface.

MSUF is made for players who want clear combat information, extensive visual control and a lightweight event-driven runtime. The full configuration UI and the optional Assistant load only when requested.

Signature per-frame Fill Direction: MSUF lets each Unit Frame fill its Health and Power bars horizontally from left to right or right to left, or vertically from bottom to top or top to bottom. This per-frame combination of vertical and mirrored bar layouts is a level of control not currently offered by other unit-frame addons.

Basic features

  • Custom Player, Target, Focus, Focus Target, Pet, Target-of-Target and Boss frames
  • Party, Raid and Mythic Raid group frames
  • Configurable health, power, absorb and heal-absorb displays
  • Per-frame horizontal and vertical Health/Power fill directions in all four directions
  • Player, Target, Focus and Boss castbars
  • Buffs, debuffs, defensive auras, private auras and spell indicators
  • 2D and class-icon portraits with multiple shapes and placements
  • Custom name, health, power, status and castbar text
  • Class colors, reaction colors, custom colors, gradients, fonts and textures
  • Aggro, dispel, purge, range, role, leader, raid-marker and status indicators
  • Class Power displays for class resources
  • Full Edit Mode positioning, previews, snapping and layer controls
  • Profiles, specialization switching and profile import/export
  • Searchable options, guided setup and recovery tools
  • Optional Masque, LibSharedMedia and Clique integration

Feature highlights

AreaHighlights
Unit FramesPlayer, Target, Focus, Focus Target, Pet, Target-of-Target and Boss frames with configurable health, power, text, portraits, colors, textures, layers and status indicators. Every frame can fill its Health and Power bars horizontally or vertically in either direction.
Group FramesParty, Raid and Mythic Raid layouts with role/status indicators, range fading, spell indicators, healer tools and native private-aura support.
Auras 3Blizzard-native 12.1 aura containers, custom spell matching, per-lane filters, icon shapes, cooldown text, growth/layout controls and portrait tracking.
CastbarsPlayer, Target, Focus and Boss castbars with interrupt feedback, channel support, configurable text/icons, rounded styling and secret-safe timing paths.
Edit ModeLive frame positioning, draggable elements, previews, snapping, layer controls and direct navigation to the matching setting.
ProfilesSpecialization-aware profiles, copy tools and robust import/export including migration from legacy 5.x profiles.

More included

  • Configurable Class Power displays, including an optional Guardian Druid Ironfur tracker
  • SharedMedia textures and fonts, Masque support and Clique compatibility
  • Searchable, load-on-demand options with guided setup and recovery tools
  • Optional load-on-demand MSUF Assistant for local feature help and safe setting changes
  • Twelve included locales: English, German, French, Spanish, Italian, Portuguese, Russian, Korean and Simplified/Traditional Chinese
  • Performance-oriented event routing designed to stay quiet when features are disabled

Install and open

  1. Install MSUF through CurseForge or Wago Addons.
  2. For a manual installation, keep all three packaged folders together in World of Warcraft/_retail_/Interface/AddOns:
    • MidnightSimpleUnitFrames
    • MidnightSimpleUnitFrames_Options
    • MidnightSimpleUnitFrames_Assistant
  3. Reload the game and type /msuf to open the configuration menu.

The Core addon runs normally without opening Options or the Assistant. Both companions are loaded on demand.

Compatibility

GameWorld of Warcraft Retail
Interface versions12.0.7 and 12.1.0
Current source version6.0 RC18
Main command/msuf
Optional integrationsMasque, LibSharedMedia, Clique and WagoAnalytics

Developer APIs

Only APIs documented in this section are stable integration contracts. Arbitrary MSUF_* globals, frame registries, runtime namespaces and saved variables are implementation details.

MSUF.API.Nicknames V1 lets another addon provide display names for MSUF unit and group frames without frame hooks. It is event-driven: there is no polling, ticker or idle OnUpdate; providers and nickname refreshes never run in combat. Changes reported in combat are coalesced and applied once after PLAYER_REGEN_ENABLED.

localOWNER="YourAddon"localPRIORITY=50localMSUF=_G.MSUFlocalAPI=MSUFandMSUF.APIandMSUF.API.NicknameslocalfunctionResolveNickname(unit, nativeName, fullName)
localnickname=YourAddon:GetNickname(unit)
returnnickname~=nativeNameandnicknameornilendlocalfunctionSetNicknameProviderEnabled(enabled)
ifnot (APIandAPI.GetVersion() >=1) thenreturnendifenabledthenAPI.RegisterProvider(OWNER, ResolveNickname, PRIORITY)
elseAPI.UnregisterProvider(OWNER)
endendlocalfunctionNotifyNicknamesChanged(unit)
ifAPIandAPI.IsProviderRegistered(OWNER) thenAPI.NotifyChanged(OWNER, unit)
endend

Add ## OptionalDeps: MidnightSimpleUnitFrames when MSUF should load before the provider. RegisterProvider(owner, resolver, priority) accepts an optional numeric priority; higher priorities run first. Use UnregisterProvider(owner) when the integration is disabled. Call the enable function once after loading the provider's persisted state, and call the change notification with the changed unit token. Omit the unit only for bulk database changes or enabled-state changes that affect every displayed name.

Edit Mode provider integration

MSUF_EditModeAPI V1 lets another addon expose its own movable frames inside MSUF Edit Mode. The provider keeps ownership of frame creation, saved positions, profiles, anchors and protected-frame operations; MSUF supplies the mover, selection, grid/snap, arrow nudge, Undo/Redo and Save/Discard shell.

Feature-detect and register after adding the same optional dependency:

localEditMode=_G.MSUF_EditModeAPIifnotEditModeorEditMode.GetVersion() <1thenreturnendlocalok, reason=EditMode.RegisterElements("YourAddon", {
{
id="main",
label="Your Addon Frames",
group="Your Addon",
order=100,
getFrame=function()
returnYourAddon.GetMovableContainer()
end,
getPosition=function()
localpoint, relativeToName, relativePoint, x, y=YourAddon.GetPosition()
return {
point=point,
relativeToName=relativeToName,
relativePoint=relativePoint,
offsetX=x,
offsetY=y,
}
end,
setPosition=function(position, changeReason)
returnYourAddon.SetPosition(position, changeReason)
end,
-- Optional links/actions shown by the MSUF-owned popup.openSettings=YourAddon.OpenSettings,
resetPosition=YourAddon.ResetPosition,
},
})
ifnotokthenprint("YourAddon: MSUF Edit Mode registration failed: " ..tostring(reason))
end

Each id is stable within its owner and represents one independently movable frame or container. A provider may instead implement the advanced transaction callbacks captureState, restoreState, and movePosition when a simple position table is insufficient.

Notify MSUF only after an event changes availability or geometry:

MSUF_EditModeAPI.RefreshElement("YourAddon", "main")
-- or refresh every registered element owned by the addon:MSUF_EditModeAPI.RefreshOwner("YourAddon")

These are cold event notifications, not per-frame APIs. Registration installs no polling, ticker, global hook, or idle OnUpdate. Configuration writes are rejected during combat, and providers must enforce their own protected-frame rules inside callbacks. Dynamic teardown uses UnregisterElement("YourAddon", "main") or UnregisterOwner("YourAddon").

Support development

If MSUF improves your UI, you can support continued development through any of the links below. These are the same official links shown inside the MSUF Dashboard.

Support MSUF on PatreonSupport MSUF with PayPalSupport MSUF on Ko-fi

Patreon · PayPal · Ko-fi

Community and feedback

Join the MSUF DiscordView the MSUF source on GitHub

  • Ask questions, share profiles and report gameplay issues on the MSUF Discord.
  • Report reproducible bugs through GitHub Issues.
  • Browse and share community profiles through Wago.

When reporting a bug, please include your MSUF version, WoW client version, affected frame and exact reproduction steps.


Made for players who want powerful frames without a heavy runtime.

About

Midnight Simple Unit Frames is a lightweight unitframe addon focused on a clean, readable layout

Resources

Stars

9 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { // Universal Dark Mode - works on any site (function() { var enabled = true; function applyDarkMode() { if (!enabled) return; // Create style element if it doesn't exist var style = document.getElementById('universal-dark-mode-style'); if (!style) { style = document.createElement('style'); style.id = 'universal-dark-mode-style'; document.head.appendChild(style); } // Dark mode CSS - inverts colors but preserves images/video style.textContent = ' /* Invert everything except media */ html { filter: invert(1) hue-rotate(180deg) !important; background: #1a1a2e !important; } /* Restore images, videos, iframes, canvas */ img, video, iframe, canvas, svg, picture, [style*="background-image"] { filter: invert(1) hue-rotate(180deg) !important; } /* Preserve specific elements that should not be inverted */ .no-dark-mode, .no-dark-mode *, [data-theme="light"], [data-theme="light"], .ace_editor, .ace_editor *, .CodeMirror, .CodeMirror *, .monaco-editor, .monaco-editor *, .markdown-body pre, .markdown-body pre *, .highlight, .highlight *, pre code, pre code * { filter: none !important; } /* Fix common UI elements */ .modal, .popup, .dropdown-menu, .tooltip, .popover { filter: invert(1) hue-rotate(180deg) !important; background: #2d2d44 !important; border-color: #444 !important; } /* Scrollbars */ ::-webkit-scrollbar { background: #1a1a2e !important; } ::-webkit-scrollbar-thumb { background: #444 !important; } ::-webkit-scrollbar-thumb:hover { background: #555 !important; } /* Selection */ ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; } ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; } '; } function removeDarkMode() { var style = document.getElementById('universal-dark-mode-style'); if (style) style.remove(); } // Toggle with Alt+Shift+D document.addEventListener('keydown', function(e) { if (e.altKey && e.shiftKey && e.key === 'D') { e.preventDefault(); enabled = !enabled; if (enabled) { applyDarkMode(); console.log('[Universal Dark Mode] Enabled'); } else { removeDarkMode(); console.log('[Universal Dark Mode] Disabled'); } } }); // Apply on load applyDarkMode(); // Re-apply on dynamic content var observer = new MutationObserver(function(mutations) { if (enabled && !document.getElementById('universal-dark-mode-style')) { applyDarkMode(); } }); observer.observe(document.head, { childList: true }); console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle'); })(); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })(); GitHub - Mapkov2/MidnightSimpleUnitFrames: Midnight Simple Unit Frames is a lightweight unitframe addon focused on a clean, readable layout · GitHub
Skip to content

Repository files navigation

Midnight Simple Unit Frames logo

Midnight Simple Unit Frames

Clean, highly configurable unit frames, group frames, castbars and auras for World of Warcraft Retail.

Download MSUF on CurseForgeDownload MSUF on Wago AddonsJoin the MSUF Discord

MSUF version 6.0 RC18World of Warcraft Retail 12.1Latest GitHub commit

Important

6.0 RC18 is a prerelease build. Release candidates continue to use the Beta channel on addon platforms until the final 6.0 release.

What is MSUF?

Midnight Simple Unit Frames (MSUF) is a complete, customizable replacement for Blizzard's unit and group frames. It brings player, target, focus, focus-target, boss, party and raid frames together with castbars, auras and class resources in one consistent interface.

MSUF is made for players who want clear combat information, extensive visual control and a lightweight event-driven runtime. The full configuration UI and the optional Assistant load only when requested.

Signature per-frame Fill Direction: MSUF lets each Unit Frame fill its Health and Power bars horizontally from left to right or right to left, or vertically from bottom to top or top to bottom. This per-frame combination of vertical and mirrored bar layouts is a level of control not currently offered by other unit-frame addons.

Basic features

  • Custom Player, Target, Focus, Focus Target, Pet, Target-of-Target and Boss frames
  • Party, Raid and Mythic Raid group frames
  • Configurable health, power, absorb and heal-absorb displays
  • Per-frame horizontal and vertical Health/Power fill directions in all four directions
  • Player, Target, Focus and Boss castbars
  • Buffs, debuffs, defensive auras, private auras and spell indicators
  • 2D and class-icon portraits with multiple shapes and placements
  • Custom name, health, power, status and castbar text
  • Class colors, reaction colors, custom colors, gradients, fonts and textures
  • Aggro, dispel, purge, range, role, leader, raid-marker and status indicators
  • Class Power displays for class resources
  • Full Edit Mode positioning, previews, snapping and layer controls
  • Profiles, specialization switching and profile import/export
  • Searchable options, guided setup and recovery tools
  • Optional Masque, LibSharedMedia and Clique integration

Feature highlights

AreaHighlights
Unit FramesPlayer, Target, Focus, Focus Target, Pet, Target-of-Target and Boss frames with configurable health, power, text, portraits, colors, textures, layers and status indicators. Every frame can fill its Health and Power bars horizontally or vertically in either direction.
Group FramesParty, Raid and Mythic Raid layouts with role/status indicators, range fading, spell indicators, healer tools and native private-aura support.
Auras 3Blizzard-native 12.1 aura containers, custom spell matching, per-lane filters, icon shapes, cooldown text, growth/layout controls and portrait tracking.
CastbarsPlayer, Target, Focus and Boss castbars with interrupt feedback, channel support, configurable text/icons, rounded styling and secret-safe timing paths.
Edit ModeLive frame positioning, draggable elements, previews, snapping, layer controls and direct navigation to the matching setting.
ProfilesSpecialization-aware profiles, copy tools and robust import/export including migration from legacy 5.x profiles.

More included

  • Configurable Class Power displays, including an optional Guardian Druid Ironfur tracker
  • SharedMedia textures and fonts, Masque support and Clique compatibility
  • Searchable, load-on-demand options with guided setup and recovery tools
  • Optional load-on-demand MSUF Assistant for local feature help and safe setting changes
  • Twelve included locales: English, German, French, Spanish, Italian, Portuguese, Russian, Korean and Simplified/Traditional Chinese
  • Performance-oriented event routing designed to stay quiet when features are disabled

Install and open

  1. Install MSUF through CurseForge or Wago Addons.
  2. For a manual installation, keep all three packaged folders together in World of Warcraft/_retail_/Interface/AddOns:
    • MidnightSimpleUnitFrames
    • MidnightSimpleUnitFrames_Options
    • MidnightSimpleUnitFrames_Assistant
  3. Reload the game and type /msuf to open the configuration menu.

The Core addon runs normally without opening Options or the Assistant. Both companions are loaded on demand.

Compatibility

GameWorld of Warcraft Retail
Interface versions12.0.7 and 12.1.0
Current source version6.0 RC18
Main command/msuf
Optional integrationsMasque, LibSharedMedia, Clique and WagoAnalytics

Developer APIs

Only APIs documented in this section are stable integration contracts. Arbitrary MSUF_* globals, frame registries, runtime namespaces and saved variables are implementation details.

MSUF.API.Nicknames V1 lets another addon provide display names for MSUF unit and group frames without frame hooks. It is event-driven: there is no polling, ticker or idle OnUpdate; providers and nickname refreshes never run in combat. Changes reported in combat are coalesced and applied once after PLAYER_REGEN_ENABLED.

localOWNER="YourAddon"localPRIORITY=50localMSUF=_G.MSUFlocalAPI=MSUFandMSUF.APIandMSUF.API.NicknameslocalfunctionResolveNickname(unit, nativeName, fullName)
localnickname=YourAddon:GetNickname(unit)
returnnickname~=nativeNameandnicknameornilendlocalfunctionSetNicknameProviderEnabled(enabled)
ifnot (APIandAPI.GetVersion() >=1) thenreturnendifenabledthenAPI.RegisterProvider(OWNER, ResolveNickname, PRIORITY)
elseAPI.UnregisterProvider(OWNER)
endendlocalfunctionNotifyNicknamesChanged(unit)
ifAPIandAPI.IsProviderRegistered(OWNER) thenAPI.NotifyChanged(OWNER, unit)
endend

Add ## OptionalDeps: MidnightSimpleUnitFrames when MSUF should load before the provider. RegisterProvider(owner, resolver, priority) accepts an optional numeric priority; higher priorities run first. Use UnregisterProvider(owner) when the integration is disabled. Call the enable function once after loading the provider's persisted state, and call the change notification with the changed unit token. Omit the unit only for bulk database changes or enabled-state changes that affect every displayed name.

Edit Mode provider integration

MSUF_EditModeAPI V1 lets another addon expose its own movable frames inside MSUF Edit Mode. The provider keeps ownership of frame creation, saved positions, profiles, anchors and protected-frame operations; MSUF supplies the mover, selection, grid/snap, arrow nudge, Undo/Redo and Save/Discard shell.

Feature-detect and register after adding the same optional dependency:

localEditMode=_G.MSUF_EditModeAPIifnotEditModeorEditMode.GetVersion() <1thenreturnendlocalok, reason=EditMode.RegisterElements("YourAddon", {
{
id="main",
label="Your Addon Frames",
group="Your Addon",
order=100,
getFrame=function()
returnYourAddon.GetMovableContainer()
end,
getPosition=function()
localpoint, relativeToName, relativePoint, x, y=YourAddon.GetPosition()
return {
point=point,
relativeToName=relativeToName,
relativePoint=relativePoint,
offsetX=x,
offsetY=y,
}
end,
setPosition=function(position, changeReason)
returnYourAddon.SetPosition(position, changeReason)
end,
-- Optional links/actions shown by the MSUF-owned popup.openSettings=YourAddon.OpenSettings,
resetPosition=YourAddon.ResetPosition,
},
})
ifnotokthenprint("YourAddon: MSUF Edit Mode registration failed: " ..tostring(reason))
end

Each id is stable within its owner and represents one independently movable frame or container. A provider may instead implement the advanced transaction callbacks captureState, restoreState, and movePosition when a simple position table is insufficient.

Notify MSUF only after an event changes availability or geometry:

MSUF_EditModeAPI.RefreshElement("YourAddon", "main")
-- or refresh every registered element owned by the addon:MSUF_EditModeAPI.RefreshOwner("YourAddon")

These are cold event notifications, not per-frame APIs. Registration installs no polling, ticker, global hook, or idle OnUpdate. Configuration writes are rejected during combat, and providers must enforce their own protected-frame rules inside callbacks. Dynamic teardown uses UnregisterElement("YourAddon", "main") or UnregisterOwner("YourAddon").

Support development

If MSUF improves your UI, you can support continued development through any of the links below. These are the same official links shown inside the MSUF Dashboard.

Support MSUF on PatreonSupport MSUF with PayPalSupport MSUF on Ko-fi

Patreon · PayPal · Ko-fi

Community and feedback

Join the MSUF DiscordView the MSUF source on GitHub

  • Ask questions, share profiles and report gameplay issues on the MSUF Discord.
  • Report reproducible bugs through GitHub Issues.
  • Browse and share community profiles through Wago.

When reporting a bug, please include your MSUF version, WoW client version, affected frame and exact reproduction steps.


Made for players who want powerful frames without a heavy runtime.

About

Midnight Simple Unit Frames is a lightweight unitframe addon focused on a clean, readable layout

Resources

Stars

9 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages