Hi, I'm Kohl.

I create libraries and developer tooling with minimal overhead and clean ergonomics.

I started programming in 2008 trying to figure out how MMORPGs worked so I could build my own. That obsession quickly led me down the rabbit hole of game modding, network protocols, and systems programming.

Open-source work

Core libraries, protocols, and workflow tooling for Luau, Roblox, and GitHub

Luau reactivity benchmarkheadless luau 0.746 -O2 · per-bench process isolation · normalized per row to the fastest (shorter = faster)1×2×4×6×8×10×relative time (lower is faster)OVERALL · GEOMETRIC MEANover 23 of 23 rows · DNF charged the 8s per-run deadlinekohltastrophe/flux0.4.01.02×centau/vide0.4.11.86×littensy/charm0.11.12.65×roblox/signals0.9.02.83×elttob/fusion0.3.018.55×Port of milomg/js-reactivity-benchmark · normalized per row to the fastest framework (1.0×, shorter = faster) · process-isolated, upstream's warm-ups and fastest-of-N (cellx: mean).Faded bars exceed 10× (true multiple labeled) · every non-finishing run (DNF) is charged the 8s per-run deadline in the geomean.Run-to-run noise is about ±10% even with fastest-of-N and several passes, so treat smaller gaps as ties.

Schematized binary buffer serializer for Roblox Luau. Packs dictionaries, bounded lists and maps, varints, bit-packed booleans, and quantized vectors or CFrames into a pre-allocated scratch buffer with schema migrations and safe deserialization.

local Player = Z.schema {
	Name = Z.str8,
	Health = Z.u8,
	Position = Z.Vector3i16,
	Bag = Z.schema8 { [Z.u8] = Z.u8 },
}

local buf = assert(Z.ser(Player, data)) -- 21 B vs 100 B JSON
local copy = Z.des(Player, buf)

Generates VitePress documentation sites from Luau modules and .d.luau declarations. Evaluates module exports, reads type annotations and plain doc comments with zero required tags, links every type to its declaration, and emits llms.txt and JSON API indexes.

--[[ Creates a state holding `initial`. ]]
function Flux.state<T>(initial: T?): State.State<T>
	return State.new(initial)
end

return Flux -- public API & types extracted automatically

Sert

Testing and deterministic simulation toolkit for Luau and Roblox. Combines unit specs, byte-tape property shrinking, stateful models, headless DataModel and multi-server fault simulations across Luau, Studio, and Open Cloud with dual-solver type probes, LCOV floors, and mutation testing.

local sert = require("@sert")

sert.prop("string.rep length", function(g: sert.GenContext)
	local s, n = g:string(), g:int(0, 20)
	sert.eq(#string.rep(s, n), #s * n)
end)

HyperLogLog

HyperLogLog++ cardinality estimator for Luau that counts distinct numbers, strings, and buffers in at most 16 KB of register memory (~0.81% standard error). Starts in a compact sparse buffer for small sets and supports binary serialization, cloning, and cross-server merging.

local hll = HyperLogLog.new(14) -- 16 KB dense max
for userId = 1, 10_000 do
	hll:add(userId)
end
local saved = hll:serialize()
print(hll:estimate()) --> ~10000

Release

Zero-dependency node24 GitHub Action and CLI that validates Conventional Commits, maintains standing release pull requests, formats Keep a Changelog notes, and publishes GitHub Releases with SHA-256 checksums across npm, Cargo, Python, Wally, pesde, and Rotriever.

- uses: kohltastrophe/release@v1
  with:
    publish: true # release PRs, notes, and GitHub Releases
    checksums: true
    major-tag: true

Sponsors

Zero-dependency node24 GitHub Action, CLI, and Cloudflare Worker relay that renders light/dark sponsors.svg walls and CTA badges from GitHub Sponsors, Ko-fi, and OpenCollective. Deduplicates cross-platform supporters and commits rolling state to an orphan badges branch.

- uses: kohltastrophe/sponsors@v1
  with:
    token: ${{ secrets.SPONSORS_TOKEN }}
    branch: badges # publishes sponsors.svg & CTA cards
    featured-threshold: 25