explaingit

collinkite/steamcontrollerkit

1SwiftAudience · developerComplexity · 3/5ActiveLicenseSetup · moderate

TLDR

Pure-Swift package that connects iOS, iPadOS, and tvOS apps to a Steam Controller over Bluetooth LE, exposing sticks, trackpads, triggers, buttons, motion, and rumble.

Mindmap

mindmap
  root((SteamControllerKit))
    Inputs
      Bluetooth LE packets
      Steam Controller hardware
    Outputs
      SteamControllerState struct
      Haptic and rumble calls
    Use Cases
      iOS games with Steam Controller
      Apple TV game input
      Motion-driven apps
    Tech Stack
      Swift
      CoreBluetooth
      SwiftUI
      XcodeGen

Things people build with this

USE CASE 1

Add Steam Controller support to an iPad game built in SwiftUI or SpriteKit.

USE CASE 2

Use the trackpads and gyro as a custom input device for a creative tvOS app.

USE CASE 3

Drive rumble and haptic tone patterns from a music or rhythm app.

USE CASE 4

Build a controller diagnostic tool that mirrors live inputs on screen.

Tech stack

SwiftCoreBluetoothSwiftUIXcodeGen

Getting it running

Difficulty · moderate Time to first run · 30min

Requires 2026 iOS/iPadOS/tvOS, a physical device since the Simulator has no Bluetooth, and Info.plist Bluetooth permission declared.

MIT license, free to use and modify with attribution; Steam Controller trademarks remain with Valve.

In plain English

SteamControllerKit is a Swift package that lets iPhone, iPad, and Apple TV apps talk to a Steam Controller (the gamepad Valve sells alongside its gaming platform) over Bluetooth Low Energy. Once it is wired into an app, the controller behaves like a normal gamepad: both thumbsticks, both touch trackpads with pressure readings, the analog triggers, all 30 buttons and touch-sensitive surfaces, and the motion sensors all become readable values. The package can also drive the rumble motors and play tone patterns through the controller's haptic system. For developers, the input arrives as a single Swift value called SteamControllerState, with the thumbsticks, trackpads, triggers normalised to a 0 to 1 range, named buttons, and accelerometer plus gyroscope data. The library handles discovery and connection on its own. It is written in pure Swift with no third-party dependencies, and builds for iOS, iPadOS, and tvOS. The README notes that it requires the 2026 versions of those operating systems, a real device because the Simulator has no Bluetooth, and an app that declares Bluetooth permission in its Info.plist. Installation is done through Xcode's Swift Package Manager. The README shows a short example: create a SteamControllerBLE object, set a delegate to receive callbacks, and call start(). Connection state changes and input updates both come back to the delegate on the main thread. There are also a few haptic calls shown, including rumble at a configurable strength, a low-frequency oscillator tone, and a logarithmic frequency sweep. The repository includes an example app called SteamControllerTester, a SwiftUI project for all three platforms that connects to a controller and displays every input live, with buttons to try the haptics. The example project file is generated with a tool called XcodeGen, so contributors run xcodegen generate before opening it in Xcode. The README explains how the protocol was figured out. The Bluetooth LE input and haptic packet formats came from SDL, an open-source library that already supports the Steam Controller, and inspecting the official Steam Link app confirmed it uses SDL too. The button mapping and haptic calibration for the newer 2026 controller were worked out by recording and analysing live Bluetooth traffic. The project is independent of Valve, the trademarks belong to Valve, and the code is released under the MIT license.

Copy-paste prompts

Prompt 1
Add SteamControllerKit to my Xcode project via Swift Package Manager, then write a SwiftUI view that prints the current SteamControllerState live.
Prompt 2
Wire SteamControllerKit into my SpriteKit game so the left stick moves the player and the right trackpad aims a reticle.
Prompt 3
Use SteamControllerKit haptics to play a rising frequency sweep when the player picks up a coin.
Prompt 4
Run the SteamControllerTester example app on an iPad. Tell me what I need from XcodeGen and Info.plist Bluetooth permission to make it build.
Prompt 5
Map SteamControllerKit input to GameController framework GCExtendedGamepad so my existing GameController code keeps working.
Open on GitHub → Explain another repo

Generated 2026-05-22 · Model: sonnet-4-6 · Verify against the repo before relying on details.