Skip to main content

Projects

AI & Research

Research-Paper Recommendation via Knowledge Graphs

A research paper (co-authored with Shikshya Shiwakoti, Jacob Reiss, and Ujjwal Pandit) that recommends which academic papers you should cite. Instead of guessing, it walks the Microsoft Academic Graph (a giant network of papers and citations) and uses an attention-based graph neural network with SAGPooling to pull out the most relevant slice of that network. That slice is handed to a large language model, so the recommendations come with grounded explanations instead of a black-box ranking.

Diagram of the knowledge-graph subgraph retrieval pipeline for paper recommendation
  • Python
  • PyTorch
  • GNNs
  • Knowledge Graphs
  • SAGPool
  • LLMs

Muffin vs. Chihuahua: The Meme, Debunked

The internet loves pointing out that blueberry muffins and chihuahuas look weirdly alike. I put that to the test by benchmarking eight image classifiers on roughly 5,900 Kaggle photos, from a dummy baseline and KNN up through Naive Bayes variants, XGBoost, several CNNs, and a fine-tuned DenseNet121. The DenseNet121 hit 99.5% accuracy and 100% precision, and I stress-tested it against an AI-generated half-chihuahua, half-muffin "chimuffin" to see where it breaks.

AI-generated "chimuffin", a hybrid of a chihuahua and a blueberry muffin used to stress-test the classifier
  • TensorFlow
  • scikit-learn
  • XGBoost
  • CNNs
  • Data Augmentation

FishLLM

In progress

Turning a Big Mouth Billy Bass (the classic singing animatronic fish) into a talking assistant for an academic building. An ESP32 microcontroller drives the motors and speaker while a large language model handles the conversation, so visitors can walk up and talk to it. I'm building it through my role as web chair of the WPI IEEE student branch.

Big Mouth Billy Bass animatronic fish wired to an ESP32 microcontroller
  • ESP32
  • Python
  • LLMs
  • Embedded
  • IEEE

MCP Tool Servers for Claude

I built two MCP servers in Python using FastMCP and hooked them up to Claude Desktop as local tools. One wraps the National Weather Service API: Claude can call get_alerts for active weather alerts by state or get_forecast for a multi-period forecast by coordinates, both handled asynchronously with httpx. The second does statistical analysis. Both run as local stdio processes.

Claude Desktop calling a custom MCP weather tool
  • Python
  • MCP
  • FastMCP
  • LLMs
  • APIs

Semantically Chunked Medical RAG

Built a question-answering system over a medical knowledge base using only free and open models. Documents are split semantically rather than at fixed character counts, which keeps related content together at chunk boundaries. The chunks are embedded with sentence-transformers, retrieved by vector similarity, and passed to an open LLM. Medical is a demanding domain for RAG: get the retrieval wrong and the answers are worse than useless.

  • Python
  • RAG
  • sentence-transformers
  • Semantic Chunking
  • LLMs

LoRA & QLoRA Fine-Tuning of Llama

Fine-tuned a Llama model for a specific task using LoRA and QLoRA. LoRA freezes the base model and trains small low-rank adapters instead; QLoRA adds 4-bit quantization on top, which is what makes fine-tuning a multi-billion-parameter model practical on a single GPU. The result is a model that performs differently on the target task without the cost of full retraining.

  • PyTorch
  • LoRA
  • QLoRA
  • Llama
  • Fine-Tuning
  • Hugging Face

Software

Kia Mouriora Te Kaiwharawhara Community Website

Spent seven weeks in Wellington, New Zealand building the public website for Kia Mouriora Te Kaiwharawhara, a waterway restoration initiative led by Zealandia ecosanctuary. I was the software developer intern for the project, part of WPI's IQP program. My main contribution was the ArcGIS map: I built the map component using the arcgis-core SDK, pulled in published ESRI layers for bird sightings (iNaturalist), land cover, and waterway boundaries, and wired up layer toggling, a filter navigation bar, collapsible layer descriptions, and click popups with species information. I also wrote the Legend and LayerCollapse components, redesigned the homepage, and set up a Google Sheets CMS so the sponsor can update content without code changes. We were building on a Leaflet prototype from the previous year's team, rebuilt it in Next.js and TypeScript, ran three scrum sprints tracked in Jira, and closed with 18,000+ lines of code, tutorial videos, and a maintenance guide.

  • Next.js
  • TypeScript
  • ArcGIS SDK
  • React
  • Tailwind CSS
  • Google Sheets
  • Vercel
  • Jira

IEEE WPI Student Branch Website

The website for WPI's IEEE student branch, which I maintain and develop as its elected Web Chair. I've held the role for two consecutive terms.

  • Web
  • IEEE

This Portfolio

The site you're reading. Built on Next.js 15 App Router with React 19, Tailwind CSS v4, Neon serverless Postgres, and NextAuth for Google sign-in. It also fetches a live transcript from a registrar-published CSV and manages an authenticated contact inbox.

This portfolio's home page in the Terminal Warm theme
  • Next.js
  • React 19
  • TypeScript
  • Tailwind v4
  • Neon Postgres
  • NextAuth

Deck Doctor: Business Site & Employee Portal

I founded Deck Doctor, a deck renovation business, and built and maintain its software. There's a customer-facing site to bring in leads and a separate employee portal where the team manages estimates, jobs, quotes, and hours.

  • React
  • Web
  • Business

TTF-Merger

FontForge-based Python utility for merging .ttf files. Multilingual font licensing was getting expensive for user-facing reports at my internship, so I wrote something to combine only the needed glyphs from each file into one.

TTF-Merger command-line utility merging multilingual font glyphs
  • Python
  • FontForge
  • Tooling

PDF Report Generation Framework

I built a PDF generation framework during my software engineering internship at Hedberg Data Systems (Steelcase | HNI). It's a type-safe Kotlin DSL: describe the report structure in code, it generates the HTML around the company's data types, Playwright renders that in headless Chromium, and the PDF bytes go back to the frontend. These reports use the merged fonts that TTF-Merger produces.

A PDF report generated from the Kotlin DSL report framework
  • Kotlin
  • DSL
  • Playwright
  • Chromium
  • HTML/CSS