Hai! It’s very good that you are trying to learn more. Here’s some of the things I’ve learned over the years.
Metatables are powerful! They give tables custom behavior, defined by special functions called metamethods.
You probably saw evidence of developers using package managers like Wally. They allow Roblox modules and services to be always updated in your file system. Then, they usually use Rojo to sync the codebase back to Roblox. I personally do not like Wally because it doesn’t let you set where each package goes in the codebase. You end up requiring them from a constant Packages folder, which is unideal for organization. You can try making a module that just requires the package, but then you have to manually re-export and define all exported types. It’s a mess, and I don’t want to deal with it!
I also prefer Argon over Rojo, since it’s more developer friendly and has two-way syncing. There’s also Azul, RbxSync, Pesto, and probably a lot more. Script syncing is high demand! Roblox’s native script sync won’t be properly type checked since requires aren’t properly typed, and will very likely error when you use any linter or language server. A sourcemap.json file is needed to know the hierarchy of the game and fix those type errors, which these syncing solutions will provide.
There’s genuinely countless signal implementations. Here’s a good place to start! If you want to be absolutely sure of which module is best for you, you should benchmark them and check their documentation.
Signal Modules:
- Signal Certifications & Classes Guide
- [v1.2.1] NamedSignal — Name and define variadic parameters in your signals!
Benchmarking Plugins:
Ah yes, state machines!
- State machines // In-Depth Tutorial
- Pulse | Advanced, Modular, Finite State Machine (FSM)
- GitHub - Roblox/rodux: A state management library for Roblox Lua inspired by Redux
Similarly, reactive programming is very powerful! I use it in almost all my projects.
Fusion- How To: React + Roblox
- Seam - A reactive state library with rich functionality (for UI, gameplay mechanics, and more)
Promise implementations are very important if you’ve dealing with messy asynchronous or error-prone logic. Returning a Promise means returning a value that will be ready in the future, making it a lot easier to deal with. You could use it for so many different things, such as caching and loading user data predictably, loading an image, returning the result of a pending Http request, etc. Like Signals, there are many different implementations people have put together. Find the one that’s right for you or make one yourself!
- Promises and Why You Should Use Them
- GitHub - evaera/roblox-lua-promise: Promise implementation for Roblox
There’s many ways to do this. Here’s some solutions from beginner to expert:
- ObjectValues
- Raw RemoteEvents, RemoteFunctions
- Networking modules
- Optimized replication modules (Replica)
Currently in Studio Beta:
- Attributes (using server authority + client-sided prediction)
Currently I’m using attributes and server authority. Server authority is in a studio beta, and should release Early 2026. Source
I personally believe class implementations are not for Luau. Generally use object oriented programming (OOP), data oriented programming (DOP), or an Entity Component System (ECS) instead!
Modular frameworks are quite popular, but I personally don’t know of one that is worth implementing. For me, it would need to support the new type solver, be type safe, and optionally support external IDE + GitHub workflows.
Generally, if you use less memory, your systems will be faster. For example, instead of using floats to store RGB values, use buffers! Buffers provide low level access to bytes, allowing you store as little as 1 byte to store one 8-bit integer, rather than 32/64 bits. For each color channel, only 1 byte is necessary, so you can save a lot of memory! And when you save memory, you speed up everything.
Reducing calls and/or batching work into less calls also help speed up your code slightly, which may turn into a big performance boost at scale!
Parallelism also allows you to execute threads simultaneously on different CPU cores, speeding up specific classes of tasks!
- ActorGroup2 | Asynchronous parallel luau made easy
- https://create.roblox.com/docs/scripting/multithreading
Parallelizer - A Lightweight Buffer-Based Parallelism Solution
You should start unit testing everything! They will help you catch bugs and build confidence that your systems are still working when you make a change.
- YOU, yes YOU need more tests!
Avant - Unit Testing Plugin (paying is encouraged, not required)- GitHub - dphfox/tiniest: A minimal, portable testing library for Luau
GitHub - Roblox/testez: BDD-style test and assertion library for Roblox Lua- GitHub - Roblox/jest-roblox: Delightful testing for Luau. This is a read-only mirror.
Additionally, if you use UI libraries like Fusion or Iris, you should consider writing stories! Stories are like unit tests for reusable UI components. They’ll help you create, test, and debug your components!
UI Labs - Modern Storybook Plugin for Roblox- GitHub - flipbook-labs/flipbook: Storybook plugin for Roblox UI
Always trying to find better ways to do things, like you’re doing now, has helped me a lot. Don’t be afraid to try new things, and don’t be afraid of learning tooling, workflows, or other people’s perspectives.
Designing and unit testing sub-systems first will also greatly help you. That’s called top-down design! And before even that, always plan out the prototype of your project.
Prototyping a project before fully polishing it will definitely help you. The sooner you get something usable out there for your testers, the sooner you can get feedback and bug reports. And maybe the idea was a bust… with a prototype you don’t waste too much of your time.
When making any project, always consider the user experience. Whether the user is the player of an experience, a developer using a plugin, or a developer trying to use a library, good UX goes a long way!
You’re not alone, it can definitely be hard sometimes to read other people’s code. See their documentation or example uses if they’re provided. Learn how their code works top-down (more independent systems first). It’s a lot easier to do that rather than to learn everything all at once, not knowing how anything works to begin with.
Be proactive! If you have an issue, need to learn something, or need a new tool, find a solution! As an example, I was getting irritated of testing string patterns with the command line. The plugins that already made an attempt at solving this were not great, so I made my own.
This has helped me a lot! And if you polish your tool and it’s not too niche, you should consider releasing it so you can help other people. I have many ideas for Resources and I plan to do some of them this year. Maybe you could make use of them? ;3
By default, Roblox doesn’t compact the data you send between clients and servers much, because that data could be anything. But when you use a networking module like Packet, you can greatly optimize your network! Packet for instance, serializes requests and responses using buffers, saving only the necessary bytes to get the job done. This reduces memory usage and significantly improves bandwidth, way better than raw RemoteEvent usage could accomplish. Also consider Sera, just a serialization library that can be used for anything.
Let me know if you have any more questions! ![]()


