Clean, highly configurable unit frames, group frames, castbars and auras for World of Warcraft Retail.
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.
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.
- 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
| Area | Highlights |
|---|---|
| Unit Frames | Player, 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 Frames | Party, Raid and Mythic Raid layouts with role/status indicators, range fading, spell indicators, healer tools and native private-aura support. |
| Auras 3 | Blizzard-native 12.1 aura containers, custom spell matching, per-lane filters, icon shapes, cooldown text, growth/layout controls and portrait tracking. |
| Castbars | Player, Target, Focus and Boss castbars with interrupt feedback, channel support, configurable text/icons, rounded styling and secret-safe timing paths. |
| Edit Mode | Live frame positioning, draggable elements, previews, snapping, layer controls and direct navigation to the matching setting. |
| Profiles | Specialization-aware profiles, copy tools and robust import/export including migration from legacy 5.x profiles. |
- 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 MSUF through CurseForge or Wago Addons.
- For a manual installation, keep all three packaged folders together in
World of Warcraft/_retail_/Interface/AddOns:MidnightSimpleUnitFramesMidnightSimpleUnitFrames_OptionsMidnightSimpleUnitFrames_Assistant
- Reload the game and type
/msufto open the configuration menu.
The Core addon runs normally without opening Options or the Assistant. Both companions are loaded on demand.
| Game | World of Warcraft Retail |
| Interface versions | 12.0.7 and 12.1.0 |
| Current source version | 6.0 RC18 |
| Main command | /msuf |
| Optional integrations | Masque, LibSharedMedia, Clique and WagoAnalytics |
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.
local OWNER = "YourAddon"
local PRIORITY = 50
local MSUF = _G.MSUF
local API = MSUF and MSUF.API and MSUF.API.Nicknames
local function ResolveNickname(unit, nativeName, fullName)
local nickname = YourAddon:GetNickname(unit)
return nickname ~= nativeName and nickname or nil
end
local function SetNicknameProviderEnabled(enabled)
if not (API and API.GetVersion() >= 1) then return end
if enabled then
API.RegisterProvider(OWNER, ResolveNickname, PRIORITY)
else
API.UnregisterProvider(OWNER)
end
end
local function NotifyNicknamesChanged(unit)
if API and API.IsProviderRegistered(OWNER) then
API.NotifyChanged(OWNER, unit)
end
endAdd ## 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.
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:
local EditMode = _G.MSUF_EditModeAPI
if not EditMode or EditMode.GetVersion() < 1 then return end
local ok, reason = EditMode.RegisterElements("YourAddon", {
{
id = "main",
label = "Your Addon Frames",
group = "Your Addon",
order = 100,
getFrame = function()
return YourAddon.GetMovableContainer()
end,
getPosition = function()
local point, relativeToName, relativePoint, x, y = YourAddon.GetPosition()
return {
point = point,
relativeToName = relativeToName,
relativePoint = relativePoint,
offsetX = x,
offsetY = y,
}
end,
setPosition = function(position, changeReason)
return YourAddon.SetPosition(position, changeReason)
end,
-- Optional links/actions shown by the MSUF-owned popup.
openSettings = YourAddon.OpenSettings,
resetPosition = YourAddon.ResetPosition,
},
})
if not ok then
print("YourAddon: MSUF Edit Mode registration failed: " .. tostring(reason))
endEach 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").
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.
- 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.