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.

Portrait of Oliver Bejjani
fun fact (1/7)Ask me about my Claude Code setup.

Projects

Personal 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
archived2026

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
archived2025

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.json
wip2025

AI 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.css
archived2023

Trends 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.md
archived2025

TV 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.ts
shipped2026

Sourdough 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
archived2026

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.py
shipped2026

lovefoodmap

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
shipped2026

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/
shipped2026

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
archived2026

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.md
wip2026

alignd.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.md
wip2026

alignd.design

Devs swipe scraped UI examples to converge on a style guide, paid per session, no accounts.

Academic & Coursework
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
archived2026

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.js
shipped2026

MyBookings

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
archived2025

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
archived2024

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.wav
archived2023

Pathfinding 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/
archived2026

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.png
archived2026

Logistic 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.npy
archived2026

Odd-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.out
archived2026

RNNs 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.

Hackathons
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
archived2025

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
archived2024

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.png
archived2024

Expense Keeper

Personal expense tracker from McHacks 11.

Contact