Skip to content
Engine

Core Concepts

Updates and Versions

How Engine stays up to date. Automatic updates load the newest published engine on every server start; manual updates keep a fixed copy you update from the plugin.

Versions

Engine uses version numbers like 1.0.0: major.minor.patch.

PartChanges when
MajorSomething you use may need to change in your code.
MinorNew features, services, systems or packages. Existing code keeps working.
PatchBug fixes.

What changed in each version is listed in the Engine Changelog, and what changed in the plugin and the shells it installs in the Plugin Changelog.

The plugin shows the installed version: for manual installs the version stored in your place, for automatic installs the newest version on the Creator Store, which is the one new servers run. The engine's own Version module holds it too.

Two update models

You choose the model when you install, and you can switch at any time in the plugin. Switching keeps your Configuration folder.

Automatic updates

The Engine module in ServerScriptService is a small shell that contains no engine code. Every time a server starts, the shell loads the published engine from Roblox and boots it. New servers always run the newest version; servers that are already running keep the version they started with.

The shell tries three ways to load the engine, in this order, and repeats the round up to three times (waiting 1 and then 3 seconds between rounds):

MethodNeeds
AssetService:LoadAssetAsyncAllow Loading Third Party Assets in Game Settings > Security, unless the game's creator owns the asset.
InsertService:LoadAssetAn asset owned by the game's creator or by Roblox.
require(assetId)A public module asset.

If loading takes longer than 10 seconds, the shell warns that it is still waiting on Roblox's asset delivery. If every attempt fails, the server prints a report with each method, how often it failed, why, and what it needs, and Engine does not start. See Troubleshooting.

After booting, the shell sets attributes on itself that you can read in the Explorer while a test runs:

AttributeValue
ShellVersionThe shell's version.
EngineSource"Live" when the published engine loaded, "Bundled" when a local copy was used.
EngineLoadMethodThe method that worked.
EngineLoadErrorThe failure report, when Engine could not start.

Manual updates

The shell contains a full copy of the engine (Engine/MainModule) and always boots that copy. Your game stays on the installed version until you click Update to vX.Y.Z in the plugin, which appears when a newer version is published. Updating replaces the copy and keeps your configuration.

Choose manual updates when you want to test every new version before your players get it, or when your game cannot load third-party assets.

Boot information

Engine:GetBootInfo() (server only) tells you how the running engine was started:

local info = Engine:GetBootInfo()
print(info.Source, info.ShellVersion)
SourceMeaning
"Live"Loaded from Roblox by an automatic shell.
"Bundled"Booted from the copy inside the shell (manual updates).
"Direct"The engine module was required without a shell.

Shell versions

The shell itself rarely changes. The plugin records which shell it put in as the EngineShellVersion attribute on the Engine module, such as 1.0.0.

If a new engine needs a newer shell, it warns on start: Engine: this shell (v1) is outdated - reinstall Engine from the plugin to get shell v2. Reinstall or switch update models in the plugin to get the new shell; updating a manual install puts in the newest shell too. Your configuration is kept. Shell changes are listed in the Plugin Changelog.

Sandboxed shells

Roblox can insert scripts as sandboxed, which stops the shell from loading the engine. The shell detects this and prints the fix: select Engine in the Explorer and run the command from the message in the Command Bar to turn sandboxing off for the shell and its parents. Installing with the plugin avoids this.

Engine sends nothing to Arthonier

Loading the engine is a normal Roblox asset load. Engine has no telemetry and makes no web requests of its own. The only HTTP requests it can make are ones you configure yourself, such as Discord webhooks in StatisticsService.