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.
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.
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.
/g in any co-guild appear in every other co-guild's guild-chat window in real time, attributed to the original sender<DMC>) so you can tell at a glance which sister guild a speaker is inCHAT_MSG_GUILD handler, not a fake channelGW:a:channel:password)/gw ochat on — non-officers never see officer traffic, and the addon detects officer-note read access before activating the bridge/gw roster on|offmode setting picks between a shared GreenWallAccount store and per-character GreenWall settings — switch any character to whichever mode you preferESC → Options → AddOns → GreenWall) or the slash-command CLIOther addons can piggyback on the confederation bridge through GreenWallAPI:
GreenWallAPI.SendMessage(addon, message) — broadcast a message to every co-guildGreenWallAPI.AddMessageHandler(handler, addon, priority) — register a callback for inbound messagesGreenWallAPI.GetChannelNumbers() — query the hidden channel numbers in useAn example consumer is GWSonar. Full reference in API.md.
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.
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).
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.
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.
/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 — re-parse Guild Information 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 versionsO → Chat tab). The bridge channel needs a free slot.J).v1.12.0 (Latest — 2026-04-29) — First Pimptasty fork release: long-standing bug fixes, dead-code cleanup, modernized TOC. Mark Rogaski's original work covers releases 0.9.00 (2010-11-01) through 1.11.18 (2025-05-24); see LICENSE for full attribution.
GwHoldDownCache:hold had an inverted comparison since v1.5.3 (Nov 2014); the comember-cache that was supposed to dedupe online/offline announcements always returned false, so every login produced both the natural CHAT_MSG_SYSTEM notification *and* a duplicate generated from the bridge channel's CHAT_MSG_CHANNEL_JOIN. The cache's pruning logic was also broken (#self.cache always returns 0 on hash-keyed tables; table.remove is the wrong API for string keys). Both fixed. (HoldDown.lua)GwConfig:load()'s cleanup loop used ipairs over self.channel, which is hash-keyed by guild / officer; the loop body never ran. Officers removing a channel directive left the addon transmitting on the orphaned channel until reload. Switched to pairs. (Config.lua)rv = false global, an if addon ~= '*' block referencing a parameter the function doesn't take (copy-paste from ClearMessageHandlers), and used gw.api_table[i] = nil which leaves a hole that breaks subsequent ipairs walks. Any third-party caller using the documented API hit undefined behavior. Rewrote to match the contract; switched to table.remove. ClearMessageHandlers had the same hole-leaving bug; fixed too. (API.lua)gw.IsLegendary leaked the _ and rarity globals on every call — orphan from the v1.11.0 legendary-loot-replication removal; deleted along with gw.GetItemString, GwPromoteSystemEventHandler, the rank field on broadcast destructuring, and an unused semver import. (Utility.lua, SystemEventHandler.lua, Chat.lua)gw.Debug call-stack parser. WoW's interpreter accepted it; lua-language-server flagged it as error-severity. Replaced with a literal backtick. (Utility.lua)'id=%, addon=%s, priority=%d' debug format string in two API debug calls would error if logged at debug level 4+. (API.lua)## Version to the packager substitution token @project-version@; added X-Min-Interface, OptionalDeps (ElvUI, Prat-3.0, Identity-2, Name2Chat, Incognito), X-License: MIT, and X-Curse-Project-ID; dropped legacy X-Category (replaced by Category), DefaultState, manual X-Date, and the two URL lines. (GreenWall.toc)Pimptasty appended to the ## Author line; LICENSE finally filled in (it had been the unfilled MIT template since the project began). New repo tooling: CLAUDE.md, .pkgmeta, .luarc.json, .markdownlint.json, docs/curseforge_description.html.v1.11.18 (2025-05-24) — TOC date fix.
v1.11.17 (2025-05-24)
v1.11.16 (2024-11-10)
InterfaceOptions_AddCategory.v1.11.15 (2024-10-24)
For bug reports or feature requests, visit the project on CurseForge.
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.