Hi, I'm Oliver.
I started coding at 12, writing Small Basic code to control Lego robots. Most of what I build still starts the same way: something I actually need, not a hypothetical user's problem. I'm good at taking a project from a rough idea to a working spec, the functional side, not colors and layouts, but figuring out what something needs to do and building it that way.
I am currently completing my senior computer science coursework at McGill University. Throughout my time here, I have naturally gravitated toward leadership roles, frequently serving as the team lead for our intensive group software projects.
Outside of school and code, I focus my time on a few specific pursuits:
Martial Arts: I serve as the President of McGill's Mixed Martial Arts club. Hiring me essentially means you get built-in physical security for the office alongside my code.
Fitness: I am a disciplined gym goer and love nerding out about the gym and hyper-optimizing my routine.
Cooking: I love experimenting in the kitchen and cooking for friends and family, which inspired my current side project: a smart cooking assistant application.
I enjoy the intersection of discipline, technology, and real-world utility. Let's build something cool.

Projects
screen-duo/ ├── screen_duo/ │ ├── devices/ │ │ ├── screen_capture.py │ │ ├── phone_capture.py │ │ ├── webrtc_server.py │ │ ├── iphone_bridge.py │ │ ├── wifi_powersave.py │ │ └── _gnome_screencast_helper.py │ ├── recording/ │ │ ├── session.py │ │ ├── sync.py │ │ ├── compositor.py │ │ └── clapper.py │ ├── ui/ │ │ ├── main_window.py │ │ └── overlay_widget.py │ └── __main__.py └── requirements.txt
screen-duo
Record your screen and iPhone camera together, auto-synced with a clapper flash.
smartFind/ ├── backend/ │ ├── app/ │ │ ├── core/ │ │ │ └── config.py │ │ ├── db/ │ │ │ ├── crud.py │ │ │ ├── database.py │ │ │ └── models.py │ │ ├── models/ │ │ │ ├── embedder.py │ │ │ ├── pdf_reader.py │ │ │ └── text_splitter.py │ │ ├── routers/ │ │ │ ├── answer_router.py │ │ │ ├── auth_router.py │ │ │ ├── chat_router.py │ │ │ ├── document_router.py │ │ │ └── upload_router.py │ │ └── main.py │ ├── Dockerfile │ └── requirements.txt ├── frontend/ │ ├── src/ │ │ ├── components/ │ │ │ ├── AuthModal.tsx │ │ │ ├── ChatSidebar.tsx │ │ │ ├── DocumentList.tsx │ │ │ └── UploadForm.tsx │ │ └── App.tsx │ ├── Dockerfile │ ├── package.json │ └── vite.config.ts ├── docker-compose.yml └── Makefile
SmartFind
Upload PDFs and ask questions about them.
AI-cooking-helper/
├── backend/
│ ├── src/
│ │ ├── controllers/
│ │ │ ├── chat.controller.ts
│ │ │ └── generateRecipe.controller.ts
│ │ ├── routes/
│ │ │ ├── chat.route.ts
│ │ │ └── generateRecipe.route.ts
│ │ ├── services/
│ │ │ └── openaiService.ts
│ │ └── index.ts
│ └── package.json
└── frontend/
└── mobile/
├── app/
│ ├── (tabs)/
│ │ ├── index.tsx
│ │ └── Recipe.tsx
│ ├── recipe_creating.tsx
│ └── _layout.tsx
└── package.jsonAI Cooking Helper
Talks you through recipes hands-free and saves the tweaks that worked.
trends-dashboard/
├── backend/
│ ├── models/
│ │ └── keyword.js
│ ├── database.js
│ ├── docker-compose.yml
│ ├── Dockerfile
│ ├── queue.js
│ ├── server.js
│ ├── worker.js
│ └── package.json
└── frontend/
├── Dockerfile
├── index.html
├── script.js
└── styles.cssTrends Dashboard
Track Google Trends keywords over time.
TV Automation/
├── remote_local.py
├── remote_app.py
├── pair_wss.py
├── test_wol.py
├── requirements.txt
└── TVMote-iOS/
├── TVMote/
│ ├── TVMoteApp.swift
│ ├── ContentView.swift
│ └── SamsungTVClient.swift
└── README.mdTV Automation
Control your Samsung TV from phone or desktop.
sourdough_de_chez_heu/
├── app/
│ ├── app/
│ │ └── (tabs)/
│ │ ├── dashboard/
│ │ └── log/
│ ├── lib/
│ │ ├── api.ts
│ │ ├── dueDate.ts
│ │ ├── phone.ts
│ │ ├── notifications.ts
│ │ └── hooks/
│ │ └── catalog.ts
│ ├── components/
│ │ ├── DateField.tsx
│ │ ├── SearchBar.tsx
│ │ └── OrderNotificationsBridge.tsx
│ └── eas.json
└── api/
├── src/
│ ├── app.ts
│ ├── server.ts
│ └── db/
├── api/
│ └── index.ts
├── vercel.json
└── test/
└── api.test.tsSourdough Tracker
iOS app for my mother to log client orders, revenue, and ingredient spend.
PokemonGo/ ├── data/ │ ├── pokemon_db.csv │ ├── species_reference.csv │ ├── to_research.csv │ ├── pokedex_pve_good_sweep.csv │ └── pokedex_pvp_good_sweep.csv ├── scripts/ │ ├── box_scan_ocr.py │ ├── box_scan_stitch.py │ ├── box_scan_import.py │ ├── box_scan_diff.py │ ├── build_species_lookup.py │ ├── build_tag_lists.py │ ├── backfill_species_trade_value.py │ └── serve.py ├── viewer.html ├── species_lookup.html └── tag_lists.html
Pokémon GO Box Sort
Classifies a Pokémon GO box into keep, trade-bait, and transfer using researched PvE/PvP tiers.
lovefoodmap/
├── dfx.json
├── src/
│ ├── backend/
│ │ └── main.mo
│ └── frontend/
│ ├── src/
│ │ ├── lib/
│ │ │ └── i18n.ts
│ │ └── components/
│ │ ├── MapApp.svelte
│ │ ├── MapView.svelte
│ │ ├── Panel.svelte
│ │ ├── Detail.svelte
│ │ ├── AddForm.svelte
│ │ └── Admin.svelte
│ └── public/
│ ├── embed.js
│ └── zones.geojson
└── scripts/
├── fetch-tiles.sh
├── dump-tiles.mjs
└── build-zones.pylovefoodmap
Bilingual, no-login map of soup kitchens, food banks, and markets. Embeddable across partner sites.
MyWorkouts/ ├── App.js ├── src/ │ ├── workoutData.js │ ├── Timers.js │ ├── audio.js │ └── theme.js ├── assets/ │ └── sfx/ ├── app.json └── eas.json
MyWorkouts (Fight Week)
Native Expo workout tracker with round/rest/count-up timers and audio cues, shipped via TestFlight.
short-form-content-blocker/
├── instagram/
│ ├── App.js
│ ├── filterRules.js
│ └── index.js
├── youtube/
│ ├── App.js
│ ├── filterRules.js
│ └── index.js
└── archive/
├── instagram-swift/
└── youtube-swift/Reels/Shorts Blocker
Two personal iOS apps stripping Reels, Shorts, and suggested content while keeping DMs and follows.
document_recovery/ ├── classify.py ├── prefilter.py ├── reclassify.py ├── data/ │ └── classify.db ├── logs/ │ ├── classify.jsonl │ └── prefilter.jsonl ├── requirements.txt └── DECISIONS.md
PhotoRec Recovery Classifier
Two-phase LLM classifier that safely sorted ~391k PhotoRec-recovered files back into a real folder structure.
tinder-for-ui/
├── src/
│ ├── app/
│ ├── components/
│ ├── db/
│ └── lib/
├── drizzle.config.ts
└── docs/
└── pricing.mdalignd.design
Devs swipe scraped UI examples to converge on a style guide, paid per session, no accounts.
tinder-for-ui/
├── src/
│ ├── app/
│ ├── components/
│ ├── db/
│ └── lib/
├── drizzle.config.ts
└── docs/
└── pricing.mdalignd.design
Devs swipe scraped UI examples to converge on a style guide, paid per session, no accounts.
comp520-coursework-w2026/ ├── src/ │ └── java/ │ ├── lexer/ │ │ ├── Scanner.java │ │ └── Tokeniser.java │ ├── ast/ │ ├── sem/ │ ├── gen/ │ │ ├── CodeGen.java │ │ ├── StmtCodeGen.java │ │ ├── FunCodeGen.java │ │ └── ProgramCodeGen.java │ ├── regalloc/ │ │ ├── NaiveRegAlloc.java │ │ └── GraphColouringRegAlloc.java │ └── Main1.java … Main5.java └── build.xml
C Compiler (COMP 520)
C and OOP to MIPS compiler in five passes.
mybookings/
├── Makefile
├── README.md
├── backend/
│ ├── server.js
│ ├── routes/
│ │ ├── authRoutes.js
│ │ ├── bookingRoutes.js
│ │ ├── slotRoutes.js
│ │ ├── OHRoutes.js
│ │ ├── groupMeetingRoutes.js
│ │ ├── meetingRequestRoutes.js
│ │ └── ownerRoutes.js
│ └── db/
│ ├── configureDB.js
│ └── schema.sql
└── frontend/
├── src/
│ ├── App.jsx
│ ├── context/AuthContext.jsx
│ ├── view/
│ │ ├── HomeView.jsx
│ │ ├── OfficeHoursView.jsx
│ │ ├── RequestFormView.jsx
│ │ └── GroupPlanView.jsx
│ └── components/
│ └── NavBar.jsx
└── vite.config.jsMyBookings
Book McGill office hours online.
comp303-tavern/ ├── DartsGame.py ├── Inventory.py ├── JukeBox.py ├── PrototypeNPC.py ├── credits.py ├── interactive_plates.py ├── leaderboard.py ├── safe_room.py ├── test/ │ ├── test_credits.py │ ├── test_darts_game.py │ └── test_example_map.py └── UML.jet
COMP 303 Tavern Module
MUD tavern room with darts, jukebox, and patterns.
McMetro/ ├── src/ │ ├── McMetro.java │ ├── McMetroTest.java │ ├── NaiveDisjointSet.java │ ├── Building.java │ ├── BuildingID.java │ ├── Track.java │ └── TrackID.java └── README.md
McMetro
Max-flow routing on a campus metro graph.
Pathfinding-simulation-250/
├── src/
│ ├── finalproject/
│ │ ├── Graph.java
│ │ ├── GraphTraversal.java
│ │ ├── PathFindingService.java
│ │ ├── ShortestPath.java
│ │ ├── FastestPath.java
│ │ ├── TilePriorityQ.java
│ │ └── MiniTester.java
│ └── tests/
│ ├── Level0Tester.java
│ └── Level1Tester.java
└── resource/
├── map_bg.jpg
├── hiker.png
├── zombie.jpg
└── BG_music.wavPathfinding Simulation
BFS and Dijkstra on a tile map with terrain.
comp-551/assignments/A1/
├── linear-regression-a1.ipynb
├── main.typ
├── template.typ
├── writeup.pdf
├── data/
│ ├── day.csv
│ └── hour.csv
├── figures/
│ ├── heatmap.png
│ ├── colineartempatemp.png
│ ├── tempvsatemp.png
│ └── weatherhistogram.png
└── supps/
├── linear-regression/
├── bayesian-reasoning/
├── logisitc-regression/
└── naive-bayes/Linear Regression (COMP 551)
Linear regression from scratch on two years of bike-share data, cutting error by a third with nonlinear features.
comp-551/assignments/A2/
├── ModelSelection.ipynb
├── training_and_eval.ipynb
├── task4.ipynb
├── instructions.md
├── data/
│ ├── spambase.data
│ └── spambase_with_feature_names.csv
└── figures/
└── AdamW.pngLogistic Regression & Regularization (COMP 551)
Mini-batch SGD logistic regression with L1/L2 regularization and K-fold CV on the UCI Spambase dataset.
comp-551/assignments/A3/
├── assignment3.ipynb
├── 551_Assignment_3_Report.pdf
└── datasets/
├── x_train.npy
├── y_train.npy
├── x_test.npy
└── y_test.npyOdd-One-Out Image Classifier (COMP 551)
Competed on a live Kaggle leaderboard classifying the odd image out of five; pivoting from a CNN to an MLP picked up 10 accuracy points.
comp-551/assignments/A4/
├── task1.py
├── fine-tuning-transformer.py
├── plot_transformer_curves.py
├── transformer.ipynb
├── progress.md
├── writeup.pdf
├── run_job.sh
├── submit.sh
├── requirements.txt
└── logs/
├── transformer-a4.24629.out
└── transformer-a4.24633.outRNNs vs Transformers (COMP 551)
Built LSTM/GRU classifiers from scratch and fine-tuned DistilBERT on 120k news headlines, comparing accuracy and overfitting head to head.
topdown-nukedown/ ├── src/ │ ├── main.cpp │ ├── Game.cpp │ ├── Player.cpp │ ├── Bullet.cpp │ ├── Map.cpp │ └── Menu.cpp ├── include/ │ ├── Game.hpp │ ├── Player.hpp │ └── Bullet.hpp ├── assets/ │ ├── background.wav │ ├── fonts/ │ ├── images/ │ └── soldier/ ├── Makefile └── runmake.sh
TopDown-NukeDown
Local two-player top-down shooter in C++.
POFM/ ├── main.py ├── mydb.py ├── templates/ │ └── index.html ├── static/ │ ├── JS.js │ └── style.css └── waste.db
POFM: Waste Score Tracker
Log waste and score your environmental impact.
mchacks11-fork-/
├── backend2/
│ ├── database.py
│ ├── main.py
│ ├── models.py
│ └── requirements.txt
└── frontend/
├── index.html
├── JS.js
├── grocery_icon.png
└── restaurant_icon.pngExpense Keeper
Personal expense tracker from McHacks 11.