Migrate from Nakama: Gap Matrix & Cutover Plan

Plan a Nakama migration without pretending APIs map 1:1. Inventory runtime code, realtime, storage and social features before staging a cutover.

Start with the non-mapping features. Nakama includes an embedded Go/TypeScript/Lua runtime, realtime multiplayer, chat and groups. Crux does not. If those are central to your game, migration means moving functionality into other services—not renaming SDK calls.

Nakama and Crux overlap on several backend primitives, but they make different architectural bets. Nakama can be self-hosted and extended with code running inside the backend. Crux is a managed fixed-scope API: custom game logic runs in your authoritative game server or another service. That difference determines migration size more than the number of API endpoints.

Migration gap matrix

Nakama capabilityCrux pathMigration class
Authentication / accountsGuest and email player auth plus persistent player recordsSemantic migration. Provider identities and existing credentials need an account-link/re-auth strategy; do not assume password material can be copied.
Storage collections / objectsPlayer documents and project documentsSchema transform. Collection/key/permission semantics do not map 1:1 to keyed JSON documents.
Leaderboards / tournamentsLeaderboards with reset schedulesPartial mapping. Recreate board/reset semantics explicitly; do not assume Nakama tournament behavior is identical.
Wallet / inventoryCurrencies, virtual items, balances and inventory adjustmentsSchema transform. Rebuild catalogue keys and verify every balance/item invariant after import.
Friends / blocksFriends, requests and blocksPartial mapping. Validate relationship state and IDs during import.
Groups / clans / chatNo equivalent player group/chat serviceExternal or stay on Nakama. Move this feature to another service before cutover.
MatchmakerCrux matchmaking queuesRewrite rules. Treat queue/filter behavior as a new contract, not a string translation.
Realtime / authoritative matchesOut of scope as a netcode engineExternal. Keep or choose a realtime networking/server solution before migrating this dependency.
Server runtime RPCs / hooksYour game server/service + Crux APIs/webhooksCode move. Crux webhooks cover event-driven callbacks; synchronous client RPCs need an endpoint you operate.
Player notificationsNo general player-notification primitiveExternal. Keep your push/in-game notification service.
Dedicated-server registryServer registration, heartbeat and discovery APIsNative but different schema. Rebuild registration/health metadata around the Crux contract.

1. Inventory what you actually use

List runtime modules, hooks/RPCs, authentication providers, storage collections, leaderboards/tournaments, wallet/inventory data, friends, groups, chat, matchmaker rules, realtime matches and operational tooling. A feature that exists in Nakama but your game never calls is not migration work.

2. Classify each dependency

Mark every row as native, semantic rewrite, or external. Do this before writing import code. If a critical feature lands in “external” and you have no replacement, stop the migration plan there.

3. Design account continuity before data import

Player data is useless if returning users cannot reach the same account. Preserve the Nakama user ID as migration metadata, build an explicit Nakama-ID → Crux-player-ID mapping, and decide how each authentication provider will re-link or re-authenticate. Do not promise transparent password migration unless the source credential format and target auth flow actually support it.

4. Export through a reproducible path

Use the Nakama APIs and/or your database access to produce a versioned export with user IDs, storage records, leaderboard state, economy state and relationship data you intend to migrate. Keep the export immutable so a failed import can be reproduced and audited.

5. Transform schemas explicitly

Nakama storage collections and Crux documents have different shapes and permission models. Write deterministic transforms, not ad-hoc “copy JSON” code. The same rule applies to economy catalogue keys, leaderboard reset behavior and social relationship states.

6. Rehome runtime code

Nakama’s server runtime is the biggest architectural gap. Move authoritative game logic to the dedicated game server or a backend service you operate. Event reactions can subscribe to Crux signed webhooks such as stat.updated and achievement.unlocked; synchronous RPC-style calls still need your own request/response endpoint.

7. Prove one low-risk path end-to-end

Before touching authentication or currency, migrate a non-critical document or leaderboard into a staging Crux project. Run it from the real engine/server code, verify reads/writes and observe the external-connection signal in the dashboard. This tells you whether the new operational model actually feels better before the risky work starts.

8. Shadow and reconcile where dual writes are safe

For mutable data that can safely be written to both systems, shadow writes during a staging or limited-production period and compare invariants: record counts, versions, balances, ranking entries and relationship edges. Do not invent a universal acceptable divergence percentage; define invariants per data class.

9. Cut over by capability, not by DNS alone

Use feature flags or versioned client/server releases so individual backend capabilities can move independently. Keep a rollback path until the new source of truth has passed your own correctness checks and enough production traffic has exercised it.

10. Archive before decommissioning

Only remove Nakama infrastructure after the rollback window and retention requirements are satisfied. Preserve database/export backups, ID mappings, import logs and the final migration code according to your retention policy. A successful cutover is not a reason to destroy the audit trail.

When not to migrate

If a large share of your product depends on Nakama runtime modules, chat/groups, its realtime engine, self-hosting, or direct source-level control, the operational cost may be buying exactly the flexibility you need. In that case, improving your Nakama deployment—or moving the same architecture to Heroic Cloud—can be lower risk than decomposing those capabilities across several services.

Bottom line

A Nakama-to-Crux migration is attractive when the problem is operating a backend platform you barely customize. It is unattractive when Nakama itself is where substantial game logic and realtime/social behavior lives. Use the gap matrix first; only write the importer after the architecture still makes sense.

Sources

Technical, pricing, and product claims were checked against these primary sources on the verification date above.