[UPDATE] Vanguard - A Modular Framework for Roblox Developers

Vanguard is a modern, modular Roblox framework built for developers who want a scalable and maintainable foundation for their experiences.

Inspired by Knit’s familiar Service and Controller workflow, Vanguard keeps that structure while adding a more complete framework layer: structured lifecycle management, built-in networking, server-authoritative validation, registered classes, components, utilities, plugin support, and type-friendly APIs.

Whether you are building a solo project or a larger production experience, Vanguard is designed to keep your code organized, predictable, and easier to expand.



Links

Vanguard Documentation

Vanguard Source Code

Vanguard on Wally

0.1.15 Changelog

Vanguard-0.1.15.rbxm (58.2 KB)


Current Release

Vanguard 0.1.15 is now available.

This release adds:

  • Plugin Developer API
  • Replicator system for server-owned state trees
  • Network protocol 2
  • Remote kind metadata
  • Plugin and replicator error codes
  • Proper .rbxm release build support
  • Expanded documentation

Important: Vanguard 0.1.15 uses network protocol 2. Vanguard 0.1.14 uses protocol 1, so make sure both server and client are using the same installed package version.


Availability

Vanguard is currently available through:

  • Wally Package
  • Source Code via GitHub
  • .rbxm release builds for manual installation

A verified Roblox Toolbox release is still planned for a future update.


Why Vanguard?

Knit has been a staple of Roblox development for years, but many projects need stronger structure, clearer startup behavior, built-in utilities, and safer networking patterns.

Vanguard was created to provide a familiar development experience while modernizing the framework around scalability, documentation, lifecycle control, and server authority.

Familiar Workflow

Developers coming from Knit will find familiar concepts like Services, Controllers, lifecycle hooks, and client-facing service APIs.

Modular by Design

Vanguard encourages clean project organization through services, controllers, components, classes, utilities, and plugins.

Built for Scale

Vanguard includes lifecycle ordering, service priority, module failure isolation, logging, network validation, and typed APIs to support larger projects.

Developer Focused

Vanguard prioritizes readability, maintainability, documentation, and long-term project health.


Features

  • Service architecture
  • Controller architecture
  • Plugin Developer API
  • Replicator state system
  • Promise-based startup
  • Structured lifecycle hooks
  • Service priority
  • Automatic module registration
  • Module failure isolation
  • Built-in networking layer
  • Remote methods
  • Reliable signals
  • Unreliable signals
  • Replicated properties
  • Server-owned replicators
  • Network validation
  • Network authentication
  • Network verification
  • Rate limiting
  • Components system
  • Registered classes
  • Public, private, and static class members
  • Logging system
  • Error codes with documentation links
  • Cache utility
  • Promise utility
  • Math utility
  • Switch utility
  • Validator utility
  • Dependency-free core
  • Rojo support
  • Wally support
  • Type-friendly APIs
  • Familiar Knit-inspired workflow

Installation

Requirements

  • Roblox Studio
  • A Rojo project
  • Wally 0.3.x
  • Vanguard 0.1.15

Vanguard is dependency-free. All utility modules are included directly in the package.

Install with Wally

Add Vanguard to your project’s wally.toml:

[dependencies]
Vanguard = "twrblxdevs/vanguard@0.1.15"

Install dependencies:

wally install

Map the generated Packages directory into ReplicatedStorage:

{
  "name": "MyGame",
  "tree": {
    "$className": "DataModel",
    "ReplicatedStorage": {
      "Packages": {
        "$path": "Packages"
      }
    }
  }
}

Require Vanguard:

local ReplicatedStorage = game:GetService("ReplicatedStorage")
local Vanguard = require(ReplicatedStorage.Packages.Vanguard)

Quick Start

Recommended Project Layout

src
|- server
|  |- Bootstrapper.server.luau
|  `- Services
|     `- GreetingService.luau
|- client
|  |- Bootstrapper.client.luau
|  `- Controllers
|     `- GreetingController.luau
`- shared
   |- Classes
   |- Components
   `- Plugins

The exact folders are not required. Vanguard can bootstrap any Instance containing ModuleScripts.


Create a Service

local ReplicatedStorage = game:GetService("ReplicatedStorage")
local Vanguard = require(ReplicatedStorage.Packages.Vanguard)

local GreetingService = Vanguard.CreateService({
	Name = "GreetingService",

	Client = {
		Greeted = Vanguard.CreateSignal(),
	},
})

function GreetingService.Client:Greet(player, name)
	local message = self.Server:BuildGreeting(name)
	self.Greeted:Fire(player, message)
	return message
end

function GreetingService:BuildGreeting(name)
	return `Hello, {name}!`
end

function GreetingService:VanguardStart()
	self.Logger:Info("Greeting service ready")
end

return GreetingService

Start the Server

local ReplicatedStorage = game:GetService("ReplicatedStorage")
local Vanguard = require(ReplicatedStorage.Packages.Vanguard)

Vanguard.Bootstrap({
	Plugins = ReplicatedStorage.Shared.Plugins,
	Services = script.Parent.Services,
	Options = {
		LogLevel = "info",
	},
}):catch(function(err)
	warn(`Vanguard server failed: {err}`)
end)

Create a Controller

local ReplicatedStorage = game:GetService("ReplicatedStorage")
local Vanguard = require(ReplicatedStorage.Packages.Vanguard)

local GreetingController = Vanguard.CreateController({
	Name = "GreetingController",
})

function GreetingController:VanguardStart()
	local GreetingService = Vanguard.GetService("GreetingService")

	GreetingService.Greeted:Connect(function(message)
		self.Logger:Info(message)
	end)

	GreetingService:Greet("Builder"):andThen(function(message)
		self.Logger:Info(`Server returned: {message}`)
	end):catch(function(err)
		self.Logger:Warn(err)
	end)
end

return GreetingController

Start the Client

local ReplicatedStorage = game:GetService("ReplicatedStorage")
local Vanguard = require(ReplicatedStorage.Packages.Vanguard)

Vanguard.Bootstrap({
	Plugins = ReplicatedStorage.Shared.Plugins,
	Controllers = script.Parent.Controllers,
	Options = {
		LogLevel = "info",
	},
}):catch(function(err)
	warn(`Vanguard client failed: {err}`)
end)

New in 0.1.15

Plugin Developer API

Plugins allow extensions, diagnostics, project-specific tooling, and future Studio tools to hook into Vanguard through public APIs.

return Vanguard.CreatePlugin({
	Name = "DiagnosticsPlugin",
	Version = "1.0.0",
	Runtime = "Shared",

	Hooks = {
		ServiceRegistered = function(context, payload)
			context.Logger:Debug(`Service registered: {payload.Name}`)
		end,
	},
})

Docs:


Replicators

Replicators are server-owned state trees for larger structured state.

Client = {
	State = Vanguard.CreateReplicator({
		Phase = "Lobby",
		Score = {
			Red = 0,
			Blue = 0,
		},
	}),
}

Server code can update paths or patch state:

self.Client.State:SetPath("Score.Red", 1)

self.Client.State:Patch({
	Phase = "Active",
})

Docs:


Lifecycle

During startup Vanguard:

  1. Loads and registers ModuleScripts
  2. Runs plugin init hooks
  3. Builds networking infrastructure
  4. Runs VanguardInit hooks
  5. Runs plugin start hooks
  6. Schedules VanguardStart hooks
  7. Starts components
  8. Resolves the Bootstrap promise

This structured lifecycle makes startup predictable and easier to reason about.


Network Security

Vanguard includes a server-authoritative network guard pipeline for inbound remotes.

You can validate payloads, authenticate players, verify actions against server state, and rate-limit requests before service code runs.

This helps protect sensitive systems such as inventory, trading, purchases, matchmaking, profile loading, and other gameplay-critical logic.

Docs:


Roadmap

  • Core Framework
  • Service System
  • Controller System
  • Networking Layer
  • Components System
  • Classes
  • Utility Modules
  • Error Documentation Links
  • Plugin Developer API
  • Replicator System
  • Wally Distribution
  • Documentation
  • Roblox Toolbox Release
  • Additional Utility Modules
  • Expanded Examples
  • Studio Tooling
  • Community Contributions

Roadmap:


Contributing

Contributions, bug reports, feature requests, and feedback are welcome.

Contribution guide:


Feedback

Questions, suggestions, bug reports, and constructive criticism are appreciated.

If you use Vanguard in one of your projects, I would love to hear what works, what feels rough, and what you would like to see improved next.

9 Likes

I tried testing this out on a call with the developer of this thing and it was good.

2 Likes

Vanguard 0.1.14 is now available

Vanguard 0.1.14 has officially been released!

What’s new

  • Documented error codes with direct help links
  • New Math and Switch utilities
  • Public, private, and static class members
  • Improved lifecycle errors and diagnostics
  • Expanded network protocol documentation
  • Full Logs: Changelog - Vanguard Documentation

Update with Wally

Vanguard = "twrblxdevs/vanguard@0.1.14"
2 Likes

It’d be nice to include an rbxm file for it, not everyone uses wally and rojo.

1 Like

Oh i see in the roadmap, nvm im just blind

Question, why not go for a provider structure instead of controller/service?

https://medium.com/@sleitnick/knit-its-history-and-how-to-build-it-better-3100da97b36

This post explains how sleitnick would “build it better”

In general, a more modular/generalized structure for a module-wrapper would be better and the safety benefits of controller/service are usually just to cover beginner mistakes no?

Please correct me if I’m wrong!

1 Like

I am working on creating an rbxm version of the Framework, I coded the framework through rojo but hopefully will have one out in 0.1.15 along side anoter bigger update to the framework.

That’s a fair question. A provider-based structure is absolutely valid, and I agree with many of the points in Sleitnick’s post. I don’t think services/controllers are universally better or that providers are inherently unsafe.

Vanguard keeps the distinction because Roblox has a meaningful client/server trust boundary. Services represent server-owned state, authorization, networking, and game logic, while controllers represent client-owned input, UI, and presentation. That lets Vanguard provide predictable lifecycle ordering, clearer types, automatic networking behavior, and validation around where code is allowed to run.

The safety benefits also are not only for beginners. Explicit architectural boundaries can reduce ambiguity in larger projects and make unfamiliar code easier to navigate. A completely generalized provider system offers more freedom, but each project then has to establish and enforce those conventions itself.

That said, services and controllers should usually be thin composition roots. Reusable domain logic can still live in ordinary modules, registered classes, components, and utilities rather than being forced into one large service or controller.

I’m also open to supporting a generalized provider API alongside services and controllers if there is enough demand. The goal is not to claim that providers are wrong, but to give Vanguard a predictable default that fits Roblox networking and security while still allowing modular code.

2 Likes

Hey I’ve been recently wondering if there will be any update regarding vanguard thanks for the framework

Hi, I just started a new job and I work very late into the night. I will work on updating Vanguard when I can sorry!

this looks cool im also making my own entire frame work depending on each other or u can use them differently i love modular frame works

@AwakenShenron @Dar4Fra3me Do you guys have any suggestions on what could be added to Vanguard?

This looks alot like knit, but a set framework in 2026 is ehhh, in my opinion, people these days like to create their own stuff ykwim, but still cool

It’s a recreation of knit meant to improve and fix the issues that Knit has

Hello! Sorry for the super late reply, never ended up catching your reply :frowning:

I agree with everything. I also massively overstated the “fact” that a service/controller architecture is just for beginners. After trying to make a small game with my own very underdeveloped provider-centric framework I can confidently say it is atleast 10x easier to work with clear boundaries.

I will say though, personifying the open-ended/modular philosophy of provider-centric frameworks in other things like for example Bootstrapper | Make Your Own Framework In 5 Minutes | 100% Procedural Pipeline by @Clinkety (love you man) who created this framework in that open spirit.

Two things I rarely see are proper hot reloading for larger games, inter-changeable “globals” such a .Network for a bridge module for networking.

I agree with this reply on most points said Bootstrapper | Make Your Own Framework In 5 Minutes | 100% Procedural Pipeline - #25 by karl_dev1229

BUT, I do think frameworks that expand and loosen their constraints as much as possible are better then writing your own wiring for any project that isn’t absolutely minuscule.

I will take inspiration from your framework and many others to create my perspective on what a modern Roblox framework should be.

2 Likes

This is actually a very interesting system and I’m intrigued by it. I’ll definitely look into this for my future projects.

1 Like

Yes sir we’ll be waiting for new updates !!

Vanguard 0.1.15 is now released

As of 2026-08-06T16:04:28Z Github Actions and Pages are experiencing and outage meaning i am unable to publish the new documenation

Added in Vanguard 0.1.15:

  • Plugin Developer API
  • Plugin lifecycle hooks
  • Plugin priorities and dependencies
  • Plugin registry APIs
  • Replicator system for server-owned state trees
  • Replicator Set, SetPath, Patch, and per-player state APIs
  • Client replicator Get, Observe, and ObservePath
  • Network protocol 2
  • Remote kind metadata
  • New plugin error codes
  • New replicator error code
  • Proper .rbxm release build file
  • Expanded docs for plugins, replicators, and protocol 2

TO TRACK THE GITHUB OUTAGE GitHub Status - Incident with Actions

1 Like

Very glad to see this! I just have ONE complaint… It might be too bloated?

I mean obviously these are all very useful features/components but at the same time, the point of a modern Roblox framework is to create the outlets, not the plugs. And if you WANT to do that, make sure the plugs are completely optional.

I’m currently working on a very complex framework for that stated goal. I’m now the main developer for a very small game that I want to fly very high with and because of that, I want to make sure I can keep the game updated without debugging the framework everytime I need to do some magic.

THIS IS ALSO PURELY MY OPINION AND MY GENERAL KNOWLEDGE ON THE SUBJECT!

Overall,. this safety you’ve created and ease-of-use is 100% worth it for newer developers. This is basically as seamless as a framework can get without going into for example flamework-ts territory.

I would be very interested to see your framework and your approach.