{"id":108824,"date":"2026-06-06T10:11:28","date_gmt":"2026-06-06T07:11:28","guid":{"rendered":"https:\/\/vpesports.com\/minecraft\/mods\/nats-player-data-bridge\/"},"modified":"2026-06-06T10:11:28","modified_gmt":"2026-06-06T07:11:28","slug":"nats-player-data-bridge","status":"publish","type":"mod","link":"https:\/\/vpesports.com\/minecraft\/mods\/nats-player-data-bridge\/","title":{"rendered":"NATS Player Data Bridge"},"content":{"rendered":"<p># NATS Player Data Bridge<br \/>\n### ![Status](https:\/\/img.shields.io\/badge\/status-beta-red)<\/p>\n<p>> This project is in its early stages and undergoing active development. Edge cases may still exist in complex modded environments.<br \/>\n> Please report any issues on GitHub or join the community on Discord.<br \/>\n> Any feedback is valuable and greatly appreciated!<\/p>\n<p>A server-side Fabric mod that synchronizes player inventories, ender chests, health, XP, statistics, and advancements across multiple Minecraft servers using NATS JetStream.<\/p>\n<p>When a player leaves, their data is saved to a NATS Key-Value bucket. When they join another server in the same cluster, that data is fetched and applied before they spawn.<\/p>\n<p>&#8212;<\/p>\n<p>## Requirements<\/p>\n<p>&#8211; **Server-side only.** Clients do not need this mod installed.<br \/>\n&#8211; **NATS server with JetStream enabled.**<br \/>\n&#8211; **Fabric API.**<\/p>\n<p>&#8212;<\/p>\n<p>## Installation<\/p>\n<p>1. Drop the mod jar into your `mods\/` folder. The NATS client library is already bundled, no extra files needed.<br \/>\n2. Start the server once to generate two config files.<br \/>\n3. Configure `config\/nats-fabric.yml` with your NATS server URL, auth token, and a unique name for this server.<br \/>\n4. Restart.<\/p>\n<p>### Setting up the NATS Server<\/p>\n<p>When setting up your NATS server, create a new text file named `nats-server.conf` and paste the following minimal configuration into it:<\/p>\n<p>&#8220;`hcl<br \/>\nport: 4222<\/p>\n<p>authorization {<br \/>\n  token: &#8220;your_secret_token_here&#8221;<br \/>\n}<\/p>\n<p>jetstream {<br \/>\n  store_dir: &#8220;.\/jetstream-data&#8221;<br \/>\n}<br \/>\n&#8220;`<\/p>\n<p>Then, start your NATS server by pointing it to the configuration file you just created:<br \/>\n&#8211; **Linux\/macOS:** `.\/nats-server -c nats-server.conf`<br \/>\n&#8211; **Windows:** `nats-server.exe -c nats-server.conf`<\/p>\n<p>Ensure the auth token in `config\/nats-fabric.yml` matches what you have set here.<\/p>\n<p>&#8212;<\/p>\n<p>## Velocity Proxy Support<\/p>\n<p>If you are running Velocity, set `&#8221;proxyMode&#8221;: true` in `config\/nats-player-data-bridge.json`. Without this, overlapping logins are rejected outright, which will break server switching.<\/p>\n<p>When proxyMode is on, the mod prevents item duplication during the switch by freezing the player server-side until the transfer is complete.<\/p>\n<p>If you are also using FabricProxy-Lite, you must set `hackEarlySend = true` in `FabricProxy-Lite.toml` for the mod to work correctly.<\/p>\n<p>&#8212;<\/p>\n<p>## Configuration (`config\/nats-player-data-bridge.json`)<\/p>\n<p>| Key | Default | Description |<br \/>\n|&#8212;|&#8212;|&#8212;|<br \/>\n| `proxyMode` | `false` | Enable RPC lock handoff for Velocity proxy setups. |<br \/>\n| `rpcTimeoutSeconds` | `15` | The timeout in seconds for cross-server RPC requests (e.g., during proxy transfers). |<br \/>\n| `syncStats` | `true` | Sync player statistics. |<br \/>\n| `syncAdvancements` | `true` | Sync advancements. |<br \/>\n| `filterMode` | `&#8221;whitelist&#8221;` | `&#8221;whitelist&#8221;` syncs only listed NBT keys. `&#8221;blacklist&#8221;` syncs everything except listed keys. |<br \/>\n| `filterKeys` | Inventory, health, XP, etc. | The NBT keys to include or exclude depending on filterMode. |<br \/>\n| `backupHistoryCount` | `20` | The number of historical snapshots to keep per player in the backup bucket. |<br \/>\n| `autoBackupPolicies` | `[DEATH, DIMENSION_CHANGE]` | List of triggers that automatically create snapshots. |<\/p>\n<p>&#8212;<\/p>\n<p>## Admin Commands<\/p>\n<p>All commands require operator permissions.<\/p>\n<p>| Command | Description |<br \/>\n|&#8212;|&#8212;|<br \/>\n| `\/nats sync [player]` | Manually push a player&#8217;s data to the cluster. |<br \/>\n| `\/nats sessions list [page]` | View DIRTY session locks in the cluster (paginated). |<br \/>\n| `\/nats sessions clean <player\/uuid>` | Clear a stuck session lock for a specific player by name or UUID. |<br \/>\n| `\/nats backup push <player>` | Create a manual snapshot of a player&#8217;s data. |<br \/>\n| `\/nats backup list <player>` | View snapshots. Hover over entries for tags (death, dim_change, etc). |<br \/>\n| `\/nats backup restore <player> <rev>` | Stage a restoration. **Requires `\/nats backup confirm` to execute.** |<br \/>\n| `\/nats backup confirm` | Execute a staged restoration. The player will be kicked to apply data safely. |<\/p>\n<p>&#8212;<\/p>\n<p>## Data Handling &#038; Resilience<\/p>\n<p>The bridge is built for production environments where data integrity and network stability are critical.<\/p>\n<p>&#8211; **Cluster-Wide Locking:** Each player session is assigned a unique lock. A server can only write data if it holds that lock, preventing corruption from racing servers.<br \/>\n&#8211; **Fail-to-Safety (Vaulting):** If NATS is unreachable, player data is saved to a local disk vault (`nats-player-data-bridge\/pending_sync\/`) and automatically synced back when the connection is restored.<br \/>\n&#8211; **Self-Healing:** Servers perform an atomic recovery on startup to reconcile orphaned locks and clear any local vault data.<br \/>\n&#8211; **Auto-Backups:** Configurable triggers (Death, Dimension Change) create safety snapshots automatically.<br \/>\n&#8211; **Background Processing:** All network operations run on dedicated virtual threads to ensure zero impact on server TPS.<br \/>\n&#8211; **Binary Format:** Data is packed into a compact CBOR binary format with Zstd compression for minimal network overhead.<br \/>\n&#8211; **Stale Data Protection:** Intelligent timestamping prevents old data from overwriting newer progress during cluster recovery.<br \/>\n&#8211; **Readiness Gating:** Servers block player joins until background synchronization and healing are 100% complete.<br \/>\n&#8211; **Watchdog:** The networking layer performs automatic reconnection retries.<\/p>\n<p>&#8212;<\/p>\n<p>## License<\/p>\n<p>MIT<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Sync player data across Minecraft servers using NATS.<\/p>\n","protected":false},"featured_media":108825,"template":"","meta":{"_minecraft_slug":"nats-player-data-bridge","_minecraft_project_id":"I0VEk9nD","_minecraft_author":"xSaVageAU","_minecraft_license":"MIT","_minecraft_downloads":11,"_minecraft_follows":1,"_minecraft_client_side":"unsupported","_minecraft_server_side":"required","_minecraft_storage_type":"zip","_minecraft_archive_name":"nats-player-data-bridge.zip","_minecraft_size_bytes":42792521,"_minecraft_version_count":4,"_minecraft_updated_at":"2026-05-16T12:29:53.168611Z","_minecraft_date_created":"2026-05-12T05:18:25.377916Z","_minecraft_date_modified":"2026-05-09T17:41:06.800261Z","_minecraft_project_url":"https:\/\/modrinth.com\/mod\/nats-player-data-bridge","_minecraft_icon_attachment_id":108825,"_minecraft_imported_at":"2026-06-06T07:11:29+00:00","_minecraft_import_hash":"685e82c8b16f39f6ffca8fa5735fa8d0","_minecraft_versions":"","_minecraft_links":"","_minecraft_gallery":"","_minecraft_api_metadata":""},"mod_category":[97,126,91,92],"mod_loader":[99],"minecraft_version":[83,167,163],"class_list":["post-108824","mod","type-mod","status-publish","has-post-thumbnail","hentry","mod_category-fabric","mod_category-management","mod_category-storage","mod_category-utility","mod_loader-fabric","minecraft_version-26-1","minecraft_version-26-1-1","minecraft_version-26-1-2"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v27.6 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>NATS Player Data Bridge - Minecraft<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/vpesports.com\/minecraft\/mods\/nats-player-data-bridge\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"NATS Player Data Bridge - Minecraft\" \/>\n<meta property=\"og:description\" content=\"Sync player data across Minecraft servers using NATS.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/vpesports.com\/minecraft\/mods\/nats-player-data-bridge\/\" \/>\n<meta property=\"og:site_name\" content=\"Minecraft\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data1\" content=\"4 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/vpesports.com\\\/minecraft\\\/mods\\\/nats-player-data-bridge\\\/\",\"url\":\"https:\\\/\\\/vpesports.com\\\/minecraft\\\/mods\\\/nats-player-data-bridge\\\/\",\"name\":\"NATS Player Data Bridge - Minecraft\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/vpesports.com\\\/minecraft\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/vpesports.com\\\/minecraft\\\/mods\\\/nats-player-data-bridge\\\/#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/vpesports.com\\\/minecraft\\\/mods\\\/nats-player-data-bridge\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/vpesports.com\\\/minecraft\\\/wp-content\\\/uploads\\\/2026\\\/06\\\/nats-player-data-bridge-icon-212cb0d112f7cbe6868068904514f79ca96926f9_96.webp\",\"datePublished\":\"2026-06-06T07:11:28+00:00\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/vpesports.com\\\/minecraft\\\/mods\\\/nats-player-data-bridge\\\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/vpesports.com\\\/minecraft\\\/mods\\\/nats-player-data-bridge\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/vpesports.com\\\/minecraft\\\/mods\\\/nats-player-data-bridge\\\/#primaryimage\",\"url\":\"https:\\\/\\\/vpesports.com\\\/minecraft\\\/wp-content\\\/uploads\\\/2026\\\/06\\\/nats-player-data-bridge-icon-212cb0d112f7cbe6868068904514f79ca96926f9_96.webp\",\"contentUrl\":\"https:\\\/\\\/vpesports.com\\\/minecraft\\\/wp-content\\\/uploads\\\/2026\\\/06\\\/nats-player-data-bridge-icon-212cb0d112f7cbe6868068904514f79ca96926f9_96.webp\",\"width\":96,\"height\":96},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/vpesports.com\\\/minecraft\\\/mods\\\/nats-player-data-bridge\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/vpesports.com\\\/minecraft\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Mods\",\"item\":\"https:\\\/\\\/vpesports.com\\\/minecraft\\\/mods\\\/\"},{\"@type\":\"ListItem\",\"position\":3,\"name\":\"NATS Player Data Bridge\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/vpesports.com\\\/minecraft\\\/#website\",\"url\":\"https:\\\/\\\/vpesports.com\\\/minecraft\\\/\",\"name\":\"Minecraft\",\"description\":\"\",\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/vpesports.com\\\/minecraft\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"NATS Player Data Bridge - Minecraft","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/vpesports.com\/minecraft\/mods\/nats-player-data-bridge\/","og_locale":"en_US","og_type":"article","og_title":"NATS Player Data Bridge - Minecraft","og_description":"Sync player data across Minecraft servers using NATS.","og_url":"https:\/\/vpesports.com\/minecraft\/mods\/nats-player-data-bridge\/","og_site_name":"Minecraft","twitter_card":"summary_large_image","twitter_misc":{"Est. reading time":"4 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"WebPage","@id":"https:\/\/vpesports.com\/minecraft\/mods\/nats-player-data-bridge\/","url":"https:\/\/vpesports.com\/minecraft\/mods\/nats-player-data-bridge\/","name":"NATS Player Data Bridge - Minecraft","isPartOf":{"@id":"https:\/\/vpesports.com\/minecraft\/#website"},"primaryImageOfPage":{"@id":"https:\/\/vpesports.com\/minecraft\/mods\/nats-player-data-bridge\/#primaryimage"},"image":{"@id":"https:\/\/vpesports.com\/minecraft\/mods\/nats-player-data-bridge\/#primaryimage"},"thumbnailUrl":"https:\/\/vpesports.com\/minecraft\/wp-content\/uploads\/2026\/06\/nats-player-data-bridge-icon-212cb0d112f7cbe6868068904514f79ca96926f9_96.webp","datePublished":"2026-06-06T07:11:28+00:00","breadcrumb":{"@id":"https:\/\/vpesports.com\/minecraft\/mods\/nats-player-data-bridge\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/vpesports.com\/minecraft\/mods\/nats-player-data-bridge\/"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/vpesports.com\/minecraft\/mods\/nats-player-data-bridge\/#primaryimage","url":"https:\/\/vpesports.com\/minecraft\/wp-content\/uploads\/2026\/06\/nats-player-data-bridge-icon-212cb0d112f7cbe6868068904514f79ca96926f9_96.webp","contentUrl":"https:\/\/vpesports.com\/minecraft\/wp-content\/uploads\/2026\/06\/nats-player-data-bridge-icon-212cb0d112f7cbe6868068904514f79ca96926f9_96.webp","width":96,"height":96},{"@type":"BreadcrumbList","@id":"https:\/\/vpesports.com\/minecraft\/mods\/nats-player-data-bridge\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/vpesports.com\/minecraft\/"},{"@type":"ListItem","position":2,"name":"Mods","item":"https:\/\/vpesports.com\/minecraft\/mods\/"},{"@type":"ListItem","position":3,"name":"NATS Player Data Bridge"}]},{"@type":"WebSite","@id":"https:\/\/vpesports.com\/minecraft\/#website","url":"https:\/\/vpesports.com\/minecraft\/","name":"Minecraft","description":"","potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/vpesports.com\/minecraft\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"}]}},"_links":{"self":[{"href":"https:\/\/vpesports.com\/minecraft\/wp-json\/wp\/v2\/mod\/108824","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/vpesports.com\/minecraft\/wp-json\/wp\/v2\/mod"}],"about":[{"href":"https:\/\/vpesports.com\/minecraft\/wp-json\/wp\/v2\/types\/mod"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/vpesports.com\/minecraft\/wp-json\/wp\/v2\/media\/108825"}],"wp:attachment":[{"href":"https:\/\/vpesports.com\/minecraft\/wp-json\/wp\/v2\/media?parent=108824"}],"wp:term":[{"taxonomy":"mod_category","embeddable":true,"href":"https:\/\/vpesports.com\/minecraft\/wp-json\/wp\/v2\/mod_category?post=108824"},{"taxonomy":"mod_loader","embeddable":true,"href":"https:\/\/vpesports.com\/minecraft\/wp-json\/wp\/v2\/mod_loader?post=108824"},{"taxonomy":"minecraft_version","embeddable":true,"href":"https:\/\/vpesports.com\/minecraft\/wp-json\/wp\/v2\/minecraft_version?post=108824"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}