Portfolio

Projects

Each project page covers the problem, the technical decisions, what I built and the evidence — tests that were run, live demos and known limitations. Team projects say so.

Software engineering

7
CompleteIndividual · Personal project

Goalkeeper Scouting

A full-stack scouting platform for goalkeepers, built from raw match-event data. Every keeper is compared only with peers from the same competition and season, and the sample size is always shown next to the number.

11 techs · Python

  • Python
  • FastAPI
  • PostgreSQL
  • SQLAlchemy
  • Alembic
  • pandas
  • +5

Automated tests 288 passed, 1 skipped

CompleteIndividual · Internship

Observability at Ediprinter

Internship project: a centralised logging, alerting and monitoring platform with Serilog and the Elastic Stack for EDIGCIA, Ediprinter's management software for vehicle inspection centres.

10 techs · .NET

  • .NET
  • ASP.NET MVC
  • Serilog
  • Elasticsearch
  • Kibana
  • Elastic APM
  • +4

Validation Log ingestion, data views and alerts tested against several scenarios

CompleteIndividual · Personal project

Reparte

A personal budgeting app: enter what you earned this month and it tells you how much to set aside for bills, savings, investment, leisure, activities and unexpected costs. Works offline; the data never leaves the device.

6 techs · TypeScript

  • TypeScript
  • React
  • Vite
  • Tailwind CSS
  • Vitest
  • PWA

Automated tests 68 passed

Technical exerciseIndividual · Backend exercise

Ticket sales API

An events, seats and orders API. One endpoint lists an event's free seats; the other reserves a specific seat — and two requests for the same seat can never both succeed, even across separate server processes.

5 techs · Node.js

  • Node.js
  • node:http
  • node:sqlite
  • SQL
  • node:test

Automated tests 8 passed

Technical exerciseIndividual · Backend exercise from a written brief

Short link service

An HTTP service that shortens URLs, redirects on lookup and counts how often each link is followed. No dependencies: Node's built-in HTTP server and SQLite.

4 techs · Node.js

  • Node.js
  • node:http
  • node:sqlite
  • node:test

Automated tests 7 passed

CourseworkTeam · PDS course

Back-office management platform

Team coursework: a role-based REST API and an Angular dashboard for managing an organisation's announcements, invoices, orders, expense reports, member requests and warnings.

9 techs · Node.js

  • Node.js
  • Express
  • Knex
  • PostgreSQL
  • Passport
  • JWT
  • +3

Integration tests 128 test cases in the repository

CourseworkIndividual · Object-oriented programming course

E-commerce app

An online-shop simulation in C# and .NET 8, organised in layers: domain models, interface-backed repositories, business rules and typed exceptions.

2 techs · C#

  • C#
  • .NET 8

Data & analysis

2
In developmentIndividual · Personal project

Claim-to-Evidence Scouting

A scouting report makes claims — "creates a lot of chances", "doesn't track runners". This project tests each one against league data and my own video coding, using rules written down before the data is collected.

10 techs · Python

  • Python
  • pydantic
  • pandera
  • pandas
  • Hypothesis
  • pytest
  • +4

Automated tests 97 passed

CourseworkIndividual · Information Systems Integration course

FC Porto squad data integration

A KNIME workflow that takes a Transfermarkt export of 32,405 players, isolates the FC Porto squad, cleans and joins player attributes with market valuations, and writes the result to CSV, JSON, XML and Excel, plus two charts.

5 techs · KNIME

  • KNIME
  • CSV
  • JSON
  • XML
  • Excel

Source data CSV of 32,405 players from the Transfermarkt database

Smaller work

5

Shorter coursework and exercises, without a page of their own.