AnS_DevContact
Color theme
← All work

Author · Independent

Twill

An open-source Luau framework for Roblox. Boot order, guarded networking, state replication, and session-locked player data.

Latest release
v2.1.2
License
MIT
Stars
2
Released
Oct 11, 2026

The problem

Most Roblox games rebuild the same infrastructure: boot order, remotes, player data, and cleanup. Popular options either need a toolchain (npm, Rojo, roblox-ts) or trust whatever the client sends.

The approach

Twill is two ModuleScripts, one per side, with every dependency bundled. No toolchain is required. Only Lifecycle behaves as a framework. Every other module is a library that works on its own and loads only when a game asks for it.

Networking that screens every call

A remote is declared once with its types. The server handler gets rate limits, schema validation, and a reply that always ends.

local Net = require("@game/ReplicatedStorage/Twill/Net")
local Types = Net.Types

return {
	BuyItem = Net.Declare("BuyItem", { Types.String(32) }, { Types.Boolean, Types.String(64) }),
}
Twill.Net.Handle(Remotes.BuyItem, function(player, itemId)
	local data = Twill.Data.Get(player)
	if not data then
		return false, "not ready"
	end

	local price = Catalog[itemId].Price
	if data.Coins < price then
		return false, "not enough coins"
	end

	data.Coins -= price
	table.insert(data.Inventory, itemId)
	return true, "bought"
end, {
	Rate = 4,
	Schema = { { "enum", table.unpack(Catalog.Ids) } },
	Reject = function()
		return false, "slow down"
	end,
})

Built to fail closed

  • Player data. A session-locked store with all-or-nothing migrations and a validation step that refuses bad saves.
  • Trade kit. Items are re-checked at the swap, tried on copies first, and both players are saved before the trade completes.
  • Proof. A suite of more than a thousand checks runs on every playtest, with a client half that exercises real two-sided paths.