This project, Obsidian Launcher, is a custom 'cracked' Minecraft launcher.
It didn't start its life in C#, though. My first attempt was in C++. 👉 Click here to browse the last C++ commit
Why the switch? Let’s just say C++ development, while powerful, presented a series of... character-building experiences that eventually led me to the more streamlined environment of C# and .NET.
-
⚔️ The Great Library Hunt & CMake Wars: Simply getting a reliable compression and archive library integrated felt like a quest. I wrestled with CMake for days just to get a clean build across setups. Hours spent debugging build scripts could've built actual features!
-
🔐 The SSL Certificate Fiasco: Remember OpenSSL’s lovely inability to easily read system certs on some platforms? I do. I embedded
cacert.pem
manually. It mostly worked—except for one URL that always failed outside of tests. The kicker? Tests passed every single time. Eventually, I gave up and disabled SSL verification altogether.
It was clear that for this project, the everything-is-manual nature of C++ was a roadblock. So, I ditched it and started fresh with C#
This project aims to replicate the key features of a modern Minecraft launcher:
- 🧩 Fetching and managing official Minecraft versions.
- ☕ Handling Java runtimes (discovery, download, extraction).
- 🧱 Downloading & verifying all required game assets.
- 📚 Managing libraries, including native ones for LWJGL.
- 🧵 Building classpaths and JVM/game arguments.
▶️ Launching the game!
Actively in development 🔄 Here's what's working or in progress:
- 📜 Version Manifests: Fetches and parses Mojang's data.
- ☕ Java Management: Finds Java, downloads, extracts archives (
.zip
✅,.tar.gz
🔜). - 🎨 Asset Management: Downloads and verifies game assets.
- 📦 Library Management: Handles downloads, verification, extraction + native rules.
- 🧠 Argument & Classpath Builder: Fully functional with placeholder support.
- 🎮 Game Launch: Successfully launches Minecraft with output capture.
- 📋 Logging: Serilog-based console and file logging.
- 📚 Rich Standard Library –
HttpClient
,System.IO.Compression.ZipFile
, and more. - 📦 NuGet Ecosystem – Easy, fast package management.
- ⚡ Productivity – Less boilerplate, more logic.
- 🧼 Modern Features – Async/await, LINQ, clean syntax.
- 🧘 Sanity Preservation – No more build system nightmares.
ObsidianLauncher/
├── ObsidianLauncher.sln
└── ObsidianLauncher/
├── ObsidianLauncher.csproj
├── Program.cs
├── LauncherConfig.cs
├── Models/
│ └── (e.g., MinecraftVersion.cs, Library.cs)
├── Enums/
│ └── (e.g., OperatingSystemType.cs)
├── Services/
│ └── (e.g., HttpManagerService.cs, JavaManager.cs)
└── Utils/
└── (e.g., CryptoUtils.cs, LoggerSetup.cs)
- .NET 9.0 SDK (or newer) ✅
-
🧬 Clone the repository.
-
🔄 Restore packages:
dotnet restore "Obsidian Launcher.csproj"
-
🏗️ Build it:
dotnet build "Obsidian Launcher.csproj" -c Release
-
🚀 Run it:
bin/Release/net9.0/Obsidian Launcher.exe
(Data will be stored in.ObsidianLauncher
)
- 🔐 Authentication: Add Microsoft login (only offline mode supported currently).
- 🖼️ UI: Build a GUI! (Console ≠ user-friendly 😅)
- 📁 Profile Management
- 🧩 Mod Management
- 🧰 TAR.GZ Support for Linux/macOS Java runtimes
- 🧠 Placeholder Replacements: Finish ‘em all.
- 🧪 Unit Tests
- 💡 And lots more!
Found a 🐞bug
or have an 💡idea
?
Open an issue or PR — all help is appreciated!
This project is licensed under the GPL v3 License 📄