Scribe v2.3.0 - Persistent, typed, auto-replicated player data built on ProfileStore

First of all thanks for the kind words :slight_smile: In regards to the studio plugin it does work on the “Server & Client” option for testing. Sadly playtesting with “Test” or “Test here” is currently broken due to the latest roblox studio update. I’m hoping to reach out to the roblox team on Monday about it. There’s a new studio plugin update as well to make you aware of this.

1 Like

Scribe v2.2.0 - The Session Store

A server-owned store, budget-paced legacy imports, per-player prices on the client, and the Scribe.Big type-solver wall fixed. Read the behaviour changes first.

Behaviour changes

  • Assigning to an accessor (data.Coins = 5) is now a type error. It never worked: it overwrote the accessor. data.Coins.Set(5) and every method are unchanged.
  • A server store write inside Data.Transaction is refused and aborts it, since a rollback cannot reach the store.

Added

  • ServerStore: a second tree owned by the server, not a player. Data.ServerStore.Wave on both realms, replicated as ordinary diffs, never saved.
  • Budget-paced legacy imports: ImportLegacyData and OnPlayerInit get a context with AwaitBudget(requestType, count?), which yields until the DataStore requests are spare. MigrationConcurrency bounds concurrent imports.
  • Per-player prices on the client: Data.GetPrice("VIP") is what this player pays after Roblox Plus and regional pricing, with GetProductInfo, ObserveProductInfo and PrefetchProductInfo. A failed read stays nil.
  • UI adapters for Vide, React and Fusion in adapters/.
  • Kick messages name the cause: throttled load, failed migration, schema rejection, import failure, version-ahead and session steal each have their own wording and option.
  • Data.Stop() on the client, plus an optional Release for custom transports.
  • Budget metrics: waiters, queued, granted, timed out and wait time.

Fixed

  • Scribe.Big inside a container element no longer pushes the template past the type solver’s budget.
  • NaN, infinity and a gap in the Args list are refused as command arguments; the same gap in Scribe.Derived inputs is refused too.
  • Owns, OwnsAsync and ObserveOwned raise a named error on a non-string key instead of quietly answering false in production.

Documentation

  • New guide: The Server Store.

Scribe Plugin Note: I have updated it to support Play Solo studio sessions once again!

1 Like

Scribe v2.3.0 - The Policy Update

Paid random items, a product-state query for your shop UI, and bigger templates before Luau’s type solver gives up.

Behaviour changes

  • PromptPurchase now refuses with the fixed Scribe.ProductState strings ("not-loaded", "owned", …) instead of prose. PurchaseReason and GiftReason gain PaidRandomRestricted and PolicyPending.

Added

  • PaidRandom = true on a product. Scribe checks the player’s policy once and refuses the purchase, soft-currency purchase or gift for anyone restricted, or while the policy is still unknown. Products only.
  • Data.GetProductState on server and client tells you whether a product is purchasable, owned, restricted, pending or not loaded, the same answer the prompt gives. ObserveProductState on the client updates your button when that changes.

Changed

  • Much larger templates typecheck before “Code is too complex”. If yours still hits it, the templates guide has a one-line escape hatch.
  • Container writes skip building an error string they rarely needed.