Projects

Schematic of an Arduino Uno circuit board

Word Guessing Game

ArduinoHardwareTry It Yourself

February 2022

A word guessing game built on an Arduino Uno. The game is played by guessing a 5-letter word in 6 guesses. The game uses a 16x2 LCD screen to display the player's guesses. Using the three buttons, the user can input a word and submit their guess. If the word is incorrect, the LCD screen will display hints about which letters were correct and which letters were in the wrong position. The program comes with a word bank of 50 words, but the user can also input a custom word for his or her friends to guess.

Read More
TGA Image files open in a text editor

Image Processor

C++Console

March 2022

A console app that has various functions for mixing and manipulating TGA images. It was created as part of a project to practice C++ I/O operations with binary files. The program reads TGA files from the input directory and outputs the modified images to the output directory. Several functions have been written to help blend images using modes such as add, multiply, subtract, screen, and overlay.

Read More
Screenshot of the Minesweeper Clone game

Minesweeper Clone

C++SFMLGame

March 2022 - April 2022

A clone of the classic Minesweeper game. The game was made using C++ with the Simple and Fast Multimedia Library (SFML), a simple C++ library with basic graphics capabilities. The objective of the game is to uncover all the tiles on the board that do not contain mines. If the player uncovers a mine, the game is over. If a tile has no surrounding mines, the surrounding tiles are automatically uncovered. Tiles that have surrounding mines will display a number, indicating the number of mines. The player can also flag tiles that they think have mines. The game also has several debugging features such as test boards, an option to view all mines, and a config file to adjust the game's difficulty.

Read More
Design of several rooms in the game's level

Top Down Roguelite Game

C#UnityGame

May 2022

A rogue-lite mobile game created as part of a 72-hour event for the non-profit organization Bernie and Murcer. The game was created using Unity with C# scripting. The player has to move through various rooms, avoid obstacles, defeat enemies, and collect items. During the event, over 20 people worked on the game, including artists, programmers, and designers. I helped create the game's inventory system, add item effects, design rooms, and improve the player's shooting mechanics.

Read More
Screenshot of the data produced by the cache simulator on a line graph.

Cache Simulator

PythonMatplotlibConsole

November 2022

A cache simulator that allows users to simulate a cache with a given cache size, block size, and associativity. It was created as part of a project to investigate how cache size affects the hit rate. Based on the input parameters, the simulator will determine the cache's hit rate and output the results to a CSV file. The results can then be viewed in a graph using matplotlib.

Read More
Screenshot featuring a search pane and a grid of several games

Game Sort: A Video Game Search Engine

TypeScriptReactWebFeatured

November 2022 - December 2022

A video game search engine that allows users to search for video games by title, genre, platform, and more. It was created as part of a team project to demonstrate how data structures and algorithms can be used to solve real-life problems. The app was created using React and TypeScript with Vite. Once users enter their search criteria, the app searches its database of over 100,000 games (scraped from IGDB and RAWG; see GitHub README) and calculates a 'match percentage' for every game. It then sorts the games by their match percentage based on the selected sorting algorithm (including JavaScript's built-in sort function whose implementation is based on the browser). The results are displayed to the user and each game can be clicked on to view more information about it. Although the app is open-source, the data is not included in the repository due to its size.

Read More
Screenshot of the SwampFriend Discord Bot displaying an intro message

SwampFriend Discord Bot

TypeScriptDiscord.jsAdd-On/Plugin

January 2023

A Discord bot that allows people to write bio messages about themselves to share with others. It was created for a hackathon with a team of 3 other people. The theme for the hackathon was 'Exploring the Unknown'. Our approach was to create a bot that would allow one to seek out new connections in his or her Discord server. The bot was created using TypeScript with Discord.js. A user can create a new intro using the '/intro' command and grab a random person's intro using '/seek'. Check out the Devpost page for more information.

Read More
Screenshot of StackBlitz with code on the left and a rendered to-do list on the right

Intro to React Workshop

TypeScriptReactWebFeaturedTry It Yourself

February 2023 - March 2023

A to-do list app designed to help teach the basics of React. It was created for a workshop for the Society of Software Developers at the University of Florida. The workshop is divided into six parts, each with an interactive exercise. During each exercise, the presenter and viewers must fix a part of the app to make it function correctly. Instructions on how to fix the app are in the 'instructions.md' file at the root of the project. Viewers can choose to follow along with the workshop and fork the repository from StackBlitz if they fall behind, maximizing the time spent coding. The first version of this workshop was given in just under 75 minutes.

Read More
Screenshot of a Blender project featuring a robot and various blocks in a room.

Intro to Computer Animation Collection

BlenderArt/Design

February 2023 - March 2023

A collection of animations made in Blender. These animations were created for several class projects to explore the features of Blender and the elements of 3D Computer-Aided animation. These include keyframe animation, path animation, inverse kinematics, rigging, particle simulation, and physics-based animation. Ellie Character Rig provided under the CC-BY 4.0 License by Blender Studio https://studio.blender.org/characters/ellie/v1/ https://creativecommons.org/licenses/by/4.0/

Read More
Screenshot of the blog section on the website's home page.

Open Source Club Website: Blog Page

JavaScriptEJSWebFeatured

October 2022 - March 2023

A website for the Open Source Club at the University of Florida. The website is designed to be a place for members to learn about the club and its events. It also serves as a place for members to share their experiences with open-source software and the club. I was responsible for styling and scripting the blog page to match the style of the rest of the website.

Read More
Screenshot featuring a digital canvas and a picture of a gesture to draw.

$N Recognizer

PythonTkinterDesktop

March 2023 - April 2023

A desktop app that can collect gesture data from users and be trained to recognize gestures that require multiple strokes. Created as part of a class project for a course on human-centered input recognition algorithms. The app is written in Python and uses Tkinter for the GUI. The recognizer is based on the $N Recognizer algorithm by Jacob O. Wobbrock, Andrew D. Wilson, and Yang Li. More info on $N: http://depts.washington.edu/acelab/proj/dollar/ndollar.html Reference: Anthony, L. and Wobbrock, J.O. (2010). A lightweight multistroke recognizer for user interface prototypes. Proceedings of Graphics Interface (GI '10). Ottawa, Ontario (May 31-June 2, 2010). Toronto, Ontario: Canadian Information Processing Society, pp. 245-252.

Read More
Screenshot of the dashboard featuring a calendar and budget information.

Student Budget Tracker

TypeScriptAngularWebFeatured

January 2023 - April 2023

A web app that allows students to track their spending and budgeting. It was created as part of a project to practice full-stack web development. The front end uses Angular, and the back end is written in Go. The app also uses a MySQL database to store user data. The app features a log-in system to allow users to save their data, a transactions table to allow users to record their transactions, and a budget table to allow users to set budgets for different categories. The app then combines the data from the transactions and budget tables to display a calendar and progress information to help users stay on track with their budgets.

Read More
Screenshot of the home page featuring a welcome message and two posts.

Bulletin Board Website

TypeScriptReactNext.jsFirebaseWeb

May 2023 - June 2023

A website that allows users to post messages on a bulletin board. It was designed to be a very simple full-stack application with create, read, update, and delete functionality. It uses React and Next.js with TypeScript. It also uses Firebase Authentication to allow users to log in with their Google accounts and Firestore to store the post data. Users can log in, create posts, edit posts, and delete posts. The home page displays all the posts along with their authors and profile pictures.

Read More
Screenshot of a memory manager test, showing diagrams memory being allocated and freed.

Memory Manager

C++Console

October 2023 - November 2023

A C++ library that allows users to allocate and free memory. It was created as part of a project to learn more about memory management in operating systems. The library uses a custom linked list to keep track of freed memory blocks and allows for different memory allocation algorithms such as 'best fit' or 'worst fit'. Additionally, a special test suite was created to test the library's functionality. The test suite outputs diagrams of the memory being allocated and freed to help visualize the process.

Read More
Screenshot of an explorer window showing the mounted filesystem and an image inside.

WAD File System Library and Daemon

C++ConsoleOS

November 2023

A C++ library and daemon that allows users to mount and interact with WAD files on Linux. It was created as part of a project to learn more about file systems. WAD files are a type of file used by classic PC games such as DOOM and Hexen. The daemon was implemented using the FUSE API and allows users to mount a WAD file as a file system and interact with it using standard file system commands such as 'ls', 'cd', and 'cat'. Users can create files, make directories, and copy images into the WAD file.

Read More
Screenshot of the Lab Escape game title screen.

Lab Escape Platformer Game

C#UnityGameArt/Design

August 2023 - December 2023

A 2D platformer game created in Unity. The game was made over a semester for a creating mobile games course. The objective of the game is to escape from a laboratory by navigating through various levels and defeating enemies. There are 3 levels for the player to traverse, giving the player a variety of challenges to overcome. Many of the game's assets were created from scratch, including the player character, enemies, items, and environment.

Read More
Screenshot of the Society of Software Developers website home page.

Society of Software Developers Website

TypeScriptReactNext.jsWebFeatured

October 2023 - December 2023

A website for the Society of Software Developers at the University of Florida. The website is designed to be a place for members to learn about the club. It has a landing page to provide basic information about the club and where its meetings are held. The about page provides information about the club, its mission, and the club officers. The project was built with a team of about 5+ people utilizing agile software development practices. I was responsible for developing components such as the website's navbar and officer information cards on the about page.

Read More
Screenshot of a discussion page with messages in a scrolling list.

StudySync: A Social Media GUI

TypeScriptReactNext.jsWeb

October 2023 - December 2023

An interface designed for a social media app that allows students to connect and share educational content. The app was created as part of a team project for a course on human-computer interaction. The app features a home page with a list of topics for the user to join. Each topic has its own discussion page where users can post messages and send attachments. The app is not connected to a back-end, so the data is not saved. Instead, it is used to allow others to evaluate the interface in user studies, so that it may be improved if a fully-featured app were to be made. It was created using React and Next.js with TypeScript.

Read More
A console window showing a Tic-Tac-Toe game ending in a tie.

ML-Powered Tic-Tac-Toe

PythonScikit-learnConsoleAI

February 2024 - March 2024

A command-line Tic-Tac-Toe game that uses machine learning to determine the best move. The game was created as part of a project to practice machine learning with Scikit-learn and compare different algorithms. The player can choose between one of three algorithms: K-nearest neighbors, linear regression, and multi-layer perceptron. These algorithms are trained on a dataset of 6,500+ games. Each dataset entry contains the board state and the best moves to make. Once the player selects an algorithm, they can play against the computer and see how well the algorithm performs. KNN tends to perform the worst while MLP is nearly unbeatable.

Read More
A chat window in VS Code showing the user asking a question about Python.

LLM Debug Assistant

PythonTypeScriptTensorflowVscodeHugging FaceAdd-On/PluginAI

February 2024 - April 2024

A VS Code extension powered by a Large Language Model (LLM) that helps developers debug their code. The extension and underlying model were created as part of a project to explore the capabilities of LLMs. The model was created from a smaller version of Meta's Llama 2 model and fine-tuned on a dataset of questions and answers from StackOverflow. The extension provides a user interface, allowing users to ask questions in a chat window. The model then generates responses to help the user debug their code.

Read More
A log file showing a peer sending and receiving messages and pieces from other peers.

Simplified BitTorrent

JavaConsoleNetworking

February 2024 - April 2024

A command-line program that implements a simplified version of the BitTorrent protocol. It was created as part of a group project to practice networking in Java and learn about peer-to-peer file sharing. Peers can join the torrent network and download pieces of a file from other peers. In the simplified protocol, each peer keeps track of the pieces every other peer has and requests pieces from peers that have the pieces they need. Every few seconds, the peers re-evaluate their preferred neighbors and unchoke the top peers to send them pieces. This system of choking and unchoking emulates the behavior of a real BitTorrent client, which is designed to maximize download speeds.

Read More
Code for a Niter program that prints "Hello, World!" and the number 42.

The Niter Programming Language and Compiler

C++LLVMConsoleFeatured

January 2024 - July 2024

A programming language designed to be Turing-complete, statically-typed, and fast. The language is compiled to LLVM Intermediate Representation, allowing for powerful optimizations and cross-platform compatibility. The language features a C-like syntax with support for functions, variables, loops, conditionals, and more. It also provides simple error messages for compilation errors. The compiler is written in C++ and operates in several stages: scanning, parsing, type-checking, and code generation. The language is still in development and has over 200 integration tests to ensure correctness and speed up development. It is named after the mineral form of potassium nitrate, a compound used in fertilizers and gunpowder, which reflects the language's power, versatility, lack of safety restrictions that nerf control.

Read More
Screenshot of the calculator GUI and REPL with some expressions.

Expressive Calculator REPL and GUI

RustTauriConsoleDesktop

July 2024 - August 2024

A calculator built in Rust that evaluates math expressions by parsing them into abstract syntax trees. It supports binary operators such as addition, multiplication, exponentiation, and modulus, following the order of operations. It supports constants such as `pi` and `e`. It also supports several mathematical functions such as `sqrt`, `sin`, `exp`, `log`, etc. To provide an interface for the library, a command-line REPL and a GUI were created. The REPL allows users to enter expressions and see the result. The GUI was built with Tauri and provides a more user-friendly interface. Both store previous expression results in variables like `$ans`, `$0`, and `$1` for easy access.

Read More
Screenshot of the UF CSU website home page.

UF CSU Website

TypeScriptSveltePostgreSQLWeb

June 2024 - October 2024

A website for the University of Florida Computing Student Union. UF CSU is a student organization that brings together students interested in computing and technology. The website was created to provide information about the club and act as a hub of information for over 35 computing clubs at UF. It features a clubs page where users can search for clubs by name and an events page with a calendar and list of upcoming events. The website was created using SvelteKit and TypeScript with a PostgreSQL database to store club and event information.

Read More
Gameplay screenshot of the Magic Shooter game.

Magic Shooter Game

C#UnityGameArt/Design

September 2024 - December 2024

A 2D top-down shooter game created in Unity. The game was made over a semester for a game content production course. The game's objective is to avoid enemy projectiles and defeat the enemy machines using magic spells. The player can move in all directions and cast fireballs in the direction of the cursor. The player can also dash to avoid projectiles and gain invincibility frames. This project served as an opportunity to practice programming player movement and game mechanics in Unity.

Read More
The main scene of the game with a basketball, launch arc, and hoop.

Basketball Arcade Game

JavaProcessingGame

March 2025 - April 2025

A simple basketball arcade game created in Java using Processing. The game was made as part of a class project to build a game with limited tools. The objective of the game is to make as many baskets as possible in 30 seconds. The player can shoot the basketball by clicking and dragging the mouse. While dragging, an arc is shown, displaying the trajectory of the ball. The player's score is saved to a text file, allowing the player to view where they rank on the leaderboard. Because Processing is a graphics library, many of the game features, such as the physics, timer, leaderboard, and scene management system, were created from scratch. Building the game required heavy use of object-oriented programming principles, such as encapsulation and inheritance. The game was made in a team of 3 people, with each person responsible for different parts of the game. I was responsible for the main scene physics and the scene management system.

Read More
The user interface for Catanatron showing the game board.

Navigating the Multiverse: Catan Reinforcement Learning

PythonJavaScriptPyTorchReactAIGameFeatured

August 2024 - April 2025

A Catan reinforcement learning agent created as part of a team project sponsored by CAE at the University of Florida's Integrated Product and Process Design (IPPD) program. IPPD is a capstone program that allows students to work on real-world projects with industry sponsors. For our team, Tactica, we were tasked with creating a machine learning agent that demonstrates tactical decision-making. We chose the game Catan due to its popularity, randomness, and strategic depth. We used an existing simulation, Catanatron, to simulate the game and provide a training environment for our agent. The simulation also provides a GUI, allowing users to play against the agent. We had to modify the simulation to add a trading interface, allowing the agent to trade with other players. I was responsible for most modifications to the GUI. We also added commands for training and testing, allowing for quick iteration and testing of our agents. For our agent, we used a reinforcement learning approach with a Graph Neural Network (GNN) to model the game board. The agent would choose among the many possible actions based on the current game state. When we found that this strategy was not effective, we pivoted to an ensemble approach where our agent instead picked among a set of strategies rather than a set of actions, reducing our action space. Our final agent was able to win at a rate of 98.4% against 3 random-choice players (players that choose random actions) and 22.7% against 3 of Catanatron's best players. Through this, we were able to demonstrate the potential of our unique ensemble approach. This project would not have been possible without the help of my teammates: Max Banach, Andres Espinosa, Cody Flynn, Jason Li, Han Mach, and Cathy Quan. This project also would not have been possible without our coach, Dr. Jorg Peters, our sponsor, CAE, and the IPPD staff.

Read More
Lab Escape game title screen.

Lab Escape Game: Godot Edition

GodotGameArt/Design

August 2024 - May 2025

A 2D platformer game created in Godot based on my original Lab Escape game made in Unity. The game was made to explore the Godot game engine and its capabilities, including its hierarchical scene system, signals, and scripting language (GDScript). While developing the game, I devised new ways to think about scene organization and how to use signals to create a more modular design. Characters and enemies utilize multiple Area2D nodes to handle different mechanisms, such as physics, attacks, and damage detection. Similar to the original game, the objective of the game is to escape from a laboratory by navigating through various levels and defeating enemies. There are 3 levels for the player to traverse, giving the player a variety of challenges to overcome. Many of the game's assets were created from scratch, including the player character, enemies, items, and environment.

Read More
My City app tablet view list-detail view with places and details.

My City Android App

KotlinAndroidJetpack ComposeMobile

August 2025

An Android app with information on various places to visit in Washington, D.C. The app was created as part of a project to explore mobile app development with Kotlin and Jetpack Compose in Android Studio. It features Material Design components, state management using view models, and navigation between screens. It also features adaptive layouts for different screen sizes, making use of the list-detail canonical layout on wider screens.

Read More