Run Voxy — the level-of-detail mod that draws terrain far beyond Minecraft's normal render distance — on an Android phone or handheld. Minecraft: Java Edition, on Zalith Launcher 2 (a PojavLauncher-family launcher), on Snapdragon/Adreno hardware.
Voxy needs desktop OpenGL 4.6, which Android does not have. This project supplies it: a Mesa stack (Kopper Zink on Turnip) packaged as launcher plugins, plus a small compatibility mod and a native library plugin that fix the places where Voxy assumes it is running on a desktop.
| Status | Working. LODs render, persist across sessions, and survive long play sessions. Shaders work with Voxy-aware shaderpacks. |
| Verified on | AYN Odin 3 — Snapdragon 8 Elite (SM8750), Adreno 830, Android 15 |
| Game | Minecraft 26.1.2 + Fabric Loader 0.19.2 |
| Not measured | frame rate. Everything here is verified correct, nothing is verified fast — see docs/open-points.md |
Everything is done on the phone or handheld itself — download the files, tap to install, pick two settings in the launcher. No PC required.
| Requirement | Why |
|---|---|
| Adreno 7xx / 8xx GPU | The graphics stack is Mesa Turnip, which is a Qualcomm Adreno driver. Mali and PowerVR are not supported. |
| arm64 | Every shipped native library is arm64-v8a only. |
| Android 11+ | Needed for the launcher's plugin mechanism. Verified on 15. |
| ~8 GB free storage | Voxy's LOD database grows fast. See Storage. |
| Zalith Launcher 2 | This relies on its renderer/driver/native plugin APIs. Other PojavLauncher forks are untested. |
Only Adreno 830 has actually been tested. Other Adreno 7xx/8xx parts are likely but unproven, and the Turnip fix in this project (findings §4.5) was specific to how this device's gralloc reports buffer layout.
Four pieces, all in the release. Three are apps rather than mods, because Android will only load a graphics driver from an installed package — it cannot load one out of a Minecraft mod.
| File | What it does |
|---|---|
turnip-plugin.apk |
Turnip — the graphics driver that talks to your Adreno GPU |
kopper-zink26-plugin.apk |
Kopper Zink — turns desktop OpenGL 4.6 into something the driver understands. This is the piece Voxy actually needs |
rocksdb-native-plugin.apk |
Lets Voxy save its terrain data to disk. Without it, worlds crash after a minute or two |
voxy-android-compat-<version>.jar |
The Minecraft mod. Fixes two places where Voxy assumes it is on a PC |
zink-env-plugin.apk is also in the release; it is a debugging aid and you do not need it.
Why each part exists, and what breaks without it, is in docs/architecture.md.
Do all of this on the device. You need about 10 minutes and roughly 8 GB free.
From the latest release, download:
| File | What it is |
|---|---|
turnip-plugin.apk |
graphics driver |
kopper-zink26-plugin.apk |
desktop OpenGL renderer |
rocksdb-native-plugin.apk |
storage support |
voxy-android-compat-<version>.jar |
the Minecraft mod |
Tap each one. Android will ask you to allow installing from your browser or file manager the first time — that is normal for apps not from the Play Store.
They will not appear in your app drawer as anything you open. They exist so the launcher can find them, and it does so automatically.
In Zalith Launcher 2, create a Minecraft 26.1.2 instance with Fabric 0.19.2, then add these mods to it:
| Mod | Version | Where |
|---|---|---|
| Fabric API | 0.148.2+26.1.2 | Modrinth |
| Sodium | 0.9.1+mc26.1.2 — this exact version | Modrinth |
| Voxy | 0.2.18-beta | Modrinth |
| Voxy Android Compatibility | latest | Modrinth or the release above |
Optional: Iris (1.11.3+mc26.1.2 or newer) for shaders, Lithium, Voxy World Gen V2.
Sodium must be exactly 0.9.1. Voxy requires that version and refuses to start with any other, which shows up as the game closing during startup.
In the launcher, open the settings for that Minecraft version and set:
- Renderer → Kopper Zink (Mesa 25.0.7 fork)
- Driver → Turnip
- Graphics API → OpenGL
In the launcher's global settings, make sure "Prefer system Vulkan driver" is OFF.
This one catches everybody. It is applied separately from the renderer setting, so leaving it on quietly overrides everything above and the game will crash when you enter a world.
That's it — launch the game and enter a world.
In the game log (logs/latest.log in the instance directory):
OpenGL Renderer: zink Vulkan 1.4(Adreno (TM) 830 (MESA_TURNIP))
OpenGL Version: 4.6 (Compatibility Profile) Mesa 25.0.7
[VoxyRenderSystem]: Voxy render system created with 536870912 geometry capacity,
using pipeline 'NormalRenderPipeline' with renderer 'MDICSectionRenderer'
Three things to confirm:
MESA_TURNIPin the renderer string — you are on Turnip, not the proprietary driver.4.6 (Compatibility Profile)— desktop GL, not ES.Voxy render system created— Voxy is alive rather than shut down.
The honest test that LODs are actually drawing is to set vanilla render distance to 2 (32 blocks). If terrain still reaches the horizon, that geometry can only be Voxy's. A pretty screenshot at render distance 32 proves nothing.
Iris works, with one catch: Voxy LODs only render if the shaderpack itself supports Voxy. The
pack must ship voxy.json, voxy_opaque.glsl and voxy_translucent.glsl. Check before blaming
the stack:
unzip -l YourShaderpack.zip | grep -i voxySupport is recent, so an old copy of a pack that supports it today will still fail silently — Complementary Reimagined r5.7.1 has none, r5.8.1 has them. The game log tells you which you have:
| pipeline at world load | meaning |
|---|---|
NormalRenderPipeline |
no shaders, or a pack without Voxy support — LODs will not draw under shaders |
IrisVoxyRenderPipeline |
the pack supplies Voxy programs — LODs draw |
Voxy's LOD database grows fast — around 500 MB/minute while Voxy World Gen V2 pre-generates terrain, even standing still, reaching several GB in minutes. This is normal: it is the same data that used to sit in RAM, now on disk, which is exactly why long sessions no longer crash. Budget several GB per world, and expect faster growth with the world-gen mod installed.
| What you see | What to do |
|---|---|
| Game closes during startup | Check Sodium is exactly 0.9.1+mc26.1.2, and that voxy-android-compat is in the mods folder |
| Stuck loading bar, or stuck on "saving world" joining a server | rocksdb-native-plugin.apk is missing — install it. If the world was created before you installed it, see below |
| Crash a minute or two after entering a world, with memory free | An older world is still using the temporary storage backend. Easiest fix is a fresh world; otherwise ask on the issue tracker |
| Crash when entering a world | "Prefer system Vulkan driver" is probably on in global settings — turn it off |
| Scrambled or tiled image, or a black screen | The renderer or driver plugin is not the one from this project. Re-check the Renderer and Driver settings for that Minecraft version |
| Iris will not load, "incompatible mods" | Use Iris 1.11.3+mc26.1.2 or newer. Do not downgrade Sodium — Voxy requires 0.9.1 |
| LODs vanish when shaders are on | Your shaderpack has no Voxy support — see Shaders |
Every one of these has a longer technical explanation in docs/findings.md, including how it was diagnosed and why the fix is what it is.
This has been verified on exactly one device. If yours behaves differently that is worth knowing — and so is it simply working, which is what turns "should work on Adreno 7xx/8xx" into something evidenced. Two issue templates: Bug report and Device report.
When the game crashes, Zalith's error screen has a Share Logs button. That hands the game log to the normal Android share sheet, so you can send it straight to a GitHub issue, a chat app or your own storage. That is the whole procedure.
Do not go hunting through Android/data with a file manager — Android 11 and later block access to
it anyway, and the files you would find there are the ones with the caveat below.
Nearly every diagnosis in this project turned on three lines from the game log:
OpenGL Renderer: … ← which driver you are really on (look for MESA_TURNIP)
OpenGL Version: … ← desktop GL 4.6, or ES
[VoxyRenderSystem]: … ← whether Voxy started, and which pipeline
Plus your device and GPU, and which component versions you installed. The bug report template asks for exactly these.
If someone asks you for an hs_err_pid*.log — the JVM's native crash dump — strip the
--accessToken line first. Those files embed the game's full command line, which contains a
live Minecraft access token along with your username, UUID and XUID. Anyone who reads it can
act as your account until the token expires, and the file looks like an ordinary crash dump.
The launcher does not offer these for sharing, and the logs it does share are safe: the game log
has no token, and the launcher's own log prints --accessToken with the value withheld. So this
only matters if you go looking.
| Document | Contents |
|---|---|
| docs/architecture.md | How the stack fits together and why each piece exists |
| docs/building.md | Building every component from source, including the toolchain traps |
| docs/releasing.md | Cutting a signed release, and the keystore that must not be lost |
| docs/findings.md | The nine blockers, how each was diagnosed and fixed. The reference for why anything here is the way it is |
| docs/open-points.md | What is unfinished, unmeasured or uncertain |
| docs/upstream-bugs.md | Bugs found in Voxy, Mesa and the launcher, with reproductions |
| docs/launcher-internals.md | How Zalith's renderer/driver/native plugin APIs actually work |
| docs/devices.md | Measured GL capability probe results per device |
| docs/turnip-build.md | Building Turnip for Adreno 8xx |
| docs/glprobe-schema.md | Output contract for the GL capability probe |
- Voxy by Cortex
- Zalith Launcher 2 by MovTery
- The Kopper Zink Android port comes from the AngelAuraMC / Swung0x48 Mesa fork — the GL side of this stack is their work, not this project's
- rocksdb-android by Jurriaan Mous
- Mesa, Turnip and Zink by the Mesa project
The original work here — documentation, scripts, the plugin projects and the compatibility mod — is MIT; see LICENSE. Two exceptions and one prohibition are worth knowing:
patches/zalith-launcher-glprobe.diffmodifies Zalith Launcher 2 and is therefore GPL-3.0-or-later, like the code it patches.- The plugin APKs package Mesa (MIT) and RocksDB via
rocksdb-android (Apache-2.0). Full notices ship
inside each APK as
assets/THIRD-PARTY-NOTICES.txtand are also in licenses/. The RocksDB libraries are modified — RUNPATH set to$ORIGINwith patchelf, nothing else — as stated in that notice. - Voxy is All-Rights-Reserved and is never redistributed here.
voxy-android-compatcontains no Voxy code: it is a Mixin mod that modifies Voxy at runtime on your own machine, and needs a user-supplied copy of Voxy to compile against. Get Voxy from its author.

