promotional bannermobile promotional banner

ZwoelfStuff

ZwoelfStuff is a small Tank Addon, that includes CD Manager who auto detects hidden Player Buffs and Auras and let it add as normal Buff to the Blizzard CDM. An advanced Death Log with Live Replay, Co-Tank Frames and a Spell Alerts. BETA
Back to Files

4.77.0

File nameZwoelfStuff-4.77.0.zip
Uploader
ZwoelfdkZwoelfdk
Uploaded
Aug 11, 2026
Downloads
23
Size
883.8 KB
Flavors
Retail
File ID
8627672
Type
R
Release
Supported game versions
  • 12.1.0
  • 12.0.7
  • 12.0.5

What's new

# Changelog

All notable changes to ZwoelfStuff are documented here.
The format follows [Keep a Changelog](https://keepachangelog.com/en/1.1.0/),
and the project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).

## [4.77.0] - 2026-08-12

### Added

- **The addon is on Wago as well as CurseForge.** Same build, from the same
  release — take whichever you already use.
- **About says where to get it, and how to reach us.** Both stores under
  *Where to get it*, and **Discord** in the page header. None of them can open
  your browser — no addon may hand a URL to one — so each puts the address in a
  box you can copy from.
- **A bar you switched off says so in the list.** A `HIDDEN` badge on the card
  head, with the reason in its tooltip. Only settled reasons appear — switched
  off, or set to never show. `Visibility:Fixed` is the one place that decides
  which those are, and it takes the wording from `Visibility:Explain`, so the
  badge and the panel cannot word it differently. Combat, target and spec are
  deliberately excluded: the list is not redrawn when you pull, and a stale
  badge on a settings page is worse than none.

### Changed

- **Edit mode's mode pair is lit, not tinted.** `UI.Button:SetActive` gives the
  current mode the same `accentSoft` bed the chip row and the CURRENT badge use.
  It was a dimmed label before — the channel `SetEnabled` already uses for "you
  cannot press this", so the mode that was merely not current read as dead.
- **The welcome window has a visible second exit.** *Not now*, a ghost beside
  *Let's go*. Escape has always closed it and always counted as answered; a
  keypress nobody is told about is not an exit.

### Fixed

- **"Four features in one addon" over six switches.** Both the welcome window
  and the Modules note on the Settings page typed the number while the rows
  under them were built from the registry. `Modules:Count()` counts it now, and
  a check makes sure `Modules.GENERATION` covers every module's `since` — a
  module added without that bump is never offered to anybody, silently.

## [4.76.0] - 2026-08-11

### Changed

- **Every number is a slider again — a track with the value beside it.** The
  design this window was built to said *"no more sliders, every number is a
  stepper"*, and the reason it gave was precision: a track standing in for a
  range has only as many stops as the column leaves it. That objection is
  answered and has been since 4.19.0 — the value is an **edit box**. Click it
  and type, or roll the wheel one step at a time. What the stepper could not do
  is say *where in the range* you are: "Icon size 44" is a number without a
  scale. Four ways in now — drag the track, click it, wheel over either half,
  or type. There is still exactly **one** numeric control in the addon, so
  every page, every panel and Edit mode got this at once.
- **The value field has an edge.** It is the darkest tone in the window, which
  is meant to say "here is a value you can change" — but in the inspector it
  stood on a ground one and a half percent lighter than itself and said
  nothing. Nobody noticed while two buttons flanked it.
- **A page's actions are in the header band now, beside its title.** They used
  to be a column of buttons *inside* the page, next to that page's preview — so
  the same kind of thing sat in a different place depending on which entry in
  the list you had clicked, and where they existed they ate a third of the
  width the preview needed. **Move bars / Build** on Cooldowns, **Make the
  macro / What a taunt would say** on Co-Tanks, **Set keys / Test mode** on
  External CD request, **Set keys / What every cell would cast** on External CD
  answer, **Open it / Share in chat** on the Death-log.
- **The slots, the offered spells and the co-tank preview have their whole band
  back**, and each band is only as tall as what is actually in it. A one-row
  panel used to hold a band four buttons deep with nothing in three quarters of
  it.
- **A button that belongs to one block stayed with that block.** *Who would be
  asked* prints the "Who to ask" list out loud, so it stands under that list
  rather than four sections above it.
- **Moving a panel is one door, not two.** The per-page *Move the panel* and
  *Move the bar* buttons opened the same edit mode the first entry in the list
  opens. The pages say where that is instead.
- **About is a page rather than a wall of text.** The mark, the name, why it
  exists and the three facts anybody is asked for — author, version, client —
  stand in a block at the top; the credits and the "what the client will not
  let it do" paragraphs are two named sections under it, and the commands are a
  list in two columns.
- **Diagnostics opens with four readings**: how many cooldowns the Cooldown
  Manager holds, how many cells on your bars are filled, how sharp the marks in
  this window are, and whether another cooldown addon is fighting for the same
  frames. All four are measured on your machine.
- **Settings has no right-hand column.** It was a panel 400 pixels wide
  standing empty until you pointed at something, to show two lines that fit
  under the row perfectly well. The sentences are on the page now.
- **The sidebar is tidy at the bottom.** *Discord* is a row like every other
  row: its word starts where every other word in that column starts, it lights
  up under the mouse the way its neighbours do, and it has air above it.
- **The window ground has an up and a down.** One vertical gradient over a flat
  colour. Three columns of three flat colours read as a wall.
- **Cards, buttons and menus have depth.** Two pixels of darkening inside the
  edge turn a card into a shallow tray, and menus cast a shadow instead of
  saying "I am on top of the page" with the same bright outline that marks the
  selected row inside them. Not under every settings row: forty trays stacked
  up is the brick wall this window was rebuilt to get rid of.
- **The window can be seen through — 94% by default, adjustable under
  Settings.** One alpha on the outermost frame. Fading each layer separately
  would multiply the values wherever two overlap, and no surface would keep a
  colour you could predict. The floor is 70%: a window you cannot see is a
  window you cannot close.

### Fixed

- **A number could land outside its own slider.** Snapping rounds to the
  *nearest* step, and the range was only clamped before that — so a range of
  0 to 1 in steps of 0.4 turned a typed 1 into 1.2. Pinned by a check that goes
  red if the second clamp is ever removed.
- **Dragging repainted sixty times a second even when nothing moved.** A 96px
  track carrying 42 steps lands on the same step for most frames of a drag, and
  each one rebuilt the bar it belongs to. It now only redraws when the snapped
  value actually changes.
- **The command list was written twice and the second copy had gone stale.**
  About still advertised `/zs text` and had never heard of `/zs build`,
  `/zs modules`, `/zs report`, `/zs skin`, `/zs test`, `/zs taunt` or
  `/zs death`. There is one list now — the chat help and the About page both
  draw it — and a check fails if it ever names a command with no handler
  behind it.

### Removed

- **The plus and minus buttons, and their eight mark files.** The track
  replaced them; leaving the artwork in would have shipped 80 KB that nothing
  draws.

## [4.75.0] - 2026-08-11

### Changed

- **The alternating light/dark grounds are gone.** They were meant to group a
  setting with its own sentence without drawing a line — the mechanism another
  UI uses, and a sound one. It does not survive this window: a stripe is
  anchored across the full content width, but half of every page stands in
  **two columns** of half-width rows, so one stripe ran under a pair that has
  nothing to do with each other and the alternation stopped meaning anything.
  Grouping is done with air now: a sentence sits close to the setting above it
  and twice as far from whatever comes next.
- **Labels start on the same line as the headings again.** The 14-pixel indent
  existed to keep text off the edge of a stripe. Without one it was the thing
  that had been complained about in the first place — space at the front of
  every line, and labels not lining up with anything.
- **Arial Narrow is the default font again, for the window and for bar text.**
  The version before this took Expressway from whichever other addon had
  installed it. Two things were wrong with that: the file is the **bold** cut
  whatever it calls itself, so the window came out heavier than it is drawn,
  and a default that depends on which *other* addons you have is not a default
  — two players on the same version saw different type. Expressway is still in
  the picker under **Settings** for anyone who wants it. An existing profile
  keeps the bar font stored in it; a default does not reach into a saved
  setting.

### Added

- **About names the addons this one was written by reading** — EllesmereUI,
  ElvUI, BigWigs, Method Raid Tools, Mythic Dungeon Tools, Details!, WeakAuras,
  Plater, LibOpenRaid — and says exactly what was taken from them: no code,
  facts about the game's API that are documented nowhere else. The same words
  the README carries, in the place a player will actually see them.

## [4.74.0] - 2026-08-11

### Changed

- **Room around the words.** Every setting sits on a ground of its own now, so
  it gets padding inside that ground instead of starting on its edge: 14 either
  side, taller rows, and a real gap under a heading instead of three pixels. A
  note lined up with the labels above it also used to run the same distance off
  the right-hand edge — an indent is padding on both sides now.
- **Headings are no longer painted in the brightest white in the palette.** The
  panel font is a bold face, and full white on top of it was three emphases for
  one thing.

> Still being worked on: the spacing is closer but not right yet.

## [4.73.0] - 2026-08-11

### Changed

- **There are no lines between settings any more.** A setting and its
  explanation share a ground of their own, and consecutive blocks alternate
  between two shades. A line is a thing you have to look at; a change of ground
  is one you do not — the eye reads the stripes and never resolves an edge. The
  grouping that took a hairline to state is now simply what the surface says.
- **The window uses the font you already have.** If any of your other addons
  ships **Expressway** it is registered with LibSharedMedia, and it is now the
  default here. The settings page had been *showing* it as the default for
  months while the window was drawn in Arial Narrow, because nothing ever asked
  for it. Nothing is bundled: the file stays where it was installed, and on a
  client that has none of them Arial Narrow is used exactly as before. Any font
  your addons register can be picked under **Settings**.
- **About says what this addon is** — the same words the README opens with,
  from its author — and spells his name properly.

## [4.72.0] - 2026-08-10

### Changed

- **You can see at a glance which features are running.** A green light next
  to a feature in the list on the left means it is on; **OFF** in red means it
  is not. It used to be the word OFF in the faintest grey there is.
- **Section headings are bigger than the settings under them.** They were
  smaller - the one word that says what a block of settings *is* was the
  faintest thing in it.
- **The explanations line up with everything else.** They were indented by
  eight pixels and nothing else on the page was, so every paragraph started in
  a different place from the rows around it.
- **A line no longer runs between a setting and its own explanation.** The
  hairline that closes a block now sits under the pair, where it separates one
  group from the next instead of cutting one in half. And there is room to
  breathe above and below every paragraph.
- **Set keys is a button in Edit Mode**, in the box with the rest. It was only
  reachable from two settings pages. Edit Mode closes as it opens, because
  both put squares over the same panels and only one of them can have your
  clicks.

### Fixed

- **The empty Keys section on the External CD request page.** Its two
  sentences were being handed to the last row of the section above it and
  shown in that row's tooltip instead - so the heading was left standing over
  nothing. Every section that opens with a paragraph was affected.

## [4.71.0] - 2026-08-10

### Added

- **Lust and a battle resurrection can be asked for - one slot each.** Drag
  **Lust** onto the panel and the click asks whoever in your group has one:
  Bloodlust, Heroism, Time Warp, Primal Rage or Fury of the Aspects. **Bres**
  is the same for Rebirth, Raise Ally, Intercession and Soulstone. One slot
  rather than one per class, because "who can lust" is one question and you
  should not have to fill five places to cover the groups you might walk
  into.
  Everything else on the panel is cast *on* you - lust is cast on the room
  and a battle res on your corpse - but the reason they belong here is the
  same: it is somebody else's cooldown, and asking out loud mid-pull is the
  part that does not happen.
- **On the answering side each class gets its own.** A mage's cell is Time
  Warp, a warlock's is Soulstone, and a shaman gets whichever lust his
  faction gave him. One press on the asker's side lights the right cell on
  everybody's.

### Changed

- **The co-tanks page is built like the other two.** The preview and the two
  buttons that act on it - **Make the macro** and **What a taunt would say** -
  sit in a band at the top that stays put while the settings scroll. The
  buttons were at the very bottom of the page.
- **Its settings stand in two columns** instead of one per line. Every row on
  that page was full width, which is what made it feel like a form rather
  than a settings page.

## [4.70.0] - 2026-08-10

### Changed

- **The two pages say what they are: External CD request and External CD
  answer.** One asks for a cooldown, the other answers somebody asking - they
  are two ends of one thing and used to be called "External cooldowns" and
  "Answering", which named neither end. Older entries in this file keep the
  names they shipped under.
- **The answer page is built like the request page.** The spells you offer
  sit in a band at the top that does not scroll, with the three things you do
  to the bar - **Move the bar**, **Set keys**, **What every cell would cast** -
  stacked beside them. They were at the very bottom, past every setting on the
  page.
- **Which spells you offer is a row of icons now**, not a stack of full-width
  toggles. Click one to stop offering it; it goes grey and stays where it is.
- **The settings stand in two columns** instead of one per line, which is what
  the rest of the window does.
- **A long page name cannot run off the sidebar** any more. It has a right
  edge now, so it is shortened rather than drawn over the OFF badge beside it.

## [4.69.0] - 2026-08-10

### Changed

- **A button is a button everywhere now.** Actions were drawn three different
  ways - a solid one, an outlined one, and bare text with no surface at all -
  so the same kind of thing looked like three kinds of thing. They all have a
  surface now.
- **The orange is rare again.** Fourteen buttons were painted in the accent,
  including "Delete this profile" and "Reset all settings" - the two loudest
  things in the window were the two destructive ones. Three are left, each
  one finishing something you started.
- **Buttons are as wide as their words.** Fifteen different widths were typed
  by hand at the call sites and none of them was measured, so a label that
  grew got clipped and a short one sat in a slab. One rule: the words plus
  their padding.
- **Half the prose is gone.** Forty-eight notes said what the game will not
  allow and why; they now say what the setting does, in a sentence or two.

## [4.68.1] - 2026-08-10

### Fixed

- **There is a way out of the key mode that you can see.** A **Done** button
  in the banner, and Escape now works from anywhere in the mode rather than
  only while a square is waiting for a key. Nothing is "saved" on the way out
  - every key is written the moment you press it - which is why it says Done
  and not Save. A fight ends the mode by itself, because keys cannot be bound
  in combat.

## [4.68.0] - 2026-08-10

### Changed

- **Setting a key is a mode on the screen now, not a list of rows.** Press
  **Set keys** and the panel comes out with a square over every place: click
  one, press the key, Escape when you are done. A key belongs to a place on
  the screen, and a row called "Slot 3" asks you to hold a picture of the
  panel in your head and count. The squares are their own frames on top -
  an answer cell is a spell button, and a click that reached it would cast.
- **The buttons on a page stand one under the other**, all one width. Three
  boxes shoulder to shoulder, each a different size, read as a toolbar
  somebody stopped styling; stacked they read as what they are - the short
  list of things the page can do. On the externals page they are a column
  beside the preview rather than a row above it.

## [4.67.0] - 2026-08-10

### Added

- **A release can announce itself in a Discord channel.** A webhook rather
  than a bot - no account to host and no permissions to hand out, just a URL
  a channel gives you. Set `DISCORD_WEBHOOK` in the repository's secrets and
  a tag posts its own release notes; leave it unset and nothing happens at
  all, which is what a fork gets. It never fails the release: the addon is on
  CurseForge by the time it speaks.

- **The keys are set in the addon now**, beside the slots they press: a Keys
  section on the External cooldowns page and on the Answering page, eight rows
  each. Click one, press the key, done - right-click clears it, and it says
  what the key was taken from if it was on something else. These write the
  game's own bindings with the same two calls its key panel makes, so they
  show up there too and survive a reload without this addon keeping a copy of
  anything. Out of combat only, because the game does not allow a key to be
  re-bound during a fight - and it says so rather than doing nothing.

### Changed

- **"Let's go" on the welcome window opens the addon.** It asks which
  features you want; closing onto an empty screen leaves you exactly where you
  were, with a settings window you have not found yet. Escape still just
  closes - one is "yes, show me", the other is "not now".
- **Edit Mode hands the window back.** Going in from the addon and coming out
  again reopens it. Going in from the minimap or from `/zs unlock` opens
  nothing, because there was nothing to hide. One rule rather than two: Edit
  Mode gives back what it took.

## [4.66.2] - 2026-08-10

### Changed

- **The changelog page reads as releases now, not as one long list.** A rule
  between them, air around it, a dot instead of a hyphen in front of each
  line - a hyphen sits on the baseline and at three lines of wrapped text it
  reads as punctuation - and the version you are actually running is marked
  **INSTALLED**, which is the first thing you look for after an update and the
  one thing a date does not answer.

## [4.66.1] - 2026-08-10

### Fixed

- **A taunt cell now taunts what that tank is fighting.** It was cast on your
  own target, which in a pull with adds is a different creature and a taunt
  wasted. His target when it can be taunted, yours when it cannot, so there is
  no press that does nothing. This is the one place in the addon that
  addresses somebody by unit rather than by name - "his target" has no name
  form - and the bar is rebuilt on every roster change because of it.

### Added

- **Keys for the external cooldown slots.** The first eight places on the
  panel, in the game's own key bindings under ZwoelfStuff. Bound to the PLACE
  rather than to the spell, because what sits in the third slot changes as
  people come and go - and pressing one with nothing in it says so instead of
  going quiet. Answer cells go from six keys to eight.
- **A quick menu on the answer bar.** A small button that appears when the
  mouse is over the bar and sets who you answer right there: the group forms,
  somebody picks up a second tank, and the settings window is on the other
  side of the screen. Clicking a name picks that person and switches to the
  mode that reads the list, because doing one without the other is a click
  that changes nothing.

### Changed

- **"Tank stuff" is now "M+ and raid stuff"** in the settings rail and in
  `/zs`.

## [4.66.0] - 2026-08-10

### Fixed

- **A cell lit up, took the press, and cast nothing - in silence.** The button
  listened for the mouse coming back UP only. Blizzard's own click handler
  compares the press it received against the game's "cast on key down"
  setting and RETURNS when they disagree: no cast, no error, no message of
  any kind. That setting is on by default, so the feature was never once
  going to work. Both directions are registered now, exactly as MRT and
  EllesmereUI do on every casting button they own, and it works whichever way
  the setting is set. The click is also written into the numbered attributes
  the game looks at first.
- **A taunt cell cast your taunt ON THE TANK WHO ASKED.** A taunt request
  means take the boss, so the spell belongs on your own target - aimed at a
  friendly player it does nothing, and says nothing. The two kinds of request
  are two different lines now, and the tooltip says which.
- **Spells your spec cannot cast were offered.** A holy priest was given a
  Pain Suppression cell that could only ever fail quietly, and worse, told the
  group that his Pain Suppression was ready - a spell with no cooldown running
  reads as available. The bar and every report now ask the spellbook. A filter
  that would remove EVERYTHING is refused instead: at a login or a talent
  swap the book is briefly unreadable, and one cell too many beats an empty
  bar.

### Added

- **Who gets a row is yours to decide.** The tanks, as before - or everybody
  in the group, which is the answer when nobody assigned roles, or people you
  name yourself in the order you want them. With a row count to go with it.
- **Keys.** Six cells can carry a binding, in the game's own key list under
  ZwoelfStuff, and the key shows in the corner of the cell. A binding cannot
  cast - that is the same wall this feature is built around - so these press
  the button for you, which is the one door from a keyboard to a spell an
  addon is allowed to open.
- **Taking the target as well**, off by default: the cast does not need it,
  and a healer who clicks a cell keeps healing whoever they were healing.
- **`/zs answers` is a report now.** It prints the switches, the game's
  cast-on-key-down setting, who has a row and why, and for every cell the
  macro line it would actually run - read off the button rather than from what
  the addon believes it wrote. Three separate causes of a silent click have
  been found by reading code; each one would have been a single line here.

## [4.65.3] - 2026-08-10

### Fixed

- **Clicking an answer cell did nothing across a realm boundary.** The macro
  addressed the short name, and `/cast [@Akui]` reaches nobody when Akui is on
  another realm - no target, no cast, no error. Every group member now carries
  the name a macro can actually address, with the realm on it only when it is
  a different one.
- **The co-tank panel crashed on 12.0 secret values, and took Edit Mode with
  it.** `UnitInRange` answers a SECRET boolean for a group member, and testing
  a secret raises. It never happened on one machine and happened every login
  on another, which is the shape of every secret-value bug so far: what is
  withheld depends on where you are standing. Every unit query in that
  snapshot goes through one guard now, and a withheld answer becomes the
  NEUTRAL one - unknown range is in range, because greying somebody out on a
  value the client refused to give is the display lying with confidence.
- **The keybinding never appeared in the game's key list.** `Bindings.xml` was
  listed in the TOC, so the UI XML parser read it instead of the bindings
  parser, and every line came back as "Unrecognized XML: Binding". The game
  loads a file of that name from the addon root by itself. Checked against
  five installed addons; not one of them lists it.

## [4.65.2] - 2026-08-10

### Fixed

- **A spell you switched off under "What you can be asked for" could not be
  switched back on.** Written `on and nil or false`, which never yields nil in
  Lua - `true and nil` is nil, nil is false, so `or false` takes over
  whichever way the switch went. It stored `false` either way: off exactly
  once, and never back.
- **The same line, twice.** The stand-in cell drawn while placing the bar was
  given a macro aimed at a player called "Tank" for the same reason - the
  exact thing the comment beside it says must never happen. Both are plain
  `if`s now, and the self test switches a spell off and on again through the
  real setter.

## [4.65.1] - 2026-08-10

### Fixed

- **The taunt button could not be moved in Edit Mode.** It had a mover, a cog
  and a padlock, and nothing dragged it: the drag was a hand-written pair of
  lines beside a hand-written list of movers, and the third panel was only
  added to one of them. Both now come off **one list**, so a panel that can be
  placed is a panel that can be dragged, by construction rather than by
  remembering.
- **The externals panel jumped back every time Edit Mode closed.** The
  position was worked out again from `GetCenter()` minus `UIParent:GetCenter()`
  - and those are in different units the moment the panel carries a scale of
  its own. Nothing else moves that frame, so it is simply not re-measured any
  more. Same fix on the taunt button and the answer bar.
- **The answer bar was invisible in Edit Mode.** Standing alone there are no
  tanks to build cells for, so it correctly drew nothing - which is useless
  when the point of Edit Mode is to decide where it goes. A stand-in cell is
  drawn while placing, and it deliberately carries **no macro**: a cell aimed
  at nobody must do nothing when clicked rather than fire at whatever you have
  targeted.
- **The taunt button had no look settings at all**, while a note on the page
  said they were "under Look on the right" - which is the co-tank panel's look
  and writes a different table. Opacity, icon zoom, border thickness, colour
  and texture, backdrop and its colour and opacity are on the page now.
- **A profile from before the slots existed threw on login.** Two migrations
  live in one function, and they were read newest-first: the lattice one
  deletes `count`, and the older list one then did arithmetic on it. Oldest
  first now, with a check that opens exactly that profile.
- `/zs externals` and `/zs taunt` print what the thing is actually painted
  with. "The colour does nothing" has two very different causes - a setting
  that never reached the painter, and a black line on a black plate - and one
  line now tells them apart.

## [4.65.0] - 2026-08-10

### Added

- **Answering** - a sixth module, and the other end of the External cooldowns
  panel. A tank asks for one of your cooldowns; the cell for that spell **on
  that tank** lights up, and clicking it casts. Your own taunt answers a
  tank-swap request the same way.
- **The addon channel** (`Core/Comm.lua`). Invisible, versioned and
  structured, so a request is a button rather than a line to read. The chat
  sentence still goes out for everybody who does not run the addon.
- **Somebody else's cooldown, finally.** The owner's idea, and it gets past a
  wall this addon has had since 4.58.0: a foreign cooldown cannot be *read* on
  this patch, but the person who owns it can *say* it - and their own client
  knows it exactly. So an externals slot now shows a real cooldown swipe for
  the person it would ask. The **duration travels with the message** rather
  than being assumed from a table, because talents move it: Lay on Hands is
  ten minutes, or eight with Unbreakable Spirit.
- Somebody who does not run the addon reports nothing, and their slot shows
  **nothing** - not a hopeful clock.
- A green ring on your slot when somebody is actually casting what you asked
  for. It is sent when the spell goes out, not when they click, so it means
  "it is happening".

### Known limits, on the page itself

- **Only people who also run ZwoelfStuff** can light up. That is the trade for
  everything above.
- **The addon never casts.** You press the cell and the game casts. That is
  also why the bar stands there permanently and only brightens: which spell a
  cell casts, and on whom, is written while you are out of combat, and the
  game does not allow it to be rewritten during a fight. The cells are named
  when the group changes - which is exactly when the owner asked whether they
  could be.
- The bar is **off until you switch it on**. Until then a request is printed
  once, naming the switch, so a feature that would silently do nothing says
  what it is instead.

## [4.64.0] - 2026-08-10

### Added

- **Three ways to ask the other tank for a taunt**, and they all run the same
  line. Owner: "kann man das nicht einbauen, also fertiges dynamisches macro,
  und als button zum stylen mit icon auswahl?"
  - **A button on your screen.** Placed in Edit Mode like everything else this
    addon draws, with the same cog and padlock the panels have, painted by the
    bar's own painters. Off by default.
  - **A keybinding.** The game's own Key Bindings window has a **ZwoelfStuff**
    section with *Ask the other tank to taunt* in it - no macro needed.
  - **A macro the addon writes and keeps.** "Make the macro" on the Co-Tanks
    page creates **ZS Taunt** with your chosen icon and updates it in place
    afterwards; drag it onto a bar once and it stays right.
- **An icon picker.** Your class taunt is the default and the likely icons sit
  on their own row at the top; the rest of the game's macro icons are a paged
  grid under them. No search box, and that is a decision: this client answers
  `GetMacroIcons` with file IDs and no names at all, which is exactly why
  Blizzard's own picker is a nameless grid you page through.

### Changed

- The taunt button belongs to the **Co-Tanks module**: one switch turns off
  the panel, the announce and the button together, and its mover reads that
  same switch.
- The button's border and backdrop are the **bar's settings under the bar's
  key names**, so `ns.PaintSurface` and `ns.PaintBorder` paint it without
  knowing what it is. There is still exactly one renderer in this addon.
- The self test pins what cannot be seen: that the macro name fits the game's
  sixteen-character limit (over it, every press would make another macro), that
  the keybinding has a global to call and strings to show, and that the icon
  pager does not run off the end of the last page.

## [4.63.0] - 2026-08-10

### Added

- **The taunt announce** (roadmap item 6, the owner's own order: 10, then 6,
  then 1). Press your taunt and one line goes out in chat, so the other tank
  knows you took it. Settings are on the Co-Tanks page, under **Taunts**.
- The message is yours to write: `%t` is what you taunted, `%s` is the taunt
  you pressed, `%n` is the other tank. A placeholder nothing filled comes out
  of the sentence rather than being read out as "%t" by somebody mid-pull.
- **`/zs taunt ask`** tells the other tank to take it - the other half of a
  swap, and the half an addon can actually do something about. Put it in a
  macro and give it a key.
- `/zs taunt` prints what your next taunt would say, who it thinks the other
  tank is, and which channels it would go out on.
- **It is off until you ask for it.** An addon that starts writing in party
  chat after an update is the worst surprise it could hand somebody, and the
  self test checks that promise rather than trusting it.
- Two presses inside two seconds are one announce. A taunt that misses is
  pressed again immediately, and a tank who spams his own group over it
  switches the feature off and never comes back.

### Changed

- **`Core/Chat.lua`** - which channel a message actually goes on, in one
  place. It was written inside the externals panel and now has a second
  caller; a second copy of those rules would be a second chance to get the
  one that matters wrong. (`/p` is NOT party chat in a dungeon from the
  finder - that group talks on INSTANCE_CHAT and a message to PARTY arrives
  nowhere, silently.) The externals panel keeps every name it had.
- Writing a sentence is one pass with a function replacement now, so a mob
  called "%n the Devourer" cannot be read as a placeholder by a substitution
  that comes after it - because none does.
- **Who is in your group** moved to `ns.Roster` in Init.lua. The taunt
  announce asks the same list a different question - "who is the other tank" -
  and two walks over one party would be two chances to disagree about who is
  in it.

### Known limits, stated on the page itself

- **It cannot tell you when the OTHER tank taunts.** Since 12.0.5 another
  player's instant cast is not announced to addons at all, the combat log is
  closed, and every taunt in the game is instant. Anything claiming to show
  you the co-tank's taunt on this patch is guessing. Yours is readable, which
  is why this says yours out loud instead.
- **"Swap at X stacks" is not possible**, and will not be in 12.1 either: a
  foreign aura's value cannot be read, only displayed.

## [4.62.0] - 2026-08-10

### Added

- **A panel's mover has a cog and a padlock**, the same two a bar's mover has.
  Owner, with a screenshot of the externals mover: "hier fehlt noch das
  zahnrad fuer einstellungen und das lock item!" The two kinds of mover are
  one idea, and having half the controls on one of them was something to
  discover rather than to learn.
- The cog carries **Centre on screen**, **Centre horizontally**, **Centre
  vertically**, **Pin in place**, **Settings** - which leaves edit mode and
  opens that panel's own page - and **Switch off**, which switches the module
  off from where you are looking at it.
- **Pinned means it does not move.** It still selects, it still opens its
  settings; it is simply not what a stray drag lands on. The co-tank panel's
  own drag honours it too, which is a second door to the same frame.
- Both controls sit on a **strip above the box** rather than in a corner of
  it. A panel can be one icon square - a single-slot externals panel is forty
  pixels - and two twenty-pixel buttons do not fit inside that at all.

### Changed

- `CreatePanelMover` takes one spec table now: label, origin, apply, config,
  page, module. Built once, so the co-tank panel and the externals panel got
  the cog and the padlock in the same change rather than one of them getting
  it and the other waiting for somebody to notice.
- The self test checks both movers carry both controls, that a pinned panel
  refuses the drag - through the real handler, not a restatement of the rule -
  and that the two keys behind the cog name a page and a module that exist.
  Both are strings handed to something that quietly does nothing when it does
  not recognise them.

## [4.61.0] - 2026-08-10

### Fixed

- **The slots on the External cooldowns page were not drawn at all**, which
  read as lost saved data: an empty band over a "Who to ask" list that still
  named the spells. Owner: "nach rl ist mein preset von meinen external cds
  immer weg." Nothing was ever lost. The frame the slots sit in had ONE
  anchor point and a height and no width, so its rectangle could not be
  worked out - and a frame like that is not drawn, and neither are its
  children. The band's own eyebrow and hairline are regions of the band
  itself, so they kept drawing and hid what had happened.
- **A chat channel you switched off came back at the next login.** It was
  listed in the defaults, and a channel that is off is stored by being
  missing - so the default filled it back in every time. The same rule the
  welcome window follows: what the player answered is not something to have a
  default for.

### Added

- **Rows and columns, the two words a cooldown bar uses.** Owner: "anzahl rows
  fehlt! wie die cdm einstellungen, reihe und spalten anzahl." Rows times
  columns is how many places there are, so the count is not a separate setting
  that could disagree with the line width any more. A panel written before
  this reads its old count and line width once, becomes the same shape, and
  drops them.
- **The preview in the band IS the panel's lattice**, laid out by the same
  function the panel uses - `Externals.Cell` - so what you arrange is the
  shape you get. It shrinks to fit the page rather than clipping or scrolling:
  a lattice you cannot see all of is not a preview of anything.
- **Move the panel, Test mode and Who would be asked sit in the band**, with
  the slots they act on. Owner: "auch sollte der test mode button etc da mit
  hoch." Test mode says which state it is in rather than looking the same
  either way.

### Changed

- **What you say moved directly under Who to ask**, at the owner's word, and
  everything about how the panel LOOKS follows after it. Who you ask and what
  you say to them are one thought; borders and backdrops are a different
  afternoon.
- `/zs externals` prints the lattice and every slot in it, filled or empty.
  "My panel is empty" has two completely different causes - nothing saved or
  nothing drawn - and one line now tells them apart.
- One "Who to ask" row is built per spell that exists rather than per slot
  that could exist. A spell lives in exactly one slot, so fourteen is the real
  ceiling however large the lattice gets.

## [4.60.2] - 2026-08-09

### Added

- **The externals preview stays put while the settings scroll under it.**
  Owner: "vorschau sticky machen! sprich content darunter scrollt." It is the
  thing being edited, and the rows below it are the settings for it - watching
  your own slots while you change how they look is what a preview is for.
- `UI.Page` grew an `opts.sticky` band for it: a strip at the top that does
  not scroll, filled by the page and measured by it. The scroll area starts
  below the band and clips its own children, so nothing can be drawn into it
  from underneath.
- The band is as tall as the slot rows actually shown, re-measured whenever
  the count changes. Sized for all twenty-four it would hold a third of the
  page empty for slots nobody asked for.

## [4.60.1] - 2026-08-09

### Changed

- **"Who to ask" sits directly under the slots**, at the owner's word. It
  belongs there: those rows and the slots above them are the same decision
  seen twice - which spells do I want, and who gives me each one. Everything
  below is what the panel looks like, which is a different afternoon.

## [4.60.0] - 2026-08-09

### Added

- **The externals panel is styled like a cooldown bar**, because the owner
  asked for exactly that: "genau wie die anderen optionen beim cdm". Scale,
  opacity, icon zoom, border thickness/colour/texture, backdrop
  show/colour/opacity/texture - the same rows, the same words.
- **And it is not a second renderer.** The settings are stored under the SAME
  key names a bar uses, so `ns.PaintSurface` and `ns.PaintBorder` paint the
  panel without knowing what a panel is. A change to how a border is drawn
  reaches both without anybody remembering there are two places - which is the
  fault this addon has already paid for twice, once in the aura strips and
  once in the death window's preview.
- The self test checks every one of those key names against
  `ns.BAR_STYLE_KEYS`. Rename one and the painters would quietly keep using
  the defaults while the setting appeared to do nothing.

### Changed

- The hover outline on a panel icon is the panel's own, drawn above the
  border: it says "this is the one you are about to press", and it has to be
  visible whatever border you chose - including none.

## [4.59.1] - 2026-08-09

### Changed

- **The channel is a MULTIPLE choice.** Owner: "wir brauchen hier eine
  mehrfachauswahl, sorry, das hab ich falsch kommuniziert." A whisper to the
  one person who can cast it AND a line in party chat is a reasonable thing to
  want - the first is aimed, the second is insurance. Chips rather than a
  select, because five yes-or-no answers all need to be visible at once, which
  a dropdown showing one line cannot do however it is worded.
- **Two choices that come out the same are sent once.** "Raid warning" and
  "Party or raid" both resolve to `RAID` for somebody without assist, and one
  sentence twice in one channel is a person spamming their own group because
  of a setting they thought was two different things.
- **A whisper with nobody to whisper no longer stops the rest.** It is dropped
  and the other channels still carry the message; only when it is the ONLY
  channel is the press refused.
- **The last channel cannot be switched off.** A button that sends nowhere is
  not a setting, and the click that emptied it is the one nobody notices
  making.
- `UI.ChipRow` grew an `isOn` predicate beside its `current` one, so the same
  widget does both the filter shape it was built for and this one.

## [4.59.0] - 2026-08-09

### Changed

- **The externals panel is SLOTS now, the way the cooldown bars are.** It was
  an ordered list, which is why "how many slots" changed nothing and why there
  was no empty third slot to click on. There is a count, a sparse table of
  what is in each place, and a profile written before this pours its old list
  into the slots once.
- **Click a slot and it stays marked**, and the next spell you click in the
  list goes into THAT one - the same gesture the Cooldowns page runs on. A
  marked slot is cleared once it is used, or the next click would overwrite
  what the last one just placed.
- **A spell can only be in one slot.** Putting it somewhere else moves it
  rather than leaving a second copy, which would whisper twice for one click.
- Taking the count down and back up gives you what you had: a slot beyond the
  count keeps its spell, the same rule a shrunk bar follows.

### Added

- **Where the message goes**: whisper, party or raid, raid warning, say, yell.
  **"Party or raid" picks the right one for the group you are actually in** -
  and that is the point of it: `/p` is NOT the party channel in a dungeon from
  the group finder. That group talks on `INSTANCE_CHAT`, and a message sent to
  `PARTY` there arrives nowhere at all, silently. `IsInGroup(2)` is the test,
  taken from BigWigs, which picks its channel exactly this way.
- A raid warning outside a raid, or without assist, falls back to the group
  rather than refusing - the message still wants to arrive - and says which.
- **`%n` in the message is the person being asked**, next to `%s` for the
  spell. Worth having in party chat, where "Ironbark bitte!" asks nobody in
  particular. With nobody to name, the placeholder is removed rather than
  printed.

### Fixed

- `gsub` answers a string AND a count, and handing that pair straight to
  another `gsub` makes the count its LIMIT - "replace at most 0 times". The
  message went out with a literal `%s` in it. Caught by the self test, which
  is the only reason it is in this section rather than in a screenshot.
- A client with no chat API is a sentence now, not an error thrown under the
  cursor.

## [4.58.2] - 2026-08-09

### Fixed

- **The "Who to ask" boxes were blank.** `UI.Dropdown` hangs its own `Refresh`
  on the row it is given, and the page replaced that hook afterwards instead
  of calling it - so the control never repainted, and the words that say what
  happens when you leave it alone ("The healer of that class") were never
  drawn. Two things wanting one hook: the second has to call the first.

## [4.58.1] - 2026-08-09

### Fixed

- **The externals panel never appeared in Edit Mode.** `ShouldShow` read
  `ns.EditMode.unlocked`, which is a FILE-LOCAL in that module and therefore
  always nil - so the panel stayed hidden while placing and its mover had
  nothing to sit on. Edit Mode calls `Externals:SetPlacing` now, the same door
  the co-tank panel and the reminders are already opened through.
- **Every picked slot is drawn while placing.** The panel hides a slot nobody
  present can fill, and the group you are standing in while arranging it is
  usually nobody at all - so there was nothing on screen to put anywhere.

### Changed

- **The list of externals no longer cares who is in your group.** Owner: "man
  sollte auch ohne das die klassen in der gruppe sind sich sein set
  zusammenstellen koennen". A set is built once, for the dungeons you run all
  week; a list that greys itself out because you are standing alone can only
  be used at the moment you have no time for it. The trailing text is the
  spell's cooldown now - a fact about the spell - and WHO can cast it stays
  where the names are, under "Who to ask".

## [4.58.0] - 2026-08-09

### Added

- **External cooldowns - a fifth module.** The cooldowns somebody ELSE presses
  on you: fourteen spells, cross-checked against Method Raid Tools' own
  `DEFTAR` set ("defensive on a target"), which is the same idea under another
  name. Pick some, arrange them into a panel, place it in Edit Mode, and a
  click whispers whoever in the group can cast it.
- **Who a click asks**, in the owner's words: "in 5 mann dungeons werden
  heiler der klasse angewispert. im raid sollte man das zuweisen koennen." So
  an assignment wins whenever one exists, and with none it is the healer of
  that class - which in a five-man is the only person who has it. An
  assignment to somebody who has left the group falls back to the rule and
  the tooltip says which of the two answered.
- **A slot nobody can fill is not drawn.** The owner's choice: with no
  paladin in the group there is no Blessing of Sacrifice icon on your screen.
  The page's list says "nobody here" beside it so the absence has an
  explanation.
- `/zs externals` prints who each slot would whisper. `/zs externals test`
  shows the panel with nobody around.

### Changed

- **This is deliberately NOT a cooldown tracker**, and that is the whole
  design. MRT shows other people's cooldowns by reading
  `COMBAT_LOG_EVENT_UNFILTERED` - checked in its own `ExCD2.lua`. That log is
  closed to addons on 12.0, and since 12.0.5 another player's INSTANT cast is
  not announced at all. Every one of these spells is instant. "Ironbark, ready
  in 1:12" is a number this addon cannot know, and it would be believed in the
  one moment it matters.
- The welcome window's generation moved to 2, so everybody who has already
  answered is asked once more - about this one entry, marked NEW, and nothing
  else. That is what it was built for.

## [4.57.2] - 2026-08-09

### Added

- **Drag the replay's plot to move along it when zoomed in.** The wheel
  already scrolled it; the hand is the gesture people reach for. The pane
  does BOTH rather than stealing one - at zoom 1, where there is nothing to
  pan to, grabbing the plot still moves the window, which is what it did
  before. It sits at the parent's own frame level, so it is UNDER every mark
  and the icons keep their tooltips.

## [4.57.1] - 2026-08-09

### Fixed

- **The bag scan recognised nothing, ever.** `GetItemInfoInstant` answers the
  class id as its SIXTH return; the code discarded four values after pcall's
  `ok` and took the fifth, which is the ICON - so a texture file id was
  compared against 0 and every potion in the bags was thrown away. Owner:
  "der erkennt die silvermoon health potion nicht". It is `select(6, ...)`
  now, which is how every installed addon writes it and the version that
  cannot be miscounted.
- **You could not type in a search field.** An EditBox built from Lua has no
  mouse: Blizzard's `InputBoxTemplate` enables it in XML, and every addon that
  builds one without the template turns it on by hand - AceGUI's
  MultiLineEditBox, its slider box, BugSack's. Ours did neither, so the field
  drew, showed its placeholder and could never be given focus by the only
  gesture anybody tries. Menus with a filter now open with the box already
  focused, which is what their own footer has been promising, and the keyboard
  is handed back when the menu closes.

### Added

- **Drag an item out of your bags onto a consumable slot.** The owner asked
  for it and it is the gesture the game's own action bars use. Both doors are
  wired, because the client offers two: releasing a drag, and clicking a slot
  while carrying something. This path reads the id off the CURSOR, so it does
  not depend on the bag scan seeing the item at all.

### Changed

- The desktop harness has bags now. It had none, so the consumable code
  returned at its first guard and every test of it was vacuous - which is
  exactly how the class-id bug shipped. Its fixture holds a healthstone, a
  potion, a sword and a hearthstone: the last two have use effects and are not
  consumables, so a filter reading the wrong field is caught by the fixture
  rather than by the owner.

## [4.57.0] - 2026-08-09

### Changed

- **The event list in the death window scrolls, and it no longer drops hits.**
  The rows were placed at absolute offsets inside a window of fixed height,
  with a hard cap of twelve to stop them running off the bottom - so the
  deaths with the most to say were the ones losing rows. The list has an AREA
  now: its top follows the verdict, its bottom sits on the footer, and what
  does not fit is scrolled to. It opens at the BOTTOM, because the row that
  matters is the last one.
- **The footer no longer draws across the last hit.** Same fault, other half:
  with a four-line verdict and ten hits, "What you had, by our own clock" was
  printed straight over the killing blow. The list's bottom is anchored to the
  footer, which grows upward, so neither can be drawn over the other whatever
  either of them contains.
- The rows are POOLED and built when needed rather than twelve up front, and
  they are eight pixels narrower than the column - which is the room the
  scroll rail sits in. Without that the right-hand numbers, which are what the
  table is read for, would be under it.

### Fixed

- **A wheel over a list that cannot scroll is handed back instead of
  swallowed.** `EnableMouseWheel` takes the gesture whether or not there is
  anything to move, and in this window the wheel is how you page between
  deaths - so a death with three hits would have eaten it over the largest
  part of the window. `UI.ScrollArea` now offers `OnIdleWheel` for exactly
  that, and the contract is checked in the self test.

## [4.56.2] - 2026-08-09

### Fixed

- **Every mark in the window was soft, and it was one comparison.** The rule
  that picks which cut of an icon to load asked
  `UIParent:GetEffectiveScale() > 1.25` - a number that is never above 1.25 on
  a real machine, since 1440p sits around 0.53 to 0.75. So the SMALLEST cut
  was loaded on every screen there is: a 22-pixel drawing stretched across 43
  real pixels in a card header, a 14 across 21 in a row. No amount of care in
  the art fixes that; the file was simply too small.

  What decides it is how many physical pixels one interface unit covers -
  `GetPhysicalScreenSize()` over `GetScreenWidth()`, the same ratio
  EllesmereUI computes for the same reason, guard included: that call answers
  0 or nil while the display mode is changing.

  Two facts were measured rather than assumed on the way: the number in a
  file's name is the DRAWING inside it, not the file (`-14` is a 16x16 image),
  and the design's own pairing is 14-into-16 and 28-into-32 - which is exactly
  the slack the chooser now allows, so it never loads a 64x64 texture to draw
  16 pixels.

  `UI.IconCutFor` is pure and tested at eight densities: a rule that is a
  screen measurement cannot be checked by reading it, which is how this
  survived so long.

### Added

- **Diagnostics reports the icon sharpness** - pixels per unit and which two
  cuts that picks. "Sieht matschig aus" is not something a screenshot can
  settle, and now it does not have to.

## [4.56.1] - 2026-08-09

### Fixed

- **The two numbers on an aura icon can be given a font.** They were the only
  text this addon draws with no way to choose its face - and worse, they were
  fonted twice: hard-coded to the shared bar font in the 12.0 renderer and to
  the OPTIONS WINDOW's font in the 12.1 engine path, so the same two numbers
  changed typeface depending on which patch drew them. One picker, one
  outline, both renderers, and the face is part of the container signature so
  picking one takes effect at once.
- **`Visibility:Start()` and the spec-key cache moved out of `Screen:Start()`
  and into the machinery.** Both are shared - a reminder's "only in combat"
  reads the same evaluator, and the spec key is the name the measured cooldown
  lengths and the recorded procs are filed under. Started inside the Cooldowns
  module they would have stopped existing for anybody who switched the bars
  off: reminders on a state nobody sampled, and a death log reading Blood's
  measurements while you played Frost.

## [4.56.0] - 2026-08-09

### Added

- **Four features, four switches.** `Core/Modules.lua` is a registry of what
  this addon actually is - Cooldowns, Co-Tanks, Reminders, Death-log - and
  each one can be off. A module that is off boots NOTHING: no frame, no
  event, no listener. `Boot` runs once and only for a module that is on;
  `Apply` runs on every flip and puts the world in the state the switch says.
  Unregistering was deliberately not the mechanism - Blizzard's callback
  registries here have no way back out, so a module that had truly unhooked
  itself could never be switched on again without a reload.
- **The welcome window**, once per character, and once more when an update
  brings a module that character has never been offered. `Modules.WelcomeDue`
  is the rule and it is pure, so the case that is easy to get wrong is
  tested: a generation bumped with no new module must not open a window in
  anybody's face.
- `/zs modules` lists what is running and switches one by name; `/zs welcome`
  reopens the window. There is a button for it under Settings.

### Changed

- **What is NOT a module**: the Cooldown Manager reader, the profile store,
  the minimap button and the game-menu entry. Switching the bars off must not
  take the spell catalogue with it - a reminder asks it whether a buff is up,
  and the death log builds its defensives out of it.
- **Off means Blizzard gets its icons back.** Every icon on a bar is one of
  Blizzard's own frames; a hidden bar still holds them, so hiding alone would
  have left the Cooldown Manager empty as well. `Screen:ModuleOff` releases
  them, and both callers - the render pass and unlock mode - ask it.
- **A switched-off page stays in the rail, greyed**, with the switch on it.
  One overlay drawn once and moved between pages rather than four copies of
  "this is off", and it swallows the clicks that greying promises it does.
  Its third column goes away with it: a live spell palette beside a greyed
  page would be half a state, and the live half edits settings for something
  that is not running.
- **Edit Mode hides the movers of a module that is not running**, handles
  included - the frames still exist once a module has run at all, so "is
  there a panel" is not the same question as "is this feature on".
- `Reminders:Explain` reports the module switch FIRST. A page explaining at
  length why one reminder is not firing, while the whole module is off, sends
  somebody reading their own trigger for a fault that is not there.

## [4.55.1] - 2026-08-09

### Changed

- **The Sharing row is full width and the buttons have air above them.**
  Half-width put a 150-pixel menu in the middle of the line with its label
  stranded at the far left, and the button strip underneath then read as part
  of that setting. `Grid:Buttons` took a `padTop` for it - pads collapse with
  the neighbour's, so a strip that wants air has to ask for a real amount.

## [4.55.0] - 2026-08-09

### Changed

- **"Deaths" is "Death-log", with a skull in the rail.** `UI.Glyph` grew a
  `RAW_TEXTURES` branch for marks that are the client's own art - one entry,
  and it earns it: the rail's skull is the same picture as the skull on the
  screen, and drawing a second one out of rectangles would be two marks for
  one feature.
- **The defensives are SLOTS, at the top of the page.** `UI.SpellSlot` in a
  grid, so a spell is dragged out of the right-hand list and dropped, and
  right-click clears it - the same gesture the cooldown bars use. The list is
  the only thing on the page that is *work*; the switches under it are set
  once and were standing in front of it. The slots are a VIEW of the picked
  set, sorted by name: a defensive is picked or it is not, and giving it a
  position would be a second thing to keep in step.
- **Consumables use the same slots.** They cannot be dragged in - the spell
  list holds no items - so an empty one opens a menu of what is in your bags.
  `UI.SpellSlot` took two optional hooks for it (`texture`, `tooltip`) rather
  than growing a second slot widget.
- **The settings pair two to a line** (`tooltipNotes = true`, like the bars
  page): every paragraph moved onto its row as a hover explanation. Three
  toggles used to fill a screen and a half with the right half of every line
  empty.

## [4.54.0] - 2026-08-09

### Removed

- **The Timeline module.** `Core/Busters.lua` and `Core/OptionsBusters.lua`
  are gone, with their page, their Edit Mode mover, their slash command and
  their tests. The owner's call: *"wir nehmen timeline als eigenes modul
  raus, das ist ja jetzt im death log drin"*. What the panel drew live was
  the fight's next scheduled hit; the replay answers the same question
  afterwards with everything the panel could never show. The defensives list
  it carried was always read by the death window - it moved, it was not lost.

### Added

- **Consumables are defensives.** `ns.db.rescueItems` is a picked list like
  `ns.db.defensives`, seeded once with healthstone and the two current
  healing potions - `nil` means "never seen", which is not the same as a
  list emptied on purpose, so a potion thrown out stays thrown out.
  - They are judged in **one list with the spells**: an `avail` entry carries
    a `spellID` or an `itemID` and nothing downstream cares which. The old
    shape had a second list for "what was in the bags", so one question had
    two answers on one window. `Death.Analyse` lost its `items` parameter.
  - An item's cooldown is a **fact**, not an estimate: `C_Item.GetItemCooldown`
    is readable on this patch. `Death.ItemReady` returns it; the count comes
    from `C_Item.GetItemCount`, and carrying none is worded as "none" rather
    than as a cooldown.
  - `Death.BagConsumables` offers whatever is in the bags right now with a
    use-spell and class id 0 - not a shipped list of item ids, which goes out
    of date every patch.
  - Drinking one is a cast: `DefensiveSpells()` maps each picked item to its
    spell through `C_Item.GetItemSpell`, so a potion gets a **bar** in the
    replay instead of appearing in the rotation row as an unnamed press.
- **The Deaths page carries the spell list as its third column**
  (`OptionsDeaths:BuildSide`, on the same `BuildSpellPane` the bars and
  reminders use). Click a spell to judge it as a defensive, click again to
  stop. Picking out of a dropdown of forty names was the worst part of it.
- `UI.MakeRowAnItem` - a row with an item's icon and the client's item
  tooltip, the same rule spells already get.

### Fixed

- **`ns.version` was a second, drifting copy of the version number** - it
  said 4.50.0 while the TOC said 4.53.0, and it is what the window shows,
  the About page prints and a shared profile is stamped with. It reads
  `C_AddOns.GetAddOnMetadata` now.

## [4.53.0] - 2026-08-09

### Changed

- **Only picked defensives get bars; the rest of the rotation gets a row of
  its own.** The owner: *"normale spells brauchen eigentlich keinen balken,
  nur def cds die man einstellt. das verwirrt nur."* He is right - a bar
  means "this was up for this long", and a Death Strike has nothing that is
  up, so drawing one off its tooltip's number invented a state that does not
  exist. Non-defensive casts are icons on `LANE_CAST_Y`, directly under the
  axis, each on a hairline reaching up to it.
- **A drop line from the axis to every bar**, standing on the moment it was
  cast, in the bar's own colour: *"auch fehlt so ein mittelstrich zur
  timeline, das man sieht wann die losgehen"*. Only for bars that start
  inside the view - one clamped to the left edge started off screen, and a
  line there would point at a moment that is not under it.
- **The "What you pressed" caption is gone** - *"das sieht jeder"*.
- **`UI.SpellChips`**: a list of spells is now laid out (icon, name, the
  client's own tooltip, flowing and wrapping into rows) instead of written
  into a font string with inline icons. Six inline escapes in a wrapping
  sentence wrap wherever they like and strand a name on the next line
  without its icon, which is exactly what the death window's footer did.
  One implementation, used by that footer and the replay's legend.

## [4.52.0] - 2026-08-09

### Added

- **A fourth source for a bar's length: the spell's own tooltip.** The owner,
  looking at two defensives still drawing as marks: *"viele def cds haben
  FESTE zeiten, die auch so in den tooltips stehen"*. He is right, and this
  is not the rule against guessing - it is the opposite of it. The client
  writes the number in `C_Spell.GetSpellDescription` itself (BigWigs reads
  the same call), so reading it is asking, exactly like asking for a name or
  an icon.
  - `ns.SpellDuration` is tried **last**, after the measured window, the
    number you set and the measured store: a tooltip says what is *supposed*
    to happen - before talents, before haste, before the hit that cut it
    short. `Replay.LengthNote` names the source on hover.
  - **The unit word comes from the client too.** `SECONDS_ABBR` /
    `D_SECONDS` are Blizzard's own formats in whatever language is installed
    (`"%d |4Sekunde:Sekunden;"`), so both forms are extracted and neither was
    typed here. `ns.DurationWords` and `ns.DurationInText` are pure and
    tested against German, English and minutes; the word is escaped before
    it is used as a pattern, because `Sek.` carries a dot and an unescaped
    one matches anything.

## [4.51.2] - 2026-08-09

### Added

- **`/zs death cds`** - why a press has no bar under it. Four causes wear
  that one symptom: the Cooldown Manager is not up, its buff viewers hold
  nothing (so no window can ever be recorded, however long you play), the
  item spell ids are secret, or the death on screen predates the recorder
  and carries no windows. `History:Dump` reports **the switch first and
  then everything else anyway** - a diagnostic that stops at the first
  problem answers one question and leaves three, and on the desktop harness
  it would never exercise its own body.

### Changed

- **"Your casts" is its own line**, not the tail of `No defensive was used -
  you cast …`. A rotation of seven abilities wrapped that sentence over
  three lines and the judgement vanished into the middle of the evidence.
  The cast list is now printed whenever there were casts, including under
  `Defensives used:`.

## [4.51.1] - 2026-08-09

### Changed

- **The availability footer writes only what it knows.** `ready` and
  `25s to go` are answers; "no known cooldown" and "not cast since login"
  are the addon saying it cannot tell, once per defensive, in the space
  where the answer should be. The owner read that footer and said they can
  go. The name and its icon stay.
- **Inline spell icons are line-height, not 14 pixels.** `|T…:0:0:…|t` sizes
  the icon to the font's line box; a fixed height taller than the line hangs
  out of the top of it, which is exactly what it did.
- **The faces on the replay are 30px** (were 20): a creature model is a
  whole silhouette in a square, and below about this it is not recognisable
  as anything.
- **"What you pressed" sits above its bars**, where the other two lanes
  carry their names. The bar stack starts 14px lower to make the gap.

## [4.51.0] - 2026-08-09

### Added

- **Defensive durations are MEASURED.** The press bars drew as stubs because
  their only source was the "active for N seconds" number a person can type
  in on the Auras page, and nobody types it in. `History.lua` now polls
  Blizzard's **buff viewers** ten times a second and records the window
  between a tracked buff going active and going inactive - our own clock
  over a value this patch withholds, the same trick the proc recorder plays
  with the glow events. Only the buff viewers, deliberately: an icon in the
  cooldown viewers is "active" for reasons of its own, and a Shield Wall
  drawn three minutes long because its *cooldown* was running would be a
  confident lie.
  - `History.PushActive` keeps a window only if it lasted between 0.5s and
    120s; `History.WindowFor` pairs a window with the press that opened it
    (0.5s early to 2.0s late, newest first, variant-aware) and answers with
    no end when the buff was **still up at the death** - which the replay
    draws as a bar running to the killing blow.
  - `History.NoteMeasured` keeps the longest window ever seen per spec, so a
    death restored from disk can still draw a length somebody observed.
  - `Replay.BarLength` asks in order: this press's own window, the number
    you set, the measured store. None answering is still a marker with no
    length - never a guess - and `Replay.LengthNote` says on hover which of
    the four it was.

- **A face over every hit and every heal.** `Death.ReadRecap` now extracts
  creature/display art **per event**, keyed by the source's name so a hit
  that carries no readable id inherits the face found on another hit from
  the same named mob. Mob faces are `PlayerModel:SetCreature` (built lazily,
  one per mark that has art); healer faces are `SetPortraitTexture` against
  the unit token the name resolves to - proven in shipping code (oUF's
  portrait element, EllesmereUI unit frames, BigWigs). No unit, no face: we
  do not know what that person looks like and will not invent one.

### Changed

- **The single killer portrait in the replay's corner is gone.** With ten
  mobs on you it answered for all of them and therefore for none. Its
  tooltip facts moved onto the per-hit marks (`Replay.SourceSummary`, was
  `KillerSummary`).
- **The damage columns stand clear of the axis** (`COLUMN_LIFT`), so the
  seconds written on the line stay readable under twenty of them.
- **"Defensives used"**, not "pressed" - and every spell named in the UI
  carries its icon and its tooltip: inline in the verdict and the
  availability footer (a wrapped font string cannot hold a hover target),
  and as real chips with the client's tooltip in the replay's legend. The
  analysis carries `{ spellID, name }` pairs everywhere it used to carry
  bare names, because only the id can produce either. `Death.PlainText`
  strips the inline icons on the way to chat, where the escape sequence
  would arrive as punctuation or not at all.
- The replay window is taller (576) and **"What you pressed" sits under its
  own bars** rather than at a fixed offset that landed on the third row -
  which nothing reached while every bar was a stub.

## [4.50.0] - 2026-08-09

### Added

- **Your presses are bars, not icons.** Each starts where you cast it and
  runs for as long as it is up, so "was it still there when the hit landed"
  is answerable by looking. Overlapping bars stack onto rows
  (`Replay.StackRows`, greedy by start time) and each keeps its own colour.
  **Where the duration comes from**: this addon measures durations and never
  assumes them (see `KnownProcs.lua`). Aura data is secret on this patch, so
  the source is the "active for N seconds" number you can set yourself on
  the Auras page. Unset, the press draws as a marker with no length rather
  than an invented one.

- **Zoom, and the wheel scrolls the plot.** Six presses inside two tenths of
  a second cannot be drawn apart at any icon size, so the plot shows less
  time instead (`Replay.View`, up to 8x). While playing the view walks with
  the playhead; scrolling takes it off that until Restart or Stop hands it
  back. At zoom 1 the view never moves, so the normal case costs one
  comparison per frame rather than sixty-eight re-anchors.

### Changed

- **The axis** is three pixels rather than one and carries its seconds **on**
  the line, on a patch of the window's own background, with half-second
  marks between them. The scale follows the zoom: twelve seconds on screen
  gets a label every two, a second and a half gets one every half.

- **The killer's portrait** is small and sits on the damage lane instead of
  filling the window's corner - in a dungeon twenty things are hitting you
  and one large face claimed the whole picture for one of them.

- The health bar is **red**, the **boxes around the icons are gone**, and the
  **Speed label sits next to its slider** rather than eighty pixels away.

### Fixed

- **A heal was recognised by two event names written from memory**
  (`SPELL_HEAL`, `SPELL_PERIODIC_HEAL`). It is now anything the client calls
  HEAL - if the recap says `SPELL_HEAL_ABSORBED` or anything else in that
  family, a heal would have been drawn as damage and counted into the wrong
  total.

## [4.49.0] - 2026-08-09

### Added

- **A third lane on the replay: healing on you.** The amount, the spell's
  icon and **who cast it**, in their class colour where the client will
  give it (`UnitClass` answers for someone in your group and nothing else,
  so it is asked under pcall and the plain name is the fallback). Healing
  used to be a green column among the red ones; "was anybody healing me" is
  its own question and now it has its own row. The window is taller for it,
  and worth it.

- **The killer's portrait on the replay**, with what he did to you on the
  hover: hits, total, biggest, and which of his abilities landed
  (`Replay.KillerSummary`, summed from the events already read). What else
  a mob *can* do is not something the client will tell an addon on this
  patch - there is no call for an arbitrary NPC's abilities, and a mob
  inside a dungeon withholds even its name. The tooltip says so instead of
  leaving a gap.

- **"Your health"** over the health bar. It is the only bar in the window
  and it was being read as the mob's.

### Changed

- **Speed is a slider** (a quarter to triple), and **the death window's
  size is a slider**. Both were buttons walking a fixed list; a quarter and
  a half are different things to want, and dragging to one beats clicking
  past three others to reach it.

### Fixed

- **The death window drew through the replay in front of it.** Two movable
  windows in one frame strata: the window's children sit above the other
  window's background, so its buttons punched through. Both are `SetToplevel`
  now - whichever is clicked comes forward - and opening a replay raises it
  without needing a click.

## [4.48.0] - 2026-08-09

### Added

- **How many deaths to keep is a setting** on the Deaths page - three to
  fifty, ten by default, per profile. They are kept for this character and
  survive logging out, so the number is how far back you want to be able to
  look. Lowering it trims the list **immediately** (`Death.Trim`): a list
  that keeps forty for the rest of the evening after being told ten is a
  setting that appears to do nothing. The cap is also applied on the way
  back **in**, because a list read off disk can be longer than what the
  setting says now.

- **The side list scrolls.** It shows twelve at a time - the pool is sized
  to the window, not to the setting, so asking for fifty does not build
  fifty frames to show twelve. The wheel over the list scrolls it; the
  wheel over the analysis still steps through deaths, and doing so keeps
  the death being read in view (`Death.ScrollTo`). The heading says "23
  deaths - scroll for more" rather than leaving the wheel to be discovered.

## [4.47.1] - 2026-08-09

### Added

- **Restart on the replay** - from the top, running. **Stop** rewinds and
  waits, which is what you want when you are about to point at something;
  Restart is what you want when you just missed it.

### Fixed

- **Play at the end of a replay did nothing.** The clock had already run
  out, so un-pausing it changed nothing on screen - a button that looks
  live and moves nothing reads as broken. There, and only there, Play now
  means play it again (`Replay.PlayAction`).

## [4.47.0] - 2026-08-09

### Added

- **REPLAY**, in a window of its own (`Core/Replay.lua`). A time axis down
  the middle, what came in above it, **what you pressed below it**. Play,
  pause, stop, and a speed button from a quarter to double. Every mark
  carries its icon, its number and the client's own tooltip; a health bar
  across the top drains as the playhead crosses them; a defensive of your
  own is drawn in the accent colour. Anybody looking at a bare lower lane
  can see that no defensive was pressed - which is what the window is for.

- **What you pressed** is now part of a death. It comes from
  `UNIT_SPELLCAST_SUCCEEDED` for "player" (`ns.History`), **not** the combat
  log - that is closed to addons on this patch. `Death.Storyline` merges it
  with the incoming events into one order, tie-breaking a press before the
  hit it answered. The verdict says the result in one line: "You pressed
  nothing in those seconds", "No defensive was pressed - you cast Death
  Strike, Heart Strike", or the defensives you did use.

- **The row bar is a health bar now.** It was the health left after each
  event, drawn in red, which said nothing about the hit itself. It is the
  health you had **going in**, split: slate for what was left, red for what
  the hit took, green for what a heal gave. `Death.RowSpans` is the rule,
  clamped so an overkill cannot draw past the end of the row.

- **The event table has a head**: When, What hit you, Damage, Health left -
  and a line above it saying what the bar behind each row means.

- **Damage and health left carry their percentage** and sit in the row
  rather than only in the hover. "107.9k" is a scratch on one tank and a
  third of another; "68%" is the same sentence on every character. On the
  killing blow the last column says how far past zero the hit went.

- **A Size button beside Share**, cycling 70 → 130 percent, saved per
  profile. The moment you want this window smaller is the moment it is in
  front of you.

### Fixed

- **A reload took your deaths, and the skull with them.** The list was kept
  for the session only, which is a defensible rule for an evening and a
  wrong one for a `/reload` - which happens after every settings change,
  every addon update and every error. The last ten are written to the saved
  variables **per character** and read back at login. Only readable values
  go in, copied field by field rather than the live table being handed
  over: a secret value in a saved variable throws at logout, when nobody is
  watching. A death nothing could be read out of is not stored at all. The
  verdict is **not** stored - it is derived from the events on the way back
  in, so a better verdict written later applies to the deaths already on
  disk.

- **The divider had all the air on one side.** The verdict, the Close
  button and the defensives line ran straight into it while the list had a
  full gutter. Even margins on both sides now.

- **The picked defensives were a column of same-grey names.** The picker
  has shown icons and the client's tooltip since 4.44.1; the list of what
  you picked did not. Both come from `UI.MakeRowASpell` now, one rule in one
  place, and the next list of spells calls it instead of growing its own.

## [4.46.0] - 2026-08-09

### Added

- **The session's deaths in a list**, down the right side of the window:
  time, where it happened, who did it, newest at the top. Click one to read
  it; the selected row carries the accent bar. The mouse wheel steps through
  them. **Clear list** underneath empties the session, and asks once first -
  there is no undo, and a mis-click during a wipe would take the analysis
  you were about to read.

- **Where it happened**, recorded with every death and shown under the
  title: `M+12 - Ara-Kara, City of Echoes - Avanoxx`, `Raid - Nerub-ar
  Palace (Heroic)`, `Open world - Duskwood`. The keystone level comes from
  `C_ChallengeMode`, the boss's name from `ENCOUNTER_START` - so a wipe on
  a boss says the boss and a death on the trash before it does not. It
  travels with the chat share. The short form ("M+12", "Avanoxx") is what
  the side list shows.

- **The killer's portrait** beside the title, a `PlayerModel` pointed at
  the creature id off the recap - the call MDT uses for its enemy tooltips,
  with a display id and an npc id parsed out of a readable GUID as the
  other two doors. None of them answering hides the block and slides the
  header back to the margin: no empty box.

- **A tooltip on every hit row** - the client's own spell tooltip where the
  recap named a readable id, and underneath it the damage, the overkill and
  the health left afterwards. A melee swing has no spell to ask about and
  says what it knows itself.

- **Where the share goes is a setting**: the group you are in (as before),
  or party, raid, instance, guild, say, yell outright. A channel that is
  not available prints to your own chat frame **and says which one was
  missing** - a share that quietly goes nowhere is the one failure this
  must not have.

- `/zs death clear` empties the list from the command line.

### Changed

- **The pager arrows are gone**, replaced by the list: two ways to walk the
  same ten deaths is one too many, and the list shows where you are instead
  of counting for you.

## [4.45.0] - 2026-08-09

### Added

- **The skull on the screen.** A small icon that appears with your first
  death of the session and counts them in its corner. Click opens the death
  window. Drag it wherever you want, any time - or lock it on the Deaths
  page. It never shows before anything has happened.

- **The window keeps the last ten deaths** of the session, and the arrows
  beside its close cross page through them. Share posts the death you are
  looking at, not blindly the newest. A capture retried for the same death
  replaces its entry rather than listing one fall twice.

- **The rows tell the whole story now**: every hit carries an icon - a
  melee swing gets the sword rather than a hole - and the attacker's name
  in quiet grey beside the spell's. The verdict names the killer too:
  "Melee from Heavyweight Golem for 109.5k". The chat share leads with
  "killed by".

### Fixed

- **The row list honours its own subtitle.** The recap hands over more
  history than "the last seconds" - the first live death showed hits from
  five minutes earlier under a heading promising ten seconds. Rows outside
  the window are kept off; when nothing recent is readable, the heading
  says so instead of lying.

## [4.44.1] - 2026-08-09

### Fixed

- **The death window said "no deaths this fight" while Blizzard's own recap
  stood open showing the killer.** The deaths list sits in the damage
  meter's answer under `combatSources`; this code read a field that does
  not exist and took the empty fallback for an empty fight. It reads the
  right one now - the field EllesmereUI's shipping code iterates - and
  checks the Current session first, Overall second.

### Added

- **Blizzard's own Death Recap is now the tie-breaker.** When it opens, the
  id it opens with is by definition your death - so it is taken over, and a
  window still saying "not enough was readable" repaints itself with the
  real events.

- **The defensive picker got spell icons, tooltips and a filter box.** A
  list of forty same-grey names tells you nothing; the icon is the
  recognition, the tooltip is the client's own, and typing narrows the list.

- The death probe prints the damage meter's answer WHOLE - both session
  types, every field of the session itself and of the first death in it -
  so a wrongly guessed field name can never blind it again.

## [4.44.0] - 2026-08-09

### Added

- **Deaths.** When you die, a window opens with what actually happened: the
  last ten seconds as a list you can read - each hit with its icon, its
  damage and the health you had left after it, the killing blow with its
  overkill - and a verdict on top: whether one hit did most of it or it was
  death by a thousand cuts, when the last heal landed, which of your
  defensives were STILL READY, and whether a healthstone or a potion sat
  unused in the bags. A button shares the short version with your group;
  words the client marks secret never go into chat. Everything comes from
  Blizzard's own death recap and damage meter - the readable sources on this
  patch - and readiness is our own estimate from your casts plus base
  cooldowns, honestly labelled as such. The window opening by itself can be
  switched off on the new Deaths page; `/zs death` opens it any time.

- **Timeline.** A panel with whatever the fight has scheduled next - the
  same feed the boss mods run on now - and your defensives under it,
  coloured by whether they are back. Pick the defensives on the new Timeline
  page; the same list tells the death window what counted as available. The
  panel shows in combat and is placed in Edit Mode. What it cannot do,
  honestly: the client marks event severity secret, so "tank busters only"
  is a filter no addon can build.

- **The options window can be scaled.** Settings, under This window: 60% to
  125%, live while you drag it. Not everybody has the pixels for 1360x760 -
  the owner's words.

- `/zs death probe` and `/zs timeline probe` print, field by field, what
  this client will actually reveal - run them once dead and once in a boss
  fight, and the window fills in what the measurements allow.

## [4.43.0] - 2026-08-09

### Changed

- **The Settings page finally says what applies to what.** It used to say
  "Applies to every bar" over rows about the minimap, and filed one font for
  the window and one for the bars under a single heading called "Text". It is
  three sections now, one axis: *Every bar* (taking over the Cooldown Manager
  display, the bar text font), *This window* (the panel font), and *Ways in*
  (the minimap button and the game menu entry).

- **"Take a layout from" and "Reset all settings" moved to Profiles.**
  Everything on Settings changes how something looks; those two change which
  settings you have at all - and that is the page whose subject that is, next
  to the delete button that already lives there.

### Fixed

- **"Take a layout from" had been broken since 4.42.0.** The dropdown listed
  your other characters, and picking one always answered "that character has
  no bars": the copy still read the saved-variable shape that the profiles
  migration deletes on first login. It reads the migrated one now, and the
  self test pins the two to the same answer.

- **A character sharing your profile is no longer offered as a copy source.**
  Copying a profile onto itself is not a copy: the cells are emptied on the
  way over, so "take my own layout" would have stripped every spell off the
  bars it claimed to duplicate. Possible at all since two characters can
  point at one profile.

## [4.42.1] - 2026-08-09

### Fixed

- **`/zs` listed a command that does not exist.** `/zs route` stayed in the
  help after the MDT pull badges were parked, so typing it did nothing at all.
  A menu naming something that does nothing is worse than a shorter menu.

- The help's one-line description of **`/zs reset`** still said it restored
  every default. It resets the profile you are using, and nothing else.

### Documentation

- **The README was rewritten.** It had been describing a different addon: it
  claimed 166 checks where there are 694, documented the *Arc* and *Diagonal*
  arrangements that were removed in 4.8.0, called the co-tank panel parked when
  it has been shipping since 4.41.0, listed a source file deleted in 4.9.0, and
  had nothing at all about reminders, profiles or sharing. It is the first page
  anyone sees on GitHub.

## [4.42.0] - 2026-08-09

### Added

- **Profiles.** A set of settings now has a name of its own, and your
  character points at one. It starts out pointing at a profile named after
  itself, which is exactly how this worked before - so nothing moved when you
  updated, and if you never open the page you will not notice it exists.

  Point a second character at the same profile and they really are the same
  settings rather than two copies drifting apart: change a colour on either
  and both have it. You can make a new empty one, copy the one you are using,
  rename it - every character using it follows - or delete it. The last
  remaining profile cannot be deleted, because something has to be in use.

- **Sharing, by string.** Copy what you have built into a piece of text and
  paste it anywhere - a chat window, a Discord, a forum. Whoever gets it
  pastes it back in.

  You choose what travels: bars, reminders, the co-tank panel, your saved
  looks, your settings - each with its own tick - and **one row per bar**
  underneath, so "here is my Bone Shield bar" is a single string rather than
  a whole profile somebody has to unpick.

  The string remembers which class and specialisation it was made on and says
  so before anything is written. Made on your class, the spells come with it;
  made on another, the layout arrives and the cells are empty, because a Death
  Knight's cooldowns are not castable on a Paladin. **Your character's name is
  not in it** - a string is made to be pasted somewhere public, and a layout
  is no reason to publish who built it.

  **Nothing you already have is thrown away.** Bars and reminders from a
  string are added to yours, not swapped for them - there is no undo here, and
  a string somebody handed you must not be able to delete an evening's work. A
  saved look whose name you already use keeps both. The co-tank panel and the
  settings are single things, so those do get replaced.

### Fixed

- **The two aura strips on a co-tank row were drawing on top of each other.**
  They sat at opposite ends of the same edge and grew towards each other,
  which sounds like it keeps them apart and does not: eight icons fill more
  than half the row, so from the fifth one on they were in the same place.
  Debuffs now sit along the top of the row and buffs along the bottom, both
  reading left to right, which cannot collide at any icon count or size. If
  you had never moved either strip yourself, yours is moved for you; if you
  had, your arrangement is left exactly as you set it.

- **`/zs reset` threw away your recorded procs**, despite saying it kept
  them. It also reset every character on the account, not the one you typed
  it on. It now resets the settings you are using and nothing else, and the
  procs really do survive.

### Changed

- **"Not shown by Blizzard" is gone as a heading.** The spells under it were
  not a different kind of thing - they are your spec's cooldowns, and on a
  default setup they are most of the list. They are listed under **Cooldowns**
  with everything else, in Blizzard's own order, with the ones you arranged
  first. The one thing that was worth knowing is still said, on the entry
  itself: a spell Blizzard is not currently displaying has no frame for this
  addon to adopt, and it takes one drag in Blizzard's Cooldown Manager
  settings to change that.

## [4.41.1] - 2026-08-09

### Fixed

- **Six files the addon never loads were being packaged with it.** They did
  nothing on your machine - they are not in the load list - but they were
  dead weight in the download, and one of them was a feature that had been
  taken out. The build now leaves them behind.

## [4.41.0] - 2026-08-09

First public release. Everything below is new to anyone installing it now.

### Bars

- **Your own cooldown bars, as many as you like.** A bar is a grid of cells;
  set the rows and columns with two sliders and put a spell in each cell.
  Changing the shape re-flows what is already there rather than scrambling it —
  6×1 becomes 3×2 with the same spells in the same order.
- **Three arrangements:** grid, staggered, and puzzle, where every cell sits
  exactly where you dragged it. Every arrangement adds each cell's own offset
  on top, so nudging one icon out of a neat row and building a free-form
  layout are the same edit.
- **Per-cell overrides.** Any single cell can carry its own scale, offset,
  kind and visibility — one icon at 150 %, a tracking bar among the icons, a
  slot hidden while you decide. The overrides travel with the spell, not the
  position.
- **Icons or bars,** per bar or per cell. Bars can fill or drain over time,
  and the direction the fill runs is a separate setting from which end it is
  anchored to.
- **Effects, all off until you ask.** A flash when a cooldown lands, an edge
  while the spell is up, a nag for a defensive that has been ready too long in
  combat, a last-seconds warning, a glow while a tracked aura is up, and
  greying out while a cooldown runs.
- **Rules for when a bar is on screen:** combat, group size, target, rested
  area, and the kind of place you are in. Every rule starts on *any*, so a
  rule you have not set can never be the reason something is missing, and the
  panel tells you which rule is currently keeping a bar hidden.
- **Styling per bar,** with *Copy from* to take another bar's look in one
  click and *Save as* to store it as a named preset. Only sizes, spacing and
  colours travel; the spells and the grid stay with their own bar.
- Fonts and textures come from LibSharedMedia, so everything your other addons
  ship is in the pickers under the names you already know.

### Placing things on screen

- **Unlock mode** moves whole bars, with snapping to the screen centre and to
  other bars' edges and centres, a guide line showing what was caught, and
  Alt to switch snapping off. Arrow keys nudge, Shift for ten.
- **Bars can be attached to each other.** Snapping puts a bar next to another
  once; attaching keeps it there.
- **Build mode** takes a bar apart cell by cell on screen — drag, scroll to
  scale, Tab between slots, arrow keys to nudge, right click for kind, hide
  and reset. The spell palette opens beside it and the selection walks on to
  the next slot by itself.

### Reminders

- **Text on your screen when something is missing.** Write the message, drag a
  spell onto it from the same list the bars use, and choose when it fires —
  when the buff is missing, or when it is active.
- Text size, colour, flashing, an icon beside it, and the same visibility
  rules the bars have.
- Placed in edit mode like everything else, where all reminders are forced
  visible so you can see what you are arranging.
- If the client cannot say whether a spell is active, the reminder stays
  silent rather than shouting — an unanswerable question is not a missing buff.

### Co-tank panel

- One row per tank in your group, you first, so rows never reorder mid-pull.
  Health, name, absorbs, target ring, raid marker, and configurable
  indicators for marker, leader, role and combat.
- Aura strips are built and wired, and draw in test mode (`/zs tanks test`).
  Live aura data for another player needs patch 12.1; the panel says so itself
  and names the client build it read.

### The window

- Three fixed columns: what the addon does, everything you own, and the
  settings for whatever is selected.
- A changelog page, an about page, and a diagnostics page.
- Minimap button, addon compartment entry, and an entry in the game menu under
  Escape.

### Commands

| Command | Effect |
| --- | --- |
| `/zs` | open the window |
| `/zs unlock` / `lock` | move the bars around the screen |
| `/zs build` | take a bar apart slot by slot |
| `/zs bars` | list your bars |
| `/zs cdm` | what Blizzard's Cooldown Manager currently holds |
| `/zs reminders` | why each reminder is or is not showing |
| `/zs tanks` | the co-tank panel |
| `/zs auras` | the procs recorded on this spec |
| `/zs test` | the checks that run inside the game on the model and the rules |
| `/zs reset` | restore defaults, keeping recorded procs |

### How it works, and what that costs

- Every icon on your bars **is** one of Blizzard's Cooldown Manager frames,
  moved onto your cell. It keeps the correct icon, sweep, charges, stacks and
  timing, because on this patch aura data is secret and no addon may read it.
- Because Blizzard lays its own row out without knowing an icon left, it would
  show a hole where one used to be. Cooldowns you have not placed are
  therefore hidden as well. Settings → *Take the display over* switches that
  off and gives the row back, holes included.
- Auras the Cooldown Manager does not carry are drawn by the addon and timed
  on its own clock.

### Known limitations

- **Spells Blizzard's Cooldown Manager is not displaying have no frame to
  adopt.** They appear in the spell list under *Not shown by Blizzard*, and
  moving them into a viewer in Blizzard's own Cooldown Manager settings makes
  them usable here. Blizzard's default hides most of them.
- Live aura data for other players needs patch 12.1.

---

Versions before 4.41.0 were development builds and were never published.

This mod has no additional files