Want a less interactive experience? Scroll down
My passion is designing creative, interactive experiences using web and game technologies, while making the development experience as friendly as possible!
I mainly use C as a simpler alternative to C++. I have experience with the standard library, and have written a few small projects in C. I enjoy the simplicity of the language, and it helps me focus on implementing a solution rather than designing one. I also think that C helps me write code for older versions of C++, especially when it comes to algorithms.
I have used C game libraries like SDL, RayLib, flecs, and some header-only libraries like stb_image and cute_headers.
I have been using C++ since 2018. While I have a great understanding of the language and love to keep up with the latest features, I do not have many finished projects to show for it. I am very familiar with language features up to C++23 and best practices, including RAII, smart pointers, iterators, ranges, functional techniques, design patterns, and more.
I have developed for similar libraries as C, but also have experience with other libraries and APIs like EnTT, OpenGL, Vulkan, WxWidgets, WinAPI, and more. I have used C++ with certain low-level APIs on Windows like multithreading, windowing, and sockets.
I usually opt for CMake as a build system and am familiar with Make. In addition, I usually use Clang and MSVC.
I have been using C# since 2021. I exclusively use C# for Unity development, though I do enjoy looking at what cool language features I could be using if Unity were to update to a newer version of C#.
I have been using Python since 2018. I have used Python for a variety of tasks, including data analysis, symbolic math, graphics, and scripting. I like to keep up with features of the language, and generally use Python whenever I need to achieve something, rather than write a user-facing program. I also write many of my algorithms in Python.
I have used Python with libraries like Sympy, Numpy, Matplotlib, SciKit-Learn, Pandas, and Pytorch. I have also written Discord bots, web servers, and done web scraping in Python a while ago.
JavaScript was my first language, and I have been using it since about 2016. I principally use JavaScript and TypeScript for web development, though I have also used it for Discord bots and other small projects. I am familiar with many of the Web APIs and love to keep up with Web technology. When I use NodeJS, I usually opt for TypeScript (and otherwise, I try to use JSDoc).
I have used countless of libraries and frameworks, including rendering libraries like React, Svelte, and Vue, backend libraries like Express, NextJS, Vite, and Remix, styling/component libraries like Tailwind and Material UI, and various libraries for APIs, databases, and more. I also know how to use Webpack and have used Rollup. I have also tinkered with unified and remark for markdown processing. I use vanilla JS on web for my work, and am comfortable working without a preprocessor or bundler.
I have been using Rust since 2021. I am still relatively new to the language, though I am capable of using it for small projects. I have tried to use rust for game development, with C libraries like SDL and with Rust-native libraries like Amethyst and Bevy, but usually end up using engines I am more familiar with. I have also played with rust for Godot and web.
Rust is my imperative language of choice for writing algorithms due to its safety features and amazing functional programming support.
I am using rust for one of my games (TeeGee) which uses rust for a user-facing CLI interface to the game.
I have been using Haskell since 2022. I have mainly used Haskell to learn about functional programming, though have also used it to implement various computational linguistics algorithms for coursework, like regular expression matching and automata algorithms. I have tried to use Haskell for other things, but have found the package and build ecosystem frustrating.
I have experience with lua in certain embedded contexts, like Love2D, Neovim, and Playdate. I have also once embedded lua in a C program for scripting, and am interested in using lua for future embedded contexts.
I use powershell as my shell of choice on Windows, and occasionally use it for scripting. This is usually for batch processing, like renaming files or processing images.
As a Linux user, I have experience with bash scripting. I use bash for configuration, scripting (eg. build scripts and WM scripts), and certain automation tasks, similar to PowerShell. I am not an expert, but I can get the job done.
I enjoy using GLSL and HLSL for graphics programming in Unity, though optional. I have written Unity shaders for custom lighting, postprocessing, and computations, and have written shaders for basic rendering in OpenGL and Vulkan.
I have used Unity since 2020. I have participated in many game jams, have participated in 4 large projects with teams, and experimented with many small projects. I have experience with rendering in BiRP and URP, including custom shaders using ShaderLabs and ShaderGraph, custom postprocessing, and visual effects using particle systems and VFXGraph. I have experience with all Unity GUI frameworks, but primarily use Unity UI and UI Elements. My games often rely heavily on physics, so I am comfortable with many of the niche features of Unity physics in 3D and, to a lesser extent, 2D. I am very comfortable with customizing the Unity editor, including making custom editors, property drawers, scene gizmos, manipulating serialized data, creating custom importers, and more.
I primarily build Unity for destkop and web, but have experience with making mobile control schemes using Unity's Input System. I also have experience with many Unity packages like Cinemachine, AI Navigation, Behavior Trees, Terrain, Timeline, and more.
I am currently developing and maintaining a small utility package for Unity, which is compatible with Unity's package manager.
I have used Godot since 2019 but have not used it as much as Unity. I have experience with GDScript, and have also written C++ and Rust for Godot. I mainly have experience in 2D, but have also done some 3D.
I have primarily used Windows since 2015. I am comfortable with many of the features of Windows, including the registry, services, permissions, and more. I am also comfortable with the Windows command line, and have used PowerShell for scripting.
I have used WSL on Windows for a while using Ubuntu. I have also dual-booted Ubuntu for a while. However, I only become comfortable with Linux in 2021 when I dual-booted Arch Linux. I am now comfortable with the standard workflow on Linux, and use it as my primary OS for development.
I am comfortable with terminal-only workflows, and have used many of the standard Linux tools, like Vim, Emacs, and (my preferred) Neovim, Git, SSH, FTP, and more.
I have experience with data science in Python, and have used Pandas, SciKit-Learn, and PyTorch for data analysis and machine learning. I am comfortable with the standard data science workflow, including data cleaning, feature engineering, model selection, and evaluation. I have most experience with regression, classification, and clustering algorithms, but have also used neural networks and other advanced algorithms.
I have solid formal understanding of rendering theory, including working knowledge of Vulkan and OpenGL and understanding of high-level math. I understand techniques such as forward and deferred rendering, shadow mapping, environment mapping, and more. I have written custom shaders for stylized rendering in Unity and OpenGL, and have experience with postprocessing and visual effects. I also have used compute shaders for parallelization.
Having worked in web for a long time, I have a very good understanding of most UI concepts. I have used many web technologies, desktop technologies (eg. WxWidgets, Qt), and game technologies, and find most easy to transfer to. While I am not a professional designer, I end up doing a lot of design work for my projects and think I have a good eye for design.
I have a good understanding of accessibility and usability. I keep designs purposeful and keep the user in mind for all decisions, including abiding by standards like WCAG. I do also love making designs that are very reactive, using many animations and transitions to gamify the experience.
I have lots of experience with Figma, Adobe XD, and Adobe Illustrator. Given a design in Figma, I can easily implement it in web or Unity.
“Every good game has a fishing minigame.
But this game is a fishing megagame.”
Upcast Blue is a fishing metroidvania where all items are fish! You play as an unnamed protagonist whose father had never permitted them to leave the cove of an unexplored island. However, with their father no longer there, they decide to explore the island, learning more about their family and helping people on the island.
The game revolves around fishing and using your fish to solve puzzles in a metroidvania fashion. The game includes many systems, including an items system—which includes fishing, fish, and inventory management—interactable objects, achievements, and input action UI. It is also heavily stylized, with use of toon shading and postprocessing effects.
The game relies on diegetic UI for most UI except those required for accessibility. The inventory of fish is represented by a bucket in game. Your logs, the lore, and quests are all stored in a journal that you physically take out.
I directed and worked alongside ~7 programmers and tech artists to implement and optimize the game's systems and shaders. I also communicated with our other teams to meet the game's creative vision and to increase performance, and made sure systems were fun and accessible.
To simplify the game's systems logic, I created an archtecture for adding items, interactables, fish, and quests relying heavily on Unity ScriptableObjects, OOP principles, the subscriber pattern, and dependency injection.
I chose and worked with modern Unity technologies like Unity's new Input System, Universal Render Pipeline (URP), UI toolkit, terrain system, and navmeshes. I constructed surface shaders, postprocessing, and terrain shaders using ShaderLabs and ShaderGraph that matched our games lighting model using URP-style practices. Using UI Toolkit, I implemented styles designed on Figma to create menus, input indicators, and an animated notification system. For the input indicators, I designed a system to connect the new Input System with UI to accessibly and dynamically represent input actions based on context, that also served the purpose of disambiguating contexts with multiple possible inputs.
This was the first game I have created that was open world, and with it came the performance problems inherent to open world games. To fix these, I requested and implemented LOD models, added static batching, and implemented custom shaders with simplified lighting logic. In addition, I utilized Unity's profiling tools to narrow down and optimize slow systems, like fish AI, that bottlenecked performance. These optimizations increased build framerates from under 60 FPS to over 120.
We also decided to use a few tools I had not used prior. For sound, while it was likely a bit overkill, we used FMOD, and I learned to implement dynamic and random sounds with distance attenuation. We also used Unity's Timeline tool to play a cutscene, where we encounted errors since FMOD had no support for Unity's video player.
This prototype follows an unnamed protagonist as they traverse through the rooms of strangers by using their ability to teleport to whatever computer they are connected to. What makes this game unique is the medium: you interact either via a 3D isometric world or through the computer's terminal. When you interact with many objects in the game, it hides the window and opens a new terminal window that you can use to interact with the game world.
This game demonstrates basic Unity skills like lighting, shaders, pathfinding, scene management, multicamera rendering, and advanced input control. It uses URP and the new Input System. It also demonstrates my ability to architecture and implement modular Rust applications. The application shows general knowledge of operating system design as well, with an implementation of a filesystem and various GNU commands.
I decided to use interprocess communication (IPC) to make the two mediums interact. The Rust terminal client is spawned as a separate process to the Unity game, and they use TCP sockets to communicate. I also considered using pipes, but TCP seemed cleaner cross-platform (pipes on Windows are not my favorite!). The current format is to send C FFI structures across TCP as bytes and use a simple header system to determine message size. However, I am learning the hard way why you should not do that, and am considering switching to a preexisting format like BSON.
There is always more to learn with Rust, and I learned about how awful lifetime management is with mutable references. I initially designed the terminal client like I would a C++ program. However, since there are many interworking parts that need to simultaneously mutate state, I ran into problems shortly. Thus, I decided to use interior mutability using Cells.
Another minor thing I learned is effective scene management with Unity. The typical workflow for beginner scene management is one scene for the menu and one for the game. However, I decided to architect the game using additive scenes and a scene for each room. I also learned about and messed with Unity's area lights and light probes.
This game is also an excuse for me to get better with Blender.
This game is an endless runner made for ACM Studio's 2024 Studio Jam! The theme was "break the cycle", and we chose to break the cycle of trolley problems. I created most of the game within the first 48 hours, with the remaining time going to adding sound effects. The game uses Unity 6000 and makes heavy use of Cinemachine camera controls and audio.
The main skills I demonstrate are my ability to quickly prototype and create a clean game, demonstrating my proficiency with all aspects of Unity, from animations to camera controls, to UI (screenspace and worldspace). I ensured that UI was visible on all target aspect ratios and resizable when I could make it.
Scope is always an issue with game jams (and games...), so with this one we tried to keep it low scope while allowing ourselves flexibility. We scoped in active items that the player would actively use, but ended up scrapping them to polish other aspects of the game. In addition, we added things like extra sound effects and a cute death screen that were not in scope.
The game jam went really smoothly! The only problem was that WebGL does not support audio mixer effects (unfortunately 😔)
This game is a visual novel made in 48 hours for the Sondering Emily x Julie Strator Game Jam. The theme was home, and we decided to make a game where the player fills in the blanks to write their own story and find the way home. The game includes modal gameplay, with a visual novel mode and a madlibs-style mode. There are over 100 unique lines, all fully voiced by one of our members. In addition, the game features a secret ending that is unlocked by going through all the options in the game.
I was in charge of all the implementation, including all UI, art assets, animationsn, and shaders. The madlibs mode was a new challenge, where I had to create a system where the player could drag and drop words into the blanks. This did not mesh well with overlay UI (which was necessary for shaders to affect the UI).
Another unique challenge was adding voice acting to the game. I had never worked with voice acting before, but I had worked with basic YarnSpinner, a popular dialogue system for Unity. In addition, I decided to implement a lot of the gameplay logic within YarnSpinner using custom commands. This allowed me to keep the game logic tightly coupled with the dialogue, which made tweaking timing and events much easier.
This is a minesweeper clone with support for custom board sizes, custom themes, a solver, and primitive support for scripted gamemodes using Lua. More importantly, it is a minesweeper clone made in C, SDL, and WinAPI, using SDL for windowing, rendering, and input, and WinAPI for resources and menus.
The main purpose of this minesweeper clone was to demonstrate my ability to write premade gameplay logic in a language that does not have advanced features like events, OOP, or containers (I only used arrays!). This project also demonstrates my ability to use low level frameworks like SDL and WinAPI to successfully implement a full game.
This minesweeper clone uses a manual but dynamic layout system (after trying Facebook's yoga and realizing it was overkill). I also demonstrate a minesweeper solver that treats the board as a system of equations (each number is the sum of its surrounding cells) using an RREF algorithm to find the solutions. While this algorithm is certainy slower than it could be with parallelization and other optimizations that a real math library would surely have, the point was to demonstrate my ability to write such an algorithm in C.
I developed a C coding style to organize structures similar to Vulkan's, where "methods" are defined on structures by passing them in as a pointer, and using the naming convention "Structure_Method". Using this coding style, I was able to translate C++ organizational structure (except OOP) into C. I also learned how to use menus in WinAPI using resources (which, unfortunately for my current linux-using self, made the application no longer cross platform). I also learned the structure of the embedded Lua scripting.
This is a Chess clone that uses RayLib and C, and currently includes all chess game logic and rendering logic for pieces and a move visualizer.
This shows my proficiency with C. It uses an object-oriented structure similar to the one I used for MineSweeper. It shows proficiency in OOP design and resource management.
It requires a small custom layout engine and complex logic for piece behavior. In addition, for assets I wrote a small python script to preprocess metadata for slicing and combine it with raw image data to embed PNGs into the application.
It was built to be modular, with the intent that the rules of the game could be easily extended or modified using Lua.
Website for the National Heritage Resource Center under the Center for World Languages at UCLA. The website has content for heritage language researchers, educators, and speakers. It serves many articles managed by an in-house CMS and also displays events from sister centers.
I optimized this website for SEO, accessibility, and devices. The website has the appropriate metadata, passes lighthouse accessibility tests which requires semantic HTML and appropriate sizing and attributes, and works at multiple viewprot sizes.
In this website, I prioritized user experience and interactivity. I designed the entire website on Figma beforehand, making use of its present feature to share the design with NHLRC directors. I did all designs with the user in mind, creating different UX pathways for each of the target audiences, notably visible on the home page. I tried to minimize difficulty in navigating the website, deciding to use a meganav and using breadcrumbs, subnavs, and table of contents when applicable. Unlike with CWL, I tried to use larger spacing and larger text to create a more obvious hierarchy.
To make the site more dynamic, I created an animation system using the IntersectionObserver API to create viewport-enter animations. I also tried using the BEM organization for CSS to create more organized components, which I still use when writing CSS.
Website for UCLA's Center for World Languages. Consists of a home page and various subpages serving event information and news articles, which uses an in-house CMS for content. I was responsible for the creation of the frontend from scratch using HTML, CSS, and JavaScript, and optimizing the website for mobile, SEO, and accessibility.
This was the first website I worked on under UCLA's International Institute. I started web dev using vanilla JS/HTML/CSS/PHP, but then started using frameworks that abstracted away most of the native browser code (eg. tailwind, react). CWL uses ASP WebForms and only CSS styling libraries. Thus, I had to get better with vanilla web tools, and used it as an opportunity to learn best practices with modern JavaScript, CSS, and HTML.
One of the more important things that I learned was accessibility standards. I learned how to structure HTML documents semanticaly to be read by a screen reader, and how to achieve many effects without the use of JS. I also did a lot of research into accessible typography, spacing, and colors.
Mobile support was very important for the website. I incorporated the relevant metadata and media queries in order to optimize for mobile.
I also learned about CSS features that had not been available from when I was a dev before. Some of the ones I particularly liked were CSS grids and variables, which I used extensively.
I also was tasked with making the website more SEO friendly, which required learning about HTML metadata tags and other metadata protocols like OpenGraph. I also here realized that generating content with client side JavaScript hurts SEO and decided to not rely on it.