Skip to content

Youssef Elshafei

Software Engineering & Business Management Student

I'm a Software Engineering and Business Management student who likes pairing technical problem-solving with strategic thinking. I'm looking to connect with peers, mentors and industry professionals, and I'm actively seeking internships where I can apply my skills, keep learning, and contribute to projects that matter.

Seeking a co-op starting May 2027 or later

Get in touchTry the project demos

Hamilton, ON · McMaster University

01

About

Youssef Elshafei

Software Engineering & Business Management Student

McMaster University, Hamilton, ON

Software Engineering and Business Management (B.Eng.Mgt) student at McMaster University, blending technical problem-solving with strategic thinking.

Focused on building scalable, real-world systems that align engineering execution with business impact.

Education
  • Bachelor of Software Engineering and Business Management (B.Eng.Mgt)
GPA
3.9+ / 4.0
Recognition
02

Projects

Five projects, each with a short account of what it does and what made it interesting to build. Nodes in the diagram link to the entry below.

01

TradeWatch

In progressPhase 10 of 12 complete

Market Intelligence & Paper-Trading Platform

TradeWatch · Kafka pipeline6 consumer groups · own offsets

The diagram scrolls sideways.

providertrades topicpersistaggregatorbroadcasterpostgresbars.1m topicredis → wspaper tradinganomaly detectoranomalies topicalert dispatcher0 messages0 bars0 flagged0 rows0 pushesoffset 0offset 0offset 0offset 0offset 0offset 0bar: 0 trades0 alerts

Provider

Consumer groups: stop one, keep sending, then restart it

0 trades, 0 stored, 0 bars, 0 flagged, 0 alerts.

The real topology, read from TradeWatch's worker modules: three consumer groups read the trades topic, the aggregator turns trades into one-minute bars on a second topic, and the anomaly detector's flags reach the alert dispatcher through a third. Each group keeps its own offset, so a stopped one falls behind without slowing anyone else and catches up when it restarts. Simplified: one symbol, minutes end when you say so, no paper-trading strategy is deployed (so no fills), and a bar counts as unusual when it holds a spike, where the real detector scores it against recent history.

TradeWatch watches live market data and notices when a stock starts behaving unusually compared to its own recent history. Around that sits a full paper-trading platform: write a trading strategy, backtest it against stored history, then run it against the live feed with simulated money, all from one React dashboard.

Under the hood, market data flows into Kafka and fans out to independent processes that each read the same stream at their own pace. One stores every trade, one builds one minute candles and rolls them up to five minute, hourly and daily ones, one pushes live prices to the browser, one runs the paper-trading strategies, and one scores every closed candle for unusual activity and hands anything it flags to an alert service. Kafka only promises that a message arrives at least once, so every one of those writes is idempotent: receiving the same trade twice never changes the result.

Most of the effort went into making that plumbing trustworthy before building on top of it, which is why the project was built in phases with the pipeline, storage and CI first and strategies and detection after. Ten of the twelve phases are done; what remains is end-to-end failure-recovery testing and cloud deployment. The anomaly detector only ever flags activity that is unusual for a specific stock compared to its own history. It does not try to catch fraud or market manipulation, and the project is careful never to claim that it does.

Implementation detail12
  • Real-time pipeline: a market data provider feeds Kafka, which fans out to six independent consumer groups: raw trade storage, candle aggregation (1-minute bars with 5m/1h/1d rollups), live broadcast through Redis to WebSockets, paper trading, anomaly detection, and alert dispatch.
  • At-least-once delivery with idempotent writes; offsets are only committed after data is durably stored.
  • Strategies are configuration run by one shared execution core, so a backtest and a live paper-trading run use the same decision code.
  • Anomaly detection: a rolling median and median-absolute-deviation z-score over each symbol's own recent candles, across return, volatility, volume and trade count. An Isolation Forest model can replace it only if offline evaluation shows it does at least as well. Flags unusual activity, explicitly not fraud or manipulation.
  • Simulates trading only: no brokerage connectivity, no real money moves.
  • Accounts with JWT authentication; every strategy, backtest and portfolio is scoped to its owner.
  • Prometheus metrics on every process and a committed Grafana dashboard.
  • Benchmarked on one laptop with everything running locally: 750 trade events per second sustained into PostgreSQL, and a median of 37 ms from the data provider to the browser. Single-machine figures, not production ones.
  • Layered architecture (domain / application / infrastructure) enforced by import-linter in CI.
  • Typed settings that fail startup with every missing config variable named at once.
  • Six independent CI jobs: lint and type-check, unit and API tests, integration tests against real PostgreSQL, Redis and Kafka, a startup check, the frontend, and a Docker build.
  • No performance number appears anywhere in the project unless a benchmark produced it.
  • Python
  • FastAPI
  • Kafka
  • PostgreSQL
  • Redis
  • Alembic
  • scikit-learn
  • React
  • TypeScript
  • Vite
  • Recharts
  • WebSockets
  • Prometheus
  • Grafana
  • Docker
  • GitHub Actions
02

Triage Flow

AI-Assisted Triage & Live Queue System

Triage Flow · intake to waiting roomyou play the patient, then the staff

Nurse: Hi, I'm the intake nurse. What brings you in today?

Three steps of the real app in one place. The red-flag check, the five levels, the SBAR summary shape and the waiting-room order (urgency first, then arrival time) all come from the Triage Flow code. The nurse is scripted here; in the app it is a language model (Llama 3.3), and its suggestion is only ever a suggestion: a staff member sets the final level. Try typing “chest pain” to see the red-flag path. Patients on the board are made up.

Triage Flow is a tool for hospital style intake that tries to get people seen faster without cutting corners on safety. When someone comes in, an AI assistant listens to their description of what's wrong and turns it into a structured summary: symptoms, urgency, and any red flags a nurse should know about right away.

The tricky part is that language models don't always get things right, and a queue deciding who gets seen next is not a place to guess. So the AI's output is never used directly. It gets validated on the server first, and a staff member always reviews and finalizes the actual urgency level before a patient's spot in the queue is set. The AI proposes, a person decides. Patients can watch their position and estimated wait update live as the queue moves, which was the part everyone actually wanted in the first place: less mystery about how long the wait really is.

Implementation detail03
  • LLM output is extracted into server-validated structured JSON (symptoms, urgency level, red flags, clinical summary) — the AI never makes the final call; staff review and finalize every case.
  • Real-time queue updates via Server-Sent Events, with dynamic wait-time estimation.
  • Deployed on Vercel with managed PostgreSQL; Docker for local development.

Team project.

  • Next.js
  • React
  • PostgreSQL
  • Docker
  • LLM API
  • Server-Sent Events
03

BridgeAid

Full-Stack Disaster Response Platform

BridgeAid · report verification200 m · 3 people · 10 min cooldown
Loading map
BridgeAid's rule for keeping false reports off the public map, running in your browser on a port of the real backend code. A report is only accepted onto the map once three different people report the same kind of incident within 200 metres of each other. The same person reporting again within 10 minutes is refused, so one panicked user cannot confirm anything alone. In the real app a confirmed incident is then also cross-checked against public news by a language model; this demo stops before that step. Nothing you tap is sent anywhere.

BridgeAid started from a simple frustration: during a wildfire, flood, or storm, the hardest part often isn't the disaster itself, it's not knowing what's actually happening nearby versus what's just a rumor. The platform lets people report incidents, request help, and see a live map of what's been verified in their area.

Because anyone can submit a report, the reports themselves get cross checked against other nearby reports and public datasets before they're allowed onto the map, so a single bad or panicked report can't spread. Volunteers can sign up by category (food, shelter, general disaster relief) and mark themselves active or on standby. There's also a recovery dashboard that shows incident counts locally and globally, though it's worth being upfront that the recovery numbers there are a simulated visualization, not a live feed of real recovery data.

The scope stays to things that could realistically be built and verified: reporting, requests, and volunteer coordination. It stops short of handling actual aid transactions or payments, since that's a different, much higher stakes problem than the one this project set out to solve.

Implementation detail07
  • Live map, built on Leaflet, that updates dynamically from verified user incident reports — unverified reports don't appear.
  • Report verification includes AI-assisted cross-checking against other reports and official datasets, aimed at reducing false or panic-driven reports.
  • Education Hub with interactive quizzes, downloadable resources and embedded learning content.
  • Recovery Dashboard: incident count and people-affected figures with a local/global toggle. This is a simulated recovery-progress visualisation, not live real-world recovery data.
  • Aid requests capture location, urgency level, household size and aid type (food, shelter, medical, supplies).
  • Volunteer registration with category selection (food bank, shelter, disaster relief) and active/standby status.
  • Security: JWT authentication, server-side input validation and API request throttling.

Team project.

  • React
  • Flask
  • Python
  • JavaScript
  • Tailwind CSS
  • Vite
  • Leaflet
  • PostgreSQL
  • JWT
04

WireFish

Network Diagnostics & Monitoring Toolkit

wirefishsimulated output
WireFish demo shell · output is simulated
Type a command or tap one below. `help` lists what works.
Type real WireFish commands. The parser is a line-for-line port of the tool's C argument handling, so flags, defaults and error messages are exactly what the program prints (try the last example: WireFish has no --subnet flag). The table, CSV and JSON layouts match its formatter. The results themselves are simulated, since a web page cannot send raw network traffic, and every address is a reserved example address.

Most of the time, figuring out what's wrong with a network means switching between three or four different tools, each with its own output format and no shared context between them. WireFish puts the basics (host scanning, traceroute, and bandwidth monitoring) into one command line tool that speaks a consistent language.

Getting traceroute and host scanning to work properly meant building raw ICMP packets by hand, including the checksum, and reading responses straight off a raw socket, since there's no friendly library standing in between to hide that complexity. It was built that way on purpose, in C, alongside three teammates, because the point of the project was actually understanding what happens at the network layer, not just calling a function that already does it.

Implementation detail06
  • Raw-socket ICMP scanning and traceroute, manually constructing ICMP packets including headers and the 16-bit internet checksum.
  • Real-time bandwidth monitor: polls Linux's /proc/net/dev and computes instantaneous and rolling RX/TX bitrate as rate_bps = (Δbytes × 8) / Δt_sec.
  • Single unified CLI binary with text, JSON and CSV output modes.
  • Modular file layout (app/, cli/, scanner/, tracer/, monitor/, fmt/, net/, log/) with a dedicated logging subsystem (debug/info/warn/error) instead of scattered printf calls.
  • Linux requires elevated privileges to open a raw socket at all.
  • MIT licensed.

Team project, built in a Git-based workflow with three teammates.

  • C
  • Linux
  • Raw Sockets
  • ICMP
  • POSIX
  • Make
  • GitHub Actions
05

Catan Simulator

Rule-Based AI Agent for Settlers of Catan

Catan Simulator · the AI's turn, step by stepTemplate Method + Visitor
desertwood6wheat8ore5brick9sheep4wheat10

■ ● AI · ■ ● opponent · not rolled yet

AI hand14 cards (> 7)

  • wood3
  • brick3
  • wheat3
  • sheep2
  • ore3
public final void takeTurn(GameMaster game) {
game.rollAndDistribute(this);
while (safety++ < 10) {
PlayerAction constraint = resolveConstraint(game); // R3.3
if (constraint != null) { constraint.execute(game); continue; }
PlayerAction best = pickBestValueMove(game); // R3.2
if (best == null || best instanceof PassAction) {
new PassAction(this).execute(game); return;
}
best.execute(game);
}
}

resolveConstraint()

  • hand > 7 cards·
  • gap to close·
  • longest road threatened·

ValueEvaluator.visit()

not scored yet

  1. Press Step to start the AI's turn.
The rule-based AI from the Catan Simulator, ported from its Java source. Each step runs one line of takeTurn (a Template Method: the order is fixed, the decisions are hooks). Constraints are checked first: a hand over 7 cards must be spent, and a gap between its own roads or a threatened longest road forces a road. Otherwise every legal move is scored by ValueEvaluator, a Visitor, and the AI picks the best, at random among ties. Change its hand or give the opponent more roads and watch the decision change. One opponent, no robber and no trading in this version.

This one was a McMaster course assignment worked on with three teammates: take an existing Java based Catan simulator and add undo and redo, plus a simple AI opponent that could actually make reasonable decisions on its own.

The catch was that the assignment wasn't really graded on whether the AI won games, it was graded on whether these features could be added cleanly, using proper design patterns, without tearing apart code that already worked. So undo and redo went in through the Command pattern, and the AI's decision making replaced a single messy function with a clear structure: a Template Method for the turn sequence and a Visitor for scoring possible moves. None of the original game logic classes had to be touched.

Implementation detail05
  • Rule-based AI scores candidate moves each turn — earning a victory point scores highest at 1.0, building without a VP scores 0.8, spending down a hand scores 0.5 — and resolves hard constraints (hand size over 7, blocked road segments, contesting longest road) before picking a move.
  • Every game action can be undone and redone within a turn via the Command pattern.
  • A CommandManager owns the undo and redo stacks. The existing Board, Player, RuleValidator, Tile and Vertex classes were left completely untouched.
  • SOLID principles (single responsibility, open/closed, Liskov substitution, dependency inversion) are named explicitly in the project docs.
  • McMaster SFWRENG 2AA4, Assignment 3.

Team project. The repository is hosted under a teammate's account.

  • Java
  • Design Patterns
  • Python (visualizer)
03

Skills

PROBEHover or focus a skill to see which projects use it.

U1Languages & frameworks

U2Tools & OS

U3Concepts

U4Also in the projects

04

Involvement

  1. 2025—Present

    Academic Tutor & Peer Mentor

    ROLE

    Local community, volunteer & paid

    Taught the fundamentals of coding and logical thinking to children in the local community. Designed simple Python and Scratch projects to build curiosity and confidence, and encouraged teamwork, creativity and persistence in problem-solving.

  2. McMaster Software Engineering Society & Engineering and Management Society

    SOCIETY

    Active member

    Technical workshops, peer learning and industry events.

  3. McMaster Engineering Software Competition

    COMPETITION

    Top 5 finish

    Placed top 5 of all contestants.

  4. United Nations Sustainable Development Goals Competition

    COMPETITION

    Team member

    Multidisciplinary team building a tech-driven solution aligned with UN SDGs.

  5. Google Developer Group on Campus

    CLUB

    Member · McMaster University

    Participates in workshops and community events centered on Google's developer tools and cloud technologies.

Certifications

  • Exploring Cybersecurity

    Sep 2026

    IBM SkillsBuild

  • DELF B1 — French Language Diploma

    Jul 2024

    Ministère de l'Éducation nationale

    Certified independent user, CEFR B1 level.

05

Contact

Recruiting for a co-op, or want to talk about one of the projects? Email is quickest, and I read everything that arrives.

elshafei.career@gmail.com

Say hello

Or email me directly; the address is above.