# Roblox Server Data

> Use for Roblox server or cross-server data: OrderedDataStore leaderboards, MessagingService, world state, seasons, or guilds.

- Skill: `tabooharmony/roblox-server-data` (Agent Skill, multi-file: 2 files)
- Install (CLI): `npx skillmds@latest add tabooharmony/roblox-server-data`
- Raw SKILL.md: https://api.skillmd.com/api/skills/tabooharmony/roblox-server-data/raw
- Safety review: pending
- Works with: Claude Code, Claude.ai, OpenAI Codex
- Category: Coding & Dev Tools
- Author: tabooharmony (https://skillmd.com/u/tabooharmony)
- Updated: 2026-09-10
- Page: https://skillmd.com/skills/tabooharmony/roblox-server-data

---


# Roblox Server & Shared Data

## When to Load

Load for server-level or cross-server data: leaderboards (OrderedDataStore), cross-server messaging (MessagingService), temporary queues and sorted maps (MemoryStoreService), shared world state, persistent non-player data, season/guild data. For player data (DataStore, ProfileStore, session locking), use `roblox-data`; for Open Cloud and external APIs, use `roblox-cloud`.

## Quick Reference

### OrderedDataStore (Leaderboards)
- Sortable DataStore. Keys are strings; use a stable key such as `tostring(UserId)`.
- Values are integers used for sorting; choose the sign and ordering intentionally.
- `GetSortedAsync(ascending, pageSize, minValue, maxValue)` → sorted pages
- For leaderboards only, not player data

```luau
local D = game:GetService("DataStoreService")
local store = D:GetOrderedDataStore("LeaderboardCoins")
store:SetAsync(tostring(player.UserId), playerCoins)
local top10 = store:GetSortedAsync(false, 10):GetCurrentPage()
```

### MessagingService (Cross-Server)
- Real-time server communication: `SubscribeAsync` / `PublishAsync`
- No delivery or ordering guarantee; design for idempotency.

### GlobalDataStore (Shared State)
- Persistent non-player state such as guilds, seasons, and counters.
- Use `UpdateAsync`; never use it for player session data.

### MemoryStoreService (Temporary Coordination)
- Queues and sorted maps for expiring matchmaking, leases, and coordination.
- Remove a read batch only after successful, idempotent processing.
- Use MessagingService or TeleportData for notification and handoff.

### Cross-Server Patterns
- Register servers with expiring heartbeats; use MessagingService for notifications.

### Pitfalls
- MessagingService is fire-and-forget: no delivery guarantee, no ordering
- GlobalDataStore has same rate limits as player DataStores; don't spam
- OrderedDataStore keys are strings; values are integers used for sorting
- Never store Instances; serialize to primitives first
- UpdateAsync for any shared counter to prevent lost updates

**Need more detail?** Load `references/full.md` for the complete reference with code examples, API tables, and edge cases.

