In 2016, I created an app to install mods for Minetest’s Android port. It was my first Android app; it taught me a great deal about Android development and also helped me get my first programming job.
Minetest is an open-source game engine with millions of downloads and thousands of weekly players. The project has a very active modding community, with many games available to play. Before I created the app, users had to manually install content by unzipping their files into a directory; this was a poor user experience, especially on Android, so I created the app to make this easier.
Minetest now has ContentDB, a platform I created to browse and install mods and games within Minetest. Because of this, the app is now obsolete and is no longer available for download. That doesn’t mean this app is fully gone - the lessons I learned live on in ContentDB.
Getting data #
For the app to function, it needs a list of mods that can be installed. In 2017, the closest thing to this list was Krock’s Mod Search, an index of mod topics on the forum, but this was super unreliable. It was common for there to be no download links or git repo, and a lot of the metadata was plain wrong.
My first challenge before I could even start on the app was to create a backend API with validated data. I did this by using Krock’s Mod Search as a base and then performing extra checks. I fetched forum topics to extract more data and links. I fetched downloads and checked their contents, making sure that they contained a valid mod with the correct mod name. I was able to manually override the data where the automatic crawler failed.
One of the most important parts of this validation system was good tooling. I created a simple web front-end that allowed you to find mods and see any problems that were preventing them from appearing in the app.
The app #
The app’s homepage had a list of mods, with installed mods appearing pinned at the top. By tapping a mod you go to the mod’s detail screen, where you can see more information about the mod and install it.
Mod installation was done in a background service, allowing the user to navigate away from the mod page whilst it was being installed. A notification showed the current download progress. Once a mod was installed, the app could then prompt the user to install missing dependencies.
Google Play and post-release #
I published the app on Google Play and F-Droid. It was received with favourable reviews, averaging 4.3 stars.
I maintained it for 3 years, adding features to improve user experience such as dependency installation and world configuration, and rewriting parts as my knowledge of Android dev increased.
As the app predated Android Kotlin and Jetpack by over a year, it was originally written in Java. Towards the end I rewrote parts of the app in Kotlin using more modern techniques. With the introduction of ContentDB, I ended up sunsetting the app and removing it from the Play Store.
The Minetest Mods app was my first Android app; it taught me a great deal about Android development. I’m happy with the result; I think it looked good and had a good user experience. One of the reasons I like making user interfaces is being able to create quality user experiences that I can be proud of.
One of the primary flaws in the app was the data. It was quite unreliable; a lot of the mods failed to installed due to changes that the crawler didn’t pick up. I made a lot of changes to the backend to improve this situation, and they did help. But the problem was ultimately solved by ditching the crawler and using mods from ContentDB instead.
Another flaw is that the app was designed just for mods, and not for other content like games and texture packs. Towards the end, I started to work on extending the app to support games and texture packs - but I was never happy with the result, and so it never made it into a release.
The app also got me my first programming job at a software house, creating Android and iOS apps for clients. Being able to show my app on Google Play in the interview was a big selling point.