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.
Everything I've built, from web apps and games to API clients and Java experiments. 21 projects and counting.
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.
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.
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.
University group project
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.
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.
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.
University group project
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.
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.
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.
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.
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.
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.
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 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 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.
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.
University project
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.
University project
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 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.
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.
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.