Software developer.

I'm doing a master's in CS through Georgia Tech's OMSCS while working full time at G3 in Winnipeg. Most of my work there is backend and cloud, on the grain trading platform farmers use to price and settle their contracts.

  1. Software Developer · G3 Canada Limited

    Own the contract lifecycle from pricing through settlement and payment on a platform used by 10,000+ farmers, and built the platform's multi-factor authentication from auth flow design through production rollout.

  2. Software Developer Intern · QDoc

    Rebuilt the Physician's Meeting Room interface in React, Tailwind, and Twilio, and wrote the event-driven AWS services behind it. Missed appointments dropped 25%.

  3. Application Developer Intern · Wawanesa Insurance

    Accessibility work on a React auto-insurance app used in California and Oregon, plus a Jenkins regression pipeline across dev, staging, and production.

  4. Junior Developer · G3 Canada Limited · part-time

  5. Quality Assurance Analyst · G3 Canada Limited · co-op

  6. Teaching Assistant · University of Manitoba · part-time

Content-Aware Image Editor

Open the editor →

An implementation of seam carving, from the Avidan and Shamir paper. I wrote the first version for Computational Photography in the OMSCS. Instead of scaling an image, it removes the lowest-energy connected path of pixels one at a time, so detailed areas keep their shape and flat areas lose pixels instead. Plain gradient energy leaves visible artifacts on complex images, so seams are picked by forward energy, and a saliency map keeps them off faces. Masking a region and forcing seams through it gives you object removal. The first version was slow. I vectorized the energy and dynamic-programming passes and recomputed energy only near each removed seam, which cut runtime by about 10x.

Python, NumPy, OpenCV, React · in-browser build in JavaScript

gnzlang, a Gen-Z language that compiles to WebAssembly

Open the repl →

A small programming language that uses Gen-Z slang for keywords: bet declares a variable, yeet returns. Underneath it's a normal implementation, with a lexer, a Pratt parser, and two backends. One walks the syntax tree and runs the REPL. The other compiles to WebAssembly, writing out the bytes of the binary module directly. That second backend was the reason I started the project. Both run in the browser.

JavaScript · lexer, Pratt parser, WebAssembly emitter

Georgia Tech
M.S. Computer Science, currently enrolled · expected 2027
University of Manitoba
B.Sc. Computer Science, Honours (Co-op), GPA 4.01 / 4.5 · 2024
Languages
Python, Java, JavaScript, TypeScript, Go, C, SQL
Frameworks & tools
React, Node.js, Tailwind CSS, REST APIs, Docker, Kubernetes, Terraform, Jenkins, CI/CD, Git, Dynatrace
Cloud & data
AWS (Lambda, DynamoDB, API Gateway, SQS), Azure (Functions, Data Factory, Logic Apps, SQL, Blob), PostgreSQL, MySQL, MongoDB

Email is the best way to reach me, whether it's about a role or about a problem you want a second opinion on.