Ledger.
Guild officers already run their raids out of a spreadsheet. Guild Pro's job is to be a better spreadsheet — one that knows what a Windfury totem is. Everything here follows from that: hairline cells, zero radius, monospace on every number, and a single gold accent that only appears where you can act.
Identity
One mark: a gold blade on a violet-steel grip, drawn on a strict 16×16 grid in five tones. It is pixel art, so it never blurs, never gets a gradient, and never gets a drop shadow beyond its own glow.
Animation
A single bright pixel-pair falls down the blade in hard steps() every 3.6s, with two glints near the tip. No easing — easing is what makes fake pixel art look fake. Disabled entirely under prefers-reduced-motion.
Colour
Two systems that never mix. Chrome is ours and can change. Data colour belongs to the game and to Warcraft Logs — our users read it fluently already, so overriding it to fit a palette makes the product harder to use, not more distinctive.
Chrome — ours
Warcraft Logs percentiles — theirs
Used on every parse number, everywhere, without exception. A 91 is purple here because it is purple there.
Class & item quality — Blizzard's
Typography
Two faces. A UI sans for anything you read as language, and a monospace for anything you read as a value. The split is not stylistic — the mono is what makes columns of numbers scannable.
Rule every numeral in a column gets
font-variant-numeric: tabular-nums, no exceptions — ragged digits are the fastest way to make a data table feel amateur.Labels 9–10px mono, .15em tracking, uppercase, faint. They are furniture; they never compete with the value.
Grid & density
Panels interlock. There are no floating cards and no gaps between boxes — regions share a single hairline, the way cells in a sheet do. This is the single decision that makes Guild Pro read as a tool rather than a dashboard.
Hairline 1px
#202024 between regions, #191919 between rows inside a region. Two weights, no more.Radius 0 everywhere. Shadow only on modal overlays.
Primitives
Six elements build almost every screen in the product.
Metric strip
The signature component. Every major screen opens with one: a grade block on the left, then a run of interlocked cells. It is the first thing an officer reads and the thing that changes when they act.
Tables
Guild Pro is mostly tables, so they carry more design weight than anything else. Sticky mono headers, hairline rows, right-aligned tabular numbers, and a share bar wherever a value is part of a whole.
| Parse | Raider | Share | Damage | ilvl | Active | DPS | |
|---|---|---|---|---|---|---|---|
| 1 | 93 | ⚔️GeardahFury | 2.50m | 95 | 99.22% | 15,026.4 | |
| 2 | 99 | 🔥IggýFire | 2.48m | 93 | 99.55% | 14,904.2 | |
| 3 | 97 | ⚖️BoomtowneRetribution | 2.29m | 90 | 98.61% | 13,776.4 | |
| 13 | 82 | ⚔️RâsszFury | 1.86m | 95 | 91.50% | 11,173.9 | |
| 98 | Raid total | 35.70m | — | 166.3s | 214,700.8 |
Charts
Charts follow the same rules as tables: hairline grid, mono axes, one accent. No legends where a direct label will do, no 3D, no gradients except a 10% area fill under a line.
Timelines
Two kinds: a raid night laid out horizontally, and an event history laid out vertically.
Roster
The home screen. Everything a GM needs to answer "who can I count on Thursday" in one pass.
| Raider | Role | Attend | Trend | Parse | ilvl | Items | Last raid | Status |
|---|---|---|---|---|---|---|---|---|
| ✨SylvanneHoly · Human | Healer | 98% | 99 | 94 | 6 | Last night | Core | |
| 🛡️AlthilosProtection · Human | Tank | 100% | 81 | 94 | 8 | Last night | Raid lead | |
| ❄️FrosthollowFrost · Gnome | Ranged | 95% | 100 | 96 | 5 | Last night | Core | |
| 🌿MoonbraeRestoration · Night Elf | Healer | 74% | 80 | 89 | 2 | Last night | Trial 4/6 | |
| 🗡️ShivsparkAssassination · Gnome | Melee | 52% | 41 | 83 | 2 | 3 weeks ago | 3 no-shows |
Loot
Three surfaces: what dropped and who got it, what everyone is owed, and what everyone wants. The ledger is append-only — every points dispute in WoW history is "the officer edited my balance".
| Item | Boss | Awarded to | Method | Cost | Wish rank | Date |
|---|---|---|---|---|---|---|
| 🪢Bindings of the WindseekerLeft half | Garr | Stormvale | Council | — | 1 | 30 Jul |
| 🗡️Perdition's BladeMain hand | Ragnaros | Nixxa | DKP | 180 | 1 | 30 Jul |
| 👑Crown of DestructionHead | Ragnaros | Yewbow | DKP | 120 | 3 | 30 Jul |
| 💍Cauterizing BandFinger | Golemagg | Sylvanne | Off-spec | 0 | — | 30 Jul |
| 🧤Gloves of ProphecyHands · tier 1 | Sulfuron | Disenchanted | Rot | — | — | 23 Jul |
| Date | Reason | Δ | Balance |
|---|---|---|---|
| 30 Jul | Perdition's Blade | −180 | 142 |
| 30 Jul | Raid attendance · MC | +50 | 322 |
| 30 Jul | On time bonus | +10 | 272 |
| 28 Jul | Weekly decay 10% | −29 | 262 |
| 27 Jul | Raid attendance · MC | +50 | 291 |
| # | Item | Source | Gain | State |
|---|---|---|---|---|
| 1 | 🔮Eye of Divinity | Majordomo | +11.4% | BiS |
| 2 | 👘Robe of Everlasting Night | Ragnaros | +6.2% | BiS |
| 3 | 🧤Gloves of Prophecy | Sulfuron | +2.8% | Upgrade |
| 4 | 📿Choker of Enlightenment | Golemagg | — | Received |
Player profile
The public face of the product and the growth engine. Everything on it is verified — characters by Battle.net OAuth, attendance by the raid, parses by Warcraft Logs. Nothing here is self-reported except availability.
Sylvanne
Verified record
Attendance · last 20 raids
Parse by encounter · Molten Core
| Ragnaros | 99 | 8 kills | |
| Majordomo | 95 | 11 kills | |
| Golemagg | 87 | 12 kills | |
| Baron Geddon | 79 | 12 kills |
Guild history
Disputes — every absence can be contested; contested entries show as contested rather than silently disappearing.
Discord surface
Discord is a client, never the database. Posts are generated views of state that lives on the site, so a post can always be regenerated and can never drift.
#2b2d31, text #dbdee1, blurple #5865f2 on the primary button. Our gold appears only as the embed's accent rail.Discord widgets
Four posts carry the entire product inside Discord. The signup is the one that has to be better than what guilds already use, because it's the one they'd have to switch away from — and the only reason to switch is that ours knows things a signup bot can't.
What the incumbent gets right
Raid-Helper's signup format is genuinely good and we should not reinvent it out of pride. The structure below is worth keeping almost verbatim.
Keep
- Queue numbers. The order people signed up in, shown before every name. Settles bench disputes without an argument.
- Class columns, three across. Maps exactly onto Discord's inline field layout.
- Role counts in one line above the columns.
- Bench, Tentative and Absence as separate short lists, not mixed into the roster.
- A closed state on the control once the event locks.
Add — the reasons to switch
- Who hasn't answered. A signup bot only knows who clicked. We know the roster, so we can show the twelve people who said nothing.
- Reliability per raider. A yes from a 52% attender is not a yes. Coloured dot, from real attendance history.
- Live comp validation. Missing healers, missing debuffs, called out while people are still signing up rather than at 20:05.
- Lockout awareness. The addon knows who is already saved to this ID.
- Spec, not just class — and the role derived from it automatically.
1 · Signup sheet
TK start for Tuesday. Sign up with your spec — the sheet fills itself in. 🗡️
SSC / TK Lockout II
Roles
Signed · 24
- 12VanpProt
- 2DapFury
- 7GeardahFury🔒
- 10bhettArms
- 20CherryflavorProt
- 3NotJoopzHoly
- 24JejensnRet
- 21BigarmflexRet
- 13FadeResto
- 14LunyoneEnh
- 19BazEle
- 18MoraEle
- 22SankaEnh
- 11laserHoly
- 8BatjuiceShadow
- 26VerrousShadow
- 4SkatmanResto
- 25taxsinglmomsFeral
- 1SazabeBM
- 16MeyMM
- 15IggyFire🔒
- 17BeansFrost
- 9trescommasDestro
- 28FunwAffli
- 🪑 Bench (2)
- 5Naray
- 6Tamaal
Tentative · absence · saved
No response · 9
Remind the 9 is the highest-value button on the widget. It DMs everyone on the roster who hasn't answered, and no signup bot can offer it because none of them know the roster.
Class columns map to Discord inline fields, three across, exactly as the incumbent does it. Don't fight the platform's layout.
2 · Locked roster
Roster is locked. React ✅ to confirm — anyone unconfirmed by 19:30 gets replaced from the bench. 🔒
Molten Core — Thursday 20:00
Groups · 40 slotted
- Aldric
- Bulmar
- Thoradin
- Bigbadben
- Althilos★RL
- Kaelric
- Eadric
- Nixxa
- Bradlands
- Atenius
- Brynja
- Halvard
- Duskrend
- Shivspark
- Boomtowne
- Yewbow
- Cragfoot
- Kestrin
- Bryndal
- Dawnhold
- Frosthollow
- Willowyn
- Emberly
- Zephrit
- Marrowlight
- Vaeltha
- Boofuss
- Mordray
- Grelth
- Naliss
Before we pull
3 · Raid recap
Full clear, guild best. Nice work everyone. 🔥
Molten Core — Full Clear
Top parses
Attendance — 30 signed, 27 raided
Hall of shame
4 · Loot recap
14 items awarded. Bindings dropped — the quest is on. 🪢
Loot — Molten Core, 30 July
Awarded
Fairness check
Voice
Guild Pro talks like a competent officer: specific, unbothered, never preachy. It records what happened; it does not have opinions about people.
Do
- State the consequence. "Shadow Weaving missing — every warlock loses 15%."
- Name the number. "Signed Yes, never zoned in. Third time this tier."
- Offer the next action. "Move a paladin into Group 6."
- Stay neutral about people. "52% attendance" — not "unreliable".
- Explain a score. Every derived number links to the evidence behind it.
Don't
- Don't editorialise. No "Yikes", no "Oof", no emoji as commentary in the app.
- Don't predict. We dropped projected DPS for exactly this reason — a model that's wrong once is never trusted again.
- Don't hide the formula. If attendance % is weighted, say how, on the screen.
- Don't apologise. An error says what broke and what to do, in one line.
- Don't use system words. "Raid night", not "event instance".
Motion
Almost none. Motion in a data tool is either feedback or noise, and most of it is noise.
steps(), 3.6s cycle, and it is the sole exception.House rules
If a decision isn't covered above, these settle it.