Development,  Tech Tips

Using a Game Controller to Speed Up Tedious Mac Tasks

FULL DISCLOSURE: I personally prefer using Keyboard Maestro over Hammerspoon for handling the “actions” in this tutorial. That said, the Hammerspoon approach seemed worth mentioning, even if I don’t have much confidence in my Lua code — so here it is, just in case it’s useful!

If you spend a lot of time performing repetitive tasks on your Mac, using a game controller as an input device can make things much more efficient—and more comfortable. Whether you’re organizing files, editing video, or culling photos, a controller lets you execute common actions with minimal effort.

In this post, I’ll walk through how I use a game controller to speed up photo culling—the process of selecting the best images from a shoot. While this tutorial focuses on photo review, the same approach can be applied to many other workflows.

Culling is an essential but tedious part of a photographer’s workflow. I’ve spent countless hours sorting through tens of thousands of images in ExcireFoto 2025 and Adobe Lightroom, and I quickly realized that using just a keyboard and trackpad was slowing me down. That’s when I started experimenting with using a USB/Bluetooth game controller for culling. Instead of hunching over a keyboard, I can sit back and control everything with a lightweight, ergonomic device in my hands.

Here’s why it works so well:

  1. Ergonomic – Game controllers are made to fit your hands. It’s natural to hold them for hours at a time.
  2. Quicker actions with muscle memory – Pressing controller buttons becomes second nature, making repetitive tasks much faster.
  3. Keeps your eyes on the screen – No need to glance at your keyboard; your fingers always know where to go.
  4. Better posture and comfort – You can position your monitor optimally without worrying about your keyboard.
  5. Simple to program – Setting up button mappings takes only minutes.
  6. Free software – You don’t need expensive tools to get this working.
  7. Gamifies tedious work – Making a dull task feel more interactive can increase efficiency.
  8. More control over navigation – Assign multiple actions to different buttons or combinations.
  9. Works for more than just culling – This method applies to video editing, file organization, and more.

I’ve done various iterations of this over time. Today I realized I’ve never blogged about it. So, here goes!

How It Works: Mapping Controller Inputs to App Actions

The key to making this setup work is mapping your game controller’s buttons to the actions you need in your software. Here’s the basic flow:

USB/BT Gamepad → Mac OS → Enjoyable (app) → Hammerspoon → Excire Foto (or whatever)

Let’s break it down step by step.

Step 1: Set up Hardware

USB/BT Gamepad

First, connect your controller to your Mac via USB or Bluetooth. Then, open System Settings → Game Controllers to verify that your device is detected. If it appears in the list, you’re good to go.

I suggest disabling the “Press Home button to open Launchpad” option while you’re here.

Step 2: Install Software

We need a way to map game controller button presses to actions in ExcireFoto. While Keyboard Maestro is an excellent option, it’s a paid tool. In this guide, I’ll show you how to achieve similar results using Hammerspoon, a free and flexible macOS automation tool.

We’ll also use Enjoyable, a simple app that translates controller inputs into keyboard presses.

Install Hammerspoon and Enjoyable now.

Once you have the necessary software installed, it’s time to configure your controller. First, we’ll map your controller buttons to keyboard keypresses using Enjoyable, then we’ll use Hammerspoon to assign those shortcuts to real actions inside ExcireFoto.

Step 3: Configure Your Controller Inputs

Use Enjoyable to configure each button to send a specific keystroke. You can map your controller buttons to whatever keys you prefer, so long as they’re single “normal” keys (stick with A-Z). Without Enjoyable (or similar) we cannot listen for HID events easily in Hammerspoon. So, by using Enjoyable we can pass simple single-character key presses into Hammerspoon, which we will then remap to whatever hotkeys (or Hammerspoon actions) we’d like. Here’s an example where I map the yellow “Y” button on my USB controller to the “Y” key (by pressing “Y” on my keyboard while in this “Press a key” text box).

You can map the Axis and Hat Switch items similarly, using the arrow keys on your keyboard for the “Press a key” value.

Step 4: Configure Hammerspoon

  1. Copy the code at the bottom of this page into a new file at ~/.hammerspoon/init.lua
  2. Download Hammerspoon
  3. Move Hammerspoon.app into your /Applications  directory
  4. Open Hammerspoon.app; it should load the config file and may or may not show the “Hammerspoon Console”

Determine the Device ID

Before mapping buttons in Hammerspoon, you need to identify your controller’s device ID. To do this:

  1. Copy the code below into your init.lua  file.
  2. Reload the Hammerspoon config from the Hammerspoon Console (found in the menu bar).
  3. Press a button on your gamepad. The console will display the device ID of your controller.
  4. Note this ID—it should be different from your keyboard’s ID.

Step 5: Map Gamepad Buttons to App Actions

We use Hammerspoon to translate our new button values (coming out of Enjoyable) into some action. In this tutorial I am focused on mapping to simple keystrokes, a lot of which Excire Foto uses. In Excire Foto you can hit “P” to flag a photo as “Accepted” and “X” to flag a photo as “Rejected,” to give just a few examples.

Update the Code

Open your init.lua  file and edit the gamepadDeviceId  variable at the top accordingly. Also, you should update the targetApp  variable to match the name of the application you wish to control.

You could take the time now to remap some of the controller buttons by monitoring what you’re pressing in Hammerspoon Console, then adding an entry for it in the keyRemap  variable.

Reload the Hammerspoon config when you’re finished, then test with (and without, to see what happens) your target application at the front.

Conclusion

Using a game controller for tedious tasks like photo culling is a game-changer (literally). With Enjoyable and Hammerspoon, you can create a fully customized setup that speeds up your workflow and makes the process more comfortable.

If you want even more control, Keyboard Maestro is a great alternative with unlimited horsepower for the “actions” side of this setup. Registering controller buttons in Keyboard Maestro is as simple as using the “USB Device Key” trigger and pressing the button. You still need to use Enjoyable.

Give it a shot! Set up your game controller, map your first few shortcuts, and see how much faster your workflow becomes. If you run into issues—or come up with new ways to use this setup—drop a comment and let me know!


Below is an example of a basic Hammerspoon script that maps your gamepad buttons to ExcireFoto actions. I will be using Keyboard Maestro instead of Hammerspoon, so I didn’t put much time into this code. YMMV! Hopefully it gives you some ideas.

Hammerspoon Code Example

Keyboard Maestro Example

Keyboard Maestro example showing multiple button configurations

Leave a Reply

Your email address will not be published. Required fields are marked *