A fast, portable Entity Component System for Luau. https://ukendio.github.io/jecs/
Find a file
Laptev Stanislav f031dcee8d
docs(api): consolidate and clarify contains method documentation (#264)
Remove duplicate contains method section and update description to be more precise about checking both entities and components. Also fix example code references to use contains instead of has for consistency.
2025-08-10 18:12:50 +02:00
.github Optimize column access 2025-06-25 17:16:04 +02:00
addons Monitors and observers need to able to accept pair terms 2025-07-29 21:08:23 +02:00
assets Optimize column access 2025-06-25 17:16:04 +02:00
benches Recycle component records 2025-07-14 14:17:18 +02:00
demo Monitors and observers need to able to accept pair terms 2025-07-29 21:08:23 +02:00
docs docs(api): consolidate and clarify contains method documentation (#264) 2025-08-10 18:12:50 +02:00
examples Optimize column access 2025-06-25 17:16:04 +02:00
test Fix backwards edge traversal for exclusive relationships 2025-08-10 16:52:08 +02:00
thesis Optimize column access 2025-06-25 17:16:04 +02:00
tools Optimize column access 2025-06-25 17:16:04 +02:00
.gitattributes Optimize column access 2025-06-25 17:16:04 +02:00
.gitignore Optimize column access 2025-06-25 17:16:04 +02:00
.luaurc Optimize column access 2025-06-25 17:16:04 +02:00
.prettierrc Optimize column access 2025-06-25 17:16:04 +02:00
.stylua.toml Optimize column access 2025-06-25 17:16:04 +02:00
bench.project.json Optimize column access 2025-06-25 17:16:04 +02:00
CHANGELOG.md Improve relationship performance 2025-08-07 18:53:50 +02:00
default.project.json Optimize column access 2025-06-25 17:16:04 +02:00
jecs.d.ts Add rbxts typings for signals (#260) 2025-07-27 17:31:31 +02:00
jecs.luau Fix backwards edge traversal for exclusive relationships 2025-08-10 16:52:08 +02:00
LICENSE Optimize column access 2025-06-25 17:16:04 +02:00
mirror.luau Recycle component records 2025-07-14 14:17:18 +02:00
package-lock.json Optimize column access 2025-06-25 17:16:04 +02:00
package.json Fix backwards edge traversal for exclusive relationships 2025-08-10 16:52:08 +02:00
README.md Optimize column access 2025-06-25 17:16:04 +02:00
rokit.toml Optimize column access 2025-06-25 17:16:04 +02:00
tsconfig.json Optimize column access 2025-06-25 17:16:04 +02:00
wally.toml Fix backwards edge traversal for exclusive relationships 2025-08-10 16:52:08 +02:00

License: MIT Wally GitHub Actions Workflow Status

Just a stupidly fast Entity Component System

  • Entity Relationships as first class citizens
  • Iterate 800,000 entities at 60 frames per second
  • Type-safe Luau API
  • Zero-dependency package
  • Optimized for column-major operations
  • Cache friendly archetype/SoA storage
  • Rigorously unit tested for stability

Installation

With Wally:

jecs = "ukendio/jecs@0.6.0" # Inside wally.toml

With pesde:

pesde add wally#ukendio/jecs@0.6.0

With npm (roblox-ts):

npm i @rbxts/jecs

Example

local world = jecs.World.new()
local pair = jecs.pair

-- These components and functions are actually already builtin
-- but have been illustrated for demonstration purposes
local ChildOf = world:component()
local Name = world:component()

local function parent(entity)
    return world:target(entity, ChildOf)
end
local function getName(entity)
    return world:get(entity, Name)
end

local alice = world:entity()
world:set(alice, Name, "alice")

local bob = world:entity()
world:add(bob, pair(ChildOf, alice))
world:set(bob, Name, "bob")

local sara = world:entity()
world:add(sara, pair(ChildOf, alice))
world:set(sara, Name, "sara")

print(getName(parent(sara)))

for e, name in world:query(Name, pair(ChildOf, alice)) do
    print(name, "is the child of alice")
end

-- Output
-- "alice"
-- bob is the child of alice
-- sara is the child of alice

Benchmarks

21,000 entities 125 archetypes 4 random components queried. Queries Can be found under /benches/visual/query.luau

Inserting 8 components to an entity and updating them over 50 times. Insertions Can be found under /benches/visual/insertions.luau