Console Variables
This page lists 51 crowdy.* console entries. They come in three kinds: trace gates that turn on
informational logging for one area, behavior switches that change what the SDK does, and diagnostic
commands that run once and hold no stored value. A row badged Editor only exists only in the editor
process. Five of the diagnostic commands (crowdy.rpc.dumpfn, crowdy.state.heartbeat.advisories,
crowdy.registry.dump, crowdy.mass.derive, crowdy.mass.state.verdict) and every other crowdy.mass.* entry are compiled out of
a Shipping build and are absent there rather than silent; every other row ships in Development and Shipping.
When you land here
You want to know what a crowdy.* name does before you type it, or you are looking for the switch that
turns on a specific area's logging. For the workflow around them (loopback testing, two-PIE setups), see
Testing locally; this page is the lookup table.
Trace gates
All 19 are off by default. Seventeen turn on that area's informational lines when set to 1; the two
.scopes entries add Unreal Insights CPU scopes instead and log nothing. Warnings and errors print
regardless of the setting.
| Name | Kind | Role | Trace gate | Help | Module |
|---|---|---|---|---|---|
crowdy.entity.trace | variable | trace | yes | When non-zero, logs CrowdyReplication entity activity: registry add/remove, event routing and dispatch, entity components, and actor tracking/management. Off by default. | CrowdyReplication |
crowdy.exec.trace | variable | trace | yes | When non-zero, logs Server Object activity: status changes, applied reads and pushes with their epoch and seq, re-reads, subscribes, calls and the connection. Never values or tokens. Off by default. | CrowdyExec |
crowdy.hud.trace | variable | trace | yes | When non-zero, logs CrowdyServices HUD activity: HUD base and widgets. Off by default. | CrowdyServices |
crowdy.mass.anim.trace | variable | trace | yes | Log every animation sequence index the Crowdy animation processor writes, per entity. | CrowdyMass |
crowdy.mass.neartier.trace | variable | trace | yes | Say when a crowd entity gains a near tier actor, whether that actor was built or taken from the pool, and when it goes back. 1 on, 0 off. | CrowdyMass |
crowdy.mass.nodes.trace Editor only | variable | trace | yes | Log where the Call Crowdy Event on Entity dropdown's entries came from (0 = off, 1 = on). | CrowdyMassNodes |
crowdy.net.trace | variable | trace | yes | When non-zero, logs CrowdyNet UDP transport activity: socket open/close, message sends and receives, worker-thread pool, and buffer pool churn. Off by default. | CrowdyNet |
crowdy.pool.trace | variable | trace | yes | When non-zero, logs CrowdyReplication actor-pool activity: spawn, release, reuse, and rendering-backend churn. Off by default. | CrowdyReplication |
crowdy.query.trace | variable | trace | yes | When non-zero, logs CrowdyNet GraphQL activity: query dispatch and responses. Off by default. | CrowdyNet |
crowdy.rpc.reliable.trace | variable | trace | yes | When non-zero, logs just the reliable (channel-transport) RPC path: a Multicast CrowdyEvent's channel send and the matching receive on every member. Narrower than crowdy.rpc.trace, which covers all RPC sends and receives; either one surfaces the reliable lines. | CrowdyReplication |
crowdy.rpc.trace | variable | trace | yes | When non-zero, logs every CrowdyEvent RPC send and receive: function, entity, addressing, owned/delegated classification, and parameter byte size. | CrowdyReplication |
crowdy.sdk.trace | variable | trace | yes | When non-zero, logs top-level CrowdySDK activity: subsystem lifecycle and configuration / gameplay-tag path registration. Off by default. | CrowdySDK |
crowdy.serialize.scopes | variable | trace | yes | When non-zero, emits the fine-grained CPU trace scopes inside payload decode. Each one costs two timestamps per received message and is nested inside a scope that is itself measured, so it is off by default and a reading must say whether the run carried it. | CrowdyNet |
crowdy.serialize.trace | variable | trace | yes | When non-zero, logs CrowdyNet payload serialization: message encode/decode and payload/class registry resolves. High frequency, so off by default. | CrowdyNet |
crowdy.services.trace | variable | trace | yes | When non-zero, logs CrowdyServices activity: authentication, teams, avatars, persistence, host subsystem, utilities, and Blueprint reception. Off by default. | CrowdyServices |
crowdy.state.scopes | variable | trace | yes | When non-zero, emits a CPU trace scope around each CrowdyState delta decode. Nested inside the enclosing delivery scope, so it shifts that scope's own figure: turn it on only for a run that needs the split. Off by default. | CrowdyReplication |
crowdy.state.trace | variable | trace | yes | When non-zero, logs CrowdyReplication CrowdyState replicator activity: owned-entity diffing, delta emission, and datagram sizes. Off by default. | CrowdyReplication |
crowdy.studio.trace Editor only | variable | trace | yes | When non-zero, logs each CrowdyStudio console GraphQL op: its plane, operation name, and outcome (HTTP code, error count). The bearer token is never logged. Off by default. | CrowdyStudio |
crowdy.voice.trace | variable | trace | yes | When non-zero, logs CrowdyVoice activity: microphone, playback and audio device changes. Off by default. | CrowdyVoice |
crowdy.serialize.trace and crowdy.serialize.scopes are high frequency.They log on every message encode and decode. Leave them off unless you are actively debugging serialization.
crowdy.net.trace logs every routed send and every received spatial message.Since 2.17.0 it also prints one line per spatial message received ("Received opcode ... for actor ... in chunk ...") and the transport's totals (datagrams received, verification failures, drops) about once a second. That is what tells "the server never sent it" apart from "the client dropped it"; it is too chatty to leave on.
crowdy.serialize.scopes and crowdy.state.scopes are nested CPU trace scopes.Each nests inside a wider enclosing scope, so turning one on shifts the timing you read for that enclosing scope too. If you are taking a performance reading, say whether the flag was on.
crowdy.studio.trace and crowdy.mass.nodes.trace are editor only. crowdy.studio.trace never logs the
bearer token, a pattern worth copying in your own logging around Studio calls.
Behavior switches
These change what the SDK does rather than what it logs. None of the 24 exist only in the editor.
| Name | Kind | Role | Trace gate | Help | Module | Where the Help cell is empty |
|---|---|---|---|---|---|---|
crowdy.kit.emotes.burst | variable | behaviour | How many inbound emotes may arrive at once before the per-second budget applies (default 16). | CrowdyReplication | ||
crowdy.kit.emotes.maxpersecond | variable | behaviour | How many inbound emotes per second are read, shared by every sender (default 64). Emotes over the budget are dropped before they are parsed. | CrowdyReplication | ||
crowdy.kit.emotes.persender.burst | variable | behaviour | How many inbound emotes one sender may send at once before its per-second budget applies (default 4). | CrowdyReplication | ||
crowdy.kit.emotes.persender.maxpersecond | variable | behaviour | How many inbound emotes per second are read from one sender (default 4). The shared budget still caps all senders together. | CrowdyReplication | ||
crowdy.mass.anim.dump | variable | behaviour | While set to 1, log a summary of the animation sets in use and of the instance batches handed to each instanced skinned mesh component, once per second. Set back to 0 to stop. | CrowdyMass | ||
crowdy.mass.anim.force | variable | behaviour | Force this animation bank sequence index on every Mass entity the Crowdy animation processor sees. A negative value disables forcing, which is the default. | CrowdyMass | ||
crowdy.mass.derive.force | variable | behaviour | Spawn every remote entity from a Mass entity config built out of its own class, pushing aside the per-class binding, the backend override and the project-wide Remote Entity Config. 1 on, 0 off. The class's animation set is pushed aside with it, so the entity animates from the set and the Bank the class itself declares, and an entity that appears in bind pose under this is showing what an unconfigured class carries. Entities already spawned keep the config they were built from; every class's animation answer is worked out again. | CrowdyMass | ||
crowdy.mass.event.proxy | variable | behaviour | Run an inbound event's own body on a per-class stand-in for entities held here as rows. 1 on, 0 off. Off, an event nothing registered a handler for lands nothing beyond the action write a declared action gets, which is what this client did before the stand-in existed. | CrowdyMass | ||
crowdy.mass.interp.adaptive | variable | behaviour | Replay each remote segment over the observed arrival interval. 1 on, 0 off (fixed duration), -1 to follow the project setting. | CrowdyMass | ||
crowdy.mass.interp.max | variable | behaviour | Longest span a remote segment may be replayed over, in seconds. Negative to follow the project setting. | CrowdyMass | ||
crowdy.mass.interp.min | variable | behaviour | Shortest span a remote segment may be replayed over, in seconds. Negative to follow the project setting. | CrowdyMass | ||
crowdy.mass.interp.overshoot | variable | behaviour | How much longer than the observed arrival interval a remote segment is replayed over. Negative to follow the project setting. | CrowdyMass | ||
crowdy.net.http2 | variable | behaviour | Asks for HTTP/2 on the SDK's own requests, falling back to HTTP/1.1 when the server does not offer it; 0 leaves the engine's HTTP version. With HTTP/2 the curl diagnostics the engine logs for a failed request can include the request headers, bearer token included, so set 0 if you ship logs from builds with logging enabled. | CrowdyCppBridge | ||
crowdy.net.receive.maxdrainms | variable | behaviour | CrowdyNet | How many milliseconds of one frame may be spent delivering inbound messages. Raise the message count first. Default 4. | ||
crowdy.net.receive.maxmessages | variable | behaviour | CrowdyNet | How many inbound replication messages one frame may deliver; whatever is left waits for the next frame. Default 3072. | ||
crowdy.net.receive.poolactorupdates | variable | behaviour | Reuse actor update message objects instead of allocating one per received message (default 1). Turn it off to measure what the pool is worth on the same build. | CrowdyNet | ||
crowdy.net.recv.signedbundles | variable | behaviour | CrowdyNet | Tell the replication server this client reads signed inbound bundles, so notifications arrive with one signature per datagram instead of one per member. A server older than v0.30.0 ignores it. Default 1, read when a connection opens. | ||
crowdy.net.retry.busy | variable | behaviour | Sends an SDK query, a password sign-in or an app-token mint or refresh again, up to 3 times with backoff, when the platform refuses it and says to retry (blame PLATFORM, retryable). 0 hands every refusal straight to the caller. | CrowdyCppBridge | ||
crowdy.net.send.bundle | variable | behaviour | CrowdyNet | Pack one network pass's outbound messages into one datagram. Needs a replication server of v0.27.0 or later; against an older one every bundled message is dropped together. Default 1, read when a connection opens. | ||
crowdy.replication.tracker.maxgatheredupdates | variable | behaviour | CrowdyReplication | How many actor updates for already-tracked actors may be gathered before the backlog is discarded; reached only when the world tick is not consuming them. Default 8192. | ||
crowdy.replication.tracker.maxqueuedupdates | variable | behaviour | CrowdyReplication | How many updates for actors not yet on screen may wait for a worker thread before further ones are dropped, counted, and reported once a second; reached only when the worker pool is not draining them. A dropped actor appears on a later update. Default 8192. | ||
crowdy.rpc.allowObjectLoad | variable | behaviour | When non-zero, a received object or class reference whose asset is not already resident is loaded from disk by path. Default 0 (find-only) so an untrusted peer cannot trigger arbitrary asset loads; an unresolved reference is delivered as null. | CrowdyReplication | ||
crowdy.rpc.loopback | variable | behaviour | When non-zero, a sent replicated CrowdyEvent is also delivered to this client's own receive path, so the whole serialize/resolve/dispatch round-trip can be tested without a second client. The call runs once locally through that path; a call made from the replayed body is sent normally but does not loop back, so there is no cascade. | CrowdyReplication | ||
crowdy.state.loopback | variable | behaviour | When non-zero, a sent CrowdyState delta for an owned entity is also decoded onto a local 'mirror' entity (a lazily-spawned second instance of the same class, RemoteProxy role, a distinct NetID) so decode/OnRep/host-authority checks can be exercised from one PIE client. Unlike crowdy.rpc.loopback this cannot replay onto the same actor (an owner's own entity silently drops a non-host-sourced delta, and decode's changed-detection would report no change against identical values); the mirror is a genuinely distinct receive target instead. | CrowdyReplication |
The notes map above stands in for these six rows because the surface exporter drops a CVar help built from adjacent TEXT() literals.
crowdy.net.http2 off if you ship, or collect logs from, a build with logging enabled.On by default, it asks for HTTP/2 on the SDK's own requests (falling back to HTTP/1.1 when the server does not offer it); the game's other HTTP traffic and the engine's http.CurlAllowHTTP2 are untouched. With HTTP/2, when a request fails at the network level (not a cancel or a timeout), the curl diagnostics the engine logs at Warning can include the request headers, bearer token included. A default Shipping build compiles logging out, so most projects never see this; if yours ships or collects logs from a build with logging enabled, set crowdy.net.http2 0.
crowdy.net.retry.busy resends a refusal the platform blames on itself before the caller ever sees Failed.On by default. An SDK query resends on any platform-blamed retryable refusal except WRONG_DATACENTER and APP_UNAVAILABLE. At most 3 retries, with the server's suggested wait when it names one or a doubling local wait otherwise. Password sign-in, the app token mint and the app token refresh are retried the same way when the platform answers that it is busy, and a retried request is dropped if the account's token changed meanwhile. Registration, link and social completion, password changes, email sends, logout and account deletion are never retried. Turn it off (0) only to compare against the un-retried behavior; leave it on for a shipping build.
crowdy.kit.emotes.* cap the emotes a client will read, per sender and across all senders.Each sender has its own small budget, and every emote also has to fit one budget shared across all senders. crowdy.kit.emotes.persender.maxpersecond (default 4) is how fast one sender's budget refills; crowdy.kit.emotes.persender.burst (default 4) is the most it holds. The per-sender budget is checked first, so one player flooding emotes runs out of their own budget and no longer uses up the shared one. An emote the shared budget drops costs its sender nothing. A client tracks at most 256 senders, and when that is full the sender that has been silent longest is forgotten.
The shared budget exists because a sender id is only what the sender claims. crowdy.kit.emotes.maxpersecond (default 64) is how fast it refills; crowdy.kit.emotes.burst (default 16) is the most it holds. An emote over either budget is dropped before it is read, with one Warning in the log. A peer that forges a player's id can use up that player's per-sender budget, which costs that player nothing but their own emotes. Raise the numbers only if a busy scene legitimately sends more emotes than that. See Send an emote.
crowdy.rpc.allowObjectLoad off in production.While it is off, an untrusted peer cannot trigger an arbitrary asset load; an unresolved object or class reference in a received RPC is delivered as null instead.
crowdy.rpc.loopback and crowdy.state.loopback are not the same switch wearing two names.
crowdy.rpc.loopback delivers a sent event back to your own receive path. crowdy.state.loopback cannot
replay onto the same actor that sent the delta: an owner's own entity drops a non-host-sourced delta, and
changed-detection on decode sees no change against identical values. Instead it spawns a distinct,
lazily-created mirror entity and replays deltas onto that, so CrowdyOnRep still fires with one PIE
client. Expect two entities, not one, when you turn it on.
crowdy.net.receive.poolactorupdates defaults to 1 (pooling on). Turning it off is for an A/B
measurement against the same build, not a fix for anything.
Diagnostic commands
Eight commands with no stored value. Only crowdy.rpc.dumpfn and crowdy.mass.derive take arguments and
print usage without them; every other command acts as soon as you run it. Five are compiled out of a Shipping
build: crowdy.rpc.dumpfn, crowdy.state.heartbeat.advisories, crowdy.registry.dump, crowdy.mass.derive and
crowdy.mass.state.verdict. crowdy.registry.dump logs every entry the cook baked into the registry, one
line each: the structs and their layout hashes, the CrowdyState properties, and the CrowdyEvent functions,
with their ids. It is the console version of the Registry page (see Inspector and Registry).
| Name | Kind | Role | Trace gate | Help | Module | Build |
|---|---|---|---|---|---|---|
crowdy.auth.consent.preview | command | command | Shows the consent prompt over the game viewport without recording anything; Accept and Decline only close it. | CrowdyServices | ||
crowdy.auth.signin.file | command | command | Signs in with the password account in a JSON file, {"email": "...", "password": "..."}, for headless smoke tests. For test accounts and development builds only: the password sits in that file, so keep it out of source control. Never type a password as a console argument, which the console logs. Args: <path to the file>. | CrowdyServices | ||
crowdy.auth.signout | command | command | Signs the player out through the SDK's normal logout. | CrowdyServices | ||
crowdy.auth.status | command | command | Prints whether this game instance is signed in, the user id, whether the app token is set and when it expires, and whether the app is paused. Never prints a token. | CrowdyServices | ||
crowdy.cpp.selftest | command | command | Link + exception-containment self test for the vendored CrowdyCPP library. | CrowdyCppBridge | Every build | |
crowdy.mass.derive | command | command | Says what a Mass entity config derived from an actor class would contain, without spawning anything. Args: <class>, a short name, an asset path or a full object path.Usage: crowdy.mass.derive <class>, a short name, an asset path or a full object path.crowdy.mass.derive: | CrowdyMass | Not in Shipping | |
crowdy.mass.state.verdict | command | command | Print one block describing whether CrowdyState is reaching crowd entities: every replicated property no fragment field claims, deltas claimed and applied, every drop reason, and which road wrote the pose. Paste the whole block when reporting a gate. | CrowdyMass | Not in Shipping | |
crowdy.net.routes | command | command | Prints the network router's subscription table: every payload key and opcode, with the struct behind it where one is registered, and every subscriber by role. | CrowdyNet | Every build | |
crowdy.registry.dump | command | command | Logs every entry of the baked registry, one line each: persistent and singleton structs, layout hashes, CrowdyState properties and CrowdyEvent functions with their ids. | CrowdyReplication | Not in Shipping | |
crowdy.rpc.dumpfn | command | command | Reports what a Crowdy event is in this process: resolved, replicated, its recipient, its FunctionID, and whether its compiled body carries the dispatch gate. Args: <ClassPathOrName> <FunctionName>. A Blueprint class name ends in _C. | CrowdyReplication | Not in Shipping | |
crowdy.state.heartbeat.advisories | command | command | Lists every CrowdyState enum property this process found outside the keyframe heartbeat, and how many resolutions each one's single warning stands for. | CrowdyReplication | Not in Shipping |
crowdy.rpc.dumpfn and crowdy.state.heartbeat.advisories print structured text you can paste directly into a bug report.The development-build sign-in commands crowdy.auth.signin.file, crowdy.auth.status and crowdy.auth.signout are described under Sign in from the console.
crowdy.cpp.selftest and crowdy.net.routes carry no build guard, so they exist in every build including
Shipping; the four diagnostics above do not, and a Shipping console answers them with an unknown command.
Gotchas
- Warnings and errors are never gated behind a trace flag. They print under the module's log category no matter what.
crowdy.net.receive.maxdrainms(4 ms) andcrowdy.net.receive.maxmessages(3072) bound one frame's receive drain. If drains keep ending on the time budget, delivery is costing more per message than the frame can afford, and raising the count is not the lever.
Related
- Log categories: the category each trace gate's lines print under.
- Project settings: the settings-class properties that sit beside these CVars.
- Testing locally: loopback and two-PIE workflows built on these switches.