Skip to main content

The Executor

The executor is the copy of the Flow runtime that lives in your place, at ReplicatedStorage.Flow. Everything a game needs to play sequences is inside it:

ReplicatedStorage.Flow The runtime (a ModuleScript)
├── Sequences One Configuration per sequence
├── CustomSections Your section types
└── CustomPresets Your subject presets

Installing it​

The plugin installs the executor the first time you create a sequence in a place. A place with no sequences is never touched. There is nothing else to install: no scripts are added to ServerScriptService or StarterPlayer.

If you manage your place with Rojo, runtime.project.json in the repository builds the executor on its own so you can keep it in source control. Your sequences still live under its Sequences folder.

Starting it​

Requiring the module is what starts it.

local ReplicatedStorage = game:GetService("ReplicatedStorage")
local Flow = require(ReplicatedStorage.Flow)

For local playback, requiring it from the LocalScript that calls Flow:Play is enough.

For synced playback, require it in two places, even in scripts that never call it:

  • On the server, from any Script. That is what creates the remotes clients listen on.
  • On every client, for example from a LocalScript in StarterPlayerScripts. A client that never requires the executor never hears about synced playback, so it won't see it.

A client that requires Flow when the server hasn't warns once in the output after ten seconds.

When it starts, the executor loads every module in CustomSections and CustomPresets. A module that doesn't conform is skipped with a warning naming the problems.

Versions and upgrades​

The executor carries a RuntimeVersion attribute, and that version is the place's version of record, not the plugin's. Everyone editing the place works against the same runtime regardless of which plugin version they have installed. The Inspector's Runtime group (shown when nothing is selected) says where the place stands:

SituationWhat the editor does
Plugin and executor matchEdits normally
Plugin is newerOffers Upgrade Runtime, which replaces the executor, keeps your sequences and custom modules, and migrates the sequences forward. It is one undo step
Plugin is newer, executor is lockedKeeps the place on its runtime and restricts the editor to what that runtime supports
Plugin is olderGoes read-only until you update the plugin

Lock Version sets the executor's VersionLocked attribute, which pins the runtime. A shipped experience that depends on exact playback behavior should lock it, and unlock deliberately when it is ready to upgrade.

Read the running version from scripts with Flow.Version.

What it touches at run time​

  • Property writes on the subjects your sequences animate, restored or held per section when the section ends.
  • workspace.CurrentCamera, while a Camera track is active. See Camera handoff.
  • Temporary instances it creates and removes: spawned templates, preset characters, Global Audio players, and the Fade overlay in the player's PlayerGui.
  • Two remotes under the executor for synced playback.

Nothing it does is saved or replicated by the server: every client evaluates sequences for itself.