Join modded Minecraft servers with ease. Downloads and loads mods from the server with dedicated instance for each server. No more manual updating and downloading of modpacks and instances.
axell
Check their projects out: tinkearOs, rugplay launderer, ray, xpsync
Once you ship this you can't edit the description of the project, but you'll be able to add more devlogs and re-ship it as you add new features!
Added a warning of removal of mods.
Added an exception screen in case of errors. Previously the GUI would freeze and console will show error but most users wont have console open so I add a warning GUI thingamajig so they can report or fix their errors quickly.
Also cleaned up code. My code still has lots of coupling and hidden dependencies that I need to resolve slowly. Also I just realised JavaFX has a progress tracker implementation already called Task, that runs stuff in a background thread and update a gui like progress bar accordingly, I'll need to migrate my progress tracking to that eventually.
It only works on Forge 1.20.1 as of now, so I'll need to add more versions. Also full of bugs and according to statistics of 10-20 bugs per 1000 lines I'll have 60-120 bugs in my code!!!!! So I'll need to make unit tests and all that.
Made an installer for Meld in C++ and Java.
launcher_profiles.json
in configured folder (default %APPDATA%/.minecraft
windows or ~/.minecraft
linux.{Minecraft appdata}/versions/{version}
Antiviruses kept on flagging the binary so I made a Java version as a backup.
Disclaimer: I used GitHub Copilot to code the installer ONLY, it did around 60% of the work, other 40% was me debugging the mess it made and trying to get it to build (this is the real reason C++ is hard 😭). See repo HERE.
Justification on AI usage:
- It's an installer, and is really basic and tedious.
- It's not the main part of the project
- I didn't want to waste time learning how to make C++ GUI.
Overall it actually saved time, and resulted in less hours logged (which I don't mind because this is a small part of the project, in fact only 42.8kb out of a total of 312kb (code only), which is 13.7%.
It now launches the game!! Trying to use a closed-sourced, completely undocumented API (Minecraft launcher) is a real challenge, but I pulled through! It was a real challenge to get it working, and there are so many leaky pipes and band-aid fixes throughout I think I just made at least a year of technical debt 😭. I had to locate and parse the version json file, download the libraries, extract native binaries, build the launch command with the whole classpath and replacing environment variables (gameDir etc), build the jvm args, and finally fork/exec into Minecraft. Almost ready for a ship and an alpha release! (I just need to make an installer and fix the blatant bugs).
*The video has been cut to reduce waiting times. The video has been compressed beyond recognition because apparently 1mb is too large of an upload that the site times out.
Made it launchable by Minecraft launcher. Minecraft launcher does not provide error logs as to why a launch failed and that is very annoying! But I prevailed - nothing will stand between me and my shells!! Minecraft launcher needed a json file of library and launch information, through the limited documentation and trial and error I figured out the appropriate fields to put - but manually making this file every time something changes is way too much work and a big sign of stupid - so I automated it of course. I made a gradle task to automatically generate the client.json
on build, this involved resolving dependencies, hashing them, finding their repository and building the url, and finally building the file with all relevant and updated launch information.
Added mod downloading that downloads the mods from web (like modrinth) and any unavailable ones download from the Minecraft server itself. Also added file change scanner, that detects any files whose contents has changed by scanning its hash and accordingly handling it - either deleting the tampered file or replacing it with the updated version from the server. I also optimised it by detecting if the file's hash already exists but under a different name so it saves re-downloading the file.
Adding progress tracking was incredibly hard for some reason, but I managed to do so, by having 3 layers of progress tracking: Per file progress, per source progress (web or server), and all these add up to the total progress displayed on the screen.
Started working on the mod download feature. Added a mod download warning so the user can acknowledge that they're responsible for the mods they download and don't sue me when they install malware. The warning shows any mods from the server that are different from what the client already has and warns about them.
Added a clickable view project on modrinth link for applicable mods so the user can check out the mod before they install it. Also made the file url and hash highlightable so the user can copy it if they want to virus scan or something. Made file URL and hash have no text wrapping because it is useless to see the whole thing.
Added game instance manager. This is a backend system to manage the multiple instances of the game, one for each server. Stored a cache of the server mods incase it is offline. Added a warning on server delete to confirm if the user wants to delete it and backup the instance files. Also added mod source icons so users can quickly figure out where their mod is from. There wasn't all that much change to the frontend as most of the time was spent making the instance logic work. It was especially important to make sure it worked as user's world files will be handled by it, and I don't want people's hours of hard work be deleted because of some bug in my system. (I can only upload small videos because of bug in website so excuse the quality)
Finished the server's required client mods display. Added selection of mods, and fixed mod version variable bug (you can see it in the devlog below). The Open Mods Folder button does not work yet because it relies on the mods being downloaded, which is a feature that hasn't been implemented yet.
I can't submit video for some reason, if you want to see it's here: https://hc-cdn.hel1.your-objectstorage.com/s/v3/d185bca8977200e94aa0d0b0538ae55f91fe0074_2025-07-25_19-14-02.mp4
Added client mods display. To get all the information I needed to add extra logic in the server-side mod to pull the mod.toml file (mod information and config file) from the mod jar and send it to the client via the HTTPS server. I also made a basic GUI for viewing the information - it needs lots of improvement!! Image shows the client receiving the server's mod data and displaying it in a forge-modlist like display, but the mods aren't even installed on the client yet!
Added server-client communication. I needed the Minecraft server to send mod information and mod files to the meld client for it to launch properly. Initially I tried to use the existing Minecraft protocol to send this data and files, this is so users didn't have to open another port aside from the minecraft server port (default 25565). Unfortunately after many failed attempts I realised it is not possible to send custom packets unless the user logs into and joins the server, which isn't possible without the mods. Minecraft packets also have a uncompressed limit of 32767 bytes, which is far from enough, and adding compression to the packets is very complex and only increases the size limit to 2MB (compressed). Ultimately, I had to resort to using a custom server on a different port. I chose HTTP(S) over raw socket connection as encryption is easier and https can be easily proxied for extra security. Image shows custom mod data successfully sent over HTTPS with self-signed certificate - viewed by browser.
Added a system on frontend to check if Meld is supported via the meld server side mod. I had to use Mixins to inject an additional json field to the Minecraft server status/ping/version check to indicate meld is supported. Little did I know how difficult it was to find documentation and tutorials on how to mixin on Forge, especially for a very un-touched area of the minecraft code (client-bound packets before login) however I did eventually succeed and was actually quite simple, understanding the documentation was a lot harder.
Added mod scanner in server side mod to get the modrinth url of the mods for client to download.
Made a GUI that imitates Minecraft server selection. Added an Edit Server feature that is fully functional.