Gaming
PS5 Controller on Minecraft Java (macOS)
Playing Minecraft Java with a DualSense on macOS: Fabric Loader + Controlify
Overview
Vanilla Minecraft Java Edition has no native controller support. The common Windows-side workaround is adding the launcher as a non-Steam game so Steam Input translates the DualSense into keyboard+mouse1, but on macOS that path has rough edges around the launcher-to-game process handoff. This guide takes the cleaner native route: Fabric Loader installed alongside the vanilla profile, plus the Controlify mod2, which reads the DualSense directly through Apple's Game Controller framework. The vanilla install is untouched and switching back is a launcher dropdown change.
Verified on macOS 26.5, Apple M4 Max, MC 26.1.2, Fabric installer 1.1.1, Fabric Loader 0.19.2, Fabric API 0.150.0+26.1.2, YACL 3.9.3+26.1-fabric, Controlify 3.0.1+26.1-fabric.
Before You Begin
Prerequisites
- Minecraft Java Edition installed via the official launcher.
- A standalone Java runtime on
PATHto run the Fabric installer JAR from the terminal. The launcher's bundled JRE is not exposed — install Temurin withbrew install --cask temurin. jqfor parsing the Modrinth API responses:brew install jq.- A PS5 DualSense controller.
Why This Approach
Three observations drive the design:
- Steam Input's macOS handoff is fragile. The Minecraft Launcher hands off to a separate
javaprocess, and Steam can lose track of which process should receive the virtual controller. Going around Steam removes that variable. - macOS speaks DualSense natively. Apple's Game Controller framework recognizes the DualSense as a standard gamepad over Bluetooth, including touchpad and gyro. Controlify reads from that framework directly — no driver shim, no kb+m translation layer.
- Fabric is a sibling profile, not a replacement. The Fabric installer writes a new entry into the launcher's
launcher_profiles.jsonnext to the release profile. Switching the dropdown back returns to pure vanilla.
Stage Fabric and the Mods
Paths
MC_DIR="$HOME/Library/Application Support/minecraft"
MODS_DIR="$MC_DIR/mods"
WORK="/tmp/mc-fabric"
MC_VERSION="26.1.2" # ← current stable as of 2026-05-30 Download the Fabric Installer
The installer is published to Fabric's Maven. Query the meta API for the latest installer version, then pull the JAR.
mkdir -p "$WORK" && cd "$WORK"
INSTALLER_VERSION=$(curl -sSL https://meta.fabricmc.net/v2/versions/installer \
| jq -r '.[0].version')
curl -sSL -o fabric-installer.jar \
"https://maven.fabricmc.net/net/fabricmc/fabric-installer/${INSTALLER_VERSION}/fabric-installer-${INSTALLER_VERSION}.jar" Run the Installer in CLI Mode
The installer's client subcommand writes a Fabric profile into the existing launcher install without launching the GUI.
java -jar fabric-installer.jar client \
-mcversion "$MC_VERSION" \
-dir "$MC_DIR" A new profile named fabric-loader-<loader-version>-<mc-version> appears in $MC_DIR/launcher_profiles.json.
Install Mods
Controlify has two required runtime dependencies on Modrinth: Fabric API3 (the common runtime almost every Fabric mod uses) and YetAnotherConfigLib (YACL)4 (the config UI library Controlify renders its settings through). Both projects expose the same Modrinth versions endpoint5, which returns version-matched download URLs for a given MC version + loader pair.
Fabric API
mkdir -p "$MODS_DIR"
FABRIC_API_URL=$(curl -sSL \
"https://api.modrinth.com/v2/project/fabric-api/version?game_versions=%5B%22${MC_VERSION}%22%5D&loaders=%5B%22fabric%22%5D" \
| jq -r '.[0].files[0].url')
curl -sSL -o "$MODS_DIR/fabric-api.jar" "$FABRIC_API_URL" YetAnotherConfigLib (YACL)
YACL_URL=$(curl -sSL \
"https://api.modrinth.com/v2/project/yacl/version?game_versions=%5B%22${MC_VERSION}%22%5D&loaders=%5B%22fabric%22%5D" \
| jq -r '.[0].files[0].url')
curl -sSL -o "$MODS_DIR/yacl.jar" "$YACL_URL" Controlify
CONTROLIFY_URL=$(curl -sSL \
"https://api.modrinth.com/v2/project/controlify/version?game_versions=%5B%22${MC_VERSION}%22%5D&loaders=%5B%22fabric%22%5D" \
| jq -r '.[0].files[0].url')
curl -sSL -o "$MODS_DIR/controlify.jar" "$CONTROLIFY_URL" Verify the Staged Mods
ls -lh "$MODS_DIR" Expected: Three non-zero .jar files — fabric-api.jar, yacl.jar, and controlify.jar.
Mod Menu6 is an optional add-on that surfaces a mod list and per-mod settings button on the title screen. Not required for Controlify to function, but convenient for reaching the Controlify config without entering a world first. To add it, repeat the pattern above with project/modmenu.
Pair the DualSense
This step is GUI-only on macOS — Apple doesn't expose Bluetooth pairing through a stable CLI surface.
- On the controller, hold PS + Share until the light bar flashes rapidly.
- Open System Settings → Bluetooth.
- Click Connect next to "DualSense Wireless Controller" when it appears.
Launch and Verify
Switch the Launcher Profile
Open the official Minecraft Launcher. In the profile dropdown next to Play, switch from the release profile to the fabric-loader-... profile created above.
Detect the Controller
Click Play. Controlify renders a controller indicator on the title screen when it detects the DualSense. If the indicator is missing:
- Confirm the controller is paired and powered on (light bar steady, not flashing).
- Confirm
fabric-api.jar,yacl.jar, andcontrolify.jarare all present in$MODS_DIR. - Confirm the loaded profile is the Fabric profile, not the release profile.
Configure Bindings
In-game: Options → Controls → Controlify. Defaults are workable; tweak deadzones, gyro, and button mapping from there.
Next Steps
With the DualSense working in vanilla Minecraft Java, the same Fabric + Controlify setup carries forward into modded MC — any Fabric-side mods added later inherit controller input without extra wiring.
Resources
Footnotes
YourSixStudios, "How to Enable PS5 Controller in Non Steam Games on Steam Settings (Best Method)," YouTube. Accessed: May 30, 2026. [Online]. Available: https://www.youtube.com/watch?v=UM6YQj8IET0 ↩
isXander, "Controlify," Modrinth. Accessed: May 30, 2026. [Online]. Available: https://modrinth.com/mod/controlify ↩
FabricMC, "Fabric API," Modrinth. Accessed: May 30, 2026. [Online]. Available: https://modrinth.com/mod/fabric-api ↩
isXander, "YetAnotherConfigLib (YACL)," Modrinth. Accessed: May 30, 2026. [Online]. Available: https://modrinth.com/mod/yacl ↩
Modrinth, "Modrinth API v2 — Get a project's versions," docs.modrinth.com. Accessed: May 30, 2026. [Online]. Available: https://docs.modrinth.com/api/operations/getprojectversions/ ↩
Prospector, "Mod Menu," Modrinth. Accessed: May 30, 2026. [Online]. Available: https://modrinth.com/mod/modmenu ↩