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:
| Situation | What the editor does |
|---|---|
| Plugin and executor match | Edits normally |
| Plugin is newer | Offers 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 locked | Keeps the place on its runtime and restricts the editor to what that runtime supports |
| Plugin is older | Goes 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.