Engine v1.1.1 | Extend Roblox with custom services, systems and packages

Engine has been in the making for a long time, and today v1.0.0 is out for everyone.

Engine is a framework by Arthonier that extends Roblox with custom services, systems and packages. You install it once with the Engine plugin and use it the same way you use Roblox’s own services. It’s free, also in games that make money.

Get the plugin | Documentation | Quick Start | Report a problem

A saved currency that shows up in the player list, in a few lines:

local ServerScriptService = game:GetService("ServerScriptService")
local Engine = require(ServerScriptService:WaitForChild("Engine"))

local EconomySystem = Engine:GetSystem("EconomySystem")

EconomySystem:CreateCurrency("Coins", { Leaderstat = true })

EconomySystem.BalanceChanged:Connect(function(player, currency, balance)
	print(player.Name, balance, currency)
end)

What’s inside

Three tiers of ready-made code. We build and maintain all of it, you use it and change settings where your game needs to.

Tier What it is Examples
Services (17) New engine capabilities Roblox doesn’t have built in DataService, NetworkService, DestructionService, UIService
Systems (4) Complete game features built from those capabilities EconomySystem, ModerationSystem, LeaderboardSystem
Packages (24) Pure Luau building blocks without side effects Promise, Signal, State, Serde, Octree
All 17 services

Data and Security

  • DataService: session-locked player profiles with autosave and replication, plus DataStores, ordered stores, MemoryStores, cross-server topics, shared documents and purchase receipts
  • CryptographyService: secure random numbers, SHA-2, SHA-3, BLAKE2, HMAC, authenticated encryption, signed tokens, Argon2, scrypt and one-time codes
  • MonetizationService: products, game passes, subscriptions and avatar items with safe receipts, regional prices, policy checks and a purchase ledger
  • StatisticsService: Roblox Analytics events, funnels, counters, automatic tracking, Discord webhooks and daily totals

Players and Networking

  • PlayerService: names, badges, membership, device, settings, policies, character, avatar, friends and groups, cached and retried
  • NetworkService: named remotes with validation, per-player rate limiting, request/response Promises, batching, streams, middleware and bandwidth stats

Runtime

  • SchedulerService: spread heavy work over frames with time budgets, priorities and throttling
  • ComputeService: parallel Luau on Actors with worker pools, parallel for-loops and task graphs
  • TimeService: scaled game time, a day/night cycle with seasons, game-time timers and real-world dates
  • PerformanceService: FPS, memory and ping, a device benchmark and automatic quality levels
  • JunkService: clean-up scopes for players, characters and rounds, plus a leak detector

World

  • GeometryService: build MeshParts from code, heightmaps and density fields, and slice, deform or simplify meshes
  • DestructionService: breakable parts and models with health, mesh fracturing, explosions, debris and structural collapse
  • SpatialService: spatial indexes for proximity queries, and zones with Entered and Exited events
  • EffectService: pooled, quality-scaled visual effects that the server can broadcast

Audio and Interface

  • AudioService: named sounds, a mixer with buses and ducking, playlists and adaptive layered music
  • UIService: a declarative, reactive UI framework with components, themes, animation, screens and dialogs
All 4 systems
  • EconomySystem: currencies saved in player profiles, shops with limits and dynamic prices, timed rewards with streaks, trades, Robux products and safe offline transactions
  • LeaderboardSystem: global leaderboards with daily, weekly and monthly resets, live in-server boards and leaderstats
  • ModerationSystem: warnings, mutes, kicks and bans that follow players across servers, roles and permissions, escalation, reports, chat moderation, commands, an audit log and server access control
  • PasswordSystem: password hashing and rules, generated passwords and PINs, and locks that limit guessing

Systems work together out of the box. EconomySystem uses LeaderboardSystem for leaderstats and DataService for balances, and ModerationSystem posts its audit log to StatisticsService.

All 24 packages

Async and Events

  • Promise: values that arrive later, every Async method in Engine returns one
  • Signal: fast, typed events, every event in Engine is a Signal
  • Timer: delayed and repeating tasks, stopwatches and countdowns on any clock
  • RateLimiter: token buckets, windows, cooldowns, debounce and throttle, keyed per player

State and Logic

  • State: reactive values that update everything computed from them
  • StateMachine: finite state machines with guards, timed transitions, history and parallel regions
  • BehaviorTree: AI built from small reusable nodes, one tree for any number of NPCs

Data

  • Collections: Queue, Stack, Deque, PriorityQueue, RingBuffer, LRUCache, Set and Multiset
  • TableKit: 80+ helpers for copying, merging, diffing and transforming tables
  • Patch: deep paths in nested tables, templates and DataStore-safety checks
  • Serde: compact binary serialization with schemas
  • Compress: run-length and LZ compression, delta encoding and Base91
  • Hash: fast hashes, checksums, MD5, SHA-1, SHA-256 and HMAC
  • Id: GUIDs, sortable ids, short codes and coupons
  • Guard: runtime type checking with readable error paths

Math and Space

  • MathKit: interpolation, easing, angles, projectiles, geometry tests, statistics and colour
  • Rand: seeded random numbers, distributions, weighted picks and shuffle bags
  • Noise: Perlin, Simplex, Value and Worley noise with fractal layering and warping
  • Spring: physically based springs for numbers, vectors and CFrames
  • Spline: smooth 3D paths with constant-speed movement and tubes
  • Octree: a 3D spatial index for radius, box, ray and nearest queries
  • Graph: weighted graphs with A*, Dijkstra, flow fields, grids and spanning trees

Memory

  • Pool: reuse objects instead of creating and destroying them
  • Bin: collect connections, instances and threads, then clean them all up with one call

Why Engine?

  • It feels like Roblox. Engine:GetService("DataService") works like game:GetService("Players"). Names, properties and events follow Roblox’s style, and every event is a Signal you :Connect to.
  • Safe by default. Session-locked player data, purchases granted exactly once, remotes that validate and rate-limit, and every client request checked again on the server.
  • Only what you use loads. A module starts the first time you get it. Anything you never touch costs nothing.
  • Configurable, not forkable. Every setting has a default. Change only what you need and keep it through every update.
  • Always up to date. With automatic updates every new server runs the newest Engine. With manual updates you decide when to move.
  • Strictly typed. Written in strict Luau, and every reference page lists the types a module exports.
  • Nothing to download. Engine never comes from a website. The plugin installs it in Studio and updates arrive through Roblox.

Getting started

  1. Get the plugin from the Creator Store. It’s free and it’s the only official way to get Engine.
  2. Open your place in Studio. Make sure you’re editing, not playtesting.
  3. Open the Engine window: go to the Plugins tab and click Engine.
  4. Choose how Engine updates: click Enable for automatic updates (recommended) or Install Latest for manual updates.
  5. Confirm and publish. The plugin adds the Engine module to ServerScriptService. Ctrl+Z undoes it like any other edit.
  6. Require it and get what you need by name.

Server Script

local Engine = require(game:GetService("ServerScriptService"):WaitForChild("Engine"))

local TimeService = Engine:GetService("TimeService")
print("Engine is running, today is", TimeService:FormatIRLDate("%Y-%m-%d"))

LocalScript

local Engine = require(game:GetService("ReplicatedStorage"):WaitForChild("Engine"))

Press Play and you should see “Engine is running” in the Output. The Quick Start then takes you through saving player data, adding a currency and sending a validated remote in a few minutes.

What the plugin installs
ServerScriptService
└── Engine            ModuleScript: require this on the server
    ├── Loader        Script: starts Engine when the server starts
    ├── Configuration Folder: your settings
    └── MainModule    The engine itself (manual updates only)

When the server starts, Engine also creates ReplicatedStorage.Engine, the copy you require on the client. Keep Engine directly in ServerScriptService and don’t rename it.

Automatic or manual updates?

Automatic (recommended) Manual
Where Engine comes from Loaded from Roblox when each server starts A copy stored inside your place
New versions Every new server runs the newest version You update from the plugin when you want
Place size Small, only the shell is saved Contains the whole engine
Needs May need Allow Loading Third Party Assets Nothing

You can switch any time with Enable Auto-update or Disable Auto-update in the plugin, and your configuration is kept. More in Updates and Versions.

Changing settings

Every module has settings with defaults. To change one, add a ModuleScript named after the module to ServerScriptService.Engine.Configuration and return only what you change:

-- ServerScriptService.Engine.Configuration.EconomySystem
return {
	TradeTimeoutSeconds = 60,
}

Your settings stay through every update. See Configuration.


FAQ

Does Engine cost anything?

No. Engine is free and Arthonier takes no share of what your experience earns.

Can I use Engine in a game that makes money?

Yes, through Roblox’s own monetization features like passes, developer products, subscriptions, ads, paid access, private servers and avatar items. You keep everything you earn and can DevEx it as usual. See section 3 of the Engine License.

Where do I download Engine?

You don’t. Engine is never offered as a file, not on our website either. The plugin installs it inside Studio and automatic updates come straight from Roblox. If you see Engine offered for download somewhere else, it’s not from us.

Does Engine send data to Arthonier?

No. Engine has no telemetry. Everything it stores lives in your experience’s own DataStores. See Privacy.

Automatic or manual updates, which should I pick?

Automatic for most games: every new server runs the newest version and your place stays small. Pick manual when you want to test each version first, or when your game can’t load third-party assets.

Can I use Engine for commissions?

Yes, as long as Engine is only used inside that client’s experience, you only charge for your own work, and the client accepts the Engine License. See section 4.

Can I reupload, share or sell Engine?

No. Only Arthonier publishes Engine. You can change its settings and code for use in your own experiences, but you can’t upload it to the Creator Store, sell it, share its source or put it in kits, templates or uncopylocked places. The full terms are in the Engine License.

Engine says it could not load the published engine

Turn on Game Settings > Security > Allow Loading Third Party Assets, publish and test again. If it still fails, click Disable Auto-update in the plugin to switch to manual updates. More fixes in Troubleshooting.

My data doesn't save in Studio

Turn on Game Settings > Security > Enable Studio Access to API Services. Without it, DataService uses a temporary in-memory store that is cleared after every test.


Links


Feedback

Found a bug, an error when Engine starts, a plugin problem or a mistake in the docs? Use the report page and include the full Output message, your update model and the result of Engine:GetBootInfo(). That way we can fix it a lot faster.

Found a way to abuse Engine? Pick Security issue on the report page and leave your email. Please don’t post it here.

Questions and ideas are welcome in the replies.

:​)

5 Likes

The plugin got removed, and I’m currently appealing it.

1 Like

The plugin is back up again. Again, sorry for the inconvenience.

1 Like

sharing instagram link in devforum is so tuff

2 Likes

It is :​)​​​​​​​​​​​​​​​​​​​​​​

1 Like

Engine v1.1.0

Engine v1.1.0 is out, together with an update to the plugin. One change touches your code: GetService, GetSystem and GetPackage now return the module itself, so the :Api() step is gone.

-- v1.0.0
local DataService = Engine:GetService("DataService"):Api()

-- v1.1.0
local DataService = Engine:GetService("DataService")

Everything else works the same: a module loads the first time you get it, and every call after that returns the same table.

What to do

  • Automatic updates: new servers already run v1.1.0, so remove :Api() from your scripts and publish. Studio’s Find All / Replace All (Ctrl+Shift+F) does it in one go: replace ):Api() with ).
  • Manual updates: your game stays on v1.0.0 until you click Update to v1.1.0 in the plugin. Remove :Api() when you update.

A leftover :Api() shows up as Attempt to get DataService::Api (not a valid member) or attempt to call missing method 'Api' of table.

Plugin changes
  • Every install gets an EngineShellVersion attribute: the version of the shell the plugin put in.
  • The plugin recognises an install only by its EngineInstall tag or EngineMode attribute, no longer by the name Engine.
  • Automatic installs no longer get the EngineVersion and EngineAssetUpdated attributes, because they always run the newest engine. The plugin window shows the version from the Creator Store instead.
  • Installing, updating and switching update models show the busy cursor while Engine loads.

Engine Changelog | Plugin Changelog | Report a problem

1 Like

Plugin is down again after the first plugin update, sorry for the inconvenience.

1 Like

The plugin is up again! Sorry again for the inconvenience, Roblox moderation behaves weirdly sometimes.

1 Like

Engine v1.1.1

Engine v1.1.1 is out with three fixes. Your scripts keep working as they are, and the plugin is unchanged.

  • Engine:GetSystem("ModerationSystem") no longer errors in games that use TextChatService. It failed with ShouldDeliverCallback is a callback member of TextChannel; you can only set the callback value, get is not available.
  • ModerationSystem:UnmuteAsync, :UnbanAsync and :LiftAsync now resolve with the sanctions they lifted when the player is in the server. They resolved with an empty list, although the lift itself worked.
  • Reading NetworkService.OnServerInvoke or NetworkService.OnClientInvoke returns the function you set, or nil, instead of erroring.

One thing to know about the ModerationSystem fix: it now sets ShouldDeliverCallback on every text channel. Roblox doesn’t let scripts read a callback, so if your game sets its own on a channel, the two can’t run side by side and whichever is set last wins. Put your own message checks in ModerationSystem:AddChatFilter, or set ChatModeration to false in its configuration to keep your own callback. More in Chat moderation.

What to do

  • Automatic updates: nothing. New servers already run v1.1.1.
  • Manual updates: click Update to v1.1.1 in the plugin.

Engine Changelog | Plugin Changelog | Report a problem

1 Like

this actually might be a useful thing i found once in a blue moon :pray:
god bless you.

(havent used it yet at time of writing this but still this looks fire. would recommend.)
1 Like

Thanks a lot, really appreciate the kind words! No rush at all with trying it out.

I’ll keep it updated with the latest Roblox changes and I’m not planning on closing it anytime soon. If something breaks, I’ll try to fix it within 24 hours whenever possible.

Once you’ve tried it, let me know what you think, and feel free to drop any feedback or feature requests
:​)​​​​​​​​​​​​​​​​​​​​​​

1 Like