Rotating Art Launcher is an Android application that lets you run .NET-based desktop games on mobile devices.
Supports native/original releases of FNA/XNA and Mono games, as well as mod loaders like tModLoader, SMAPI, and Everest.
The runtime supports both SDL2 and SDL3, with an integrated Mono runtime for compatible games.
| Game | Edition / Runtime | Status |
|---|---|---|
| Terraria | Original release · Mono | ✅ Supported |
| Celeste | Original release · Mono / Everest | ✅ Supported |
| FEZ | Original release · Mono | ✅ Supported |
| Terraria | tModLoader | ✅ Supported |
| Stardew Valley | SMAPI | ✅ Supported |
| Other FNA/XNA and Mono games | — | 🚧 In progress |
|
|
||||||||||||
|
|
- 📱 Android 9.0 (API 28) or higher
- 🏗️ ARM64-v8a architecture device
- 💾 At least 2GB free storage
1. Download the latest APK from the Releases page
2. Enable "Install from Unknown Sources"
3. Install the APK and launch the app
4. Follow the setup wizard
- Open Rotating Art Launcher
- Tap "+" to add a game (or download via GOG)
- Select the game executable
- Configure the renderer, SDL version (SDL2 or SDL3), runtime (.NET or Mono), and controls; with SDL3, Vulkan rendering is available
- Launch and enjoy 🎮
Click to expand build guide
| Tool | Version |
|---|---|
| Android Studio | Latest stable |
| Android NDK | r28 |
| CMake | 3.22.1+ |
| JDK | 21 |
| Git | With LFS support |
# Clone the repository
git clone --recursive https://github.com/FireworkSky/RotatingartLauncher.git
cd RotatingartLauncher
# Build the Debug APK
./gradlew assembleDebugOutput: app/build/outputs/apk/debug/
Click to expand directory structure
RotatingartLauncher/
├── app/ # Main Android application module
│ └── src/main/
│ ├── java/.../ralaunch/ # Kotlin/Java source code
│ │ ├── core/ # Game launch core logic
│ │ ├── dotnet/ # .NET runtime integration
│ │ ├── renderer/ # Renderer config & loading
│ │ ├── controls/ # Virtual control system
│ │ ├── gog/ # GOG Galaxy integration
│ │ ├── easytier/ # EasyTier multiplayer service
│ │ ├── patch/ # Patch management system
│ │ └── ui/ # Compose UI screens
│ ├── cpp/ # Native C/C++ (SDL2, GL4ES ...)
│ └── assets/ # Runtime resources
├── shared/ # Kotlin Multiplatform shared module
│ └── src/
│ ├── commonMain/ # Shared UI, domain, data layer
│ └── androidMain/ # Android-specific implementations
└── patches/ # C# game patch files
Contributions are welcome! Feel free to submit Issues and Pull Requests.
Click to expand contributing guide
- Fork this repository
- Create a feature branch (
git checkout -b feature/AmazingFeature) - Commit your changes (
git commit -m 'Add some AmazingFeature') - Push to the branch (
git push origin feature/AmazingFeature) - Open a Pull Request
- Follow Android Kotlin coding guidelines
- Use meaningful variable and function names
- Add comments for complex logic
- Check existing Issues to avoid duplicates
- Create a new issue with:
- Clear description of the problem
- Steps to reproduce
- Device info (model, Android version)
- Logs (if applicable)
This project is licensed under the GNU General Public License v3.0 (GPLv3). See the LICENSE file for details.
Third-Party Licenses
| Library | License |
|---|---|
| SDL2 | Zlib License |
| GL4ES | MIT License |
| .NET Runtime | MIT License |
| FNA3D | Microsoft Public License |
Special thanks to the following open-source projects and communities
| Project | Description |
|---|---|
| SDL Project | Cross-platform media library |
| GL4ES | OpenGL compatibility layer |
| .NET Runtime | .NET runtime |
| FNA | XNA compatibility framework |
| ANGLE | OpenGL ES over Vulkan |
| EasyTier | P2P networking |
| PojavLauncher | Launcher inspiration |
Thanks to all contributors and Patreon supporters!