Student & hobbyist developer building games, servers, bots, and everything in between. Arch Linux nerd, JVM enthusiast, and proud Hyprland ricer.
I'm Rhys (VardinsDev) — a student and self-taught developer who loves diving into projects just to see how far I can push them. Whether it's a Minestom multiplayer shooter, a pygame arcade game, or an Arduino gadget, I build things for the fun of it.
My daily driver is Arch Linux with Hyprland, Catppuccin Mocha everywhere, and JetBrainsMono Nerd Font because life's too short for ugly terminals. I rice my setup the way some people redecorate — obsessively.
On the JVM side I live in Kotlin and Java, mostly building Minestom servers and custom game mechanics. I pick up Python for scripting and GUI apps, and C++ for lower-level projects and graphics with Raylib.
I also contribute to open source — including a merged PR into the Minestom project itself.
A mix of games, servers, bots, and hardware experiments — built for fun, learning, and the occasional headache.
A fully-featured firearms library built on top of Minestom (Java 25). Custom weapon mechanics, recoil systems, ammunition, and hit detection — all designed as a reusable API for Minestom server developers. Ships with a dark pixel-brutalist GitHub Pages site and a complete wiki.
// hitscan raycast — Rifle.java Pos eyePos = player.getPosition() .add(0.0, player.getEyeHeight(), 0.0); Vec direction = player.getPosition().direction(); double i = 1.0; while (i <= 100) { Vec point = eyePos.asVec().add(direction.mul(i)); Player hit = isPlayerAtPosition( instanceContainer, point.asPos(), player); if (instanceContainer.getBlock(blockPos) != Block.AIR) { break; // bullet stopped by terrain } else if (hit != player) { HealthManagement hm = new HealthManagement(); hm.damage(hit, 25); if (hm.getHealth(hit) <= 0) hm.setKilledBy(hit, player); break; } i += 0.5; }
// shield-first damage — HealthManagement.java public void damage(Player player, double hitDamage) { double shield = getShield(player); double health = getHealth(player); if (shield < hitDamage) { double overflow = shield - hitDamage; health += overflow; // bleed into HP shield = 0; } else if (shield == hitDamage) { shield = 0; } else { shield -= hitDamage; } player.setTag(healthTag, health); player.setTag(shieldTag, shield); }
WW1-themed multiplayer Minestom shooter in Kotlin. Hitscan weapon handlers, custom health/boss bar system, team combat, PeaceTime toggle, MySQL/MariaDB persistence with dotenv credential management, and a branded AbyssLogger.
Arduino color sequence memory game using an RGB LED and physical buttons. Includes a full Wokwi circuit diagram and GitHub README. Hardware meets software in a satisfying little package.
A full-featured GTK4 Python todo app with Catppuccin Mocha theming, Discord webhook integration, bot token DM support, folder management, and auto-extraction of user mentions.
Contributing back to the projects I depend on the most.
Separated DataComponent from directly extending Codec<T> and StaticProtocolObject,
cleaning up architectural coupling in the protocol layer. Iterated on reviewer feedback including a field rename
from network to networkType.