promotional bannermobile promotional banner

GreenWall - Revived

Bridged Guild Chat for WoW Confederations

GreenWall — Bridged Guild Chat for WoW Confederations

Stop juggling whispers and Discord channels just because Blizzard's 1,000-member guild cap forced your community into multiple guilds. GreenWall transparently bridges guild chat — and optionally officer chat — across every co-guild on a single realm or a connected-realm cluster, so a single conversation flows between all of them as if they were one guild.

The Problem

Blizzard caps guild membership at 1,000 characters. Active communities outgrow that fast, and the workaround — splitting into multiple guilds — fragments guild chat. Officers end up running parallel Discord channels, members lose track of who is in which sister guild, and join/leave events stop being visible across the whole community.

Existing bridge addons typically rely on a designated "gateway" member whose client relays the traffic. When that member logs out, the bridge dies. Configuration is done by every member individually, so newcomers can't see the bridged conversation until they set the addon up themselves.

The Solution

GreenWall uses a hidden custom chat channel as the transport. Every member of every co-guild joins the same channel automatically, and chat sent in any one co-guild's guild chat is replicated into the chat windows of every member of every other co-guild — routed through the channel, not through any one player.

There is no gateway member: with N online members the bridge has N independent senders. The bridge survives anyone logging out, and the only way to break it is for every member of every co-guild to be offline simultaneously.

Configuration lives in the in-game Guild Information page (J key). Officers set it up once for each co-guild; ordinary members install the addon and the bridge just works — zero per-member configuration required.

Core Features

Transparent Guild-Chat Bridging

  • Messages typed in /g in any co-guild appear in every other co-guild's guild-chat window in real time, attributed to the original sender
  • Optional co-guild tag prefix (e.g. <DMC>) so you can tell at a glance which sister guild a speaker is in
  • Bridged messages preserve player linking, item links, and chat-window class colors — they go through the standard CHAT_MSG_GUILD handler, not a fake channel
  • Hidden bridge channel never appears in your channel list and never spams the chat window

Officer-Chat Bridging

  • Optional second hidden channel for officer chat; configured via the GM's officer note (GW:a:channel:password)
  • Each officer opts in individually with /gw ochat on — non-officers never see officer traffic, and the addon detects officer-note read access before activating the bridge
  • Same replication semantics as guild chat: every co-guild's officer chat appears in every other co-guild's officer chat window

Roster Announcements

  • Cross-confederation join, leave, kick, online, and offline notifications — you see the same notifications you'd expect from your own guild for every member of every co-guild
  • Toggle with /gw roster on|off
  • A comember-cache hold-down suppresses the duplicate notification storm that would otherwise fire when a peer crosses the bridge channel boundary

Per-Character or Account-Wide Settings

  • mode setting picks between a shared GreenWallAccount store and per-character GreenWall settings — switch any character to whichever mode you prefer
  • Existing pre-1.9.0 installs default to character mode so nothing changes underneath you on upgrade
  • Settable via the standard Blizzard Interface Options canvas (ESC → Options → AddOns → GreenWall) or the slash-command CLI

Third-Party Addon API

Other addons can piggyback on the confederation bridge through GreenWallAPI:

  • GreenWallAPI.SendMessage(addon, message) — broadcast a message to every co-guild
  • GreenWallAPI.AddMessageHandler(handler, addon, priority) — register a callback for inbound messages
  • GreenWallAPI.GetChannelNumbers() — query the hidden channel numbers in use
  • Messages are framed with the source addon name so multiple subscribers coexist cleanly

An example consumer is GWSonar. Full reference in API.md.

Compatibility With Popular Chat Addons

  • ElvUI — bridged messages are routed through ElvUI's floating chat-frame event handler
  • Prat-3.0 — bridged messages flow through Prat's chat dispatcher
  • Identity-2 / Name2Chat / Incognito — outbound message rewriting is detected and accommodated rather than triggering the corruption guard
  • Compatibility shims activate automatically; no extra setup required

How It Works

Hidden Custom Chat Channel

GreenWall does not use the addon-message API. Bridged traffic is sent as ordinary chat-channel messages on a custom channel that every member silently joins via JoinTemporaryChannel. The channel is removed from every chat-window subscription after joining, so it never appears in your chat. Each segment is structured as:

opcode#guild_id##payload

The opcode (C chat, B broadcast, N notice, R request, M addon, E external API) tells the receiver which adaptation-layer decoder to apply. Maximum segment length is 255 bytes; longer messages are truncated.

Loopback & Corruption Detection

Every transmitted segment is hashed with CRC-16-CCITT and counted in a per-channel transmit table. When a peer's own broadcast loops back through the channel, the hash count is decremented. If a self-sent segment arrives with a hash that doesn't match anything in the table, the addon raises a corruption warning — that's how GreenWall detects a third-party addon mutating outbound chat (Identity-2, Name2Chat, Incognito are the known offenders, hence the dedicated compatibility shims).

In-Game Configuration

The addon reads its confederation configuration from the Guild Information panel (J) at login time and on GUILD_ROSTER_UPDATE. The directive grammar is line-oriented:

GW:c:channel_name:password           # required common channel
GW:p:Darkmoon Clan:DMC               # peer co-guild + tag
GW:p:Baseball Dandies:BBD
GW:p:Nightlife:NL
GW:v:1.11.0                          # optional minimum addon version
GW:s:value:k                         # substitution variable, $k expands later

The optional officer-chat directive lives in the GM's officer note: GW:a:officer_channel:password. Reload the configuration after editing with /gw reload. Full grammar in CONFIGURATION_FORMAT.md; officer-oriented setup walkthrough in GUILD_QUICKSTART.md.

Reconnection & Backoff

Channel joins are debounced by a configurable joindelay (default 30s) so the General channel grabs slot 1 first. Per-channel join failures use exponential backoff (10s → 900s). Configuration reloads are gated by a 5-minute hold-down to prevent reload storms on guild-roster churn.

Slash Commands

  • /gw, /greenwall — root command (use /gw help for the full list)
  • /gw status — channel and connection statistics
  • /gw dump — full settings and configuration dump (channel names and passwords redacted)
  • /gw reload (or /gw refresh) — re-parse Guild Information on your own client after an officer edits it
  • /gw reset — disruptive: clear all channels and reload from scratch
  • /gw mode account|character — switch between shared account-wide settings and per-character settings
  • /gw tag on|off — toggle co-guild prefix tags on bridged messages
  • /gw roster on|off — toggle cross-confederation join/leave/online/offline announcements
  • /gw ochat on|off — enable officer-chat bridging (officers only)
  • /gw joindelay N — seconds to wait before joining the bridge channel
  • /gw debug 0..5, /gw verbose on|off, /gw log on|off, /gw logsize N — diagnostics
  • /gw redact on|off — obfuscate channel names and passwords in debug output (default on)
  • /gw version — print addon and WoW build versions

Requirements

  • WoW client — supports Classic Era 1.15.x, Burning Crusade Classic 2.5.x, Wrath Classic 3.4.x, Cataclysm Classic 4.4.x, Mists Classic 5.5.x, and Retail 11.x. A single CurseForge project ships a per-flavor build of the same source.
  • Fewer than 10 active custom chat channels — you can verify in the Social window (O → Chat tab). The bridge channel needs a free slot.
  • For officer-chat bridging: officer-note read access on at least one character per co-guild. This conflicts with EPGP-style addons that store data in the officer note.
  • For initial configuration: Guild Information edit access in the guild management panel (J).

Recent Updates

v1.13.5 (Latest — 2026-08-05) — Offline test suite, and the ten defects it found.

  • fix: the Interface Options "Defaults" button raised a Lua error — it called the settings reset with no arguments, which then indexed a nil table on the first key. Underneath that sat a second defect that would have surfaced the moment the first was fixed: the reset only overwrote settings that were absent or invalid, making it a no-op on any real settings store. Both fixed. (Settings.lua, Interface.lua)
  • fix: third-party addons that registered an API handler with '*' never received a single message. The dispatcher asked whether the sending addon was literally named '*' rather than whether the registration was the wildcard — and since senders are validated against installed addons, that could never be true. Every wildcard handler was registered, sorted, and never called. (API.lua)
  • fix: one mistyped version line in the Guild Information panel aborted the whole configuration parse for every member. GW:v: accepted forms the semantic-version parser rejects (it needs 1.2.3-beta, not 1.2.3beta), and the mismatch raised part-way through — so the channel, peer and officer directives on the following lines were never read. Bad versions are now skipped and the rest of the page still loads. (Config.lua)
  • fix: the bridge channel was never hidden from your chat windows. The check scanned the window's message groups (GUILD, SAY) for a channel name, which can never match — and had it matched, it passed a frame name to an API that since 1.15.9 needs the frame itself, and would have raised. Fourth site broken by that refactor, and the only one no player had to report. (Channel.lua)
  • fix: hold-down timers could stop firing silently, and leaked a frame every time they started. The timer frame was created into a local that nothing kept, so its survival depended entirely on the client never reclaiming it — and when a timer does not fire there is no error, the callback just never runs. The frame is now created once and reused. (HoldDown.lua)
  • fix: GwConfig:is_container() raised on every call (it looked for a method that does not exist), and /gw logsize lots threw instead of printing the message explaining the mistake. (Config.lua, GreenWall.lua)
  • fix: three defects in the bundled semantic-version library, in comparison code that had never once run. A version with build metadata but no pre-release (1.0.0+20130313144700) was rejected outright; the comparison was not antisymmetric, so 1.0.0-alpha and 1.0.0-1 each ranked below the other; and a shorter pre-release outranked a longer one, making 1.0.0-alpha newer than 1.0.0-alpha.1. These decide whether the GW:v: minimum-version check fires. The library version was bumped alongside the fix, which matters: without the bump this corrected copy would silently lose to any other add-on carrying an older copy of the same library. (Lib/SemanticVersion.lua)
  • fix: /gw help did not list mode, joindelay or refresh, so three working commands were undiscoverable in game. The README also documented a stats command that has never existed, and described reload as asking every member of the confederation to reload — it only ever reloaded your own client. Both corrected, and a test now checks the help text against the real command list. (Globals.lua, README.md)
  • tooling: added an offline test suite — 430 examples at 100% line coverage across every add-on file, on the shared WoWAPITesting harness. Every fix above came from writing the test for how the code should behave and reading the failure. Also repaired .pkgmeta, whose folder entries and script globs were malformed in a way that silently matched nothing — the development tree was being packaged into the released zip.
  • note: nothing visible to players changed beyond these fixes. The TOC, wire protocol and configuration grammar are untouched, so mixed-version confederations keep working.

v1.13.4 (2026-07-22) — Restore inbound bridging after the WoW 1.15.9 chat-frame refactor.

  • fix: co-guild messages stopped displaying on the default UI after patch 1.15.9, throwing Chat.lua:110: attempt to call a nil value on every inbound message. The same refactor that broke outbound bridging in v1.13.3 also removed the global ChatFrame_MessageEventHandler outright — it is now a method on each chat frame (ChatFrameMixin:MessageEventHandler). GreenWall bound that global at load to inject received peer messages into your chat windows, so on the stock UI it captured nil and every decoded message errored instead of displaying. Receipt and decoding still worked; only the final display call failed. This is why it looked partial in the field — GreenWall overrides that same binding with ElvUI's and Prat's handlers, which still exist, so ElvUI/Prat users kept seeing messages while stock-UI users saw nothing. Now feature-detects and adapts to the frame method when the global is gone; ElvUI/Prat overrides are untouched. (Compat.lua)
  • note: this completes the trio of 1.15.9 breakages — v1.13.2 fixed the login crash, v1.13.3 fixed outbound /g and /o bridging, and this fixes inbound display of co-guild messages on the stock UI.

v1.13.3 (2026-07-22) — Restore outbound bridging after the WoW 1.15.9 chat-frame refactor.

  • fix: guild and officer chat stopped bridging outbound after patch 1.15.9 — your messages showed in local guild chat but never reached co-guilds. 1.15.9 (interface 11509) rebuilt the chat edit box into the mixin-based Blizzard_ChatFrameBase system, so the global ChatEdit_ParseText GreenWall hooked to catch outgoing messages became a dead deprecation alias — the client now calls the edit box's own ParseText method, which the hook never saw. The bridge channel still connected (/gw status showed connected=true) and inbound peer messages still arrived, which is why it looked half-alive. Now hooks each chat edit box's ParseText method where the new mixin exists and falls back to the legacy global hook on older clients, so every flavor keeps working. This refactor already shipped on Retail (11.0) and Mists Classic, where the old hook was likewise dead. (GreenWall.lua)
  • change: bumped the Classic Era TOC to interface 11509 for WoW 1.15.9. (GreenWall.toc)
  • note: this is the second half of the 1.15.9 breakage — v1.13.2 fixed the GetAddOnInfo login crash, this fixes the quieter outbound-bridging regression from the chat-frame refactor. Inbound replication was never affected.

v1.13.2 (2026-07-22) — API-breakage fixes for the latest WoW client update.

  • fix: GreenWallAPI crashed with attempt to call a nil value whenever a third-party addon touched it — a client update removed the loose global GetAddOnInfo, which now exists only as C_AddOns.GetAddOnInfo. Any caller reaching SendMessage / AddMessageHandler / ClearMessageHandlers for a named addon hit the assert(addon == GetAddOnInfo(addon)) validation and threw — seen in the wild as VersionCheck-1.0 calling AddMessageHandler at login. The rest of the addon migrated to C_AddOns in v1.12.0; API.lua was the one file missed. (API.lua)
  • change: proactively migrated two now-deprecated globals — the same update demoted GetGuildInfoText and SendChatMessage to deprecation-fallback shims for C_GuildInfo.GetInfoText and C_ChatInfo.SendChatMessage that load only while the loadDeprecationFallbacks CVar is on and are flagged "will be removed in the future." Switched both to the namespaced API with the loose global kept as a fallback, using the same feature-detect idiom v1.13.1 introduced for C_GuildInfo.GuildRoster — no flavor regresses, and the namespaced SendChatMessage is the same restricted function, so the wire protocol is unchanged. (Config.lua, Channel.lua)
  • note: audited the addon's entire WoW API surface against the updated Classic Era docs. GetAddOnInfo was the only hard removal and GetGuildInfoText / SendChatMessage the only two deprecations; every other global GreenWall calls is still first-class. No further changes required.

v1.13.1 (2026-05-19) — Hotfix for v1.13.0's multi-flavor rollout.

  • fix: GuildRoster() crashed on TBC Classic / Wrath / Cata / Mists / Retail with attempt to call global 'GuildRoster' (a nil value) — Blizzard moved GuildRoster() into the C_GuildInfo namespace years ago; it remains as a loose global only on Classic Era 1.15.x. v1.13.0 enabled the addon to load on the other flavors but did not audit the Lua source for Era-only API calls, so GwConfig:reload() threw on the very first config load and the bridge configuration never bootstrapped. Reported on TBC/Anniversary. (Config.lua)
  • tooling: refreshed CLAUDE.md to match the post-v1.12.0 / post-v1.13.0 docs reality — togpm changelog format, 6 flavor-specific TOC files, and the @project-version@ packager substitution that replaced manual ## Version: / ## X-Date: bumps. (CLAUDE.md)

Community

For bug reports or feature requests, visit the project on CurseForge.

Dedication

GreenWall is dedicated in memoriam to Roger Keith White (1962-2017), known to the members of Alea Iacta Est as Ralff. He was instrumental in the creation and refinement of GreenWall, and the soul of our community writ in flesh and blood.

Never again shall we meet such a formidable mountain of intelligence, curiosity, hospitality, and non-stop innuendo.

The GreenWall - Revived Team

Forgeborn tier frameprofile avatar
  • 2
    Followers
  • 27
    Projects
  • 353.5K
    Downloads
Donate

More from PmptastyView all

  • Dibs project image

    Dibs

    A master‑loot tool for Classic Era raids: everyone calls dibs on the gear they want before the raid, so when an item drops the masterlooter instantly sees who's competing — for fast, fair, drama‑free distribution. Works for pugs too.

    • 283
    • August 7, 2026
  • LibProfessionDB project image

    LibProfessionDB

    Library for WoW profession skills for use in other AddOns.

    • 1.8K
    • August 7, 2026
  • LibItemDB project image

    LibItemDB

    A library with all of the WoW items for use by other addons

    • 2.1K
    • August 7, 2026
  • TOG Profession Master project image

    TOG Profession Master

    TOG Profession Master should help you and your guild to know faster which player has which profession and who can craft which item or who has learned which enchantment.

    • 5.3K
    • August 7, 2026
  • Dibs project image

    Dibs

    A master‑loot tool for Classic Era raids: everyone calls dibs on the gear they want before the raid, so when an item drops the masterlooter instantly sees who's competing — for fast, fair, drama‑free distribution. Works for pugs too.

    • 283
    • August 7, 2026
  • LibProfessionDB project image

    LibProfessionDB

    Library for WoW profession skills for use in other AddOns.

    • 1.8K
    • August 7, 2026
  • LibItemDB project image

    LibItemDB

    A library with all of the WoW items for use by other addons

    • 2.1K
    • August 7, 2026
  • TOG Profession Master project image

    TOG Profession Master

    TOG Profession Master should help you and your guild to know faster which player has which profession and who can craft which item or who has learned which enchantment.

    • 5.3K
    • August 7, 2026