Shihaab
Alam

Second-year CS student at Aston University, working on ML systems and research engineering. I build, I experiment, and I write about what actually works (and what doesn’t).

Birmingham, UK · Open to 2027 placements and internships in data science, ML and software engineering

I’m Shihaab. I like building systems, testing ideas properly, and documenting when they don’t work.

Three projects so far: continual learning research with an agent that plays Celeste, a statistical look at every official speedcubing result, and a Windows app for gaming with a controller.

Selected work

#001

Celeste RL

Continual reinforcement learning research using Celeste: how much of one room an agent forgets when it learns the next.

I built a Python environment, with a small C# plugin, that runs the game at about 2,600 frames per second through its real controls. On it, I taught an agent Room 1, then Room 2, and measured what it lost along the way.

Under the standard PPO recipe, learning Room 2 cut Room 1 success by 37 to 56 points in every lineage. Two variants lost far less without doing worse on Room 2. The evidence is descriptive, from four lineages, and the technical report says exactly what it can’t show.

the agent playing Room 1
Room 1 at real speed, then at one third speed. Left: the game state the agent reads. Bottom right: the buttons it presses.
2,600 fpsabout 85× faster than the existing interface
87% → 6%median share of Room 1 skill lost learning Room 2: standard recipe against the donor anchor
469unit tests, plus live checks against the running game
926 / 926frames reproduced exactly against normal-speed play
Python PyTorch Gymnasium C# / .NET Reinforcement learning (PPO) Continual learning Experimental design and statistics
2026 · in progress
#002

WCA Analysis

A model with r² ≈ 0.95 was still wrong by years.

An analysis of the complete World Cube Association results export, every official speedcubing competition and competitor on record, testing claims that look obvious until you check them.

  • An exponential trend fit the 3x3 world record with r² ≈ 0.95, yet every version of it called the sub-3-second record 2.5 to 4+ years too early.
  • A simple home-versus-away comparison is confounded, because people who travel to compete are more dedicated. Comparing about 13,900 competitors against themselves, they do better away from home (p = 1.3e-67).
  • Found two bugs in loading the raw export, duplicate competitor rows and mixed-type event IDs, and pinned both with tests that run in CI.
Python pandas SciPy Matplotlib Jupyter pytest
wca-analysis
Chart of the 3x3 world record single from 2003 to 2026 on a log scale. An exponential trend fitted with r squared 0.95 crosses 3 seconds in June 2023, but the record actually went below 3 seconds, to 2.76, in February 2026: 2.6 years later than the model predicted.
#003

DualSense Quick Menu

A PS5-style control centre for Windows.

Press the PS button on a DualSense mid-game and an overlay opens for Spotify, volume, switching apps and power, without putting the controller down. In closed alpha with testers.

  • Input latency. In CPU-heavy games, presses waited 50–100 ms for CPU time. Raising the controller threads above the game’s priority fixed it.
  • Windows. A controller-driven Alt-Tab built from the live window list, a global shortcut, and a tray app that can start with Windows.
  • Spotify. Browsing and playback on a worker thread, so the overlay never waits on the network.
  • Shipping. Every build runs the tests, packages with PyInstaller, then self-tests the finished exe before it’s zipped.
Python PySide6 pydualsense Spotify API PyInstaller
2026 · alpha View on GitHub
dualsense-quickmenu
The DualSense Quick Menu overlay open over Rocket League: a Now Playing card showing the current Spotify track and album art, a Switch App card, and a row of tray icons for home, music, sound and power.
how a button press reaches the overlay
Architecture diagram. The DualSense sends raw HID reports over USB at about 125 Hz to an HID read thread, then a poll thread that samples every 8 ms and turns state into presses; both run at THREAD_PRIORITY_HIGHEST, above a game's normal-priority threads. A Qt signal passes presses to the Qt main thread, which draws the overlay and never waits on the network. Spotify calls go to a worker thread that talks to the Spotify Web API over HTTPS with PKCE OAuth. Under full CPU load, input had waited 50 to 100 ms for a turn, while the app's own work took under 7 ms.

Writing

#001 · In progressMy personal history with AI

Contact me

shihaabalam [at] gmail.com