Before you hire me

Check it yourself

Three things get asked before anything else: show me some code, who have you worked for, and can I trust you. Here are all three, and every answer ends in something you can open and read without taking my word for it.

Read the code

Public · MIT · runnable

Commission code belongs to the person who paid for it, so none of it is here. What is here is a piece of my own framework, published in full: the same modules I ship on, their tests, and nothing rewritten to look better for a website.

GitHub · public

roblox-ability-lifecycle

Ability and skill lifecycle, lifted out of the framework I ship commissions on.

  • 1,569 lines of Luau across 11 modules
  • 1,347 lines of tests, 7 spec files
  • Runnable: lune run tests/run-all.luau
  • MIT, my copyright, no client code in it
src/Skills/Shared/Lifecycle.luauRead the source
GitHub · public

VZNCore-Template

The ECS engine underneath it, as a project you can clone and run.

  • Open source, benchmarked against jecs
  • Every benchmark row published, wins and losses
examples/basic-movement.luauRead the source

Every input from a client is bounded before it is trusted

An exploiter sends a list of targets. Wrong type, empty, too long, duplicated, too many: each one is a return, not an assumption, and what comes back is frozen so nothing downstream can edit it.

src/Skills/Server/_Validation.luauLines 37 to 54 on GitHub
ValidationModule.NormalizeAudience = function(AudienceValue: Audience): Audience?	local ActorIds = {}	local Seen: { [string]: boolean } = {}	for _, ActorId in AudienceValue.ActorIds do		if type(ActorId) ~= "string" or #ActorId == 0 or #ActorId > 64 then			return nil		end		if not Seen[ActorId] then			if #ActorIds >= MAX_AUDIENCE_ACTORS then				return nil			end			Seen[ActorId] = true			table.insert(ActorIds, ActorId)		end	end 	return table.freeze({ ActorIds = table.freeze(ActorIds) })end

One broken ability does not take the rest down with it

Ability code is written per game, so the runner treats every call into it as something that can throw. The error comes back as a value the lifecycle can act on instead of unwinding through the server.

src/Behavior/Shared/Runner.luauLines 42 to 53 on GitHub
local function invoke(Callback: (() -> ())?): (boolean, string?)	if Callback == nil then		return true, nil	end 	local Ok, ErrorValue = pcall(Callback)	if Ok then		return true, nil	end 	return false, tostring(ErrorValue)end

I also publish the benchmarks for my engine against the fastest one on Roblox, including every row it loses. See the numbers

Who I have worked for

25 studios · 23 commissions

Not logos: live games, the peak player count each one reached, and the Discord where their community is. Every commission has video of the work actually running.

  • Anime Last Stand157,103peak players
  • Dragon Soul (NOVALY)28,000peak players
  • Anime Royale4,000peak players

41 public reviews, 4.96 out of 5. Printed in full and unedited, including the ones that are a single line. Ask me on Discord and I will put you in touch with any of them.

Read all 41

Can I trust you

Answered by the contract, not by me

The honest answer to this is never a promise, it is a structure. These four are true because of how the work is set up, and every one of them is written down in the agreement you sign before anything starts.

What if you take the money and run?

Every invoice is capped at $500, however big the project. A $1,500 build is three of them, each paid before that segment starts, so the most you ever have at risk at one time is $500 — not the project.

How invoicing works

When do I actually get the code?

From the first day of a segment. I work directly inside your codebase rather than in a place file on my machine, so the code is in your hands as it is written, not handed over at the end.

Before work starts

What if it is not what I asked for?

I quote from your design document and deliver against that document, so "what I asked for" is a written thing we can both point at. One consolidated revision list per milestone, 3 days to send it.

How it works

What if it breaks after you are gone?

You have 7 days after final delivery to report in-scope bugs. Those are fixed free. And you own what I script for your game once it is paid for; the framework under it is licensed to your game with no ongoing fee.

Delivery and ownership