Inventory · PROJECTS

Loot bag

SLOTS · 08 / 08

Everything I've built recently. Featured items are equipped up top, the rest are in the stash. Every tile is on GitHub, click through for code, readmes, and, where available, a live demo you can poke at.

EQUIPPED ACTIVE LOADOUT · 3 SLOTS
№01 ★ FEATURED

Lorentz Boost Grid

A real-time GLSL shader. You slide a boost, special relativity does the rest, and the world bends.

4th place at the Cambridge Graphics Competition 2026 (beaten by three frankly excellent people). No mesh, no rasterisation. Each pixel computes exactly where its ray would hit a Lorentz-boosted grid, and returns the right colour. Rapidity oscillates along the X-axis, γ drives both length contraction and an ambient colour glow. One GLSL file. Runs on Shadertoy.

GLSLGraphicsRelativity
№02 ★ FEATURED

StartHack × Zwick Roell

A weekend hackathon at St. Gallen: 48 hours, a materials-testing brief, one working prototype by Sunday night.

Team entry for the sponsor challenge at St. Gallen. The brief was about data workflows for industrial materials-testing rigs; we shipped a rapid-iteration prototype over the hackathon weekend. Coffee consumption: high. Sleep: negotiable. Public GitHub repo by Sunday night.

HackathonTeam buildIndustrial
№04 ★ FEATURED

BLINK 3D

First-person horror where your actual blinks control reality. Eyes open, you freeze. Close them, you move, but so do the things in the dark.

Open your eyes and the world stops; you turn to stone. Close them and you move freely, but so does whatever is hunting you. OpenCV reads real-time blinks from your webcam, Panda3D renders the 3D dungeon, five enemy types each have distinct chase patterns, layouts are procedurally generated, and there are three difficulty presets plus three run mutators for when the base game isn't making you anxious enough. Built for a game jam. Made me flinch at my own eyelids for a week.

PythonPanda3DOpenCV
🎒 STASH STORAGE · 5 ITEMS
№03

Altruism Engine

300 neural-network critters evolving over 3000 generations to answer one question: share food, or hoard it?

My high-school senior project. 300 agents across 3 species + 10 predators, each running a 10-hidden-layer feedforward net batched through torch.bmm so the whole ecosystem steps forward in a single GPU call. Two modes let me compare selection pressures directly: altruism (food split proportionally) vs. steal (largest agent takes everything). Top 10% breed, mutation rate 0.1, 3000 generations of watching tiny fish either get along or very much not.

PythonPyTorchEvolutionary Computation
№05

BLINK 2D

The 2D prototype before BLINK 3D got ambitious. Pygame, top-down, same "eyes open = paused" mechanic.

The top-down proof of concept before the 3D version took over my life. Procedurally generated houses across three floors, keyboard fallback if you'd rather not point a camera at yourself, crafting wheel, an AoE petrify pulse for when you're cornered, enemies with a suspicion meter, and a seven-level guided tutorial so new players don't immediately rage-quit.

PythonPygameGame Dev
№06

GitHub Blogger Agent

Paste a GitHub repo; get a report a manager could actually skim. Or chat with the repo like it's a slightly overworked senior dev.

Pulls up to 90 days of commits, categorises them by what they actually did (not just what the commit message claimed), feeds the real diffs to Gemini 1.5 Flash, and renders a stakeholder-ready report with a commit heatmap, language chart, prose summary. There's also a 'Dev-GPT' chat mode grounded in the README and commit history, which turns out to be suspiciously good at answering 'why does this file exist?'. Flask + Jinja2 + markdown-it-py on the rendering side.

PythonFlaskGemini
№07

Personal Job Autofill

A Chrome extension that fills job applications for me. Nothing leaves the browser. No servers, no analytics, no vibes-based data collection.

Manifest V3, fully local. Multi-profile support (different personas for different roles), custom keyword→value mapping when field labels are weird, a Fill Report tab showing what got filled / skipped / couldn't match, a Cmd-Shift-F shortcut, and a toolbar badge with a per-page field count. Fires React/Vue-safe focus/input/change/blur events so modern form frameworks actually register the fill. Every byte of data lives in chrome.storage.local.

JavaScriptChrome ExtensionMV3
№08

Viral Illness Dose-Response Model

Numerical model of a viral infection under medication. Euler's method + an IVT argument hand off the therapeutic dosing window in closed form.

Discretised ODE model of viral particle count vs. drug concentration, integrated with forward Euler on a 1-hour time step. An IVT argument over the simulation output pins the therapeutic dosing window to 10.2–10.3 million particles, which maps to ~24.25 µg/hour given 2.5%/hour kidney clearance. Three self-contained Python programs, one per model variant. One of the first projects where 'write the model, run it, read off the answer' clicked for me.

PythonNumerical MethodsPharmacokinetics

TIP · CODE IS WORTH MORE THAN ITS WEIGHT IN XP.