Skip to content

RaidKit · In-game addon

Grudge List

Keeps your personal do-not-group list and warns you the moment one of them joins your party or raid.

In-game addonTBC Classic Anniversary (Interface 20505)v0.1.0Early For TBC Anniversary players who pug dungeons and raids and want to remember who not to group with, especially officers and raid leaders who fill spots from the wider realm.

One person: you. It is a personal list, not a guild system. · In your WoW client as a normal addon; no server, no Discord bot. · Nothing. A friend only needs the addon if you want to swap lists with them.Version 0.1.0 is built and passes its automated tests; the folder is linked into the author's AddOns directory but has not yet been opened in the game client, and no build has been published.

Overview

Every raider has a mental list of players they never want to group with again: the rogue who ninja'd the sword (took loot they were not entitled to), the healer who "disconnected" right before the last boss, the tank who left after one wipe. The problem is that the list lives in your memory, and memory fails at exactly the moment a pug invite pops up. Grudge List keeps that list for you and does the checking automatically.

You add someone by typing their name, by targeting them, or with one click from a Recent tab that quietly records everyone who has been in a party or raid with you. Each entry gets one of six fixed categories (Ninja, Fake DC, Left early, Rude, Bad play, Other) and a free-text reason you edit straight in the table. From then on the addon stays out of your way: when a listed player joins your group, is already in it when you come through a loading screen, or sends you an invite, you get a chat line with the reason, a raid-warning banner in the middle of the screen, and the raid-warning sound. Each of those is a separate toggle.

The list is account-wide, so every character you play shares it, and it is shareable. Export it as text, paste it to a friend, and their import merges into their own list rather than replacing it. A name that appears on several lists is marked "on N lists". A community database that would tally names across many players' lists has been discussed as an idea; nothing of the sort has been built, and nothing leaves your computer unless you paste an export somewhere yourself.

Where things stand: version 0.1.0 exists as code and passes 79 headless checks plus a 9-step UI smoke test. The addon folder is linked into the author's own AddOns directory, but the first /reload in the game client has not happened yet, and no build has been published for anyone else. This page describes what the code does today so you know what to expect when a first build is published.

What it does, in detail

What an entry holds

Each entry stores the player's name and realm, one of six categories, a free-text reason, the date it was added, and who added it. The category is fixed to one of Ninja, Fake DC, Left early, Rude, Bad play or Other so entries stay comparable if you ever merge lists with friends; the reason is where you write what actually happened. The reason box in the table takes up to 200 characters; a reason typed after /grudge add or /grudge target, or one that arrives by import, has no length cap.

Entries are keyed on the lower-case name-realm pair. Names you type without a realm are assumed to be on your own realm and are displayed bare; players from other realms show as Name-Realm. A lower-case first letter is capitalized when you type a name, so "bob" is stored and shown as "Bob", and spaces in a realm name are stripped. Once a listed player has been seen in a group, the addon also stores their class and character GUID (the game's permanent id for a character), so a player who pays for a name change is still recognized the next time they land in your group.

Three ways to add someone

Type a name into the box at the top of the List tab and press Enter or click the Add button next to it (the box takes up to 40 characters) when you know who it was. Click Add Target in the footer when they are standing in front of you; this works on players only and records their class and GUID immediately. Or open the Recent tab after a run and click Add next to the offender; that path also copies the class and GUID the addon recorded when it saw them. From chat, /grudge add Name reason and /grudge target reason do the same jobs with an optional reason.

Every path files the entry under Other. The three window paths (the name box, Add Target, the Recent tab) then switch you to the List tab and, if the entry is new, put the cursor in that row's reason box; type the reason, press Enter, and click the category button on the row to cycle it to the right one. The slash commands do not open the window or move the cursor: /grudge add prints "Added Name. Set the category and reason in /grudge." and /grudge target prints "Added Name." If the player is already listed, either command says so and, when you gave a reason, replaces the old one.

Recent groupmates

Every time your party or raid roster changes, the addon records each newcomer: name, class, zone, whether it was a party or a raid, and when. The Recent tab shows them newest first with a relative time ("just now", "12m ago", "3h ago", "2d ago"). Someone who groups with you again moves back to the top rather than appearing twice. The history is capped at 60 people; the oldest fall off.

Anyone already on your list shows a "listed" pill instead of the Add button. You can clear the history from the Settings tab without touching the list itself. You are never recorded in your own history, and placeholder names the game has not resolved yet are skipped. Before anyone has grouped with you, the tab says "No groupmates recorded yet. They appear here as soon as someone joins your group."

How warnings fire

When the roster changes, the addon compares the new group against the last snapshot and checks each newcomer against the list, first by name-realm and then by GUID. A match produces up to three things, each on its own toggle: a chat line ("Grudge List: Name just joined and is on your grudge list - Ninja: took the sword (added 2026-09-01, on 2 lists)" with the name in class color), a banner in the raid-warning position reading "GRUDGE: Name - Ninja", and the raid-warning sound.

You are warned once per join. If the player stays in the group, ordinary roster changes do not warn about them again; if they leave and come back, you are warned again. Loading screens are the exception: on login, on /reload, and every time you enter or leave a dungeon or raid instance or take any other zone transfer with a loading screen, the addon forgets its snapshot and re-checks everyone present, so a listed player who is still in your group is announced again each time, worded "is in your group" instead of "just joined". /grudge check runs that same forced re-check on demand with the same wording. When a listed player sends you a party invite, the inviter's name is checked and you are warned while the invite dialog is still up, so you can decline. That invite check is by name only, since no GUID is available yet; a renamed character who invites you is not caught until they are actually in the group.

Sharing: export and merge-on-import

Export turns your list into plain text with a "GRUDGELIST 1" header line, a comment line saying who exported it and when, and then one entry per line in the form key|Name|Realm|category|added|addedBy|reason|sources. You copy it out of the Export window and paste it wherever you talk to your friends. Pipes, newlines and backslashes inside reasons are escaped so the text survives a chat paste.

Import merges. Nothing already on your list is removed. A name you already have keeps your own reason and category, with two exceptions that only add information: an empty reason is filled in from the import, and a category of Other is upgraded to whatever the other person chose. New names arrive with the original adder's name and original date, are marked as imported, and record who imported them and when. Every list a name has appeared on is remembered, so the row can show "2 lists", "3 lists" and so on. Importing the same text twice changes nothing. Text without the header is refused with "That is not a Grudge List export (missing header)." A line the importer cannot parse is counted as skipped rather than stopping the import. An export whose header carries a higher format number than the addon understands (today the format is 1) is refused with "This export is from a newer Grudge List (format N). Update the addon."; the check is on that format number, not on the addon's version.

Chat-safe by construction

The vertical bar is WoW's escape character in chat strings, and a stray one inside a reason could break a message or a color code. Every player-typed string is scrubbed before it reaches chat or the banner: pipes become forward slashes. The reason box in the table shows the text exactly as you typed it, pipe included, and the export format escapes pipes separately, so a pipe in a reason survives a round trip through export and import even though it shows as a slash in chat.

The window

The window has three tabs (List, Recent, Settings) and a footer with Export, Import and Add Target. The title bar shows the version (v0.1.0) and the subtitle shows live counts, for example "3 grudges · 12 recent groupmates · click a reason to edit it, click a category to change it". It opens at 760x500, is resizable between 620x360 and 1200x900, and remembers its size. Esc closes it, and Esc also closes the Export/Import window. The Settings tab offers six accent presets for the window's one color (gold is the default) and the choice persists across sessions.

The List tab columns are Player, Category, Reason, Added and Remove. The Added column shows the date plus the first name of whoever added the entry in white; when the entry is on more than one list, the adder's name gives way to an "N lists" pill. The Recent tab columns are Player, Seen in, When and Grudge. Every control has a tooltip: the category button lists the cycle order, the reason box says it saves the moment you leave it, the Remove button reminds you about /grudge undo, and Add Target says it works on players only.

The layout has only been exercised under a widget mock, not rendered by the game. A layout pass (column widths, the reason box hit area, pill alignment) is expected after the first in-game screenshot.

Ideas that are not built

A community database (a Discord-authenticated web service that tallies how many independent lists a name appears on, published as a data file the addon could read) was discussed on the day the addon was designed. It has not been started. The working recommendation is that if it ever exists it should show only counts, categories and recency, require more than one independent reporter, keep reasons private, and that the decision to build it should wait until after a few weeks of personal use of the addon. The export format and the per-entry list of sources were designed with that in mind, but today the only way a name gets a count above one is a friend pasting you their export.

Also unbuilt: a right-click "Add to Grudge List" item on unit frames (the Anniversary client's menu hooks are unverified), entries that expire, and a per-entry "warn once ever" mode.

Functions

Features

Six fixed categories plus a free-text reason
Ninja, Fake DC, Left early, Rude, Bad play, Other. Click the reason cell to edit it in place (saved on Enter or when you leave the box; the in-table box takes up to 200 characters); click the category button to cycle it.
Add by name, by target, or from Recent
Type a name (realm optional, up to 40 characters) in the List tab and press Enter or click Add, click Add Target while targeting a player, or click Add on the Recent tab. Each window path switches to the List tab and, for a new entry, puts the cursor in the reason box. /grudge add and /grudge target do the same from chat but only print a confirmation.
Recent groupmates history
Everyone who has been in a party or raid with you, newest first, with class, zone, party or raid, and how long ago. Capped at 60. Already-listed players show a "listed" pill. Adding from here also stores the recorded class and GUID on the entry.
Join warnings on three channels
Chat line with class-colored name, category, reason, date added and list count; a raid-warning banner reading "GRUDGE: Name - Category"; the raid-warning sound. Each has its own toggle.
Loading-screen and invite warnings
After every loading screen (login, /reload, entering or leaving an instance, other zone transfers) the current group is re-checked and listed players are announced as "is in your group". When a listed player invites you, you are warned before you accept; that check is by name only.
Rename-proof matching in groups
Matches by name-realm first, then by character GUID once one has been seen in a group, so a renamed character is still caught when they join. Class and GUID are learned from the live group and stored on the entry.
Export and merge-on-import
Versioned plain-text export you can paste anywhere. Import never removes entries or overwrites a reason you wrote; it fills blanks, upgrades Other to a real category, adds new names with their original adder and date, records who imported them, and counts every list a name appears on.
Undo for removals
Removing is immediate, from the row's x button or /grudge remove. /grudge undo restores the most recent removal. The memory lives only in the running session: it is lost on /reload as well as logout, and a second removal replaces it.
Account-wide, no dependencies
One list shared by all your characters, saved in the GrudgeListDB saved variable (the file WTF\Account\<account>\SavedVariables\GrudgeList.lua). No libraries, no other addons required.
Chat-safe output
Player-typed text has WoW's pipe escape character replaced with a slash before it reaches chat, the banner or a color code; the reason box keeps what you typed, and the export format escapes pipes, newlines and backslashes.

Slash commands

CommandWhat it does
/grudgeOpen or close the window. /grudgelist does the same. Any subcommand the addon does not know prints "Unknown command 'x'. Try /grudge help".
/grudge add Name-Realm reasonAdd someone under category Other with an optional reason, for example /grudge add Stabbyrogue took the sword. Leave off -Realm for players on your own realm. Prints "Added Name. Set the category and reason in /grudge." and does not open the window. If they are already listed, a non-empty reason replaces the old one.
/grudge remove Name-RealmTake someone off the list. Prints a reminder that /grudge undo brings them back.
/grudge undoRestore the most recent removal. Works only within the current session (a /reload or logout clears it) and only for the last one; a later removal replaces it.
/grudge target reasonAdd whoever you are targeting, players only, with an optional reason. Records their class and GUID, prints "Added Name." (or "Already listed: Name."), and does not open the window.
/grudge listPrint every entry to chat, one line each: name, category, reason, date added, and "on N lists" when it applies. With nothing listed it prints "The list is empty. Enjoy it while it lasts."
/grudge recentPrint recent groupmates to chat with zone and how long ago, marking those already listed. Shows the first 15; the rest are in the window. With no history it prints "No recent groupmates recorded yet."
/grudge checkRe-check the current group now and re-warn for every listed player present, worded "is in your group" like the loading-screen check. Prints how many were found.
/grudge exportOpen the Export window with your list as text ready to copy.
/grudge importOpen the Import window to paste a friend's export.
/grudge helpPrint the command list to chat.

Settings

Chat line with the reason
Print a chat line naming who joined and why they are on the list. On by default.
Banner in the middle of the screen
Show a raid-warning style banner reading "GRUDGE: Name - Category". On by default.
Play the raid-warning sound
Play the same sound as a raid warning alongside the other channels. On by default.
Also warn when they invite you
Check the inviter's name against the list when a party invite arrives, before you accept. Name only; no GUID is available at that point. On by default.
Accent
Six color presets for the window: gold (default), teal, blue, violet, rose, ember. The choice persists across sessions.
Clear recent groupmates
Forget the recent-groupmates history. The grudge list itself is untouched.
Recent cap
How many recent groupmates are remembered. Defaults to 60 and is stored in the saved variables; there is no control for it in the Settings tab in this version.

How-to guides

01First raid night with Grudge List

Once a build is available, this is the whole first evening: confirm it loaded, seed the list with the names you already remember, and let the Recent tab do the rest.

  1. 1Log in and look for the load line in chat: "Grudge List: v0.1.0 loaded. 0 grudges on file. /grudge opens the list." If you do not see it, the folder is in the wrong place; see Install.
  2. 2Type /grudge to open the window. It opens on the List tab, empty, with a hint that you can add a name above, use Add Target, or pick from the Recent tab. Esc closes it.
  3. 3Seed it with the names you already carry in your head. Type each one into the "Name or Name-Realm" box and press Enter or click Add. Players on your own realm need no realm suffix, and a lower-case first letter is capitalized for you.
  4. 4For each new row the cursor is already in the reason box. Type what happened and press Enter, then click the category button on that row until it shows the right one (Ninja, Fake DC, Left early, Rude, Bad play or Other).
  5. 5Close the window and raid. Every player who joins your party or raid is recorded on the Recent tab automatically; you do not need to do anything during the run.
  6. 6If a listed player joins, you get a chat line with the reason, a banner in the raid-warning position and the raid-warning sound. Expect the same announcement again after each loading screen while they stay in the group. Decide what to do with that information; the addon does not kick or decline anyone for you.
  7. 7After the run, open /grudge and switch to the Recent tab. If someone earned a place on the list tonight, click Add on their row, type the reason, and set the category.

02Add someone from a recent group

You do not need to remember the exact spelling of a name. The Recent tab already has it, with class and zone to jog your memory.

  1. 1Open /grudge and click the Recent tab. Everyone who has been in a party or raid with you is listed newest first, with class, Party or Raid, the zone, and how long ago.
  2. 2Find the player and click Add on their row. The class and GUID the addon recorded are stored on the entry, and you are jumped back to the List tab with their reason box focused.
  3. 3Type the reason and press Enter. Then click the category button on the row to cycle from Other to the right category.
  4. 4Players already on your list show a "listed" pill on the Recent tab instead of an Add button, so you cannot add someone twice by accident.
  5. 5Prefer chat? /grudge recent prints the first 15 recent groupmates with a [listed] marker on anyone already on the list.

03Add the player you are looking at

When the offender is still in front of you, targeting them is faster than typing and records their class and GUID on the spot.

  1. 1Target the player. This works on players only; targeting an NPC prints "That is not a player." and having no target prints "Target a player first."
  2. 2Click Add Target in the footer of the window, or type /grudge target with a reason, for example /grudge target left after one wipe.
  3. 3The entry is filed under Other with the class and GUID already stored. The footer button switches you to the List tab with the new row's reason box focused; the slash command only prints "Added Name.", so open /grudge to set the category.
  4. 4Because the GUID is stored, this player is matched when they join a group even if they later change their character's name.

04Tune the warnings

All four warning behaviors are on by default. Turn off the ones you do not want without losing the others.

  1. 1Open /grudge and click the Settings tab. Under Warnings you will find four toggles: "Chat line with the reason", "Banner in the middle of the screen", "Play the raid-warning sound" and "Also warn when they invite you".
  2. 2Turn off the banner or the sound if you only want the chat line; the chat line is the one that carries the reason and the date.
  3. 3Turn off "Also warn when they invite you" if you would rather see the invite dialog undisturbed and check the list yourself.
  4. 4Warnings fire once per join, plus once after every loading screen for anyone listed who is still in the group. To re-run the check on the current group at any time, type /grudge check; it prints how many listed players are present and warns for each of them again.
  5. 5While you are there, pick an accent preset if you like; the choice persists.

05Share your list with a friend

Export is plain text. Import merges, so swapping lists with a friend adds to what each of you has and never wipes anything.

  1. 1Click Export in the footer, or type /grudge export. The Export window opens with the text already highlighted; press Ctrl+C. If you clicked elsewhere first, click Select All and then Ctrl+C.
  2. 2Paste it to your friend in Discord or a message. The first line reads "GRUDGELIST 1" and the second says who exported it and when; each line after that is one entry.
  3. 3Your friend clicks Import (or types /grudge import), pastes with Ctrl+V and clicks Import. Esc closes the window when they are done.
  4. 4The window reports a summary such as "Import from Name-Realm: 3 added, 2 already listed (merged), 0 skipped." Names they already had keep their own reasons; an empty reason is filled from yours and a category of Other adopts yours. New names arrive with your name as the adder and your original date, marked as imported. A line that cannot be parsed counts as skipped; a paste without the header is refused with "That is not a Grudge List export (missing header)."
  5. 5Names on both lists now show a "2 lists" pill in the Added column. Re-importing the same text later is harmless.

06Remove, undo and clean up

Removal is instant, so there is a one-step safety net.

  1. 1Click the x at the right end of a row, or type /grudge remove Name-Realm. Chat confirms the removal.
  2. 2If that was a mistake, type /grudge undo straight away. It restores the most recent removal only; a /reload, a logout, or removing someone else first makes it unrecoverable.
  3. 3To clear the Recent tab without touching the list, click "Clear recent groupmates" on the Settings tab. The Data section there shows how many are on the list and how many recent groupmates are remembered against the cap of 60.
  4. 4To start over completely, log out and delete GrudgeList.lua from World of Warcraft\_anniversary_\WTF\Account\<your account>\SavedVariables (the variable inside that file is called GrudgeListDB); there is no in-game wipe.

Good to know

  • No published build. Version 0.1.0 exists as code and passes its automated tests, but it has not been opened in the game client. The banner and sound calls are the first things to confirm in-game.
  • /grudge add, the Add box, Add Target and the Recent tab all file the entry under Other. You set the real category by clicking the category button in the window; there is no way to pick one from the command line.
  • Only the window paths (name box, Add Target button, Recent tab Add) jump to the reason box, and only for a new entry. /grudge add and /grudge target print a confirmation and leave the window alone.
  • Undo remembers only the most recent removal, in memory only: a /reload or logout clears it, and removing someone else replaces it.
  • Warnings fire once per join on ordinary roster changes, but every loading screen (login, /reload, entering or leaving an instance, other zone transfers) re-warns for every listed player still in the group. /grudge check does the same on demand.
  • Invite warnings match by name only, because no GUID is available while the invite dialog is up. A renamed character is only caught by GUID once they are in the group.
  • Import never removes or overwrites your entries, so importing a friend's list cannot clean up yours. It will fill an empty reason and upgrade a category of Other, which is the only way an import changes an existing row.
  • An export whose header format number is higher than the addon understands (today: 1) is refused with a message; update before importing. The check is on the format number, not the addon version.
  • Pipes in reasons are replaced with slashes in chat and banner output, so "|" will not show there. The reason box in the table shows what you typed, and export preserves it.
  • The 200-character limit applies only to the reason box in the table; reasons given on the command line or by import are not capped.
  • /grudge recent prints only the first 15 recent groupmates; the rest are on the Recent tab.
  • The recent-groupmates cap (60) has no control in the Settings tab in this version.
  • There is no right-click "Add to Grudge List" on unit frames yet.
  • The community-database idea is only an idea. Nothing is uploaded anywhere; your list stays in your SavedVariables unless you paste an export somewhere yourself.

Visuals

How a listed player joining your group becomes a chat line, a banner and a sound, and why you are warned once per join.
The List tab: add box on top, editable table in the middle, Export / Import / Add Target footer below.
Importing a friend's export merges into your list: nothing is removed, your reasons win, Other is upgraded, and shared names count their lists.

Requirements & credits

Requirements

  • World of Warcraft: The Burning Crusade Classic on an Anniversary realm (Interface 20505); other client versions are untested.
  • No other addons or libraries; the UI kit is bundled inside the addon folder.
  • A friend who wants to swap lists with you needs the addon too; reading an export without it is possible but not useful.

Credits

  • Grudge ListWritten by the RaidKit author (in-game Cheechmarín, as listed in the addon's .toc). Idea and scope, the name, and the merge-on-import decision date from 2026-09-09.
  • WowUIKitIn-house shared UI module (version 1.4.0) used by the RaidKit addons (Grudge List, BrokenDice, Gargul Persistence Bonus). Copied into the addon folder and checked byte for byte against the shared source by the test runner; no third-party code.
  • Blizzard EntertainmentWorld of Warcraft is a trademark of Blizzard Entertainment. RaidKit is not affiliated with or endorsed by Blizzard.

Download & install

Install Grudge List v0.1.0

Download not published yet

Folder: Interface/AddOns/GrudgeList · Interface 20505

  1. 1No build has been published yet; version 0.1.0 has only been linked into the author's own AddOns folder. The steps below describe the install once a first build is available.
  2. 2Copy the GrudgeList folder (the one containing GrudgeList.toc) into World of Warcraft\_anniversary_\Interface\AddOns.
  3. 3Launch the game or type /reload.
  4. 4Look for the load line in chat: "Grudge List: v0.1.0 loaded. 0 grudges on file. /grudge opens the list."
  5. 5There are no dependencies to install. Your list is saved account-wide as GrudgeList.lua under WTF\Account\<your account>\SavedVariables (the variable inside is GrudgeListDB).
  6. 6Not listed on CurseForge or Wago.

Changelog

  1. v0.1.02026-09-09
    • First build; verified headless (79 checks and a 9-step UI smoke test, run with sh test/run_all.sh under Lua 5.1; the runner also checks the bundled UIKit copy against the shared 1.4.0 source), not yet seen in-game.
    • The list: add by name, by target, or from the Recent tab; six fixed categories plus a free-text reason edited in place; remove with /grudge undo as the session-only safety net.
    • Group watching: roster diff records every groupmate (name, realm, class, GUID, zone, party or raid, time; cap 60) and warns once per join for listed players; every loading screen re-warns for anyone already present; party invites are checked by name before you accept.
    • Warnings: chat line with class-colored name, category, reason, date and "on N lists"; raid-warning banner; raid-warning sound; each on its own toggle. Reasons are pipe-scrubbed before any chat or banner output.
    • Matching by lower-case name-realm, then by GUID for renamed characters.
    • Sharing: versioned text export (GRUDGELIST 1) with escaped fields; import merges, never removes, never overwrites your own reason, upgrades Other to a real category, records every source and who imported each entry, and refuses a higher format number.
    • Window on the shared UI kit 1.4.0: 760x500 by default, resizable, Esc to close, List / Recent / Settings tabs, Export / Import / Add Target footer, accent presets persisted.

Full changelog for Grudge List

More from RaidKit