Softcore is a Retail World of Warcraft addon for hardcore-style leveling accountability with friends.
It keeps a per-character run ledger with deaths, rule violations, party compatibility, audit history, achievements, and current run status. It is not server-side enforcement. The goal is to make the group's agreement visible while keeping each character's validity under that player's control.
- Place the
Softcorefolder inWorld of Warcraft/_retail_/Interface/AddOns/. - Enable
Softcoreon the character-select addon screen. - Log in or run
/reload. - Use
/scto confirm the addon loaded.
- A compact main menu for starting runs, reviewing rules, checking status, clearing allowed violations, reading logs, and tracking achievements.
- A HUD for quick local or party status.
- A minimap button for opening the main menu.
- Party proposals, run sync proposals, party invites, and rule amendments inside the Charter tab, without extra popup windows.
- Advisory item tooltip warnings for wearable gear, enchants, heirlooms, consumables, and other item restrictions.
- CSV export for the local run ledger and a bounded bug-report export for testing or support.
Open the menu with /sc menu, the minimap button, or by clicking the HUD.
| Tab | Purpose |
|---|---|
| Overview | Current run label, local status, party status, deaths, violations, active time, recent meaningful activity, and a compact party ledger. |
| Charter | Start runs, choose presets, review active rules, use Party Sync, modify rules, and respond to proposals or amendments. |
| Violations | Active issues with compact rows, counts, tooltips, and one-click Clear where allowed. |
| Log | Newest-first audit history with low-value rows filtered from display; CSV export always remains available. |
| Achievements | Account-level milestones, rule and class achievements, max-level progress, and earned completion awards. |
The Overview run label comes from the current rule signature. Exact known profiles show their run names; anything else is shown as Custom Run.
Softcore includes four visible presets:
| Preset | Shape |
|---|---|
| Casual | Low-restriction grouped baseline. Unsynced party play, economy access, mounts, flying, flight paths, consumables, heirlooms, enchants, and repeated dungeons are allowed; instanced PvP is blocked. |
| Chef's Special | Creator-preferred profile. Synced party members are required by default, white/gray gear limits are enabled, bank is allowed, trade/auction/mailbox/warband/guild banks are blocked, flying mounts are blocked, and enchants stay enabled. |
| Bronzeman | Stricter solo-leaning challenge profile, with flight paths allowed and unsynced party play disabled. |
| Bronze Vigil | A harder Bronzeman variant with no flight paths, cinematic camera, and Explorer Mode enforced. |
There are also hidden custom rule profiles that can still be recognized by the run-label system when their exact rules match. Head Chef's Special is recognized as Chef's Special with Explorer Mode enabled. Any edited or unmatched ruleset becomes Custom Run.
Solo runs start immediately from the Charter tab.
Grouped starts use a Charter-tab proposal:
- The proposer configures rules and clicks Start Run.
- Party members review the proposal in Charter.
- Every current party member accepts or someone declines.
- The proposer confirms after everyone accepts.
- Accepted members start the same run ID and rules.
Pending proposals expire after 30 minutes. Declining cancels the proposal for everyone.
Softcore syncs with Blizzard addon messages using the SOFTCORE prefix on party or instance-chat channels. Normal parties are supported; raid groups are treated as local-only because the UI is designed for party scale.
Use Party Sync in the Charter tab, or /sc sync, when the party display looks stale or when players want to align active runs. In a party, the Charter Party Sync button can stay visible (sometimes disabled) during an open proposal so the tooltip still explains what to do next.
Party Sync can:
- refresh stale party status
- align separate active runs with the same rules into one run ID after explicit acceptance
- propose rule amendments when active run rules differ
- invite party members who are not yet in the run
Remote party state is display and compatibility data. It must not reset, fail, overwrite, or silently mutate your local character. Local run state changes only from local deaths, local violations, and local user actions such as accepting a proposal, applying a rule amendment, starting, resetting, stopping, or retiring a run.
Death is permanent for the character.
Most non-death rule breaks create violations instead of directly failing the run. Examples include disallowed bank or auction access, sending mail or taking mail, accepting a trade when trade is restricted, using restricted movement, equipping restricted wearable gear, equipping permanently enchanted gear when enchants are disallowed, and gaining XP with an invalid party member when the active rules block that party state.
Opening a mailbox or trade window alone is allowed so accidental clicks or another player initiating trade cannot force a violation.
Clearing a violation preserves the audit trail and logs the clear event. Death and fatal/character-fail violations are not clearable. Live-state checks, such as equipped gear or active movement forms, are rechecked after clearing so unresolved behavior can create a fresh active violation.
Explorer Mode is an immersion rule. While active, Softcore hides Blizzard quest guidance such as quest objective blobs, super-tracked arrows, auto quest watch, and the minimap display, then restores the prior settings when the rule no longer applies. Third-party quest helpers may still draw their own arrows or pins.
Achievements are grouped by level milestones, max-level runs, preset challenges, class mastery, and rule families for access, travel, gear/items, and party/instance restrictions. Inside each group, in-progress achievements sort by highest percent progress first; completed achievements move to the bottom of that group. Harder preset variants can satisfy their base preset achievement where appropriate: Head Chef's Special counts for Chef's Table, and Bronze Vigil counts for Bronzeman.
Max-level completion uses the same discovered run label shown on Overview. When an active valid run completes, Softcore records the completion, plays restrained feedback, and opens a parchment-style award with concise run statistics. The latest completion award is stored per character and can be reopened from the Achievements tab.
Characters that are already max level cannot start or join a new leveling run. In a party, Softcore blocks run proposals, join-run sync, and run invites when a known participant is already max level, and the Charter controls explain the restriction instead of creating an ineligible run.
The HUD is a small status strip for the active run, party state, and pending governance. It also appears for proposal or amendment review before a run is active. Click it to open the most relevant menu tab.
HUD text is intentionally short, using labels such as Review, Waiting, Settling, Syncing, Invite, Run Sync, No Addon, Offline, Raid Local, Version, Rules, Run ID, Not In Run, and Level Gap.
Explorer Mode hides the minimap display during active runs while preserving surrounding Blizzard controls such as the addon compartment, location, clock, and calendar when possible. Softcore remains available through the HUD, addon compartment, and a small Explorer tray button.
Softcore UI sounds are restrained and limited to important moments such as run start/completion, achievements, local deaths or violations, incoming review, accepted or applied governance, cancellations, and violation clears. Use /sc sound off to mute them or /sc sound test list to inspect available cues.
Use /sc for everyday help and /sc commands for the fuller support list.
Common commands:
| Command | What it does |
|---|---|
/sc menu |
Open the main menu. |
/sc status |
Show current run status. |
/sc rules |
Open Charter and rules. |
/sc violations |
Open Violations. |
/sc log |
Open Log. |
/sc sync |
Request fresh party sync state. |
/sc bug |
Open a bounded copyable bug-report export. |
/sc reset |
Explain the destructive reset confirmation. |
Useful support commands:
| Command | What it does |
|---|---|
/sc export |
Open the full local run CSV. |
/sc participants |
Print current participants. |
/sc conflicts |
Print active party conflicts. |
/sc gear |
Print equipped gear rule status. |
/sc dungeons |
Print dungeon tracking state. |
/sc hud |
Toggle the HUD. |
/sc minimap |
Toggle the minimap button. |
/sc announce off|chat|party|guild |
Configure optional announcements for your own character's deaths. |
/sc sound on|off|test [event] |
Toggle or test Softcore UI sounds. |
/sc camera status|next|soft|cinematic|dramatic|off |
Test local camera profiles without changing run rules. |
/sc proposal |
Show the current pending proposal. |
/sc accept |
Accept the current pending proposal. |
/sc decline |
Decline the current pending proposal. |
/sc propose-add Player-Realm |
Invite a party member into the current run. |
/sc reset confirm end run |
Stop/reset the local active run. |
/sc retire |
Retire this character from the active run. |
/sc syncdebug or /sc sd |
Print sync diagnostics. |
/sc debugclear <test> or /sc dc <test> |
Clear the in-memory debug trace and test counters before a test pass. |
/sc debuglog, /sc dl, /sc bug, or /sc report |
Open the bounded bug-report export. |
Most menu commands also support chat output, such as /sc status chat, /sc rules chat, /sc log chat, /sc export chat, and /sc debuglog chat.
/sc export opens a comma-delimited CSV summary for the local run. It includes run status, observed active time, death and violation counts, rules hash, participants, and the stored audit log.
/sc bug, /sc dl, and /sc report open a bounded diagnostic export intended for bug reports. It includes current run/rules/sync state, pending governance, peers, conflicts, sync counters, newest audit rows, newest violations, and the capped debug trace.
For multiplayer testing, run /sc dc <test name> on every client before the test, reproduce the issue, then collect /sc syncdebug and /sc bug from every involved client. Include BugSack or Lua error text separately.
Active run data is stored per character in SoftcoreCharDB. Alts, rerolls, and replacement characters do not inherit another character's active run.
Softcore preserves the current run across /reload, logout, and party leave/rejoin. It does not start a new run, reset progress, accept proposals, or apply amendments from status heartbeats alone.
Important boundaries:
- Remote deaths, failures, mismatches, stale messages, resets, and violation clears do not mutate local authoritative state.
- Incomplete chunked sync messages expire without applying partial state.
- Shared audit rows are accepted only as sender-owned rows, and targeted Party Sync join responses must come from the peer/request being joined.
- Proposals and amendments expire after 30 minutes.
- Raid conversion makes Softcore local-only and expires pending group governance.
- Remote violation clears can only clear imported shared violations owned by that peer, not local authoritative violations.
- Character, realm, class, level, and zone.
- Run ID, start time, observed active time, start level, rules, status, and party state.
- Deaths, violations, cleared violations, and audit log entries.
- Participants, peer display state, conflicts, proposals, invites, and rule amendments.
- Dungeon repeat state and relevant instance entries.
- Gear quality, heirloom, permanent enchant, consumable, economy, storage, movement, Explorer Mode, and access rule events.
- Local PvP advisory warnings for War Mode and player PvP flagging.
- Per-character max-level completion award snapshots.
Contributor-facing implementation details live in:
AGENTS.md: product constraints, sync model, persistence rules, safety boundaries, testing expectations, and documentation-update rules.DESIGN.md: current UI design system and layout guidance.
Anyone changing sync, UI, commands, persistence, proposals, achievements, or release behavior should update the smallest relevant README and AGENTS sections in the same commit.
Useful in-game commands:
/reload, /sc commands, /sc status, /sc rules, /sc log, /sc violations, /sc participants, /sc conflicts, /sc gear, /sc dungeons, /sc sync, /sc syncdebug, /sc bug
General checks:
- no BugSack errors
- no UI overlap
- inactive/no-run states handled safely
- active runs preserved after
/reload - party leave/rejoin settles after heartbeat or resync
- remote events do not reset or invalidate local progress
- proposals and amendments expire instead of applying late
Two-client multiplayer baseline:
- Computer A:
Cathe-Thrall, usually party leader/proposer. - Computer B:
Hordrien-Thrall, usually party member/receiver/accepter. - Start each pass with
/reload, then/sc dc <test name>on both clients. - Use
/sc reset confirm end runon both clients when a clean inactive state is required. - After sync-heavy actions, wait 10-30 seconds for addon-message queue settling.
- Collect
/sc syncdebugand/sc bugfrom both clients when diagnosing.
Release-oriented multiplayer passes:
- Fresh grouped run proposal: A proposes, B accepts, A confirms, both share run ID and rules hash.
- Party Sync for matching active runs: align run ID without wiping local history.
- Party Sync for mismatched active rules: review highlighted diffs, accept amendment, settle to one rules hash, and log meaningful rule changes.
- Active-run invite: invite a not-in-run party member without changing existing participant history.
- Disconnect/reload recovery: stale rows recover through heartbeat/resync without local reset.
- Non-addon member: Party Sync blocks inclusion after grace period with clear HUD/Charter state.
- Join/leave during pending governance: no late apply, no silent mutation, and no audit spam.
- Proposal and amendment expiry: late accept/confirm/apply messages are ignored.
- Raid conversion: local-only mode, cleared remote roster display, expired group governance, and preserved local run.
- Remote safety: remote death, reset, failure, mismatch, stale message, or violation clear never mutates local authoritative validity, rules, logs, deaths, or violations.
Release readiness:
- Syntax-check all TOC-loaded Lua files.
- Verify the Retail interface number in-game with
/dump select(4, GetBuildInfo())and updateSoftcore.tocif needed. - Confirm
## VersioninSoftcore.tocandSC.versioninCore.luamatch. - Confirm the project license and keep a local
LICENSEfile when possible. - Prepare CurseForge summary, description, categories, logo, supported Retail version, release type, and changelog.
- Prefer a first public
Betafile unless the full multiplayer checklist has passed cleanly.
Package contents:
- Zip a top-level
Softcorefolder containingSoftcore/Softcore.toc. - Include TOC-loaded Lua files,
Assets/*.tga,README.md, changelog/release notes, and license. - Exclude
.git,.claude,.cursor,.vscode,AGENTS.md,DESIGN.md, editor files, local test files, and unused empty stubs. - Install and smoke-test the exact zip from a clean
Interface/AddOnsfolder.
Single-client smoke:
- Login,
/reload, open menu, switch all tabs, HUD, and minimap button. - Run
/sc,/sc commands,/sc status,/sc rules,/sc log,/sc violations,/sc gear,/sc dungeons,/sc sound test list,/sc export, and/sc bug. - Start a solo run, reload, and confirm run state, HUD, minimap button, logs, rules, and active time remain sane.
- Trigger or inspect representative rule checks: gear, mailbox/bank/auction/trade access, mount/flying/flight-path rules, dungeon tracking, and violation clear.
- Verify inactive/no-run states do not nil-error after
/sc reset confirm end run.
Required multiplayer release passes:
- Fresh grouped run proposal.
- Party Sync for separate matching active runs.
- Party Sync for mismatched active rules.
- Invite into active run.
- Disconnect/reload recovery.
- Non-addon member blocker.
- Join/leave during pending proposal.
- Proposal expiry.
- Rule amendment expiry.
- Raid conversion.
- Remote safety.