Projects

Ongoing

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.

Pythonscikit-learnNLPSecurityMLRandom Forest
Ongoing

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.

PythonRustC++JavaBacktrackingCSP

$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!

Complete

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.

PythonLLMCLINLPGit
Ongoing

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.

Next.jsTypeScriptTailwindFramer MotionVercel
Marine Sensor Dashboard
Complete

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.

ElectronReactTypeScriptJestNode.jsMQTT
Exploring

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.

RustLinear AlgebraMachine Learning
Complete

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.

JavaScriptChrome ExtensionREST APIObsidianDOM Scraping
CityStars
Complete

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.

PythonDjangoJavaScriptCSSSQLite