Portfolio
Featured
2026
Rod and Reef
Story-driven Roblox fishing game with 530 quests across four islands. I'm its lead developer: I own the backend (player data, luck, quests, dialogues, seasons) and build UI. This page links to the technical article for each system.
Spray
Roblox ParticleEmitters drawn on the GUI with ImageLabels. Every particle is computed in closed form from a clock, so an effect can be paused, jumped and rewound, and the same seed always gives the same result.
More
2026
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.
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.
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.
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.
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.
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.
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.
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.
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.
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.
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.
Owake
Retro alarm clock, chronometer and digital clock for AVR. Built on a hierarchical finite state machine and a custom HD44780 LCD driver.
SolidCrystalI2C
High performance and easy to use modern driver for LCD displays based on the HD44780 controller. Runs on AVR/Arduino systems.
2024
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.
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.
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.
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.
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.
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.
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.
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.
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.
2022
Blocks Simulator: Rotate
The rotate tool turns a block around its own axes with arc handles and snaps the angle to the nearest increment. This article covers the order of multiplication that picks the axes, the rounding, why three numbers are enough for the server, and why the three angle fields are three different kinds of rotation.
Blocks Simulator: Color
The colour tool has a wheel, RGB, HSV and hex fields, five preset colours and an eyedropper, and paints whatever you click. This article covers the polar math of the wheel, why tinting the wheel's image is an exact way to show the value, how the fields stay in sync, and a few bugs, two of which cancel each other out.
2021
Blocks Simulator: Move
The move tool slides a block along its own axes in snapped steps of up to 255 studs. This article covers the one line that does it, why rounding up makes forward and backward asymmetric, a bug in the position fields, and what the May 2022 rewrite changed.
Blocks Simulator: Scale
The scale tool grows or shrinks a block from the face you drag and leaves the opposite face where it was, on rotated blocks too. This article covers the half-shift that makes it work, the six direction vectors, the snapping formula and the first version it replaced.
Blocks Simulator: Build
The build tool has a settings window with a live 3D preview and a ghost block that snaps to the grid against the face you point at. This article covers the attribute-based store behind the window, the preview, the snapping rule and why it ends up flush on some faces and overlapping on others, and how the server creates the block.