My projects
Here is a non-exhaustive list of projects I'm working on or have worked on in the past. All of these are passion projects, a learning experience, or (almost always) some combination of both.
All of my experiece in web design comes from these projects, and I absolutely love creating for the web, especially using modern tech stacks like Astro or NextJS. I think the immense work put into improving the developer experience in recent years is almost entirely thanks to the explosion of open source development on platforms like GitHub, which is just one of the many benefits of open source software.
As such, most of the projects below are open source, and GitHub repositories have been linked where applicable.
-
christianlegge.dev
The website you are currently on was built from scratch, by me (as much as anything can be built from scratch, anyway). I used Astro, a fast web framework primarily intended for static site generation.
I’ve designed the website to be as mobile-friendly as possible, and it employs a responsive design.
I designed it myself and implemented the design using Tailwind CSS. I don’t claim to be a web designer but I think it looks alright. I also built the blog system myself using Astro’s built in Markdown rendering tools. The website is hosted on Railway.
-
Astro
-
Static site generation
-
Tailwind
-
TypeScript
-
-
Cojiro is a web app intended to simulate playthroughs of Ocarina of Time Randomizer, a game which randomizes the locations of items in The Legend of Zelda: Ocarina of Time. Players feel that the practice helps them make better routing decisions, which is helpful when competing in races.
It is a rewrite of a previous project called ZOoTR Sim, which was similar in concept but was played solely by clicking text links. Cojiro is a green-field rewrite of that project using NextJS and React. The website is hosted on Vercel, and the database is a Postgres one hosted on Railway.
-
React
-
NextJS
-
Prisma
-
PostgreSQL
-
T3
-
Tailwind
-
TypeScript
-
tRPC
-
-
In a similar vein to Cojiro above, pmr-tracker is a project designed to work alongside a video game randomizer, this time one for Paper Mario. Instead of simulating full games, this is a tracker meant to be used by players to keep track of which items they have found and which locations they have checked.
A similar tracker to this one was already in use by the community when I got involved, but there were a few outstanding issues with it, and I decided to build a new one from scratch, and take the opportunity to learn a new framework (Vue) while I was at it. This version is now in use by many of the game’s players.
It’s written in Vue and uses a customizable drag-and-drop grid system so users can lay it out however they want. It also has a feature which connects to the randomizer’s API to determine the settings of a particular game; because there are dozens of settings that might affect how the tracker works, this is a huge quality of life upgrade for users. The app is hosted on Railway.
-
Vue
-
TypeScript
-
API
-
-
Open source contributions
What kind of open source advocate would I be if I didn’t contribute to others’ projects? One of the best things about open source is when a capable dev sees a bug or a possible improvement they can take responsibility and fix it themselves. And I’ve done so many times! Here are some examples:
- ALttP Randomizer: Add a feature that lets users select custom enemy drops for their games
- OoT Randomizer: Add a feature that lets users randomize the background music across different areas of the game
- Jellyfin: Fix a bug in which videos were finishing early due to an INT_MAX error
- RuneLite Quest Helper: Add a new quest to the helper, including internal values for progress and in-game instructions to help players
I have lots more, but they’re mostly just simple bug fixes and whatnot. To see them, search
is:pr author:christianlegge archived:false is:closed
on github.com/pulls (you must be signed in to see the page).-
Open source
-
git
-
GitHub
-
HappyBoy
HappyBoy is a Game Boy emulator. I wrote it using C++ as speed is an important factor when emulating hardware. I chose not to look at any other emulator’s source code (of which many are available), because part of the fun was figuring it out on my own. There are a lot of data sheets and fan-made compendiums of how the Game Boy works electronically, which I made extensive use of when writing the emulator.
It’s written to be as cycle-accurate as possible and I don’t take shortcuts when processing ROM code. It runs one CPU cycle at a time using a fetch-decode-execute loop that emulates the real LR35902 CPU of the Game Boy. The emulator has working graphics, sound, and controls. Currently it only supports a few of the ROM mapping modes, which limits the games it can play.
-
C++
-
Hardware emulation
-
ASM
-
SDL2
-
-
I’ve participated in a few game jams, which are events where entrants are given a theme and have a limited amount of time (usually 3–7 days) to make a small prototype for a game based on the theme.
Moonshot was made in Unity in January 2020. You play as an astronaut who has to mine rocks to collect fuel pellets. The player has to be watchful of their oxygen level which depletes over time. You can extract oxygen from the rocks, but that depletes their fuel supply. You have to fight off aliens using your flamethrower, too—which uses up tons of oxygen!
Inside is more of a tech demo than a game, but my idea was a mountain climber who can stomp on the ground to make the snow and ice fall away. It was programmed using Godot in April 2020.
Dice n’ Slice is a dungeon crawler where the rolls of the dice help you fight your enemies. The dice can boost your attack, your defense, or heal you, and Yahtzee-like hold-and-reroll mechanics let you have more control over your outcome.
-
Unity
-
Godot
-
Game Design
-
Game Development
-
-
ZOoTR Sim
ZOoTR Sim is, I’m proud to say, a much worse version of Cojiro. I initially wrote it using AngularJS and hosted it on Amazon S3 as a static site. When I needed backend (to obscure an internal API key the site had grown to use), I added Node and Express and moved hosting to Amazon EC2.
I started working on ZOoTR Sim in 2018 and the codebase grew unwieldy over the years. By the time I felt like I had the skills to do it, I was excited to begin the rewrite that eventually became Cojiro. I learned a lot about web development from my years working on this project but I never want to look at it again.
-
MongoDB
-
ExpressJS
-
AngularJS
-
NodeJS
-
CSS
-
-
wowiebot
Years ago I used to stream regularly on Twitch, and I got the idea to use a chatbot to add some fun things to my stream like chat commands and song requests. There are existing bots you can download and use, of course, but I liked the idea of writing one myself.
I forked a repository called twitchat, which implemented the basics of connecting to the Twitch API and sending/receiving chat messages. That repository was a fantastic jumping-off point for my code, as I was pretty inexperienced then and would have struggled to write it on my own. My experience with this bot is a large part of why I believe in the benefits of open source when it comes to learning to code.
-
C#
-
.NET
-
Chatbot
-
Twitch
-
API
-
-
I write crossword puzzles! This really doesn’t have much to do with coding—you could argue that making puzzles engages the same part of your brain as programming, and I think that’s true to an extent, but really this is just here because I’m proud of them. A lot of these puzzles are kind of niche and will be pretty hard to solve for people not “into” crossword puzzles already, but I would feel bad leaving them off of here.
I’d like to move them onto this website someday, mainly so I don’t have to pay for two domain names. Well, I guess Blogspot works too.
-
Crosswords
-
Puzzles
-
Fun
-