Shadowed Unit Frames
SUF focuses on a simple configuration while maintaining the flexibility that most users will care about, preventing unnecessary bloating of the addon that sacrifices performance. While you aren't going to be able to set the health bar to be exactly 3.14 pixels outside of the unit frames, you can change options you actually care about such as bar height, ordering, frame height and so on. To speed up configuration, you can configure multiple units at the same time through the global configuration. For example, if you want to set the height of the Player, Target, Focus and Party frames to 50 then the height of Target's Target, Target's Target of Target, Focus Target to 30 you can easily do this by changing two options instead of having to do it seven times.
However, should you need a little bit of extra configuration do not despair! An advanced option is included that will unlock additional configuration giving finer control over the configuration.
Shadowed Unit Frames in Midnight
Due to the strict limitations on addons introduced by Blizzard in Midnight, SUF will not be updated at this time.
Shadowed Unit Frames in WoW Classic
There is in-development Beta versions available for WoW Classic!
Note that WoW Classic does not provide all the information that you might be used to:
- There is no Focus Frame
- Information about the HP of enemies is not available, and they'll show as 100 HP
- Cast Bars for anyone but the player himself are not available
- Debuffs have no duration information
Some of this data can be restored with additional libraries/addons, but it'll always be guesswork and potentially inaccurate. Shadowed Unit Frames comes bundled with LibClassicDurations for debuff durations. Mob HP can be provided by Real Mob Health, which you need to install manually.
Note on copying your layout from Retail to Classic:
In general you cannot copy your layout between the two versions, since they are quite different, and doing so will result in certain elements exclusive to one version (like Pet Happiness on Classic) not always working properly. There are some provisions in the code that makes copying from Retail to Classic mostly work, use at your own risk - however, never copy a Layout from Classic to Retail, this will absolutely result in the Class-specific power bars and other elements not available on Classic to cease to function.
Slash commands: /shadoweduf (/suf)
Anchoring
Are you driven crazy by your party frames not aligning up exactly with your player frames, even if it's only half a pixel off? The anchoring system will let you solve all alignment issues, by allowing you to anchor a frame to another and set a simple offset from the frame it is anchored to, or by manually setting the X/Y position of the frame.
Using the screen shot as an example, if you drag the player frame the other frames will move with the player frame preserving the alignment and spacing. Each frame can still be manually positioned wherever you want, but this gives you a way of easily anchoring and moving frames around without having to use a ruler.
Zone configuration (Disabling options/units by zone type)
Units and modules can be enabled or disabled based on the type of zone you are in. For example, if you want to see party targets and party pets while you are in an arena but nowhere else then you can use the visibility options to enable it only while inside an arena. Modules can also be disabled by zone type, if you want to see party auras while in a raid instance but nowhere else you can disable the module in raid instances only.
Profiles do not have to be swapped and it is all automatic.
Units
Supports unit frames are as follows:
Player: Player, Pet, Pet Target
General: Target, Target of Target, Target of Target of Target, Focus, Focus Target
Party: Party, Party Pets, Party Targets, Party ToT
Raid: Raid, Raid Pet, Main Tank, Main Tank Target, Main Assist, Main Assist Target, Boss, Boss Target, Boss ToT, Main Assist ToT, Main Tank ToT
Arena: Arena, Arena Target, Arena Pets, Arena ToT
Battleground: Battleground, Battleground Target, Battleground Target
Features
- Tags: Includes a simple tagging system that can be customized in virtually any way using Lua, even if something isn't included by default odds are you can make the tags
- Incoming Heals: Supports the Blizzard Events for incoming heal data, no external libraries needed
- Auras: Can be set to only show auras you casted, or can cast on others. Can enlarge auras that you casted, and hide the cooldown ring on the timers of auras you didn't cast as well to make it more obvious which ones you casted and which ones you didn't
- Aura Timers: You will need a mod such as OmniCC to show timers on buffs and debuffs
- Aura Indicators: Display colored squares or icons for certain auras on any unit
- Fader: Fades frames when out of combat and inactive (100% mana/no target)
- Class Power (Eclipse, Holy Power, etc): Supports all of the class power features from Eclipse to Burning Embers.
- Highlighting: Border highlighting of frames based on mousing over them, curable debuffs, aggro or you are targeting/focusing them
- Range Checking: Fades frames out that are out of range of you
- Exportable Layouts: If you have a layout, or your friend has a layout you want to try out you can export/import SUF layouts by going to /suf -> Layout Manager
- Profiles: You can change from any profile to another one without reloading your UI, should you want to use a completely different layout based on zone you can easily switch profiles without hassle
Pretty much all the general unit frame settings are in, health bars, cast bars, power bars, portraits, indicators and so on.
Modules
Basic module support is included, should you be interested in building a module see the documentation on github for more information.
Feedback
For feature requests and bug reports, please continue to use the Ticket tracker. Feel free to ask on the thread first, if you're unsure what to do!
-
View User Profile
-
Send Message
Posted Feb 27, 2026Any chance the 'SmoothBars' module could be updated for compatibility with your new version?
https://www.curseforge.com/wow/addons/shadoweduf-smoothbars
-
View User Profile
-
Send Message
Posted Feb 26, 2026Retail 12.0.1.66102
SUF v v4.4.15 (27 Jan 2026)
63424x [string "return function(unit, unitOwner, fontString..."]:2: attempt to perform boolean test on a secret boolean value (tainted by '*** ForceTaint_Strong ***')
[return function(unit, unitOwner, fontString)
return UnitIsAFK(unitOwner) and ShadowUF.L["AFK"] or UnitIsDND(unitOwner) and ShadowUF.L["DND"]
end]:2: in function <[string "return function(unit, unitOwner, fontString..."]:1>
[ShadowedUnitFrames/modules/tags.lua]:184: in function 'func'
[ShadowedUnitFrames/modules/tags.lua]:234: in function 'UpdateTags'
[ShadowedUnitFrames/modules/tags.lua]:102: in function '?'
[ShadowedUnitFrames/modules/units.lua]:36: in function 'FullUpdate'
[ShadowedUnitFrames/modules/units.lua]:467: in function <ShadowedUnitFrames/modules/units.lua:467>
Locals:
unit = "raid1target"
unitOwner = "raid1target"
fontString = FontString {
parentBar = StatusBar {
}
parent = SUFChildmaintanktarget1 {
}
configID = 1
powerType = "ENERGY"
widthID = "$healthBarRIGHTI0"
availableWidth = 139
}
(*temporary) = <no value>
(*temporary) = "raid1target"
(*temporary) = "attempt to perform boolean test on a secret boolean value (tainted by '*** ForceTaint_Strong ***')"
-
View User Profile
-
Send Message
Posted Feb 25, 2026[ADDON_ACTION_BLOCKED] AddOn 'ShadowedUnitFrames' hat versucht die geschützte Funktion 'UNKNOWN()' aufzurufen.
[!BugGrabber/BugGrabber.lua]:488: in function '?'
[!BugGrabber/BugGrabber.lua]:412: in function <!BugGrabber/BugGrabber.lua:412>
[C]: ?
[C]: in function 'RegisterForClicks'
[ShadowedUnitFrames/modules/units.lua]:592: in function 'CreateUnit'
[ShadowedUnitFrames/modules/units.lua]:520: in function 'method'
[Blizzard_FrameXML/RestrictedFrames.lua]:791: in function <Blizzard_FrameXML/RestrictedFrames.lua:783>
[C]: ?
[C]: ?
[Blizzard_FrameXML/RestrictedFrames.lua]:810: in function 'CallMethod'
[ local header = self:GetParent()
self:SetHeight(header:GetAttribute("style-height"))
self:SetWidth(header:GetAttribute("style-width"))
self:SetScale(header:GetAttribute("style-scale"))
self:SetAttribute("*type1", "target")
self:SetAttribute("*type2", "togglemenu")
self:SetAttribute("type2", "togglemenu")
self:SetAttribute("isHeaderDriven", true)
-- initialize frame
header:CallMethod("initialConfigFunction", self:GetName())
-- Clique integration
local clickHeader = header:GetFrameRef("clickcast_header")
if( clickHeader ) then
clickHeader:SetAttribute("clickcast_button", self)
clickHeader:RunAttribute("clickcast_register")
end
]:14: in function <[string " local header = self:GetParent()..."]:1>
[tail call]: ?
[C]: ?
[Blizzard_FrameXML/RestrictedExecution.lua]:483: in function <...aceBlizzard_FrameXML/RestrictedExecution.lua:446>
[Blizzard_FrameXML/SecureGroupHeaders.lua]:116: in function <...faceBlizzard_FrameXML/SecureGroupHeaders.lua:110>
[Blizzard_FrameXML/SecureGroupHeaders.lua]:173: in function <...faceBlizzard_FrameXML/SecureGroupHeaders.lua:130>
[Blizzard_FrameXML/SecureGroupHeaders.lua]:495: in function 'SecureGroupHeader_Update'
[Blizzard_FrameXML/SecureGroupHeaders.lua]:62: in function <...faceBlizzard_FrameXML/SecureGroupHeaders.lua:60>
Locals:
self = <table> {
}
event = "ADDON_ACTION_BLOCKED"
addonName = "ShadowedUnitFrames"
addonFunc = "UNKNOWN()"
name = "ShadowedUnitFrames"
badAddons = <table> {
ShadowedUnitFrames = true
}
L = <table> {
ADDON_CALL_PROTECTED_MATCH = "^%[(.*)%] (AddOn '.*' hat versucht die geschützte Funktion '.*' aufzurufen.)$"
NO_DISPLAY_2 = "|cffffff00Die Standardanzeige heißt BugSack und kann vermutlich auf der Seite gefunden werden, wo du auch !BugGrabber gefunden hast.|r"
ERROR_DETECTED = "%s |cffffff00gefangen, klicke auf den Link für mehr Informationen.|r"
USAGE = "|cffffff00Benutzung: /buggrabber <1-%d>.|r"
BUGGRABBER_STOPPED = "|cffffff00In deinem UI treten zu viele Fehler auf, als Folge davon könnte dein Spiel langsamer laufen. Deaktiviere oder aktualisiere die fehlerhaften Addons, wenn du diese Meldung nicht mehr sehen willst.|r"
STOP_NAG = "|cffffff00!BugGrabber wird bis zum nächsten Patch nicht mehr auf ein fehlendes Display-Addon hinweisen.|r"
ADDON_DISABLED = "|cffffff00!BugGrabber und %s können nicht zusammen laufen, %s wurde deshalb deaktiviert. Wenn du willst, kannst du ausloggen, !BugGrabber deaktivieren und %s wieder aktivieren.|r"
NO_DISPLAY_STOP = "|cffffff00Wenn du diesen Hinweis nicht mehr sehen willst, gib /stopnag ein.|r"
NO_DISPLAY_1 = "|cffffff00Anscheinend benutzt du !BugGrabber ohne dazugehörigem Display-Addon. Zwar bietet !BugGrabber Slash-Befehle, um auf die Fehler zuzugreifen, mit einem Display-Addon wäre die Fehlerverwaltung aber bequemer.|r"
ERROR_UNABLE = "|cffffff00!BugGrabber kann selbst keine Fehler von anderen Spielern anzeigen. Bitte installiere BugSack oder ein vergleichbares Display-Addon, das dir diese Funktionalität bietet.|r"
ADDON_CALL_PROTECTED = "[%s] AddOn '%s' hat versucht die geschützte Funktion '%s' aufzurufen."
}
-
View User Profile
-
Send Message
Posted Feb 24, 2026Retail WoW. Got this error on fight with last boss in delve +11 with Brann as tank only:
Message: [string "return function(unit, unitOwner, fontString..."]:2: attempt to perform boolean test on a secret boolean value (tainted by '*** ForceTaint_Strong ***')
Time: Tue Feb 24 20:35:20 2026
Count: 152
Stack:
[return function(unit, unitOwner, fontString)
return UnitIsAFK(unitOwner) and ShadowUF.L["AFK"] or UnitIsDND(unitOwner) and ShadowUF.L["DND"]
end]:2: in function <[string "return function(unit, unitOwner, fontString..."]:1>
[Interface/AddOns/ShadowedUnitFrames/modules/tags.lua]:184: in function 'func'
[Interface/AddOns/ShadowedUnitFrames/modules/tags.lua]:234: in function 'UpdateTags'
[Interface/AddOns/ShadowedUnitFrames/modules/tags.lua]:248: in function <Interface/AddOns/ShadowedUnitFrames/modules/tags.lua:248>
Locals:
unit = "party1"
unitOwner = "party1"
fontString = FontString {
parentBar = StatusBar {
}
parent = SUFHeaderpartyUnitButton1 {
}
configID = 1
powerType = "ENERGY"
widthID = "$healthBarRIGHTI0"
availableWidth = 133.000031
}
(*temporary) = <no value>
(*temporary) = "party1"
(*temporary) = "attempt to perform boolean test on a secret boolean value (tainted by '*** ForceTaint_Strong ***')"
-
View User Profile
-
Send Message
Posted Feb 24, 2026On TBC Anniversary, when i exit the game, and log back in, SUF doesnt load/showup at all. In the addons pane it shows as enabled, and i can access options via /suf, but none of my frames are taken over by SUF. not sure whats going on.
-
View User Profile
-
Send Message
Posted Feb 23, 2026On 2.5.5 for BCC I'm getting a strange issue with the Pet frame. I'm not seeing any script errors but I have noticed that the panel will occassional not update my pets level, xp bar or happiness until I reload the UI. For example I noticed my pet had leveled up to 50 but the level shown as an indicator on the energy bar remained at 49. My pet will also go down to unhappy but it will still show the green happy icon.
-
View User Profile
-
Send Message
Posted Feb 23, 2026Will SuF supported again by Curse Forge and downloadible with the App?
-
View User Profile
-
Send Message
Posted Feb 22, 2026Where am I supposed to get the fresh version of the addon? People mention the github, but I can't find a Midnight version there.
-
View User Profile
-
Send Message
Posted Feb 23, 2026In reply to ought:
https://github.com/NoSelph/ShadowedUnitFrames/releases
Click on the latest v4.4.xx-alpha-midnight.zip and extract in your addons folder
-
View User Profile
-
Send Message
Posted Feb 24, 2026In reply to NILLme: Great, thank you very much!
-
View User Profile
-
Send Message
Posted Feb 27, 2026In reply to NILLme:
Thank you for updating it! Im stoked you are continuing to maintain it on github and appericiate you!
-
View User Profile
-
Send Message
Posted Feb 21, 2026Combo points aren't showing.
Please fix it.
-
View User Profile
-
Send Message
Posted Feb 21, 2026Hello,
love your work but i have one huge problem. When activating shadowed unit frames my cooldown manager "section" is replaced / changes and is unusable for me. Any way for me to customize SUF so that this will not happen?
-
View User Profile
-
Send Message
Posted Feb 20, 2026This is common error on normal server
Message: [string "return function(unit, unitOwner, fontString..."]:2: attempt to perform boolean test on a secret boolean value (tainted by '*** ForceTaint_Strong ***')
Time: Fri Feb 20 11:37:25 2026
Count: 466
Stack:
[return function(unit, unitOwner, fontString)
return UnitIsAFK(unitOwner) and ShadowUF.L["AFK"] or UnitIsDND(unitOwner) and ShadowUF.L["DND"]
end]:2: in function <[string "return function(unit, unitOwner, fontString..."]:1>
[Interface/AddOns/ShadowedUnitFrames/modules/tags.lua]:184: in function 'func'
[Interface/AddOns/ShadowedUnitFrames/modules/tags.lua]:234: in function 'UpdateTags'
[Interface/AddOns/ShadowedUnitFrames/modules/tags.lua]:248: in function <Interface/AddOns/ShadowedUnitFrames/modules/tags.lua:248>
Locals:
unit = "target"
unitOwner = "target"
fontString = FontString {
parentBar = StatusBar {
}
parent = SUFUnittarget {
}
widthID = "$healthBarRIGHTI-18"
configID = 1
availableWidth = 182.999863
}
(*temporary) = <no value>
(*temporary) = "target"
(*temporary) = "attempt to perform boolean test on a secret boolean value (tainted by '*** ForceTaint_Strong ***')"
-
View User Profile
-
Send Message
Posted Feb 21, 2026In reply to creepshow11483: If you're on retail, make sure you're using the latest version.
-
View User Profile
-
Send Message
Posted Feb 21, 2026In reply to Selph: Are you still updating the .zip at https://selph.fr/suf-midnight.zip or are we supposed to get updates from the github? Thanks again for your work.
-
View User Profile
-
Send Message
Posted Feb 22, 2026What is the correct Github link for this project? I can't find it.
-
View User Profile
-
Send Message
Posted Feb 22, 2026In reply to ought: https://github.com/NoSelph/ShadowedUnitFrames
-
View User Profile
-
Send Message
Posted Feb 20, 2026Seeing this in TBC anniversary:
5x ShadowedUnitFrames/modules/auras.lua:684: attempt to index field 'buffs' (a nil value)
[ShadowedUnitFrames/modules/auras.lua]:684: in function '?'
[ShadowedUnitFrames/modules/units.lua]:21: in function 'FullUpdate'
[ShadowedUnitFrames/modules/units.lua]:295: in function 'CheckUnitStatus'
[ShadowedUnitFrames/modules/units.lua]:211: in function <ShadowedUnitFrames/modules/units.lua:208>
[C]: in function 'Show'
[Blizzard_FrameXML/SecureStateDriver.lua]:83: in function <...rfaceBlizzard_FrameXML/SecureStateDriver.lua:73>
[Blizzard_FrameXML/SecureStateDriver.lua]:137: in function <...rfaceBlizzard_FrameXML/SecureStateDriver.lua:119>
-
View User Profile
-
Send Message
Posted Feb 19, 2026This error will see on Aniversarry Server: Message: ...ace/AddOns/ShadowedUnitFrames/ShadowedUnitFrames.lua:700: attempt to index local 'frame' (a nil value)
Time: Thu Feb 19 17:46:00 2026
Count: 1
Stack:
[Interface/AddOns/ShadowedUnitFrames/ShadowedUnitFrames.lua]:700: in function <...ace/AddOns/ShadowedUnitFrames/ShadowedUnitFrames.lua:696>
[Interface/AddOns/ShadowedUnitFrames/ShadowedUnitFrames.lua]:720: in function 'HideBlizzardFrames'
[Interface/AddOns/ShadowedUnitFrames/ShadowedUnitFrames.lua]:92: in function 'OnInitialize'
[Interface/AddOns/ShadowedUnitFrames/ShadowedUnitFrames.lua]:929: in function <...ace/AddOns/ShadowedUnitFrames/ShadowedUnitFrames.lua:927>
Locals:
taint = true
(for index) = 1
(for limit) = 2
(for step) = 1
i = 1
frame = nil
(*temporary) = nil
(*temporary) = SecureStateDriverManager {
}
(*temporary) = "attempt to index local 'frame' (a nil value)"