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 have been programming for a long time in many different fields, and am overall a very functional software engineer with both high level and low level knowledge of many fields. I pride myself for havingintrinsic curiosity, always learning new things and experimenting. I find this to be my greatest skill, since it allows me to continuously improve and adapt.
I have experience with many languages in all paradigms, and like to write idiomatic code that makes use of good software design patterns, being very familiar with OOP, imperative, and functional programming and being able to pick up new languages with ease.
I practice implementing algorithms and data structures knowledge via leetcode and try to use the best data structure for the job. I am also familiar with parallel programming and concurrency, and have used multithreading, tasks, coroutines, and GPU parallelization, in languages like C++, C#, and JS.
I am a big fan of typing and documentation. I always write types in optionally typed languages, write comments (when naming is not enough), and try to write doc comments. I also write tests for my code when I can and understand the importance of unit and integration tests.
I have done extensive collaboration, and am very comfortable with the standard Git and GitHub workflows.
I have done system design for many game and fullstack applications, and I am comfortable with designing software architectures and server architectures. I choose the best design patterns while developing software, am comfortable with concepts in modern web development, including serverless, containerization, orchestration, databases, caching, authorization and authentication, etc.
I have been making games since Flash, and have participated in many game jams. I have experience with many game engines, including Unity, Godot, Unreal Engine, other smaller engines, and custom engines. I have experimented with games in many languages, including C#, C, C++, Rust, Python, and Lua.
Due to my experience in web, I enjoy UI development. I am comfortable with declarative and immediate UI, having used all 3 of Unity's UI frameworks. I also am interested in UI algorithms, such as layout, picking, and text rendering, and am interested in furthering my knowledge in this area.
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 (visual and HLSL) for stylized rendering in Unity and OpenGL, and have experience with postprocessing and visual effects. In my OpenGL/Vulkan applications, I have created simple forward render pipelines. I also have used compute shaders for parallelization.
I am also familiar with physics engines and their advanced features like collision layers, joints, springs, constraints, and softbody dynamics. I've used Unity's and Godot's physics engines and Box2D in C++. I am also vaguely familiar with some of the theory behind physics engines, and would love to work on one in the future.
I also have some experience with networking. I have only used asynchronous networking (which I am very familiar with due to web experience) and Unity's Networking for GameObjects, but am familiar with the theory behind realtime networking. I am also interested in furthering my knowledge in this area.
I have experience with game AI. I have implemented pathfinding algorithms and am familiar with pathfinding libraries. I have implemented state machines and have used behavior trees in Unity. I am also familiar with GOAP.
A 3D open world fishing metroidvania
A survival horror game about finding a resource on an alien planet
A prototype game about a terminal world
A 2D endless runner where you solve trolley problems
A 2D visual novel with mad-libs mechanics
A utility package for Unity, compatible with the package manager
Minesweeper written in C using SDL.
Chess written in C using RayLib.
A WIP Godot GDExtension to embed CEF into Godot
A simple pong game written in C++ using SDL (to teach a friend C++/SDL)
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.
A 3D open world fishing metroidvania
A survival horror game about finding a resource on an alien planet
A prototype game about a terminal world
A 2D endless runner where you solve trolley problems
A 2D visual novel with mad-libs mechanics
A utility package for Unity, compatible with the package manager
I have used Godot since 2019 but have not used it as much as Unity. I am trying to switch to Godot as my primary game engine, since I want to support open source software and it gives me the opportunity to read through the source code.
I have used Godot for a few small WIP projects. I have used GDScript, GDExtension, and building with custom modules.
I have experimented with the rendering system by making custom shaders and using multiple cameras. I have also messed around a bit with the pathfinding system.
A WIP Godot GDExtension to embed CEF into Godot
I have been using C++ since 2018. I try to keep up with the latest features of the language, and like to solve problems in interesting ways. I keep up with the best practices by reading source code and articles, and am familiar with most C++ concepts such as RAII, the big 5, good OOP, functional programming, SFINAE, templating/auto, etc. I am proud of how much I know of this language, and I always am excited to find more quirks of the language.
I am familiar with a lot of the standard library, including the STL, iterators/ranges, streams, multithreading, smart pointers, concepts, and functional utilities.
I have experimented in many projects with numerous frameworks:
A small C++ testing framework
A WIP Godot GDExtension to embed CEF into Godot
A proof of concept C++26 compile-time named field extraction library
A WIP layout library for C++20, supporting flexbox and some grid algorithms
A tiny C++ compiletime string hashing library
A Win32 only GUI tool to delete unwanted shortcuts from your desktop
A simple pong game written in C++ using SDL (to teach a friend C++/SDL)
I mainly use C for the same purposes as C++. I have experience with the standard library, and have written a few small projects in C. I enjoy the language, but in new projects I hesitate to use it mainly due to type safety.
I have used C game libraries like SDL, RayLib, flecs, and some header-only libraries like stb_image and cute_headers. I also enjoy writing algorithms in C.
I would call myself seasoned fullstack web developer. I started with web development in 2016, getting familiar with pure HTML/CSS/JS. I have since used many frontend frameworks, though I primarily use React. I keep up with web technologies, and enjoy using the latest features in CSS and JS. I am comfortable with many web APIs.
For backend, I primarily use Node.js with TypeScript, and default to Express or Next.js. Since I usually deploy to serverless/static hosting, I usually use a simple architecture with just an API and a database.
Since I usually use serverless, I am most comfortable with that architecture. However, I do have some experience with monolith and microservice architectures, having used Docker and Kubernetes on GCP. I usually feel bottlenecked by my lack of money, but I do understand the concepts of cloud computing through research and coursework.
I am familiar with relational database design, specifically with PostgreSQL. I am also familiar with caching with Redis. I have used ORMs, but prefer to use SQL. I have also used MongoDB.
I have implemented authentication and authorization using both session-based and token-based authentication, having used password hashing and OAuth.
I have also done some web scraping and websocket programming.
JavaScript was my first language, so I have been using it since about 2016. I am very familiar with JavaScript on web, having written many client-side with just JavaScript, for work and before I started using React.
I am very comfortable with JavaScript, and know most of the features (did you know it has labeled breaks??). I am also familiar with a lot of the Web APIs and am comfortable using JS without external libraries.
When I use Node, I use TypeScript. I am also very comfortable with TypeScript specific features and utilize advanced type techniques. With Node, I mainly do fullstack development, though also sometimes use it for scripting and automation within my Node projects (eg. custom SSG).
I have used countless of libraries and frameworks, including rendering libraries like React, Svelte, and Vue, backend libraries like Express, NextJS, and Remix, styling/component libraries like Tailwind and Material UI, and various libraries for APIs, databases, and more. I am comfortable with WebPack configuration. I have tinkered with unified and remark for markdown processing.
I use VB.NET at my positions working for the Center for World Languages at UCLA. We used VB.NET with WebForms for the backend, which used an in-house CMS to serve content from databases.
I tried to translate my C# knowledge into VB.NET, and I am relatively comfortable with the language.
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, 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.
I also am interested in UI algorithms, such as layout, picking, and text rendering, and am interested in furthering my knowledge in this area.
A WIP Godot GDExtension to embed CEF into Godot
A WIP layout library for C++20, supporting flexbox and some grid algorithms
A Win32 only GUI tool to delete unwanted shortcuts from your desktop
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 developed a lot of software on Windows, have used many Windows dev-tools like Visual Studio, and have used many Windows APIs.
Nowadays, I try to use WSL for development.
Minesweeper written in C using SDL.
A Win32 only GUI tool to delete unwanted shortcuts from your desktop
I primarily use Linux for development, with experience in WSL, Ubuntu, RHEL, and Arch, the latter of which I use daily. I am very comfortable with bash scripting and the Linux filesystem. I am also comfortable software on Linux, although I have not created many platform-specific applications on Linux. I try to test my software on Linux whenever I can to ensure cross-platform.
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 basic neural networks.
I am very interested in furthering my knowledge in this area, and have started reading textbooks and research on certain subjects.
I have been using Python as a scripting language since 2018. I use it for automation, webscraping/data analysis, and symbolic math. I am very comfortable writing code in python and like to use complex language features. I am less comfortable with the standard library, but can read the documentation.
I have used Python with libraries like Sympy, Numpy, Matplotlib, SciKit-Learn, Pandas, and Pytorch.
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, for WASM, and for compilers. However, I have not finished many projects, and frankly get annoyed with the slow build times. I do try to keep up with rust features, since I admire the language's design.
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.
“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.
This is one of the largest games I've worked in terms of assets and code size, with me having changed over 250,000 lines of cover over 400 commits.
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 is the website for ACM Studio at UCLA, a student-run organization for game development. The website was a callaborative effort, but must of the design and implementation was done by me.
The website has a large, flashy homepage to showcase Studio's purpose, projects, and upcoming events. In addition, there is a blog section, a games section, and various events sections.
The website is built using Next.js, TypeScript, and Material UI. It connects with Notion for most of the data, like officers, events, and blog posts. It also connects with Google Calendar for other events. It deploys to Netlify, utilizing mainly SSG, but also some SSR.
I also wrote a few articles for the website, including Outline Shaders in Unity's URP and Installing Unity and Visual Studio Code.
To integrate the website with our team's workflow, we used Notion as the database. This was after considering using a custom headless CMS and third party CMSs, but we could not find one that was easy to use, suited our needs, and was free. I developed a custom Notion data-binding system, which made it connect new Notion databases to the website via a schema type and a binding structure. Notion, however, is not a great database. It is slow. Static generation helped speed it up. However, images had a lifetime, so we had to use Next.js's revalidation to rebuild the website every so often, but this does not work on first visit after 10 minutes. I am still looking for a better solution, but am currently advocating for using external storage for images.
I wanted to make a very interactive homepage, so I used a lot of on-enter animations and other animations. We used framer-motion for a lot of the animations, but I also used CSS animations for some of them. Using framer was a bit of a learning curve, but I eventually realized that it is not really worth it for a lot of animations, so we switched to using CSS animations and intersection observers.
I also used automatic image optimization for static assets using bash/PowerShell scripting. I also created a WebScraper to scape Itch.io data for the home page carousel (and whatever other uses we may have).
Resource X is a horror game made for UCLA Recreation's Fiat Ludum game jam. The theme was begin anew, which we interpreted to mean finding resources on an alien planet to help earth start anew. In the game, you control a rover on this alien planet and are tasked with finding this resource. However, your rover keeps losing connection and power, so you must fix it using the terminal, all the while making sure you have oxygen and avoid dust storms.
This game required a lot of quick design and implementations of features, since it had many features: the terminal, the rover, the power minigame, the comms minigame, and the dust storm.
The rover required multi-camera rendering. In addition, we used multiple render pipeline configurations to apply custom shaders just to the rover's camera. In fact, we used 3 cameras: one for the rover, one for the terminal UI, and one for the player, all of which had different shaders stacked on top of each other. The rover used a navmesh and simple tank controls for movement, and we tuned lighting heavily to make the moody atmosphere.
The minigames were completely self-contained and contained full gameplay loop logic, including saving progress and restarting. Both were rendered using Unity UI, and have great keyboard support due to this. Me and another member designed all the puzzles, some of which were quite difficult despite the simple mechanics. The minigames demonstrated my ability to design and implement systems quickly, as well as my ability to design and implement UI with animations.
The terminal was a simple yet abstract command line interface. It consisted of a Terminal, which controlled the text buffer and printing, the cursor, the input, and whatever TerminalPrograms are running. TerminalPrograms are the programs that run in the terminal, and they included the actaul Shell itself and all other commands. This demonstrated by ability to design and implement an abstract, generalizable system that also uses my knowledge of terminals.
One of the hurdles I came across was that Unity UI's rendering is a little buggy. I think it is because it maybe cached some parts of the rendering, but some rotations would sometimes not be applied. We decided to leave this in, since it did not actually affect the gameplay logic and added to the vibe.
This is also the first time I used rendering to a texture for UI specifically, as well as rendering to something other than a Raw Image. I learned how to create multiple rendering pipeline settings too, since I had usually just applied a custom material to do postprocessing before.
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.
DesktopMop is a Win32 application that cleans your desktop based on a set of regular expressions. I mainly created it to remove unwanted shotcuts from my desktop.
This application uses Win32 for nearly everything except data structures and algorithms. I did filesystem manipulation using Win32 functions, I did mutexes with Win32, I did windowing with Win32, I did GUI components with Win32 (using listviews), and I did menus/shortcuts/tray icons with Win32. This application shows my ability to effectively parse and read through documentation for low-level APIs in order to implement a fully functional application, as well as my understanding of the Win32 API's windowing and messaging system.
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.