This is an account of my thoughts on the experience of entering the world of homebrew developing and my process of developing my first app.
On March 12, 2025, I finally published my first homebrew app, Kekatsu DS, and there’s a lot to say about how I got to this point.
The beginning
Since I was a child, I always noticed the presence of programs with strange names on the video game consoles I had.
In my family and in the reality I lived in, it was basically standard to get your consoles “modified” before you could play with them. I remember receiving my first Nintendo DSi on my birthday when I was maybe 7 or 8 years old and immediately being given an R4 card full of games. Piracy is wrong, but try explaining that to a child experiencing these emotions.
Anyway, this “phenomenon” happened with all the consoles of that time, including the Wii. The process to start playing was a bit more elaborate there: if on the DS it was enough to start a “game” that allowed you to start other games, on the Wii you had to open a program, which opened another program, which started a game from a burned DVD. I’m talking about the Homebrew Channel, Neogamma, Backup Launcher, and the whole company that follows them.
![]() |
---|
The POV of me at 8 years old. |
My curiosity towards homebrew thus began with the Wii: one day in 2013, through YouTube videos and forums in my language, I learned how to make good use of the Homebrew Channel and the WAD Manager that I found “pre-installed” on my Wii. From there, I understood how to install emulators, games, and other programs that I might not have used but kept just for the thrill of it.
The realization
Over the years, I learned most of the concepts about homebrew, understood what they actually were, and how to use them to improve the user experience of the consoles they were created for. Countless times I applied software mods on my consoles and those of my friends, always following the best instructions given by the community.
One thing, however, did not change since I was a child: I never actually wondered how those functionalities that seemed to come out of nowhere were created. And no one seemed to ask. Everything I had learned from people online was how to use homebrew, taking their existence for granted.
So at about 13 years old, I searched on Google the simple phrase: “How to create a game for Wii”. Not a nice experience. Words upon words that I had never heard before, programming languages, development environments… I knew nothing of all this, and it scared me enough to completely ignore the question I had asked myself.
Many years later, I began to understand a bit more about the world of programming while I was in my fourth year of high school. I learned Python (with the great help of a friend) and published Crocdb between August and September 2022. I was still far from understanding how to seriously program in C and C++, the main limit to starting creating homebrew.
The “skill issue”
In the summer of 2023, I decided to make an attempt to learn more about the homebrew development scene for Wii. What I was looking for was a way as easy and intuitive as writing a script in Python. Until that moment, I was in love with Python; for me, it was the solution to everything, as it made it easy to transform my ideas into lines of code.
The law of the instrument here created a strong limitation: I necessarily had to learn a new way of programming and understanding the tools used by the community. What blocked me this time was the lack of a de facto standard way to start learning. My question at the time was “Is there a guide that explains everything from start to finish made less than 10 years ago?”.
I started my university career as a Computer Science student in September 2023 and began to study the C language more in-depth. This pushed me to give another chance to trying to learn what I wanted. This time I managed to set up a development environment with devkitPro and discovered libwiigui, a library that makes it easier to create graphical interfaces for Wii.
Thanks to a tutorial, everything seemed clearer, and I was able to start creating my first application for Wii.
The idea
My main goal was to create an app that allowed using the Crocdb API to download games in a standalone way.
It was necessary to understand how to use external libraries like curl and jansson, as well as handle the problems of programming in C and C++, such as dynamic memory allocation.
![]() |
---|
A screenshot of what Crocdb for the Wii was starting to look like. |
The first rewrite
A few weeks after conceiving the basic idea, there was a change of plans. The idea was no longer to create Crocdb for the Wii but to create a sort of store for games that mimics the style of the Wii Shop Channel. So I started a complete rewrite of the app.
![]() |
---|
A screenshot of the app after its first full rewrite. |
The second rewrite
After a complete rewrite, the idea of similarity with the Wii Shop Channel no longer convinced me so much. I wanted to create something more elegant and easy to maintain, so I took inspiration from apps like pkgi-psp and pkgi-ps3, both content downloaders.
I started with the second rewrite, and this time the app’s name was Wiinobu. The basic functionality allowed using one or more JSON databases for content and managing downloads through a download list.
![]() |
---|
A screenshot of a build of Wiinobu, March 2024. |
![]() |
---|
Another screenshot of the same build, showing the “Downloads” screen. |
Within 7 months, I reached a dead end in development because I was not satisfied with the codebase I had created, which had become difficult to maintain. This led to a lack of motivation to continue developing Wiinobu from where I had left off.
The third rewrite
In July 2024, I decided to restart development again, this time following the abstract programming guidelines in C that I had learned at university. The concept is the same, but done better and with more readable code.
Here the name Kekatsu was born, which is a caricature of the Neapolitan dialect phrase “Che’ cazz’”, meaning “cool” or “interesting”.
![]() |
---|
A screenshot of a build of Kekatsu Wii, November 2024. This time with widescreen support! |
![]() |
---|
The startup loading screen. Here can be seen the main “brick” logo. |
![]() |
![]() |
![]() |
---|
Some scrapped logos that a friend of mine sketched while on a Discord call. These had to resemble the word “Tonkatsu” maybe. He ended up creating the “brick” logo (which I’m glad of).
At the time of writing this post, Kekatsu Wii is still in development.
Development for DS
I started looking into homebrew development for the Nintendo DS in January 2025. The push came from the release of version 2.0.0 of libnds by devkitPro, which added stable WPA2 Wi-Fi support on the DSi.
The start was very welcoming thanks to the community of the DS⁽ⁱ⁾ Mode Hacking Discord server, which gathered all the useful resources for starting to develop for the Nintendo DS in one place. Their help was essential.
The first project I published was nds-curl, a port of curl and wolfSSL for Nintendo DS, which I worked on for about a week. I was ready to port Kekatsu to the Nintendo DS.
The GUI problem
The most recommended choice for easily managing 2D graphics within a Nintendo DS app is the NightFox’s Lib library, which has many guides and examples.
However, I could not use nflib, as the version of the development kit I needed was not compatible with it. So I decided to use Easy GL2D as the base for the GUI, a library integrated into the SDK that allows drawing primitive 2D elements through the DS’s 3D engine.
![]() |
---|
Here I was testing out the rendering of text with gl2d. |
The problem with using gl2d is that rendering a frame simultaneously on both DS screens through the 3D engine is impossible due to how the DS’s GPU is designed.
A technique to make this possible is to essentially render a frame first on one screen and then on another, splitting the number of FPS in half. I followed this example to implement this.
Maintainability
I started developing Kekatsu DS in mid-February 2025.
A few months earlier, a university friend pointed out how my coding style was a bit unusual. I did not follow a precise logic for indentation, spacing, variable type choice, function and variable naming… I did everything as it came to me.
So I decided to follow some code style guidelines, and I chose the Webkit Code Style Guidelines. My goal is to keep the codebase as uniform as possible, leaving no room for exceptions.
The result
After 1 month of work, I finally published Kekatsu DS. I am very satisfied with the work I have done and intend to continue maintaining it to add features.
![]() |
![]() |
![]() |
---|
Of course, it is not a perfect product, but it represents a significant milestone in my journey as a developer. I have learned a lot through this process and am excited to continue improving and expanding it. The support and feedback from the community have been invaluable, and I look forward to seeing where this project will go in the future.