Back to portfolio

Projects

Everything I've built, from web apps and games to API clients and Java experiments. 21 projects and counting.

2026

06 projects

Ring of Fire

A real-time Ring of Fire drinking game for when nobody brought a pack of cards. Everyone joins on their own phone with a 4-letter code, and the app deals the cards and tracks mates, rules and the King's Cup.

  • React
  • TypeScript
  • Web Sockets
  • Workers

SkiteScore - Scottish Prem Tracker

A real-time Scottish Premiership statistics platform providing live scores, league tables, team and player analytics, and match predictions. Built on a cached Sportmonks API proxy.

  • React
  • Vite
  • Tailwind CSS
  • API

Breakle

A Wordle-style guessing game for Prison Break fans. Guess the secret character in as few tries as possible, using colour-coded clues for gender, nationality, status, first appearance, relation and episode count.

  • HTML
  • CSS
  • JavaScript
  • JSON
University group project

Quasinumbers

Python library for Quasinumbers, a custom modular number system. It tests algebraic properties like associativity and distributivity, benchmarks list against iterator approaches, and has interactive visualisations.

  • Python
  • Matplotlib
  • Numpy
  • Jupyter

Thread-Safe Blocking Stack in C

Thread-safe, generic fixed-size stack in C. A blocking wrapper uses POSIX mutexes and counting semaphores to coordinate producer and consumer threads without deadlock. It includes unit tests and a Makefile build.

  • C
  • Concurrency
  • Stack
  • POSIX Threads

Order Simulator

A restaurant ordering simulator. Browse JSON-driven menus for several venues, each with its own look, then add dishes to a basket and review your order. Built from scratch with no frameworks or dependencies.

  • HTML
  • CSS
  • JavaScript
  • JSON
University group project

Expression Quest

A Haskell terminal puzzle game: combine given numbers and operators to hit a target value. Features a custom expression parser and evaluator, difficulty-tiered level packs, random level generation and QuickCheck tests.

  • Haskell
  • Cabal
  • QuickCheck
  • Parser

DPLL SAT Solver

A SAT solver written in C that implements the DPLL algorithm. It uses unit propagation and backtracking search to decide satisfiability of CNF formulas, and includes a DIMACS parser and custom clause ADTs.

  • C
  • DIMACS
  • Shell
  • Make

Bad Movie Plots

Guess the film from a deliberately terrible plot summary. Search with autocomplete, take a hint for half points, and chase a high score saved in your browser. Film-strip styling, mobile-friendly, no frameworks.

  • HTML
  • CSS
  • JavaScript
  • JSON

2025

13 projects

Ticket Chief

A ticket-queueing web server built from raw sockets in Java. It has a two-stage waiting-room queue, a multithreaded HTTP handler, a polling vanilla JS frontend, and HMAC-signed tickets to prevent forgery.

  • Java
  • Sockets
  • JavaScript
  • Multithreading

Sorting Complexity

Empirical analysis of Merge, Quick, and Selection Sort. A Java benchmarking harness times each algorithm on average and worst-case inputs, and Python plots the results to compare them against theoretical complexity.

  • Java
  • Python
  • Algorithms
  • Visualisations

The Pixel Preservation Project

A retro game catalogue built with vanilla JavaScript. Add, edit and delete entries across NES, SNES, PS1, PC and Amiga, with live title search, sorting, input validation and duplicate detection.

  • HTML
  • CSS
  • JavaScript
  • CRUD App

Stacks and Queues

Java implementation of a double-ended stack sharing a single array, plus a FIFO queue built from two stacks. Uses interfaces, a factory pattern, custom exceptions and JUnit tests to verify correctness.

  • Java
  • Data Structures
  • JUnit
  • OOP

Simple TCP App

Java client/server pair using TCP sockets to run a custom CB radio-style protocol. The server is a finite state machine that validates each message, resends its last reply on bad input, and serves the current time.

  • Java
  • TCP Sockets
  • Finite State Machines

FSA Implementation through TDD

Java implementation of a finite state automaton, built test-first with JUnit. It has a clean interface, custom exceptions for invalid states and bad input, and a full test suite. It was a university assignment on TDD.

  • Java
  • TDD
  • JUnit
  • Finite State Automata

Animal Photos

Desktop app that fetches random dog, cat, fox and duck photos and GIFs from public REST APIs. Built in Java 21 with a Swing GUI, the built-in HttpClient and JSON parsing, and packaged as a macOS .dmg installer.

  • Java
  • Swing
  • REST API
University project

Nonograms

Java Nonograms (Picross) game with a GUI, black-and-white and colour puzzles loaded from JSON, undo, save/load, and a live solution checker. It also has a clue-based solver and a validating puzzle parser.

  • Java
  • Swing
  • JSON
  • Puzzle
University project

Brickbreak

Brick Breaker game built in Processing (Java) with three levels, progressive ball speed, power-ups and power-downs, moving obstacles, a lives system and a persistent file-based leaderboard.

  • Java
  • Processing
  • Games

JDBC

Java movie database app built with JDBC and SQLite. Includes a normalised schema with an ER diagram, CSV-driven setup scripts, a command-line tool for six queries, JUnit tests and Javadoc.

  • Java
  • JDBC
  • SQLite
  • JUnit

Before 2025

02 projects

EAFC Higher or Lower

A Higher/Lower guessing game built on EA FC 24 player cards. Use hints to guess whether the next card's stat is higher or lower. Includes user accounts, a top-10 leaderboard and SQLite storage.

  • Livecode
  • SQLite

Siege Clip Hub

Static, responsive hub for browsing a Rainbow Six Siege clip archive by year and season. It has animated CSS gradient backgrounds, per-season banner art, and cloud-drive links.

  • HTML
  • CSS