It’s closing in on that time of year again, and I’d like to just take a moment to reflect on what has happened over the last year or so. A lot has happened throughout this year for me personally and in the world around me.
Without further ado, let’s get into it!
Prism Launcher: community involvement and FLOSS #
Prism Launcher is a continuation of the PolyMC Minecraft launcher. I started contributing to PolyMC on April 27 of this year, adding a Big Sur style icon to the launcher; later on I learned a bit more Qt with my existing C++ knowledge and gradually made more meaningful code contributions such as migrating the launcher to use a new API provided by CurseForge, bugfixes, and various other QoL features.
On October 18, the lead maintainer of the project went rogue and booted out all of the other maintainers and the contributors (including myself) because of certain prejudices and ideologies I won’t go into detail here. We had to regroup and form a new project. I was an active member of the previous community, so I volunteered to become a moderator in the new Discord. After a while, we got our first releases out and stabilized into a calm server. Then we spent some time internally reorganizing our moderation team to prevent the errors of the past replaying themselves, at which point I became a community manager on November 8.
Community managers are responsible for day-to-day administrative tasks, such as making changes to the structure of community spaces, resolving conflicts, making decisions, engaging in the community itself, configuring bots and settings, etc. We try to make the community a welcoming place for everyone to talk in.
Such a role was one of my first; I had little experience in fulfilling such a task. The decisions that we had to make together and enforcement of rules were quite taxing on my skills of judgement and discretion. It was difficult at first when I tried to get a grasp of what I was doing and how I should reach the balance between various extremes of behavior. Needless to say, this was quite the journey.
However, in the end, I think that I ended up with a much more mature, considerate version of myself. Listening to multiple sides, considering nuanced context, and supporting minority groups are all part of what I do and will continue to do in this role.
Meanwhile, I continued to work on the launcher itself. I added various features such as a button to install to PATH on macOS, native operating system file associations for modpacks, smart resource pack importing, and a few other smaller bugfixes in the two months since we started this new project. In addition, I still maintain the Discord bot in the community, a project that I started and continue to manage.
This community was one of the first I had joined when I first signed up to Discord, and I am glad that I could do more to this community. It’s also quite fulfilling to contribute to a widely used piece of software and lend your own hand in making it better. Perhaps that’s the open source spirit after all 😃
Moddermore: a fast growing product #
As I got into Minecraft modding, I felt the need for a place to share a list of mods that I was using on a publicly viewable link. Initially, I implemented this concept by storing a list in my Notion database and fetching data from that database from a page on my website. It was rudimentary, but it worked.
Then, I realized that other, less technical people may also have the same needs as I do; I had seen various people complaining about not being able to share a list of mods without making a modpack (which was comparatively complicated and still is at the moment). This made me think. What if I were to create a product for this? Would that work?
On July 1, I went ahead with creating a Next.js app with Tailwind CSS, a tech stack I was relatively familiar with. For the database, I chose Supabase, an open source Firebase alternative that included a database, authentication, and storage, which made it easier for me to start the project off. After two or three weeks of development, I was able to get a basic MVP running. There were a few quirks here and there, and some of the features weren’t quite there yet, but I wanted to get it out. On July 21, I removed the closed beta notice and made the app publicly usable for everyone.
It received 200 page views on that same day, something none of my products had ever been able to achieve before. I also sent it out on a few Discord communities to do a bit of promotion, and soon a good few dozen people were using it. Although it wasn’t an instant hit, this felt like a vote of confidence, and I continued to work on it to add new features and tweak the user experience.
On July 19, just before the launch, I sent an email to Vercel to inquire about their Open Source Software sponsorship plan. I had a feeling (which proved to be correct) that once this project grew, the personal hobby plan I was on wouldn’t be able to sustain the amount of traffic, or at least take a chunk of resources away from some of my other personal projects. On August 2, I added the Vercel logo to the footer of the website and a badge at the top of the README; Vercel created a pre-paid Pro plan account and I moved the project to the team account.
It was done.
This felt amazing, both for myself and for the future of the project. I didn’t have to worry about exceeding the limits of the hosting provider for a good while, and I also honed my self-promotional skills. This would come in handy again four months later.
As the amount of users continued to increase at a steady rate and I was adding more and more features to the app, I realized that perhaps Supabase wasn’t such a good fit for my project anymore. From September 17 to 19, I rewrote most of the backend to use a MongoDB Atlas database and
next-auth for authentication. The project had grown to such a scale that this required rewriting around one thousand lines of code, and there had to be planned downtime for the database migration, but in the end, it mostly went fluidly and users were using the new system in no time.
On October 27, I received one of the first PRs to one of my personal projects, a PR that overhauled the list of mods to make the design more consistent and informative. It couldn’t be a better display of the power of open source software; I had thought of it but never took the time to implement it. And here was someone who saw this problem, took it upon themselves to solve it, and made it available for fellow users by making a pull request.
Donations were also a new business model that I applied to this project. Instead of locking certain features behind subscriptions, I explored voluntary donations via my Ko-fi and Buy Me a Coffee (deprecated) pages as a way of keeping the project sustainable. Although in total, I only received $7 of monetary donations, it still felt viable once more and more users started using the site. Nonetheless, I am still actively exploring other business models with various friends, such as advertising or subscriptions. Nonetheless, my bottom line is the privacy of my users, and I will never use invasive things like Google Ads on Moddermore despite it being free and generally available. Still, sustainability is something I have come to think about since the costs of running such an app are small but considerable.
Development mostly stalled as my academic life became busier and I had other things to do. This changed when on December 15, Adrien, a friend, moderator on Prism Community and GDLauncher, and AI art fan who goes by Ashtaka online, bought two years’ worth of the domain
moddermore.net and transferred its ownership to me. It was an incredible act of generosity and, in a sense, moved my project forward like never before. I had considered buying a domain for the project from the day it all began, because after all a free
.vercel.app domain wasn’t an all that enticing place to give your email to. Having a domain somewhat symbolized a formalization that this was a product, and an actually used one. Sure enough, bounce rates dropped after the domain was adopted.
Thank you, Ashtaka.
Soon thereafter, I did some more work on the authentication part to reduce the load on our email API and added OAuth support for Google, GitHub, and Discord. These login methods provided an easier and more convenient login method than email magic links.
With the new domain, I also felt the need for a business email on the domain to answer account deletion and other email requests. As it happened, I was already searching a privacy-friendly email platform before the domain donation, and I decided to go with Tutanota, since they had comparatively affordable pricing. Upon scanning a few pages of their blog posts, I was charmed to learn that they had an open source software sponsorship plan too! I reached out via email on December 22, got a reply three hours later approving my project with instructions on how to feature the sponsorship on my homepage, and that very night I was able to get business-grade custom domain email for moddermore.net. In addition, the business plan also covered multiple domains, so I moved my personal email ryanccn.dev to Tutanota as well. (It was using Cloudflare email forwarding before — until I found out that sending emails through Gmail aliases still leaked the private Gmail address. That pushed me to switch.) Although Tutanota could sometimes look overly simplistic and still have a few places to iron out, I believe it was the right choice! Feel free to send me an email at hello [at] ryanccn [dot] dev if you want to.
Big thanks to Vercel and Tutanota here for supporting my open source project!
A few days ago, I registered Twitter and Mastodon accounts for Moddermore and set up an independent Discord community for it instead of being a channel in my personal server. With the growth that this product has seen in the past few weeks, I felt it was only necessary to start creating a community and social accounts surrounding the product itself.
As of today, the app has accumulated nearly 50k pageviews and 5k unique visitors (may be inaccurate because of the non-invasive nature of the analytics platform I am using). On the app data side, there are nearly 1k registered users and nearly 1.5k lists created. It is a truly novel experience for me and it will be interesting to see where this goes in the future.
Minecraft Modding: new realms #
As I was getting into these Minecraft modding-related circles, it was only fitting for me as a developer to try making some mods myself. Coincidentally, we were going to start learning Java as part of the computer science course this semester, so I decided to get a head start during the summer vacation by learning how to make a few mods.
It was quite an interesting experience, and despite the common opinion that Java was an old and archaic language, some aspects of it did feel pretty nice to me as a developer. And the fact that you could just patch into portions of the JVM bytecode and change it around in order to modify the behavior of the game was indeed a novelty.
Soon I was maintaining about four or five niche mods, so I spun them off into a separate GitHub organization to manage shared secrets and move them away from my primary area of development.
Some of the mods I’ve made:
- Myriad Bows: make bows consume arrows based on probability (made for ModFest)
- EmuNO: a bug fixing mod for various quirks on macOS
- uwuify chat: a mod that does what it says ✨
- Postmortal Inventory: makes totems of undying work from your inventory
I was distributing my mods on Modrinth, a modern, both user-friendly and developer-friendly platform for mod and modpack distribution. On November 12, Modrinth released its Creator Monetization Program (i.e. payouts), and I was charmed to find out that through my work on a few of my mods, I had been able to earn a few cents! It wasn’t much, but it was some of the first money I had earned through my own work. Through these four months, I have earned… $1.77. It’s really not a lot, but it is something ¯_(ツ)_/¯.
Through Minecraft modding, I’ve also met a whole bunch of interesting and nice people, for instance, on the Quilt Community and on Prism Community. I’ve met similarly-minded people, made a few friends, and talked together of common interests. In a way, they (and you who are reading this very article!) have alleviated the loneliness I have always been feeling.
Updates to ryanccn.dev #
This very website has received its fair share of work and updates. In fact, it might be my oldest still-worked-on project to date. Most of the changes I’ve made are detailed in my blog post back in October; read that if you will. In a nutshell, I aggressively improved the performance of my site while adding two web fonts and made the structure of both the website and the codebase under it better.
After that blog post, I made a major change to the website by adding a new theming system based on CSS custom properties. This allowed for a more unified, well-structured color palette and also allowed the default-colored themes and the new Catppuccin themes to coexist so that users could choose based on their preferences. (Scroll to the footer to switch themes!) In addition, I moved the sidebar to the top following the layout structure of a traditional website; I may consider switching back at a later date but this is the case for now.
On the content side, my blog posts here have been shifting more towards the opinionated and thoughtful side rather than doing simple tutorials or technical introductions; this website has become a better venue for expressing my opinions and my thoughts on the technologies we use, the patterns we see, and the habits we form as developers. Nonetheless, I’ll continue to do tutorials when I see fit and also keep a slightly more frequent publishing schedule.
More open source contributions #
Other than Prism Launcher, I’ve also worked on quite a few other open source projects throughout this year.
- I’ve created two Catppuccin ports for Vercel and Crowdin, which are waiting to be merged into the main organization, and fixed a small thing on the Discord theme;
- I created and continue to update Fig’s
ffmpegautocompletion spec with a complicated auto generation script I wrote in Deno;
- I also contributed to Modrinth, the open source platform that I publish my mods on, and helped translate for Chinese (Simplified) and uwuified English on their Crowdin;
- I wrote an automated script to upload Replay Mod versions to Modrinth, leading to its distribution on Modrinth.
Some of my own newly minted open source projects this year include:
- A demo of the Sieve of Eratosthenes built with Vue and Vite;
- A port of httpbin to Deno;
- A Node.js CLI to create bookmarklets for developers;
- A Discord bot for my personal server and the Moddermore server;
- A custom build script for Iosevka that uses my custom config and patches in Nerd Font symbols.
I recently joined Mastodon; it is a freer and more open platform even without the ongoing drama at Twitter. I still send things on Twitter, but do more personal updates and development-related news on my Mastodon. Follow me at @[email protected]!
If you actually made it to the end of this (wow), wish you all a very Merry Christmas and Happy New Year!