Projects

Plant Care Assistant

Plant Care Assistant

Full-stack plant management and social networking app, built collaboratively as my RNCP certification project.

Features plant tracking with care scheduling, a social feed with posts/comments/likes, and Supabase authentication.

Prisma handles schema and type-safe queries; Docker containerises the full stack; Playwright covers E2E testing; GitHub Actions runs CI/CD.

ReactTypeScriptNext.jsTailwind CSSDockerSupabasePrismaJestPlaywright

Forum Frontend

Forum Frontend

React/TypeScript SPA built with Vite, consuming the forum REST API from Forum Backend.

Features JWT authentication via AuthContext, a markdown editor for post creation, category and thread browsing, and SCSS styling. User profiles with custom avatar uploads.

Vitest tests cover the auth flow and core components.

ReactTypeScriptSass

Forum Backend

Forum Backend

RESTful API for a discussion forum, built with Express, Node.js, and TypeScript.

Implements JWT authentication with access/refresh token rotation, role-based access control (member/admin), CSRF protection, and page-based pagination.

Consistent error response structure throughout; Vitest test suite covering key routes.

ExpressPostgreSQLNode.js

Shopping Cart

Shopping Cart

React/TypeScript SPA built with Vite, themed around Magic: The Gathering. Consumes the Scryfall REST API to browse and filter cards by colour, type, rarity, and price across different sets.

Cart state tracks quantities and running totals; completed lists can be exported in Cardmarket decklist format.

Multi-page routing via React Router; deployed via GitHub Pages.

ReactTypeScript

Battleship Game

Battleship Game

This is a version of the classic board game Battleship, built using TypeScript and Test-Driven Development (TDD).

ReactTypeScriptJavaScriptJest

Knights Travail Solution

Knights Travail Solution

TypeScript solution to the classic Knights Travail problem: find the shortest path for a chess knight between any two squares on an 8x8 board.

Implements BFS (breadth-first search) over a graph of all valid knight moves, returning the full sequence of positions from start to destination.

Board and knight modelled as separate interfaces, demonstrating OOP separation of concerns.

JavaScriptTypeScript

Binary Search Tree Implementation

Binary Search Tree Implementation

TypeScript implementation of a self-balancing Binary Search Tree built from scratch. The tree auto-balances on construction using an O(n log n) sort; supports insertion, search, and a prettyPrint visualiser.

Demonstrates core CS data structure concepts and OOP design in TypeScript.

TypeScriptJavaScript

Hashmap Implementation

Hashmap Implementation

TypeScript implementation of a hash map built from scratch, including the underlying linked list for each bucket.

Uses separate chaining for collision resolution and exposes a full API: set, get, has, remove, keys, values, entries, and clear.

Demonstrates understanding of data structure internals and hash function design.

TypeScript