𝔩𝔢𝔩𝕠𝔭𝔢𝔷
Theme

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.

Tip

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 PATH to run the Fabric installer JAR from the terminal. The launcher's bundled JRE is not exposed — install Temurin with brew install --cask temurin.
  • jq for parsing the Modrinth API responses: brew install jq.
  • A PS5 DualSense controller.

Why This Approach

Three observations drive the design:

  1. Steam Input's macOS handoff is fragile. The Minecraft Launcher hands off to a separate java process, and Steam can lose track of which process should receive the virtual controller. Going around Steam removes that variable.
  2. 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.
  3. Fabric is a sibling profile, not a replacement. The Fabric installer writes a new entry into the launcher's launcher_profiles.json next 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.

Tip

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.

  1. On the controller, hold PS + Share until the light bar flashes rapidly.
  2. Open System Settings → Bluetooth.
  3. 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, and controlify.jar are 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

  1. 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

  2. isXander, "Controlify," Modrinth. Accessed: May 30, 2026. [Online]. Available: https://modrinth.com/mod/controlify

  3. FabricMC, "Fabric API," Modrinth. Accessed: May 30, 2026. [Online]. Available: https://modrinth.com/mod/fabric-api

  4. isXander, "YetAnotherConfigLib (YACL)," Modrinth. Accessed: May 30, 2026. [Online]. Available: https://modrinth.com/mod/yacl

  5. 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/

  6. Prospector, "Mod Menu," Modrinth. Accessed: May 30, 2026. [Online]. Available: https://modrinth.com/mod/modmenu