Projects
Machine Learning
Password Strength Evaluator
Jan 2026
A defensive password-strength checker that uses statistical patterns from leaked datasets. Combines entropy analysis, pattern detection and ML models to estimate password predictability - without storing or cracking passwords.
What I learned
Working with the RockYou dataset exposed how predictable human password choices really are. Feature engineering for text-based ML is harder than it looks - defining what makes a pattern took longer than building the model itself.
Challenges
Balancing recall vs precision for weak password detection. If I rebuilt this I'd spend more time on the feature pipeline before touching the model.
Algorithms & Languages
Multi-Language Sudoku Solver
Oct 2025
An exploration of Sudoku solving across Python, Rust, C++ and Java and more. Implements backtracking, constraint propagation, and stochastic algorithms across both 9x9 and 16x16 grids - then benchmarks the results across languages.
What I learned
This is my first venture into Rust and wanted to tackle the challenge head on. Learned many new ways of algorithmically solving a Sudoku.
Challenges
Getting file handling to work in my first Rust project was a struggle, as well as restructing the entire repo for better future use.
$python auto-git-commit/main.py
Changes to be commited:
modified: components/projectCard.tsx modified: lib/projects-data.tsx new file: public/barge.jpg new file: public/cityStars.jpg
SUBJECT:
Add cityStars images to project card
Description:
Two new JPG files, `public/cityStars.jpg` and `public/barge.jpg`, have been added to represent projects within the component. The changes were committed as part of updating the project data for better representation in UI components.
PROCEED? [Y/n]
y
Commit created successfully!
Developer Tooling & ML
Git Auto-Commit
Feb 2026
A CLI tool that generates commit messages from git diffs - started with heuristic rules, then upgraded to a local LLM for deeper understanding.
What I learned
Heuristics got me 80% of the way surprisingly fast. The LLM upgrade was less about accuracy and more about message quality - the basic version was correct but robotic.
Challenges
Getting the LLM to produce concise, conventional-commit-style messages without hallucinating context that wasn't in the diff. Originally had a example in the LLM prompt, the LLM however just return this example everytime.
Web Development
Portfolio Site
Nov 2025
This site - built with Next.js 15, TypeScript, Tailwind v4, and Framer Motion. Designed from scratch with a focus on typography, motion, and a consistent design system.
What I learned
Everything in this site was a new experience to me. I learned about API keys through the Spotify widget. This was also my first introduction to Tailwind and Next.js, on top of this hosting the site through vercel and connecting to my remote Github repo was a new challenge. I've learned a great deal of important and useful web skills through this project.
Challenges
Maintaining a consistent design system across components without a UI library. Choosing what elements go where whilst keeping a users journey in minc. The challenge of making the site look good on both desktop and mobile was harder than I orignally thought.

UofG Team Project - Systems & Data Visualisation
Marine Sensor Dashboard
Sept 2025
A cross-platform desktop application built for Malin Group to monitor and visualise live marine sensor data during heavy marine lifts. Built with Electron and React, the app ingests real-time telemetry and presents it through an interactive dashboard designed for field operators. IP was bought so no longer have rights to code.
What I learned
Electron's split between main and renderer processes forces you to think carefully about where logic lives. Writing tests for a desktop app with real hardware dependencies taught me more about mocking strategy than any course. As the Product Manager, I was in the customer facing making and leading 5 sprint meetings with the team and Malin the duration of the project, this taught me time management skills and reinforced my presentation skills by clearly articulating our monthly work.
Challenges
Coordinating a team of five across a shared Electron/React codebase without stepping on each other - merge conflicts were a constant. Getting Electron packaging right, from icon resolution to app path handling, took longer than expected for something that felt like it should be trivial.
Neural Network
Rust Neural Network
Mar 2026
To better understand how neural networks work, I challenged myself to build a simple neural net from scratch in Rust, meaning no external libaries or crates. This meant creating my own Matrix struct and implementing all the basic functions for simple lin alg to then build up to more complicated parts such as, activation and loss functions. This project is still in early development.
What I learned
I'm learning a great deal of Rust as this is my first major project utilising it. I'm learning more in depth about the behind the scenes of common ML libraries by implementing it myself.
Challenges
Working with systems/ Rust concepts such as borrowing has been challenging along with sytanx differences from other languages.
Chrome Extension
Claudian
Mar 2026
A Chrome extension that scrapes markdown artifacts generated by Claude and saves them directly to an Obsidian vault via the Obsidian Local REST API, enabling a seamless AI-to-notes workflow.
What I learned
Having never built a Chrome extension before, I learned how Manifest V3 works - including content scripts, message passing between the popup and page context, and securely handling API keys in a client-side environment. I also got hands-on experience with the Obsidian Local REST API and how to integrate it with a browser extension.
Challenges
The trickiest part was getting Chrome to communicate with Obsidian's local HTTPS server - the self-signed certificate caused fetch requests to fail silently until I traced the issue and configured Chrome to trust the local origin. Scraping the artifact content from Claude's React-rendered DOM a lso required careful inspection to find stable selectors, and converting the rendered HTML back to clean markdown with Turndown needed custom rules to preserve tables and heading styles.

Full-Stack Web Development
CityStars
Mar 2026
A city review and social platform built with Django. Users can browse ratings and reviews for cities, follow other users, publish their own reviews through a personalised feed and chat in real time to friends. Cities are ranked dynamically based on aggregated user ratings.
What I learned
Django's ORM and auth system get you a long way fast - user authentication, profile management, and relational data modelling were all far less painful than building them from scratch would have been.
Challenges
Designing the data model to support both city rankings and a social follow graph cleanly. Getting the feed logic right - filtering posts by followed users while maintaining a coherent ranking system - required more careful query design than expected.