Skip to content

Player Identity

Worldweave provides a unified player identity layer: one Root account that works across every connected game. Players authenticate once and carry their identity — friends, achievements, ranked rating, social presence — anywhere Worldweave is supported.

Root accounts

A Root account is the canonical identity on the Worldweave platform. It has:

  • A stable canonical player ID (UUID) — never changes, safe to store as a foreign key in your game’s data
  • A display name chosen by the player
  • An avatar (optional, uploaded via the platform UI)
  • Linked platform accounts (Steam, Epic, consoles — see below)
  • Cross-game achievement and social data

Players create Root accounts at softfire.dev/account or from within any connected game’s account flow. Account creation requires only an email address and password.

Device identity

Players who launch your game without a Root account are assigned a device identity — a locally generated UUID stored in the OS credential store. Device identity enables:

  • Local save persistence across sessions
  • Local leaderboard entries
  • Limited offline play without account creation

Device identities are not tracked server-side. They are strictly local and have no MAU impact.

Linking platform accounts

Players can link their Steam, Epic Games Store, or console platform account to a Root account. Linking enables:

  • Single sign-on via the platform’s own auth flow (Steam overlay login, Epic account services)
  • Purchasing entitlements through the platform store and having them reflected in Worldweave
  • Using the platform’s friends list to find other players in Worldweave’s social layer
// Initiate a Steam account link from game code
var identity = Services.Get<IPlayerIdentityService>();
await identity.LinkPlatformAccountAsync(PlatformType.Steam);

This triggers the platform’s own OAuth flow. On success, the platform account is associated with the player’s Root account on the Root server.

A single Root account can have multiple platform accounts linked. If a player already has a Root account linked to Steam, launching your game via Steam will log them in automatically without prompting.

Offline-to-online migration

When a player who has been playing with a device identity creates a Root account, the engine initiates an offline-to-online migration:

  1. The device identity’s local save data is uploaded to the Root and associated with the new account
  2. Local achievement progress is synced
  3. The local device identity is linked to the Root account so future sessions on the same device authenticate automatically

This migration is handled automatically by WorldweaveAuthService. You do not need to write migration code. The player sees a single prompt: “Sync your local progress to your new account?” with a Yes / No choice.

// You can detect that a migration opportunity exists and show your own UI
var auth = Services.Get<WorldweaveAuthService>();
if (auth.HasLocalProgressPendingMigration)
{
// Show migration prompt in your UI before calling:
await auth.MigrateLocalProgressAsync();
}

GDPR and data portability

Worldweave is GDPR-compliant. Players can:

  • Export their data — all Root account data (profile, achievements, world history, save sync records) is available as a JSON archive from softfire.dev/account/export
  • Request deletion — a deletion request wipes all Root account data within 30 days. Local device data is not affected (the Root cannot reach it)
  • Withdraw consent — marketing emails and platform-level analytics can be disabled independently

Developers are responsible for their own game-side data. Worldweave handles only the data it stores — it does not have visibility into your game server databases.

IPlayerIdentityService API

Access player identity from game code via IPlayerIdentityService:

var identity = Services.Get<IPlayerIdentityService>();
// Canonical player ID (stable UUID, safe to store)
Guid playerId = identity.CanonicalPlayerId;
// Display name
string name = identity.DisplayName;
// Is the player authenticated with a Root account (vs device identity)?
bool isAuthenticated = identity.IsRootAuthenticated;
// Current authentication state
AuthState state = identity.AuthState;
// AuthState: Anonymous | DeviceIdentity | Authenticated | Expired

The canonical player ID is the correct key to use when storing any server-side per-player data in your own game backend. It is stable across platform account re-links, device changes, and password resets.