A lightweight World of Warcraft addon that saves your Mythic+ keystone data to SavedVariables so external tools can read it without interacting with the game client.
On every login and logout, KeystoneSync writes the current character's keystone information to KeystoneSyncDB:
| Field | Description |
|---|---|
character |
Character name |
realm |
Realm name |
region |
Region (default: eu) |
hasKeystone |
Whether the character currently holds a keystone |
keystoneWeeklyResetKey |
EU weekly reset key for the saved keystone. Used to clear stale keystones after Wednesday reset |
ilvl |
Average item level reported by WoW |
money |
Character money from GetMoney(): total copper plus gold/silver/copper breakdown |
preyHunts |
Weekly Prey Hunt completion data split by Normal, Hard, and Nightmare, including completed quest IDs, the full quest completion map, and the weekly reset key |
currencies |
Midnight Season 2 Mistcrests, Venomblight Manaflux, Tidal Spark Dust, Spark of Tides, keys, Nebulous Voidcore, and Trovehunter's Bounty bag/buff/weekly completion state |
mythicPlusSeason |
Current-season Mythic+ dungeon bests. Captured after a delayed login pass or reliable Mythic+ events to avoid stale WoW cache data from another character |
keystoneLoot |
Optional local snapshot of the current character's KeystoneLoot wishlist and Voidcore state, including explicit availability/API status |
keystoneLevel |
Keystone level (e.g. 8) |
keystoneDungeon |
Dungeon name (e.g. "The Stonevault") |
keystoneChallengeMapId |
Challenge mode ID |
keystoneMapId |
UI map ID |
updatedAt |
Unix timestamp of the last save |
updatedReason |
Event that triggered the save (PLAYER_LOGIN, PLAYER_LOGOUT, MANUAL_COMMAND) |
Only characters at level 90 or above are tracked.
Spark of Tides (itemId = 274476) is a physical-item count for the current
character. currencies.sparksOfTides.itemQuantity (also exposed through the
compatibility aliases quantity and totalItemQuantity) is the carried amount
plus the last trustworthy character-specific bank amount. inventoryQuantity
is the amount carried in normal bags and the equipped reagent bag.
Spark location is counted directly from Retail containers rather than inferred
from C_Item.GetItemCount. Carried storage explicitly enumerates
Enum.BagIndex.Backpack, Bag_1 through Bag_4, and ReagentBag.
bankQuantity enumerates only the tab IDs returned by
C_Bank.FetchPurchasedBankTabIDs(Enum.BankType.Character) while the personal
bank is accessible. Retail 12.1 exposes the consolidated personal bank,
including its reagent-capable character storage, through these Character tabs;
it does not expose an additional personal Reagent Bank container alongside
them. The addon never requests Enum.BankType.Account, so Warband/Account Bank
tabs are excluded. bankQuantityKnown identifies a valid snapshot and
bankUpdatedAt records its capture time. Before the first bank access the bank
amount is unknown; after a trustworthy capture, login, reload, and bank close
preserve that character's last known amount instead of replacing it with a
false zero. PLAYER_LOGOUT also preserves the last normal-play Spark snapshot
rather than rescanning containers during teardown.
Tidal Spark Dust (currencyId = 3509) remains independent progression data and
is never used to derive the current physical Spark count.
KeystoneLoot is an optional dependency. KeystoneSync continues saving its normal data when KeystoneLoot is missing, disabled, not ready, incompatible, or returns no favorites.
For each current character processed by KeystoneSync, the local-only
KeystoneSyncDB[key].keystoneLoot block uses one of these states:
not_installedinstalled_not_readysupportedunsupported_api
A supported snapshot contains the detected API/addon versions, KeystoneLoot's current
character key, capture timestamp, normalized favorites, and read-only Voidcore state.
Favorite identity uses sourceId, specId, itemId, numeric tier, and a normalized
bonus-based variantKey; optional enrichment includes sourceType, slotId, icon,
bonusIds, gems, enchant, exact item level, exact in-game quality, and owned=true
while the item ID is equipped or present in bags or the personal bank. Omitted owned
means the item is not currently known to be owned. Item level and quality remain nullable
while WoW loads an item. Normal KeystoneLoot UI Favorites do
not store the selected upgrade-track bonuses, so KeystoneSync captures the exact public
item-tooltip hyperlink when FAVORITE_ADDED fires and retains that variant in its own
character record. Guarded callbacks refresh only the same active character snapshot.
Dungeon sourceId values remain KeystoneLoot challenge mode IDs. Voidcore usedItems is
a sorted list of numeric item IDs marked as used.
Favorites created before this capture support, or imported without trustworthy bonus IDs, remain deliberately nullable: KeystoneSync never labels the sparse base item level or quality as exact. Remove the Favorite, select the intended track/rank, and add it again once to capture the exact variant. Later filter changes do not alter an already captured Favorite; removing it clears the capture so a subsequent add can replace it.
An empty favorites = {} from a supported, ready KeystoneLoot API is authoritative and
replaces an older wishlist. KeystoneSync never backfills historical character entries
with the logged-in character's KeystoneLoot data. KeystoneClient and the Worker consume
these additive exact-variant fields while remaining compatible with older snapshots.
- Download the dedicated addon release asset
KeystoneSync-vX.Y.Z.zipfrom GitHub Releases. - Extract the
KeystoneSyncfolder into your WoW AddOns directory:World of Warcraft\_retail_\Interface\AddOns\KeystoneSync\ - Enable the addon in-game from the AddOns menu on the character select screen.
/ksync
Forces an immediate save and prints the stored keystone for the current character in the chat window. When available, the same save performs exactly one KeystoneLoot refresh and prints one concise integration diagnostic without listing wishlist items.
Use /ksync kl for a safe per-Favorite KeystoneLoot diagnostic. It reports only item/source/spec
identity, Favorite bonus IDs, captured track/rank context, variant key, exact item level/quality,
and metadata source. It never prints account identifiers, authentication data, or unrelated
SavedVariables.
If you turned in Orin Straylight's weekly Nebulous Voidcore quest before installing the version
that records quest turn-ins, use /ksync voidcore completada on that character. This confirms
completion only for the current week; the addon clears it at the next Wednesday reset.
World of Warcraft\_retail_\WTF\Account\<ACCOUNT>\SavedVariables\KeystoneSync.lua
This is the file external tools (e.g. KeystoneClient) poll to sync keystone data to a backend API and display it in a desktop client or web dashboard.
Addon releases are owned by this repository. A release-impacting addon change requires a Spanish changeset under .changes/pending/*.json. On qualifying pushes to main, GitHub Actions publishes automatically only when the ADDON_RELEASE_ENABLED repository variable is true. Manual workflow_dispatch releases remain available independently of that automatic-release gate. Release automation plans the bump, updates KeystoneSync.toc, packages KeystoneSync-vX.Y.Z.zip with root KeystoneSync/, and publishes the GitHub Release under tag vX.Y.Z.
Build-only workflow/tooling changes validate and package the addon without publishing. KeystoneClient consumes only the dedicated KeystoneSync-vX.Y.Z.zip asset, not GitHub's automatic source archives.
Release tooling always runs from the current release infrastructure on main. When a missing or incomplete GitHub Release is resumed for an existing historical tag, the workflow exports the immutable tagged addon source into a temporary directory and packages that exact runtime through the current validator; it never rewrites or globally checks out the historical tag.
| Field | Value |
|---|---|
| Interface | 120100 (Midnight, patch 12.1) |
| Retail only | Yes |
See CHANGELOG.md.