Projects
personal projects and some university projects, newest first.
2026
Deep Q-learning on Atari BreakoutQ-learning from Frozen Lake, scaled up to raw pixels with a convolutional network, a replay buffer and a target network, following the DQN paper. The agent beats the human reference score after one million steps.
Reinforcement learning · DQN · PyTorch · Gymnasium · Atari
Learning to plug in a network cable with imitation learningA low-cost SO-101 arm with millimetres of play learns a sub-millimetre task, plugging an SFP+ cable into a network card, from demonstrations, ACT and DAgger.
Imitation learning · ACT · DAgger · LeRobot · PyTorch · SO-101
- Reinforcement learning fundamentals
Working through Sutton and Barto with small experiments, a 10-armed bandit and tabular Q-learning on Frozen Lake, including an interactive demo.
Reinforcement learning · Q-learning · Python · Gymnasium · NumPy
Marching cubesFrom a formula to a triangle mesh. A Java implementation of marching cubes, explained step by step with an interactive 2D version of the algorithm.
Java · Computer graphics · Geometry
Software rendering pipelineHow a 3D model becomes pixels. A Java/Swing renderer that takes OBJ meshes through every stage of the rendering pipeline by hand, with an interactive version to step through.
Java · Computer graphics
2025
CPU GLSL shader rendererA GPU fragment shader, run on the CPU in plain C++. Vector types that mimic GLSL, a nested loop over the pixels and raw PPM files, with no graphics API and no image library. Includes an interactive version to trace a single pixel.
C++ · Computer graphics
RaydarFinding a flying object in 3D from several ordinary 2D cameras. Moving pixels become rays, the rays are walked through a sparse voxel grid, and the voxels where rays from different cameras meet mark the object.
C++ · Computer vision · Eigen · Blender
Sim2real ball balancerA plate on three stepper motors that should keep a table tennis ball in its centre, controlled only through a camera. A PPO policy learns the task from pixels in Isaac Lab, and a C++ pipeline on a Raspberry Pi runs it on real camera images. It works in simulation, the transfer to the hardware is not finished.
Reinforcement learning · Isaac Lab · PPO · C++ · ONNX · Raspberry Pi
Pill sorting machineA machine that sorts pills by colour, built in a team of three on an MSP430. Event-driven firmware in C with a colour sensor, two servos and an LCD on one I2C bus, and an interactive model of its state machine.
C · MSP430 · I2C · Embedded
Real-time object detection in the browserYOLOv11n running client-side on the live webcam feed with ONNX Runtime Web and React, from camera frame to bounding boxes.
YOLO · ONNX Runtime Web · React · TypeScript
MSP430 robotic armA robot arm that copies a small hand-held replica of itself. Four potentiometers, an MSP430 and a PCA9685 servo driver, with interrupt-driven ADC and I2C firmware in plain C, and an interactive model of the signal chain from knob to servo.
C · MSP430 · I2C · Embedded
2D raytracerA small C++ and SFML program where a draggable sun sends out 360 rays. Shadows are never computed, they appear wherever no ray arrives.
C++ · SFML · Computer graphics
Handwritten digit recognizer in C++A neural network written from scratch in C++, without any ML library. Forward pass, backpropagation and training on MNIST explained step by step, with the trained network running in the browser.
C++ · Neural networks · MNIST · OpenCV