Skip to documentation

Rekall Global Events · UE 5.8

From first event
to production architecture.

Build one exact event contract, then carry it through Blueprint, C++, scheduled delivery, retention, secure transport, Flow orchestration, and correlated diagnostics.

Build the first eventExplore all 29 nodes
01

Start here

The plugin in one minute

Rekall Global Events lets one gameplay system announce that something happened without needing direct references to every system that may react. Each event has a stable name and an exact data shape. Interested systems listen for that event, and the plugin validates, routes, schedules, retains, transports, or traces it according to explicit rules.

  1. 01Define

    Create Game.Inventory.ItemAdded with an Item Id and Quantity payload.

  2. 02Listen

    Let UI, quests, audio, and analytics subscribe independently.

  3. 03Publish

    Announce the event once when inventory accepts the item.

  4. 04React

    Each eligible listener receives the same validated contract.

Define → Listen → Publish → React

Why use it

One fact, several reactions

The inventory component does not need references to the quest tracker, HUD, audio system, or analytics code. Those systems can be added or removed without changing the publisher.

Exact contract

Errors stay visible

The Gameplay Tag identifies the event, the reflected struct fixes its data shape, and a structured result reports what the publication actually did.

Optional extensions

Grow one contract

Core handles local delivery. Network, Flow, and Insights extend selected contracts without changing what the original event means.

02

Start here

The complete event lifecycle

What it is

Publishing is a checked journey from a stable event identity to a specific delivery outcome. It is not a blind broadcast.

Why use it

Each stage has one responsibility, so failures stay specific: a bad definition is different from a payload mismatch, an invalid selector, a full queue, or simply having no listeners.

Simple example

Inventory publishes Game.Inventory.ItemAdded with Item Id = HealthPotion and Quantity = 2. The quest, UI, audio, and analytics listeners can react without being dependencies of inventory.

How it works

  1. 01Resolve

    The definition registry resolves the Game.Inventory.ItemAdded Gameplay Tag.

  2. 02Validate

    The publication must carry the definition's exact reflected payload struct.

  3. 03Plan

    Scope, audience, timing, and priority options resolve independently.

  4. 04Admit

    Publication delivers now or is admitted to a bounded queue for later delivery.

  5. 05Deliver

    An eligible subscription snapshot receives the payload and immutable context.

  6. 06Report

    The result says delivered, queued, no subscribers, or names a specific rejection.

Technical details

Immediate delivery snapshots eligible subscriptions before invoking them, so a callback can safely unbind without mutating the active iteration. Queued acceptance means work entered the bounded scheduler; it does not mean callbacks already ran. The context is read-only and carries resolved routing, sequence, and correlation information.

03

Start here

Install the plugin

Install once for a project or engine, enable the plugin, and add a native module dependency only when your own C++ code uses the API.

  1. Close Unreal Editor.

    For one project, copy the plugin to <Project>/Plugins/RekallGlobalEvents. For every project in one UE 5.8 installation, use <UE_5.8>/Engine/Plugins/Marketplace/RekallGlobalEvents.

  2. Enable and restart.

    Open Edit > Plugins, search for Rekall Global Events, enable it, and restart when prompted. A Blueprint-only project needs no generated Visual Studio files and no module dependency.

  3. Rebuild native projects.

    If the project has C++, regenerate project files and rebuild its Editor target. Add RekallEventsCore to the consuming module; add Network or Flow only where native code uses those optional runtimes.

PrivateDependencyModuleNames.AddRange(new[]
{
    "RekallEventsCore"
});
04

Start here

Publish your first Blueprint event

This complete local workflow requires no C++ and leaves you with a saved payload schema, validated definition, live listener, and inspectable publication result.

  1. Create and save the payload.

    In the Content Browser choose Add > Blueprint > Structure. Name the Blueprint Struct ST_InventoryItemAdded, add Item Id (Name) and Quantity (Integer), then save it before assigning it to a definition.

  2. Create the identity.

    In Gameplay Tags settings add Game.Inventory.ItemAdded. Rekall uses the Gameplay Tag as the stable runtime identity; the asset name and display name are not the identity.

  3. Create and validate the definition.

    Choose Add > Data > Data Asset, select Rekall Event Definition, and set the tag, saved payload struct, display name, World scope, Immediate delivery, and schema version 1. Run Asset Actions > Validate Assets and fix every error.

  4. Compile a catalog.

    Create another Data Asset, select Rekall Event Catalog, and add the definition under Definition Assets. Assign that catalog as Default Catalog in Project Settings > Game > Rekall Events. Each Game Instance compiles the complete catalog atomically; one invalid record leaves the registry unhealthy instead of partially registered.

  5. Bind with the right lifetime.

    In an Actor Blueprint place Bind Inventory Item Added at Begin Play. Leaving World Context and Owner disconnected uses self. Read the exact ST_InventoryItemAdded payload on On Event. Store the subscription handle only if you must unbind early; owner destruction removes the listener safely.

  6. Publish and inspect.

    In another Blueprint place Publish Inventory Item Added, construct the exact typed payload, and execute it. Inspect Result.Status, attempted/delivered/skipped counts, diagnostic code, sequence, and correlation ID—or branch with Is Publish Successful—before assuming a listener ran.

05

Start here

Publish your first C++ event

Define one reflected payload and stable Gameplay Tag, register their exact pairing before Game Instance initialization, then resolve, subscribe, publish, inspect, and clean up through the public typed API.

  1. Add the runtime modules.

    Add Core and Gameplay Tags privately to the consuming game module. Use public dependencies only if your public headers expose their types.

PrivateDependencyModuleNames.AddRange(new[]
{
    "GameplayTags",
    "RekallEventsCore"
});
  1. Declare the payload and tag.

    Put the reflected payload and native tag declaration in a header. The generated include remains last.

#pragma once

#include "CoreMinimal.h"
#include "NativeGameplayTags.h"
#include "InventoryEvents.generated.h"

UE_DECLARE_GAMEPLAY_TAG_EXTERN(TAG_Game_Inventory_ItemAdded);

USTRUCT(BlueprintType)
struct FInventoryItemAdded
{
    GENERATED_BODY()

    UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Inventory")
    FName ItemId;

    UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Inventory")
    int32 Quantity = 0;
};
  1. Define the tag and register the definition.

    A native definition provider is an Unreal modular feature. Register it in module startup so each subsequently initialized Game Instance snapshots it, and unregister it before the provider is destroyed. Duplicate tags or a missing payload type make registry initialization fail atomically.

#include "Definitions/IRekallNativeDefinitionProvider.h"
#include "Features/IModularFeatures.h"
#include "InventoryEvents.h"
#include "Modules/ModuleManager.h"

UE_DEFINE_GAMEPLAY_TAG_COMMENT(
    TAG_Game_Inventory_ItemAdded,
    "Game.Inventory.ItemAdded",
    "A local inventory item was added.");

class FMyGameModule final
    : public IModuleInterface
    , public IRekallNativeDefinitionProvider
{
public:
    virtual void StartupModule() override
    {
        IModularFeatures::Get().RegisterModularFeature(
            IRekallNativeDefinitionProvider::GetModularFeatureName(), this);
    }

    virtual void ShutdownModule() override
    {
        IModularFeatures::Get().UnregisterModularFeature(
            IRekallNativeDefinitionProvider::GetModularFeatureName(), this);
    }

    virtual void AppendDefinitions(
        TArray<FRekallEventDefinitionRecord>& OutRecords) const override
    {
        FRekallEventDefinitionRecord& Record = OutRecords.AddDefaulted_GetRef();
        Record.EventTag = TAG_Game_Inventory_ItemAdded;
        Record.PayloadStruct = FInventoryItemAdded::StaticStruct();
    }
};

IMPLEMENT_PRIMARY_GAME_MODULE(FMyGameModule, MyGame, "MyGame");
  1. Resolve, subscribe, and publish.

    Declare FRekallScopedSubscription ItemAddedSubscription; as a native member of the listening object. Resolve against an explicit World Context Object, retain the move-only subscription for exactly the listener lifetime, and inspect the structured publish result.

#include "Events/RekallEvents.h"
#include "InventoryEvents.h"
#include "Listeners/RekallScopedSubscription.h"
#include "Subsystems/RekallEventWorldSubsystem.h"

void UInventoryAnnouncements::BeginPlay()
{
    Super::BeginPlay();

    const TRekallEvent<FInventoryItemAdded> Event =
        Rekall::ResolveEvent<FInventoryItemAdded>(
            this, TAG_Game_Inventory_ItemAdded);
    if (!Event.IsValid())
    {
        return;
    }

    URekallEventWorldSubsystem* Events =
        GetWorld()->GetSubsystem<URekallEventWorldSubsystem>();
    ItemAddedSubscription = FRekallScopedSubscription(
        Events,
        Rekall::Subscribe(
            this,
            this,
            Event,
            [this](const FInventoryItemAdded& Payload,
                   const FRekallEventContext& Context)
            {
                ShowInventoryMessage(Payload.ItemId, Payload.Quantity);
            }));

    FInventoryItemAdded Payload;
    Payload.ItemId = TEXT("HealthPotion");
    Payload.Quantity = 2;
    const FRekallPublishResult Result =
        Rekall::Publish(this, this, Event, Payload);
    if (!Result.IsSuccess())
    {
        UE_LOG(LogTemp, Warning, TEXT("Rekall publish failed: %s"),
            *Result.DiagnosticCode.ToString());
    }
}
06

Start here

Choose the right Unreal mechanism

What it is

This is a starting guide, not a ranking. Choose the mechanism whose ownership, timing, authority, and lifetime match the problem.

Why use it

Event-driven code is useful for independent reactions, but adding indirection where a dependency is intentional makes gameplay harder to follow.

Simple example

Keep the authoritative inventory count as a replicated property. After inventory accepts a pickup, use Game.Inventory.ItemAdded for independent local reactions. A tutorial Flow may wait for that event, while an AI's ongoing decisions remain in StateTree or Behavior Tree.

How it works

Start withRealistic exampleBoundary
Direct callA pickup tells its known inventory component to add an item and needs the result now.The caller intentionally owns the dependency; it is not an independent announcement.
Delegate or interfaceA weapon exposes an ammo-changed callback to its owning HUD, or interacts with a known usable object.Best when ownership and observer set are local and already clear; it does not provide a global definition registry.
Replicated property or RPCThe server replicates authoritative inventory quantities and ownership to clients.Use Unreal replication for gameplay truth; an event notification does not replace correction, relevancy, dormancy, or state recovery.
Gameplay Message SubsystemA project already standardized on Gameplay Tags sends lightweight local gameplay messages to tag listeners.Stay with its message model when Rekall's exact definitions, structured results, bounded retention, transport policy, Flow, or Insights are not needed.
Rekall CoreInventory publishes Game.Inventory.ItemAdded so UI, quests, audio, and analytics react independently.Core is local event delivery. It is not network replication, a transaction coordinator, or authoritative state storage.
Rekall NetworkThe server transports an allowlisted presentation or workflow event to an owning client.Only explicit policies cross authority through admitted endpoints; authoritative inventory remains Unreal replicated state.
Rekall FlowA data-authored tutorial starts, waits for the key pickup, branches, opens a door, and ends.Use it for bounded multi-step orchestration, not continuous AI decision-making or general Blueprint replacement.
StateTree or Behavior TreeAn enemy continuously evaluates perception, combat state, and movement decisions.These model long-lived state and decisions; they can publish or wait for events without being replaced by them.

Technical details

Ask four questions before choosing: who owns the dependency, whether a return value is required synchronously, whether authority or state recovery matters, and whether the behavior is a one-time announcement or a long-lived decision process. Then add optional Rekall capabilities only where their explicit contracts solve a real need.

07

Foundations

Three ideas before the node atlas

Start with the contract, then learn who announces and reacts, then choose the authoring surface. Everything else in Core adds delivery rules to those three ideas.

01 · Contract

Definitions and payloads

A stable Gameplay Tag names one exact reflected data shape.

02 · Relationship

Publishing and listening

One system announces; independent listeners react for their own lifetimes.

03 · Authoring

Typed versus generic

Choose concrete pins at authoring time or an owning runtime-selected value.

07A

Foundations

Definitions, Gameplay Tags, and payloads

What it is

An event definition is a saved contract: one stable Gameplay Tag, one exact reflected payload struct, and policy metadata such as default delivery, retention, tracing, and optional transport rules.

Why use it

The definition gives publishers and listeners one shared meaning. Validation can reject the wrong data shape before an eligible listener sees it.

Simple example

Game.Inventory.ItemAdded is the identity. Its payload is either the saved Blueprint Struct ST_InventoryItemAdded or the registered native USTRUCT FInventoryItemAdded, with Item Id and Quantity fields.

How it works

A Game Instance compiles catalog assets and native definition providers into one atomic registry snapshot keyed by Gameplay Tag. Publication resolves that registry entry; it does not scan assets by name. The asset may be renamed or moved without changing runtime identity as long as the Gameplay Tag remains the same.

Technical details

Schema matching uses exact UScriptStruct identity, not a comparison of field layout. A base struct, derived struct, or unrelated layout-compatible struct is still a PayloadMismatch. Use FRekallEmptyPayload for a native signal with no fields rather than leaving the contract unset. Duplicate tags or missing payload types make registry initialization fail atomically.

07B

Foundations

Publishing and listening

What it is

A publisher is an announcer. A subscription is one independent promise to react when a matching event reaches its routing domain.

Why use it

Inventory can announce one accepted pickup while UI, quest progress, audio, and analytics each own their reaction. No listener has to be present for the publisher to remain valid.

Simple example

The inventory component publishes Game.Inventory.ItemAdded once. A quest subscription reads Quantity; the HUD subscription refreshes its count; removing the audio listener does not require an inventory code change.

How it works

Binding records a weak owner and returns a subscription handle. Keep the handle when you need to unbind early; otherwise owner destruction removes the listener safely. Immediate publication invokes the eligible subscription snapshot inside the publish call. Queued publication reports successful acceptance into bounded work and invokes callbacks only when its chosen tick or phase arrives.

Technical details

FRekallPublishResult classifies Delivered, Queued, Transported, and No Subscribers as successful publication outcomes. Invalid Definition, Payload Mismatch, Invalid Context, Invalid Scope, Rejected By Policy, and Network Handoff Failed are failures. No Subscribers means the contract was valid but no eligible listener matched; it is not automatically an error. Preserve the stable diagnostic code and correlation ID when escalating a problem.

07C

Foundations

Typed versus generic authoring

What it is

Typed and generic nodes use the same registered contract. They differ in when the event identity becomes known and where schema checking appears.

Why use it

Typed nodes make a known definition easy to read in a Blueprint graph. Generic nodes let reusable systems select among definitions at runtime without borrowing payload memory.

Simple example

A typed Publish Inventory Item Added node exposes a concrete ST_InventoryItemAdded pin. A generic Publish Event call carries the runtime-selected Game.Inventory.ItemAdded tag plus an owning FInstancedStruct containing that same exact payload type.

How it works

ChooseBest fitSchema feedbackInventory example
Choose typed whenThe definition is known while authoring the graph or C++ call site.Definition-backed concrete pins reconstruct when the payload changes; incompatible links disconnect visibly.Gameplay code always publishes Game.Inventory.ItemAdded.
Choose generic whenA reusable, data-driven tool selects a Gameplay Tag at runtime.The owning FInstancedStruct is validated against the resolved definition at publication.A diagnostic relay inspects several inventory tags selected from data.

Technical details

Typed editor K2 nodes compile away to Core or Network runtime calls; packaged bytecode does not require their editor classes. Generic payloads own their reflected value in FInstancedStruct; they are not untyped byte blobs, and exact struct identity is still required.

08

Foundations

C++ API and listener lifetime

TRekallEvent<TPayload> resolves a Gameplay Tag once against one Game Instance registry generation, then enforces the reflected payload type for publish and subscribe calls.

#include "Events/RekallEvents.h"
#include "Listeners/RekallScopedSubscription.h"

TRekallEvent<FInventoryItemAdded> ItemAdded =
    Rekall::ResolveEvent<FInventoryItemAdded>(this, ItemAddedTag);

FInventoryItemAdded Payload;
Payload.ItemId = TEXT("HealthPotion");
Payload.Quantity = 2;

FRekallScopedSubscription Subscription(
    GetWorld()->GetSubsystem<URekallEventWorldSubsystem>(),
    Rekall::Subscribe(this, this, ItemAdded,
        [](const FInventoryItemAdded& Payload,
           const FRekallEventContext& Context)
        {
            // Exact payload; read-only router context.
        }));

const FRekallPublishResult Result =
    Rekall::Publish(this, this, ItemAdded, Payload);

The first argument is the explicit World Context Object; sender is optional and recorded weakly. Cache a typed handle only for the current Game Instance registry lifetime. World mismatch, registry replacement, travel to a replacement Game Instance, or teardown makes it stale.

FRekallScopedSubscription is move-only and owns one cleanup responsibility. Reset/destruction unsubscribes through a weak public endpoint, while URekallEventListenerComponent can collect Actor-owned handles and clear them at End Play. A wrapper's IsValid() is syntax/ownership state, not a live-router query.

09

Delivery

Scope, audience, timing, and priority

What it is

Every local publication answers four separate questions: where it belongs, which listeners qualify, when callbacks run, and how eligible work is ordered.

Why use it

Separating these decisions prevents a timing change from silently broadening the audience, or a high priority from becoming an accidental phase override.

Simple example

Publish Game.Inventory.ItemAdded in the current World, qualify the intended local listeners, choose End Frame so inventory mutation settles before UI and quest reactions, and use normal priority unless ordering among that phase's eligible work matters.

How it works

  1. 01Scope

    Choose which local routing domain owns delivery: World, Game Instance, or a narrower local context.

  2. 02Audience

    Choose which subscriptions qualify through a directed target or captured Gameplay Tag Query.

  3. 03Timing

    Run now, on the next tick, or at Pre Physics, Post Physics, or End Frame.

  4. 04Priority

    Order eligible callbacks or queued work; never jump ahead of the selected phase.

Resolved delivery choices and selectors

ChoiceLifetime or timingRequired selector
WorldOne game World; removed at travel/teardownNone
Game InstancePersists across ordinary World travelNone
Local PlayerOne local split-screen playerExplicit/derivable ULocalPlayer
DirectedOne exact weak UObject ownerDirected target
AudienceListeners whose captured tags satisfy a queryNon-empty Gameplay Tag Query
ImmediateDispatches during PublishNo phase
Next TickQueues for the next game-thread tickNo phase
Tick PhaseQueues for Pre Physics, Post Physics, or End FrameTick phase

Immediate

Runs eligible callbacks inside the publish call. Use when the producer can safely pay callback cost and reentrant reactions are expected.

Next Tick

Accepts work into a bounded queue for the next game-thread tick. Use to break reentrancy or let current state settle.

Tick Phase

Queues for Pre Physics, Post Physics, or End Frame. Use when reaction order relative to simulation is part of the contract.

Definition defaults versus publication overrides

Definition fieldPublication controlResolution rule
ScopebOverrideScope + ScopeThe definition wins unless the flag is true.
Delivery modebOverrideDeliveryMode + Delivery ModeThe flag makes even an explicit Immediate override unambiguous.
Tick phasebOverrideTickPhase + Tick PhaseUsed when effective delivery is Tick Phase.
PrioritybOverridePriority + PriorityHigher priority sorts first with stable ordering.

Definition defaults make consistent delivery the zero-configuration path. Leave flags false to honor a definition's World / Next Tick defaults. To force one call inline, set bOverrideDeliveryMode and choose Immediate; changing the value without its flag does nothing.

Technical details

Immediate delivery can be reentrant: a listener runs before Publish returns and may cause more gameplay work. Next Tick and Tick Phase break that call stack but remain bounded admission, so inspect a rejected result. Explicit subscription tags and IRekallAudienceProvider tags are merged and captured when binding; after team, role, or membership changes, unbind and subscribe again. Scope and audience are local selectors, not replication, and mixed or missing selectors return InvalidScope rather than broadening delivery.

10

Delivery

Retention and explicit replay

What it is

Retention is a bounded local cache of accepted event envelopes. Depending on policy, one retention key can keep one newest snapshot or a short recent sequence. It is not an event log, database, durable save, or replicated state store.

Why use it

A late-created local UI can explicitly ask for the newest relevant presentation snapshot instead of requiring the original publisher to fire again.

Simple example

If Game.Inventory.ItemAdded uses Latest, a late UI listener may query or replay the most recent pickup. That snapshot says what was added last; it cannot reconstruct the full authoritative inventory. A compact inventory-summary definition is usually the better retained contract for a full UI refresh.

How it works

None

Deliver and forget. Choose it for transient effects, audio cues, damage flashes, analytics markers, and any notification a late listener should not reconstruct.

Latest

Keep the newest accepted envelope for its resolved local scope key. Choose it for one compact current snapshot such as match phase or presentation mode.

RecentHistory

RecentHistory keeps multiple accepted envelopes for one retention key in sequence order. Query and replay still select only the newest matching sequence; they do not stream the older snapshots. Per-key and global entry/byte limits evict the oldest sequence first, and expiry removes aged snapshots. Choose it over Latest only when a short, bounded local presentation or workflow trail matters. It is not an event log, durable history, or replicated state.

Latest per Audience

Keep the newest value per exact audience-query identity. Choose it only when each local audience stream needs an independently bounded snapshot.

Technical details

Retention keys include event tag, resolved scope, Local Player or Directed scope object where required, and the exact Audience query where required. Expiry, maximum entries, and maximum bytes are always enforced. A queued publication is not retained until it reaches its delivery phase. Query returns a snapshot; replay delivers that snapshot to a chosen live handle through the local router and does not republish it globally.

11

Optional systems

Move a local event to the network

Keep the existing Gameplay Tag and exact payload schema. Network transport extends the same definition with an explicit allowlist and an owned endpoint; it does not create a second event identity or a global replicated catch-all.

  1. Add the transport policy.

    Add one Rekall Network Policy Fragment to the existing definition. Choose the narrowest direction, set Reliable or Unreliable intentionally, and configure positive payload-byte and per-connection rate limits. Without this fragment, the definition remains local-only.

  2. Decide whether clients may originate it.

    For Client to Server traffic, enable client origin explicitly. If gameplay ownership, team, inventory, or permission matters, name and register a server-side IRekallNetworkAuthorization rule. A missing named rule fails closed.

  3. Install the owned endpoint.

    Add URekallNetworkEndpointComponent to the replicated PlayerController class used by the game. The PlayerController ownership chain makes Client-to-Server RPC admission meaningful; attaching the component to an arbitrary Actor is rejected.

  4. Replace only the crossing publication.

    Leave local producers on Publish Event Name. Where transport is required, replace that node with the definition-backed Network Publish Event Name node so the concrete payload pin remains exact. The generic Publish Network Event node is the runtime-selected FInstancedStruct alternative.

  5. Supply route-specific context.

    Server to Owner requires Target Owner. Server to Audience requires an explicit server-resolved PlayerController list; duplicates are removed. Parent Correlation Id joins this attempt to the originating Core event or Flow. Never trust sender, authority, or connection identity carried in a client packet.

  6. Validate before PIE.

    Run Asset Actions > Validate Assets on the definition and catalog. Confirm one policy fragment, an exact registered payload, a supported schema, positive limits, the intended direction, and any named authorization provider before diagnosing transport.

  7. Exercise the topology in PIE.

    First test Standalone and confirm the structured result reports local publication without RPC serialization. Then use multiplayer PIE to test the listen host and a remote client, including the wrong-side rejection path. Finally run the project's dedicated server configuration and confirm endpoint registration, authorization, schema, bounds, recipient count, and Core republication behavior.

12

Optional systems

Secure network transport

What it is

Selected event definitions cross authority boundaries only when an explicit Network policy allows them. Network does not replicate all events, and it does not replace authoritative gameplay state.

Why use it

Use RekallEventsNetwork when a small, declared presentation or workflow notification must reach the server, one owner, an audience, or all connected clients while keeping the same Core event contract.

Simple example

Inventory still changes its authoritative contents through an Unreal replicated property or RPC-owned state change. After the server accepts that change, an allowlisted presentation event can tell a remote tutorial or HUD that Game.Inventory.ItemAdded occurred. The notification may cross the network; inventory truth does not move into the event.

How it works

A definition needs one Rekall Network Policy Fragment, realistic byte and per-connection rate limits, and a supported exact payload schema. Each replicated PlayerController owns a registered URekallNetworkEndpointComponent. For client-origin traffic, the server derives identity from that owning connection and runs any named IRekallNetworkAuthorization rule; a missing named rule fails closed. A client packet never chooses its own sender identity or reflected payload type.

01

Standalone

Validates the live definition and exact payload, bypasses RPC serialization, and publishes through the local World router.

02

Listen Server

The host follows server validation and endpoint rules; owning a local player is not an authorization bypass.

03

Dedicated Server

Runs authoritative definition, policy, schema, rate, byte, recipient, authorization, and late-join decisions without a Local Player.

Admission sequence

  1. Resolve the current game World, Game Instance registry, and registered PlayerController-owned endpoint.
  2. Resolve the live Core definition and its single Network policy fragment.
  3. Plan the route from net mode, caller authority, and declared direction.
  4. Require pointer-exact local payload type, then encode within the positive byte bound and trusted schema signature.
  5. On inbound client traffic, derive identity from the owning connection, consume per-connection/event rate budget, and run any named server authorization rule.
  6. Publish locally on authority or deliver only to the resolved Owner, deduplicated Audience, or All endpoint set; return a structured Network result on every rejection.

Route matrix

Definition directionEligible callerPlanned routeRequired context
Local OnlyAny valid game WorldLocal Core publicationValid definition and exact payload
Client to ServerNetwork client without authorityServerLocally owned registered endpoint; client origin explicitly allowed
Server to OwnerListen/dedicated authorityOwning ClientTarget Owner with registered endpoint
Server to AudienceListen/dedicated authorityAudience ClientsExplicit server-resolved PlayerController list
Server to AllListen/dedicated authorityAll ClientsRegistered endpoint set

Every direction publishes locally in Standalone. In a networked World, the wrong caller side is rejected rather than rerouted. Use reliable transport only where loss changes meaning. Late-join Latest or Recent History is bounded and revalidated for Server-to-All presentation/workflow messages; inventories, health, ownership, and match truth remain Unreal replicated state.

Technical details

The live server definition controls direction, client-origin permission, schema signature, byte and rate admission, authorization, server republication, and recipient resolution. Server-to-Owner requires a target owner; Server-to-Audience uses an explicit, deduplicated server-resolved PlayerController list. Late-join caching is limited to bounded Server-to-All presentation/workflow packets and revalidates the live definition and schema when an endpoint registers.

13

Optional systems

Flow authoring and runtime

What it is

A Flow is a reusable gameplay sequence saved as an asset. It advances through connected steps, may pause while waiting for time or an event, and ends Completed, Cancelled, or Failed.

Why use it

Use a Flow when a tutorial, encounter signal, UI sequence, or other event-driven workflow should remain inspectable as data and should wait for events without turning one Blueprint into a long chain of timers and subscriptions.

Simple example

Start → Publish Tutorial Started → Wait for Key Added → Invoke Condition: Has Key → Action: Open Door → End
  1. 01Start

    The asset's Entry Node selects the first authored step; the external start call creates this run.

  2. 02Publish Tutorial Started

    Core validates and delivers the declared tutorial-started event, parented to this Flow's correlation.

  3. 03Wait for Key Added

    Wait Event listens for Game.Inventory.ItemAdded. It wakes on that tag and discards the delivered payload.

  4. 04Invoke Condition: Has Key

    Invoke Condition calls the registered Has Key extension and chooses Next Node or False Node from its returned boolean.

  5. 05Action: Open Door

    A deliberately registered project extension performs the door action. It is not an arbitrary reflected function call.

  6. 06End

    The successful instance becomes Completed and enters bounded terminal history.

How it works

Saved plan

One reusable authored Flow Asset

The saved asset is the reusable authored plan. It stores indexed node data, an entry index, edges, variables, authority, and budgets.

Live run

One instance and handle

At start, the runtime validates and compiles the saved asset for that instance, then executes against the asset's indexed nodes. The instance has its own owner, current node, variables, status, diagnostics, and correlation ID; its handle controls and inspects only that run.

Build the first Flow

Build the happy path above, then deliberately exercise every way it can stop.

  1. Create and name a Rekall Flow Asset.

    In the Content Browser choose Add > Data > Data Asset, select Rekall Flow Asset, and give the asset a purpose-revealing name such as DA_Tutorial_KeyDoor.

  2. Choose the narrowest authority mode.

    Use Local, Server Authoritative, Owning Client Cosmetic, or All Clients Cosmetic according to where this exact sequence is allowed to run. Flow state is not implicitly replicated.

  3. Build the entry and connect every path.

    Set Entry Node as the diagram's conceptual Start. Add Publish, Wait Event, Invoke Condition, Invoke Action, and End node data; set each Next Node and the Invoke Condition False Node to valid indices. Start is not another internal node kind—the six-node Blueprint lifecycle starts a runtime instance from the asset.

  4. Select the existing event contracts and bound the wait.

    Configure Publish with the tutorial-started event tag and exact payload. Configure Wait Event for Game.Inventory.ItemAdded and set a positive delay as its timeout; then connect Invoke Condition: Has Key so both its success and false edges reach intentional bounded outcomes.

  5. Register every named Action or Condition extension.

    Implement IRekallFlowExtension, return stable names for Has Key and Open Door, and register the extensions through IModularFeatures. Missing extensions fail closed; Rekall never reflects arbitrary function names.

  6. Set budgets and validate the asset.

    Choose positive per-tick and total-step limits plus an intentional lifetime, then run asset validation. Fix invalid entries or edges, unreachable nodes, unbounded cycles, recursive children, missing event data, variable mismatches, and invalid budgets before cook.

  7. Start one runtime instance and retain its handle.

    In ordinary Blueprint call Start Rekall Flow with World context, owner, and asset. Keep the returned Rekall Flow Handle for pause, resume, cancel, and inspection; an invalid handle means start admission failed.

  8. Inspect and test the lifecycle.

    Read status, current node, total steps, diagnostic code, and correlation ID. Test success, wait timeout, explicit cancel, owner loss, and the intended Standalone/listen/client/dedicated PIE authority mode.

Inside the Flow Asset

Sequence authoring

These are the nodes authored inside a Flow Asset:

  • Publish
  • Wait Event
  • Delay
  • Branch (authored boolean)
  • variables
  • Repeat
  • Subflow
  • Parallel
  • Race
  • Gate
  • Invoke Action / Invoke Condition (named extensions)
  • Cancel
  • End

Outside in ordinary Blueprint

Instance lifecycle

These are the six external lifecycle nodes:

  • Start
  • Pause
  • Resume
  • Cancel
  • Get Info
  • Query

The existing Flow lifecycle screenshot contains only those six external lifecycle nodes and Unreal macro tunnels. The internal Flow Asset concepts are not extra entries in the 29-card node atlas.

Flow state model

  1. Running

    Executing connected steps under the per-instance and World scheduler budgets.

  2. Waiting

    Suspended for a Delay, Wait Event, Subflow, Parallel, or Race result.

  3. Paused

    Explicitly stopped while remembering whether resume should restore Running or Waiting.

  4. Completed

    Reached End successfully.

  5. Cancelled

    Stopped explicitly, by owner loss, by teardown, or by a Cancel node.

  6. Failed

    Stopped on a rejected publish, timeout, limit, missing extension, child failure, or other diagnostic.

A newly admitted instance starts Running. Running may become Waiting and return to Running when its condition is satisfied. Running or Waiting may become Paused; Resume restores the pre-pause state. An active instance may be Cancelled, while End produces Completed and runtime faults produce Failed. Completed, Cancelled, and Failed are terminal.

Pause, Resume, and Cancel propagate through the active child tree. Cancellation removes active event waits, cancels children, and clears the instance's runtime bookkeeping; World teardown also cancels active instances. A failed start admission returns an invalid handle, while a runtime failure records a stable diagnostic for inspection.

Terminal history is configurable per World and defaults to 256 entries. An older handle evicted from that bounded history reports Failed with no diagnostic and should be treated as unknown or expired. Flow state is not implicitly replicated; coordinate authoritative and cosmetic runs through explicitly policy-controlled Network events.

Technical details

Resource budgets

BudgetProtectionEvidence on failure
Asset Max Steps Per TickOne instance cannot monopolize a frameUnfinished work carries to a later tick
Asset Max Total StepsBounds cyclic or unexpectedly long plansREK-FLOW-STEP-LIMIT
Asset Max Lifetime SecondsTerminates stale instancesREK-FLOW-LIFETIME-LIMIT
World active instances/runtime bytesBounds concurrent memory admissionInvalid start handle or REK-FLOW-BYTE-LIMIT
World steps per tickBounds aggregate scheduler workRemaining work carries forward
Terminal historyBounds completed/cancelled/failed inspectionOld/unknown handle returns Failed with no code

Project Settings > Game > Rekall Flow configures World-wide active-instance, runtime-byte, step, and terminal-history bounds. Every terminal path cleans event subscriptions, timers, child Flows, and runtime instance data. Inspect status, current node, total steps, diagnostic code, and correlation before changing the asset.

14

Optional systems

Insights and correlated diagnostics

What it is

The optional editor-only RekallEventsInsights module observes public Core, Network, and Flow trace sinks. It is an observation surface, not a gameplay dependency: the runtime modules do not load or depend on Insights, and packaged Game, Client, or Server runtime receipts exclude it.

Why use it

Use Insights to diagnose one gameplay cause across Flow transitions, Core admission and delivery, and optional Network transport without reconstructing the path from separate logs.

Simple example

The tutorial Flow publishes an event, Core accepts and delivers it, Network may transport an allowed presentation event, and Insights links those records into one inspectable causal chain.

One tutorial action, joined across optional systems
  1. FlowTutorial instance

    Owns a correlation ID and publishes with that ID as the parent.

  2. CoreAccepted and delivered

    Records attempt and router-local delivery sequence values.

  3. NetworkAllowed presentation hop

    Preserves the supplied parent correlation and records route outcome.

  4. InsightsJoined diagnosis

    Queries the correlation to show Flow transitions, Core stages, and Network hops together.

How it works

Attempt Sequence
Identifies one logical Core publish attempt, including a permitted worker handoff.
Delivery Sequence
Orders work inside one local router and becomes nonzero only after router admission.
Correlation ID
Joins records that belong to the same causal chain.
Parent Correlation ID
Links a nested publication or transport attempt back to the Flow or event that caused it.

Technical details

Capture modeRecordsUse
Start (metadata)Stage, tag, status, attempt/delivery sequence, correlation, counts, diagnostic codeDefault low-data pipeline diagnosis
Start (payload opt-in)Metadata plus policy-permitted bounded text snapshotsSchema/value diagnosis in a trusted editor session
Unreal Trace channelCore pipeline stages without Insights dependencyCapture with standard Unreal tracing controls

Flow instances use their own correlation as parent when entering Core, and Network preserves the supplied parent. ExportJson writes a versioned text-only session; it never exports live UObject or FInstancedStruct references. Import supports offline filter/correlation analysis under current bounds. The default recorder holds at most 10,000 records and 8 MiB, evicts oldest records, drops oversized individual records, and reports drops without blocking gameplay.

15

Reference

Blueprint node atlas

All 29 showcased Blueprint nodes are grouped by authoring surface. Typed editor nodes compile into runtime calls; generic nodes remain data-driven; Network helpers enforce transport policy; Flow lifecycle nodes control compiled instances.

Atlas A · 8 nodes

Typed definition-backed nodes

Select a Rekall Event Definition in Details or place a definition-specific action such as Publish Inventory Item Added. The concrete payload pin is reconstructed from that definition and the editor-only K2 node compiles away to a packaged Core or Network runtime call.

Unreal Engine 5.8 macro graph showing eight typed definition-backed Rekall Global Events Blueprint nodes
Figure 01

Definition-backed publish, subscription, wait, retained-state, query, and Network publication nodes with exact payload pins. Review the typed cards.

Typed · Core

Publish Rekall Event

Publishes the selected definition with its concrete payload struct.

Key inputs
World context, sender, typed payload, event options
Outputs
Structured FRekallPublishResult
Use when
The event definition is known at authoring time.
Watch for
Definition defaults apply unless matching override flags are enabled; incompatible schema changes disconnect payload links.

Guide: publishing and listening

Typed · Core

Bind Rekall Event

Creates a persistent weak-owner subscription with an exact typed callback.

Key inputs
World context, owner, subscription options, optional scope override
Outputs
Then, On Event, subscription handle, typed payload, immutable context
Use when
A listener needs every matching publication during its lifetime.
Watch for
Store the handle for early unbind; owner destruction also removes delivery, and audience membership is captured at bind time.

Guide: publishing and listening

Typed · Core

Wait for Rekall Event

Suspends one execution path until delivery, timeout, cancellation, or invalidation.

Key inputs
World context, subscription options, timeout, optional scope override
Outputs
Completed, Timed Out, Cancelled, Invalid Context, Invalid Definition; wait handle; typed payload and context on Completed
Use when
A Blueprint sequence needs one matching event before continuing.
Watch for
Zero timeout is unlimited; only Completed owns a value, and a repeated latent UUID replaces the previous wait.

Guide: wait diagnostics

Typed · Core

Unbind Rekall Event

Removes the live subscription named by a stored handle.

Key inputs
World context, subscription handle
Outputs
Success boolean
Use when
A listener must stop before its owner is destroyed.
Watch for
The first live removal returns true; repeated, foreign-router, or stale handles return false safely.

Guide: listener cleanup

Typed · Core

Query Rekall Event Subscriptions

Returns active subscription metadata for the selected definition and routing domain.

Key inputs
World context, optional scope override
Outputs
Array of subscription information
Use when
Diagnostics, controlled gameplay inspection, or editor tooling needs live router state.
Watch for
The records are inspection snapshots, not mutation handles; query the same effective World or Game Instance domain used to bind.

Guide: listener diagnostics

Typed · Retention

Get Retained Rekall Event

Reads the retained stream for the definition and exposes its exact payload.

Key inputs
World context, scope, optional scope object, optional audience query
Outputs
Found/Not Found, full retained result, typed payload, original context
Use when
A late system needs the newest retained state without invoking a listener.
Watch for
Not Found also covers an absent or incompatible value; inspect Result to distinguish invalid scope or context.

Guide: retention and replay

Typed · Retention

Replay Retained Rekall Event

Delivers the selected retained stream to one existing subscription handle.

Key inputs
World context, retention selectors, live subscription handle
Outputs
Found/Not Found, retained result, typed payload and original context
Use when
Historical state should enter one listener through its normal callback path.
Watch for
The handle must belong to the same live router and be selected by the retention key; replay never republishes to everyone.

Guide: explicit retained replay

Typed · Network

Network Publish Rekall Event

Transports the selected definition through its allowlisted Network policy using an exact typed payload.

Key inputs
World context, sender, typed payload, target owner/audience players, parent correlation
Outputs
Network status, route, correlation, recipient count, diagnostic code
Use when
A known event must cross Client/Server authority boundaries.
Watch for
No silent fallback occurs for wrong direction, missing endpoint, schema mismatch, or serialization failure; absence of a Network policy means local-only.

Guide: secure network transport

Atlas B · 15 nodes

Generic Core and Network runtime nodes

Use this data-driven surface when the event is selected at runtime. Payloads are owning FInstancedStruct values, but the registered definition's exact struct identity still governs every publish, retained read, replay, and transport operation.

Unreal Engine 5.8 macro graph showing generic Core and Network runtime Blueprint nodes
Figure 02

Data-driven Core publication, subscription, retention and latent-wait helpers beside policy-controlled Network functions. Review the runtime cards.

Runtime · Core

Publish Event

Publishes a runtime-selected event through Core after exact definition and payload validation.

Key inputs
World context, sender, Gameplay Tag, FInstancedStruct payload, options
Outputs
Structured publish result
Use when
The event identity or payload value is selected from data at runtime.
Watch for
Calls are game-thread-only; matching fields do not substitute for exact struct identity.

Guide: publishing and listening

Runtime · Core

Bind Event

Binds a dynamic callback that receives an owning generic payload and immutable context.

Key inputs
World context, owner, tag, callback, subscription options, optional scope override
Outputs
Subscription handle
Use when
Listeners are configured from runtime data instead of a fixed definition asset.
Watch for
The owner is weak and the returned payload must be broken as the definition's exact struct.

Guide: publishing and listening

Runtime · Core

Unbind Event

Removes a generic Core subscription from its live routing endpoint.

Key inputs
World context, subscription handle
Outputs
Removal success
Use when
A data-driven listener has an explicit end condition.
Watch for
Syntax-valid does not prove the router still owns the handle; stale or foreign handles return false.

Guide: listener cleanup

Runtime · Core

Query Subscriptions

Inspects active subscription records for one tag in the effective router.

Key inputs
World context, Gameplay Tag, optional scope override
Outputs
Array of active subscription information
Use when
You need live router evidence for diagnostics or tooling.
Watch for
This is the live-state check; Is Subscription Handle Valid only checks handle syntax.

Guide: listener diagnostics

Runtime · Retention

Get Retained Event

Returns the retained payload and original context for an exact retention key.

Key inputs
World context, tag/scope/scope-object/audience retention key
Outputs
Retained status and event snapshot
Use when
Runtime-selected state must be queried without triggering a callback.
Watch for
Queued events become visible to retention only at their delivery phase; expiry and byte/entry limits still apply.

Guide: retention keys and timing

Runtime · Retention

Replay Retained Event

Replays one retained snapshot to one active subscription.

Key inputs
World context, retention key, subscription handle
Outputs
Found, Not Found, Invalid Handle, Invalid Scope, or Invalid Context plus event snapshot
Use when
Existing listener logic should consume retained state explicitly.
Watch for
The key and handle must belong to the same router; this does not broadcast historical traffic.

Guide: explicit retained replay

Runtime · Result

Is Publish Successful

Classifies a Core publish result for a compact Blueprint branch.

Key inputs
FRekallPublishResult
Outputs
True for Delivered, Queued, Transported, or No Subscribers
Use when
A graph needs success/failure control flow before detailed inspection.
Watch for
Success does not always mean a callback already ran; Queued is accepted work and No Subscribers delivered to nobody.

Guide: structured result diagnostics

Runtime · Handle

Is Subscription Handle Valid

Checks whether both identifiers encoded in a subscription handle are present.

Key inputs
Subscription handle
Outputs
Syntax-valid boolean
Use when
You need to reject an empty/default handle cheaply.
Watch for
This is syntax-only—not proof of a live listener. Use Query Subscriptions against the correct router for liveness.

Guide: handle and router lifetime

Runtime · Result

Is Retained Event Found

Branches on whether a retained result contains a found snapshot.

Key inputs
FRekallRetainedEventResult
Outputs
Found boolean
Use when
A graph only needs a simple found/not-found decision.
Watch for
Inspect the full status when Invalid Handle, Invalid Scope, or Invalid Context must be distinguished from ordinary absence.

Guide: retained result states

Runtime · Latent

Wait for Event

Creates one generic latent subscription and resumes through an explicit terminal branch.

Key inputs
World context, tag, subscription options, timeout, scope override
Outputs
Completed, Timed Out, Cancelled, Invalid Context, Invalid Definition; wait handle; generic payload and context
Use when
Data-driven logic needs one event or a bounded wait.
Watch for
Only Completed contains a payload. Replay may complete during creation; every terminal path removes the subscription exactly once.

Guide: wait diagnostics

Runtime · Latent

Cancel Wait for Event

Cancels the pending latent action identified by a wait handle.

Key inputs
World context, wait handle
Outputs
Cancellation success
Use when
Another graph or lifecycle transition must stop a wait.
Watch for
Cancellation succeeds once; repeated, completed, timed-out, or stale handles return false.

Guide: wait cancellation

Runtime · Handle

Is Wait Handle Valid

Checks whether the handle still names its original callback target and wait identity.

Key inputs
Wait handle
Outputs
Syntax/target-valid boolean
Use when
You need to reject an empty handle or dead callback target.
Watch for
It does not query the latent manager and does not prove the wait is still pending; cancellation is the authoritative operation.

Guide: wait state evidence

Runtime · Network

Publish Network Event

Publishes a runtime-selected event through the Network coordinator and its definition policy.

Key inputs
World context, sender, tag, generic payload, target owner/audience, parent correlation
Outputs
Network publish result with status, route, correlation, recipients, and code
Use when
Both the network event and payload are selected dynamically.
Watch for
Exact schema, caller side, endpoint ownership, payload bounds, rate limits, and authorization all fail closed.

Guide: network admission and routes

Runtime · Network

Is Network Publish Successful

Classifies the structured Network result for concise control flow.

Key inputs
FRekallNetworkPublishResult
Outputs
True for Published Locally or Transported
Use when
A graph needs a first-pass network success branch.
Watch for
Still inspect Route, Recipient Count, and Diagnostic Code; transported acceptance is not evidence of a remote gameplay reaction.

Guide: network result evidence

Runtime · Network endpoint

Send to Server

Sends an already encoded Network packet through a PlayerController-owned endpoint's reliable or unreliable Server RPC.

Key inputs
Network packet, reliability flag
Outputs
No structured return; server admission is tracked by the endpoint
Use when
Low-level native/advanced tooling already has a validated encoded packet.
Watch for
Normal gameplay should prefer Publish Network Event. Attaching an endpoint to an arbitrary Actor is rejected; a packet never chooses its own trusted reflected type.

Guide: endpoints and server admission

Atlas C · 6 nodes

Flow lifecycle nodes

These convenience functions resolve the current World and control compiled Flow instances. They are distinct from the Publish, Wait Event, Delay, Branch, Repeat, Subflow, Parallel, Race, Gate, Action, Condition, Cancel, and End nodes authored inside a Rekall Flow Asset.

Unreal Engine 5.8 macro graph showing six Rekall Flow lifecycle Blueprint nodes
Figure 03

World-context Flow instance controls and inspection nodes. The screenshot's Inputs and Outputs tunnels are Unreal macro scaffolding. Review the Flow cards.

Flow · Lifecycle

Start Rekall Flow

Compiles/starts the supplied Flow Asset as a World-owned runtime instance.

Key inputs
World context, weak owner, Flow Asset
Outputs
Flow handle
Use when
A data-authored sequence should begin for a concrete owner.
Watch for
Authority mismatch, invalid asset, active-instance limit, or runtime-byte admission returns an invalid handle; Flow state is not implicitly replicated.

Guide: Flow authority and admission

Flow · Lifecycle

Pause Rekall Flow

Pauses a live instance and propagates the pause through its active child tree.

Key inputs
World context, Flow handle
Outputs
Success boolean
Use when
A gameplay pause or modal state must freeze orchestration.
Watch for
The handle belongs to one World; completed, cancelled, failed, unknown, or foreign handles cannot be paused.

Guide: Flow lifecycle

Flow · Lifecycle

Resume Rekall Flow

Restores a paused instance and children to their pre-pause running or waiting state.

Key inputs
World context, Flow handle
Outputs
Success boolean
Use when
The condition that paused the Flow has ended.
Watch for
Resume only paused live instances; World budgets still limit work when execution continues.

Guide: Flow lifecycle

Flow · Lifecycle

Cancel Rekall Flow

Cancels an instance, its active children, waits, timers, and extension-owned work.

Key inputs
World context, Flow handle
Outputs
Success boolean
Use when
An encounter, tutorial, UI journey, or owner ends early.
Watch for
Cancellation wins during reentrant callbacks and records bounded terminal state; repeated cancellation returns false.

Guide: cancellation and cleanup

Flow · Diagnostics

Get Rekall Flow Info

Returns the current or recently terminal snapshot for one Flow handle.

Key inputs
World context, Flow handle
Outputs
Status, current node, total steps, diagnostic code, correlation ID
Use when
UI, diagnostics, or gameplay needs one instance's state.
Watch for
Terminal history is configurable per World and defaults to 256 entries; an expired/unknown handle reports Failed with no diagnostic.

Guide: Flow diagnostics and budgets

Flow · Diagnostics

Query Rekall Flows

Lists active and bounded recently terminal Flow instance snapshots in the current World.

Key inputs
World context
Outputs
Array of Flow instance information
Use when
A debug surface or coordinator needs a World-wide lifecycle view.
Watch for
The array is an inspection snapshot, not mutable runtime state; terminal entries age out of the bounded history.

Guide: Flow inspection

16

Reference

Troubleshoot from evidence

Start with the structured status, stable diagnostic code, registry errors, or Flow/Network instance record. Change configuration only after the failing stage is identified.

Definition-specific node is missing

Evidence first: run Validate Assets on the definition/catalog and confirm a valid tag and saved payload struct. Then save the definition, reopen the action menu, and check that the installed Editor module is enabled. The generic node can be placed and assigned in Details, but do not use it to hide an invalid definition.

Blueprint compilation or publish reports an invalid definition

Evidence first: inspect the compiler message, Result.Status/DiagnosticCode, IsRegistryReady(), and all GetRegistryInitializationErrors(). Then confirm the tag, payload contract, catalog assignment, duplicates, and policy fragments; restart PIE after changing a catalog because a Game Instance snapshots the registry at initialization.

Payload mismatch or a wire disconnected

Evidence first: look for PayloadMismatch or the typed-node compiler error and compare the live definition's exact struct. Then rebuild the value for the new schema, increment Schema Version, compile, test, and save. Do not substitute a layout-compatible, base, or derived struct.

Publish succeeds but no listeners run

Evidence first: inspect No Subscribers, attempted/delivered/skipped counts, then Query Subscriptions in the effective World or Game Instance router. Only then compare tag matching, owner lifetime, scope override, Local Player/Directed/Audience selector, captured audience tags, and delivery phase.

Wait never resumes

Evidence first: add a positive timeout and observe Completed, Timed Out, Cancelled, Invalid Context, or Invalid Definition. Query matching subscriptions and trace the publication correlation. Then align tag/query/scope/audience, confirm the callback target is alive, and check whether the same latent UUID replaced the wait. Zero timeout deliberately means unlimited.

Network publication is rejected

Evidence first: read Network Status, Route, Recipient Count, and Diagnostic Code, then correlate the Network record with Core. Check the live definition/policy, caller side, PlayerController-owned endpoint, schema signature/readiness, exact payload, byte/rate limits, authorization rule, and explicit owner/audience. Never broaden the route as a fallback.

Flow fails to start or terminates

Evidence first: validate the asset, inspect the returned handle, Get Rekall Flow Info, and query Flow trace records. An invalid start indicates context, asset, authority, instance, or byte admission failure. A live/terminal record exposes codes such as REK-FLOW-PUBLISH-FAILED, REK-FLOW-STEP-LIMIT, REK-FLOW-LIFETIME-LIMIT, or REK-FLOW-BYTE-LIMIT; fix that contract before raising a budget.

Works in Editor but not in a packaged build

Evidence first: inspect build/cook logs and packaged runtime receipts. Core plus intentionally used Network/Flow runtime modules may enter the build; RekallEventsEditor, RekallEventsInsights, BlueprintGraph, KismetCompiler, UnrealEd, tests, and QA modules must not. Typed nodes are compile-time conveniences whose generated bytecode calls Core or Network.

17

Reference

Packaging and module boundaries

The installed customer plugin contains exactly five customer modules. Unreal then excludes uncooked/editor diagnostics from packaged Game, Client, or Server runtime receipts.

ModuleInstalled customer pluginPackaged runtime role
RekallEventsCoreYesRuntime event definitions, routing, scheduling, retention, and tracing producer
RekallEventsNetworkYesOptional runtime transport when the project uses Network features
RekallEventsFlowYesOptional runtime orchestration when the project uses Flow
RekallEventsEditorYesUncookedOnly typed K2 nodes and asset validation; excluded from runtime receipts
RekallEventsInsightsYesEditor-only diagnostics; excluded from runtime receipts

Core has no dependency on Network, Flow, Insights, Slate, BlueprintGraph, KismetCompiler, or UnrealEd. Network and Flow depend one-way on Core. Typed nodes compile into runtime calls, so packaged bytecode does not require their K2 classes. Automation tests, QA tags, docs-test modules, BlueprintGraph, KismetCompiler, and UnrealEd are not customer runtime dependencies.

Legal Publisher: Rekall Software Solutions / Marius Myburg. Purchase tiers, current pricing, and Fab availability are stated on the product page; this guide does not expand those commercial boundaries.

18

Reference

Production checklist

Treat release readiness as a set of observable contracts. Record the asset, topology, build, and diagnostic evidence for each item instead of relying on a successful editor-only play session.

  1. Validate definitions and catalogsContract

    Run asset validation, resolve every catalog entry, reject duplicate tags, and confirm each definition names one exact reflected payload struct and intended policy metadata. Re-run after tag, schema, or catalog changes. Review definitions and payloads.

  2. Prove listener cleanupLifetime

    Store subscription and wait handles, exercise early unbind/cancel paths, destroy owners, and verify stale or foreign-router handles fail safely without keeping Worlds alive. Review publishing and listening.

  3. Review scope, audience, and delivery timingDelivery

    For each production event, document its effective router, eligible listeners, immediate or queued phase, and priority. Stress reentrant publishers and verify phase-sensitive reactions in the intended World and Local Player domains. Review routing and timing.

  4. Set and pressure-test bounded workBudgets

    Exercise queue capacity and per-tick work limits, retention entry/byte/expiry bounds, Flow step/instance/child/lifetime/byte budgets, and trace record/byte bounds. Confirm overflow, eviction, timeout, and terminal outcomes remain diagnostic rather than silent.

  5. Lock Network policy and test every topologyAuthority

    Allowlist only intended definitions and directions, then test Standalone, remote client, Listen Server host, and Dedicated Server behavior. Cover endpoint ownership, server authorization, exact schema, rate/byte limits, recipients, rejection evidence, and the late-join boundary. Review Network admission and routes.

  6. Exclude editor-only modules from runtime receiptsBuild

    Inspect staged receipts and dependency logs: RekallEventsEditor, RekallEventsInsights, BlueprintGraph, KismetCompiler, UnrealEd, tests, and QA modules must not enter customer runtime targets. Review module boundaries.

  7. Smoke-test packaged Game, Client, and Server targetsRuntime

    For every target the project claims to support, launch an actual packaged build and verify registry readiness, one typed and generic local publication, queued delivery, retained query/replay, intentionally used Network routes, and intentionally used Flow starts. Do not infer Client/Server support from Editor PIE. Review the qualified release boundary.

  8. Review Insights payload and privacy policyEvidence

    Confirm capture mode, sampling, payload opt-in, record/byte budgets, export handling, and who may inspect or share text snapshots. Verify metadata-only Network records and dropped-record diagnostics without making gameplay depend on the editor observer. Review capture and privacy gates.

19

Reference

Glossary

Short definitions for the terms used throughout the guide. Follow a term to the chapter that owns its full contract.

Event
A named fact that happened, carried as one validated envelope through the local delivery lifecycle.
Definition
The registered contract that combines stable tag identity, one exact payload struct, and default policy metadata.
Gameplay Tag
The stable runtime identity of an event, such as Game.Inventory.ItemAdded; the asset name is not that identity.
Payload
The owning structured value carried by an event; its reflected struct must exactly match the live definition.
Publisher
The system that announces an event without needing direct references to every reacting system.
Subscription
A live registration that selects an event and delivery options for one independently owned reaction.
Listener
The callback target that reacts when a matching accepted event reaches its subscription.
Handle
An opaque identity used to control or inspect the exact subscription, wait, or Flow instance that created it.
Scope
The local routing domain—World, Game Instance, Local Player, or another supported domain—that owns delivery.
Audience
Audience is one of five local routing scopes. It selects subscribers whose captured Gameplay Tags satisfy the publication's audience query; an empty query or mixed Local Player or Directed selectors are rejected as InvalidScope.
Delivery timing
When accepted callbacks run: immediately, on the next tick, or in an intentional tick phase.
Retention
Core retention is a bounded local cache: Latest replaces the value for one retention key, RecentHistory keeps a bounded ordered recent sequence, and LatestPerAudience keeps the latest value per exact Audience query. It is separate from Network's bounded ServerToAll late-join packet cache and is not authoritative replicated state.
Replay
An explicit delivery of one retained snapshot to one selected live subscription; it is not a new publication.
Router
The live local service for a scope that owns subscriptions, delivery queues, and retained entries.
Schema
The exact reflected payload-struct identity and version expected by a definition and checked again at transport boundaries.
Endpoint
The PlayerController-owned Network component through which an allowed client or server route is requested.
Admission
For client-origin traffic, the client-origin endpoint receives the packet, then the server derives trusted identity and validates policy, schema, rate, bytes, and authorization before trusted Core republication. Outbound routes perform their checks before send.
Correlation ID
The identifier that joins one attempt with its Core, optional Network, and Flow outcomes; a parent ID preserves the calling chain.
Flow Asset
The reusable saved data asset that authors indexed nodes, connections, variables, authority mode, and budgets.
Flow Instance
One live run of a Flow Asset with its own owner, handle, current node, variables, state, diagnostics, and correlation.
Terminal history
The bounded per-World record of completed, cancelled, and failed Flow instances kept for later query and diagnosis.