Portfolio
⌕

Featured

More

2026
OpenRAHS
OpenRAHS
An open-source Luau library for the row of button hints in the corner of a Roblox game. It picks the glyph for whatever the player is holding, follows keyboard layouts and Input Action rebinds, never touches input, and draws through a frontend you can replace one event at a time.
LuauRobloxUIInput
Mastedore Standalone Unicycle
Mastedore Standalone Unicycle
A Roblox unicycle that lives in a single model and can be pasted into any game. It uses no VehicleSeat and no physical wheels: the player's Humanoid does the moving and a kinematic wheel model decides how.
LuauRobloxGameplayVehicles
Rod and Reef: Quests
Rod and Reef: Quests
The quest system of Rod and Reef: 530 definitions as data, one profile class running on both server and client, a prerequisite graph that survives disabled quests, quest slots derived from objectives and a difficulty estimate in expected casts.
LuauRobloxGameplayPython
Rod and Reef: Fishing Minigame
Rod and Reef: Fishing Minigame
Every fish in Rod and Reef is fought on a dial where a needle and a target spin in opposite directions. Difficulty comes from the rod against the fish's rarity and size, scoring is a tug of war, and the effects are drawn with Spray, my GUI particle library.
LuauRobloxGameplayUIVFX
Rod and Reef: Player Data
Rod and Reef: Player Data
How Rod and Reef stores each player's data in ProfileStore sessions, how the client gets a copy that stays current through an initial snapshot plus per-path changes, and how gifts travel between servers without getting lost.
LuauRobloxBackendDataStoreNetworking
Rod and Reef: Dialogues
Rod and Reef: Dialogues
NPC conversations in Rod and Reef are Luau tables that become graphs, are assembled in layers and are walked twice: once on the client to show them, and once on the server so nobody can collect a reward for a quest they were never offered.
LuauRobloxGameplayNetworking
Rod and Reef: Luck System
Rod and Reef: Luck System
Every cast in Rod and Reef goes through five rolls and several layers of luck: rod, bait, nearby friends, boat, multipliers, ceilings, pity and a nudge toward the fish your quests ask for. This article explains the math of each layer and how they compose.
LuauRobloxGameplayMath
Rod and Reef: Seasons
Rod and Reef: Seasons
45-day seasons counted from a fixed epoch, four leaderboards per season on OrderedDataStores and permanent titles for the top 50. No server coordinates with any other: the season is a function of the clock and closing it is an idempotent job.
LuauRobloxBackendDataStore
Rod and Reef: Subtitles
Rod and Reef: Subtitles
A Python pipeline that transcribes Rod and Reef's voice lines with OpenAI Whisper, works out which script line each improvised take is, writes word-by-word subtitles as Luau modules and uploads the audio to Roblox. In game, a clock-driven player shows them without drifting from the voice.
PythonLuauRobloxAudioUI
Rod and Reef: Ambient Barks
Rod and Reef: Ambient Barks
The protagonist of Rod and Reef comments on what you are doing as you play. Underneath there are several weighted state machines running in parallel, a catalog of 73 recorded lines and a director that decides when to speak without repeating itself.
LuauRobloxGameplayAudio
QueueService
QueueService
A FIFO queue for Roblox laid out on the map with numbered parts. It freezes players, walks them to their spot along a polyline and fills the line with NPCs so it always looks full.
LuauRobloxGameplay
Owake
Owake
Retro alarm clock, chronometer and digital clock for AVR. Built on a hierarchical finite state machine and a custom HD44780 LCD driver.
C++AVREmbedded
SolidCrystalI2C
SolidCrystalI2C
High performance and easy to use modern driver for LCD displays based on the HD44780 controller. Runs on AVR/Arduino systems.
C++AVREmbedded
2024
Sword Masters
Sword Masters
Round-based Roblox sword game I was contracted to rebuild from scratch in 2024: PvP, zombie hunts and a boss fight, a map vote between rounds, seven abilities and a rotating shop. This page links to the technical article for each system.
LuauRobloxGameplayBackendAI
Sword Masters: Abilities
Sword Masters: Abilities
Each Sword Masters player equips one ability out of seven. Every ability is a server module with the same four functions, and a handful of remotes lets the long ones ask the client for input halfway through, such as where to aim or when to fire.
LuauRobloxGameplayNetworking
Sword Masters: Ability Shop
Sword Masters: Ability Shop
The Sword Masters ability shop shows three offers drawn by rarity that rotate on a clock. The current offer lives in a DataStore and new ones are announced through MessagingService, so every server shows the same three.
LuauRobloxBackendDataStoreMath
Sword Masters: Boss
Sword Masters: Boss
The Mountain Guardian fight came from the earlier version of Sword Masters, and my job was to integrate it. It decides with several loops on independent timers, a set of attribute flags and countdown cooldowns, and it picks its attacks as a Markov chain that never repeats a move twice in a row.
LuauRobloxGameplayAI
Sword Masters: Dash
Sword Masters: Dash
Dash, the free ability every player starts with, throws you up to 50 studs forward. Under it there's an AlignPosition pulling the root towards a point ahead, an AlignOrientation locking the facing, and two ways to stop: touching an invisible marker at the destination or 0.4 seconds going by.
LuauRobloxGameplayPhysics
Sword Masters: Fireball
Sword Masters: Fireball
Fireball grows in your hand, lets you pick a spot within 75 studs and bend the arc by dragging the mouse, then flies along that arc one point per frame and explodes against the map for 80 damage.
LuauRobloxGameplayPhysicsMath
Sword Masters: Laser beam
Sword Masters: Laser beam
Laser beam shrinks your sword, pulls a laser out of your arm and fires it for eight seconds. You aim by turning the camera, the beam's length comes from a box cast against the map, and the hit volume is a box aligned with the beam, checked every frame.
LuauRobloxGameplayVFX
Sword Masters: Rounds
Sword Masters: Rounds
The loop every Sword Masters server runs: intermission, map vote, loading, teleport, countdown, the round and its rewards. It's a five-state machine driven by a table of handlers, one tick per second, inside a promise that restarts once before closing the server.
LuauRobloxGameplayBackend
Sword Masters: Zombies
Sword Masters: Zombies
The zombie hunts in Sword Masters spawn waves from eight enemy types. Each zombie chases in hops of at most 12 studs on top of SimplePath, re-plans at the end of every hop, and has a one-second watchdog that turns any silent pathfinding failure into a retry.
LuauRobloxGameplayAIPathfinding