Skip to main content

From the legacy engines to ck-exec

ck-exec replaced four legacy engines of the game API, which no longer serves them: game models (containers, typed properties and functions in an expression language), automations (schedules, triggers and timers over the same functions), compute modules (studio WASM run inside the game API) and player code (grid-scoped player modules and their browser client modules, player models and automations). Their pages are gone, and an old link to one of them lands on its section here. This page maps what you used to what you use now, and links the page that explains it. For a worked example, see port a compute module.

Running your logic​

Legacyck-execPage
Game-model functions (mutations, returnExpression)Hub handlers in Rust with ckx-sdk; a hub runs one handler at a timeOverview
Container types with typed properties, visibility, edgesThe hub's own types, or ckx_sdk::model for typed containers, edges and per-property visibilityBuilds
Authority rules on the caller (owner_of_self, is_host, is_current_turn, …)Checks in your handler against the caller (call.player(), call.developer())Overview
Authority rules on platform data (tier_feature, group_permission, grid_permission)players.features, players.check_permission, grids.check_permissionWorld and platform data
Compute modules (compute*)Hubs (stateful) and spokes (stateless, scaled out)Overview
Compute templates, engines and Game Kit blueprintsStarter packs (execStarters): world-tick, matchmaker, session, npc-mobsBuilds
Sessions (gameModelCreateSession, turns, host transfer)A hub per session (the session starter), its state on a topicBuilds
emit_event, model_invoke, automation actions, cascadesCalls between instances (ctx.call, ctx.send) and topics (ctx.publish, ctx.subscribe)Timers, subscriptions and presence
Expression lint and quarantine, circuit breakersThe Rust compiler and the manifest checks; a crash-looping instance is held back and placed againOperations

Calling it from clients​

Legacyck-execPage
gameModelInvoke, computeInvoke, playerComputeInvokeexecConnect, then calls over the host's WebSocket gatewayConnect from a game
CrowdyJS gameModel, compute, playerCompute; their CrowdyCPP twinsCrowdyJS client.exec, CrowdyCPP client.exec()Connect from a game
State reads (gameModelContainerState, gameModelTraverse, session reads, events)Endpoints that return stateConnect from a game
gameModelContainerChanged, gameModelSessionChangedTopics a client subscribes toConnect from a game
gameModelActivePlayerCountThe root hub hears presence and publishes the count on a topicTimers, subscriptions and presence
The invoke limit (120 calls per 10 s per player and app)The same numbers at the gateway, per host, refused Busy ("rate limited")Operations

State​

Legacyck-execPage
Containers and properties, committed on every invokeHub memory, snapshotted every 5 to 60 seconds and when it stopsOverview
Data that needed every write keptctx.persist_now()Timers, subscriptions and presence
A module's state blob (state_get / state_set)Hub memory, snapshots up to 8 MiBOverview
user_state, avatar_stateplayers.state, players.set_state, players.avatar_stateWorld and platform data
grid_stateA hub keyed by the gridWorld and platform data
gameModelSeedThe type's spawn seed in the manifestOverview
Redeploys that change the shape of stateload(snapshot, from_version) migratesOverview

Timers and triggers​

Legacyck-execPage
Compute ticks (tickHz)ctx.timer_everyTimers
Automation schedules: intervalctx.timer_everyTimers
Automation schedules: cronctx.timer_cron with ckx_sdk::cron, the same syntaxCron schedules
One-shot timers (gameModelScheduleInvoke, a function's timers, dedupeKey)ctx.timer_after; the timer's name is its dedupe keyTimers
player_joined, player_left, player_count_changedon_presence on the root hubPresence
A player joining or leaving what they playon_sessionSessions
function_invoked, property_changed, container_createdThe hub knows when it changes; others subscribe to its topicsSubscriptions between hubs
grid_actor_changed, grid_voxel_changedA grid's world events, delivered to its mods (on_world)Mods
Manual runs (gameModelRunAutomation) and admin callsexecConnectAsDeveloper, then call the endpoint as a developerOperations

World and platform data​

Legacy host callck-execPage
chunk_get, voxels_list, voxel_setworld.chunk, world.voxels, world.set_voxelsWorld and platform data
actors_list, actors_list_radiusworld.actors, world.actors_radiusWorld and platform data
grid_permission_check, grid_at, grid_contains, …grids.get, grids.check_permissionWorld and platform data
Permission effectspermissions.grant, permissions.revokeWorld and platform data
Wallets and the ledgerNot offered on ck-exec for now

Realtime​

Legacyck-execPage
Function notifications, emit_spatial, emit_channelctx.emit_spatial, ctx.emit_channelRealtime events
Server-driven actors (NPC and mob poses)ctx.emit_actor, on the same wireRealtime events
client_event from a moduleNot offered: send what a client needs on a topic or as an eventRealtime events

Build and deploy​

Legacyck-execPage
computeDeployVersion (compile on the server)execBuild, then execDeploy with the buildBuilds
Uploading built modulesexecDeploy with the WASMBuilds
Module versions and rollbackexecVersions, execActivateVersionOperations
computeSetModuleEnabled, automation enabled, the policy kill switchexecSetEnabled for the app or one node typeOperations
The crowdy-compute CLIexecBuild and execDeploy, or from a script CrowdyJS client.exec.build and deploy. ck-exec's own CLI is not publishedDeploying from a script

Operations​

Legacyck-execPage
computeModuleLogs, playerComputeLogsexecLogsLogs
Runs, stats and diagnosticsexecInstances, execEndpointStats, execLogsOperations
gameModelFlowexecLogs(flow:): every line one call chain loggedFollowing one call
Policy and ceilings (fuel, memory, run time, tick rate)Manifest limits, within the platform's boundsOverview
Metering and appComputeBudgetPer-minute usage in compute units; an enforced budget pauses the appUsage and budgets

Player code​

Legacyck-execPage
Player server modules (playerComputeDeploy, run as the grid owner)Mods: execModBuild, execModDeploy, in the owner's own sandbox, confined to the gridMods
Player-code templatesThe mod starter (execModStarter, the grid-mod crate)Mods
Player client modules (browser WASM, playerComputeDeploy with the CLIENT target)A mod's CLIENT half: one crowdy-client-sdk crate, built with execModClientBuild and attached with execModClientDeploy. Legacy client modules are not migrated: build each one again as a CLIENT halfCLIENT halves
Grid-attached client mods (gridClientMods, consentGridClientMod, trustGridAuthor, playerCodeClientArtifact)execGridClientMods, execConsentClientMod, execTrustAuthor, execModClientArtifact; CrowdyJS ExecClientHalves runs a grid'sCLIENT halves
A server module that requires a client module (playerComputeSetRequires)Nothing to pair: a CLIENT half belongs to its modMods
Player models and player automationsA mod's own state and timers, and its grid's world eventsMods
publishPlayerCode, acquirePlayerCode, installPlayerCode, bundled listingsexecModPublish, execModListings, execModInstall (no payments yet); a listing carries the mod's CLIENT halfMods
Crowdy Studio deploying a SERVER targetThe SERVER target as a mod (ck-exec, Crowdy Studio's only engine since CrowdyJS 18)Mods
Crowdy Studio deploying a CLIENT targetThe CLIENT target as that mod's CLIENT half (CrowdyJS 17.14.0)CLIENT halves

Tools​

Legacyck-exec
CK Studio's Compute and Automations tabsCK Studio's ck-exec tab on the app page: status, node types, versions and rollback, instances, calls per endpoint, logs (with a flow filter)
The Unreal SDK's game models: containers and attributes, Effects, sessions, pre-seeding and their authoring in the editorThe Unreal SDK's Server Objects, which you use from Blueprint or C++: see What a Server Object is and Move from Game Models. The SDK's Game Model API is deprecated, and a later release removes it. From C++ you can also call your app's ck-exec code directly with CrowdyCPP's client.exec() (see connect from a game); engine integration describes building CrowdyCPP into an Unreal plugin