Who uses this API
control-flex-api has five public consumers today, and all of them are official bridge mods under the ControlFlexMC organisation. The mods they adapt (Epic Fight, Create, Exposure, EMI, Immersive Vehicles) do not depend on this API and need no changes at all — this page keeps "depends on the API" and "is merely adapted" strictly apart.
Section: Overview · Setup & lifecycle · Interfaces · Implementations · Who uses the API
You can tell the two apart from a build script: a compileOnly "com.github.ControlFlexMC:control-flex-api:<version>" line means it is a bridge (it depends on the API); declaring Control Flex under dependencies only means it requires the core mod to be installed; if neither appears, the mod is purely a target.
Bridge mods that depend on the API
All five repositories live under ControlFlexMC and branch per MC version (the default branch is 1.20.1). The "API surface" column comes from counting call sites in each repository's own source.
| Repository | Adapts | Branches | API surface used | Bundled assets |
|---|---|---|---|---|
| cfx-compat-epicfight | Epic Fight | 1.20.1 · 1.21.1 | The whole SPI (ready / compat / guide) + action state + state push + camera hand-off + input view | compat JSON + guide JSON + en/zh strings |
| cfx-compat-create | Create train console | 1.20.1 · 1.21.1 | Plugin ready callback + action state + controller state | None |
| cfx-compat-exposure | Exposure viewfinder | 1.20.1 · 1.21.1 | Calls getInteractiveContextRegistrar() only — no SPI plugin at all |
None |
| cfx-compat-emi | EMI | 1.18.2 · 1.19.2 · 1.20.1 · 1.21.1 | Plugin compat callback + asset installer (the 22 pseudo keys are described in JSON) | compat JSON + en/zh strings |
| cfx-compat-vehicles | Immersive Vehicles (MTS) | 1.12.2 · 1.16.5 · 1.18.2 · 1.19.2 · 1.20.1 · 1.21.1 · 26.1.2 | Plugin ready callback + action state + controller state | None (no JSON shipped) |
Adapted mods (no API dependency)
These are the upstream mods. They have no idea they are being driven by a gamepad — the bridge sits on this side and translates input into signals they already understand, so an upstream update only needs the bridge to follow; not one field upstream changes.
| Mod | Minimum version | Adapted by |
|---|---|---|
| Epic Fight | ≥ 20.14 (1.20.1 Forge) · ≥ 21.15 (1.21.1 NeoForge) | cfx-compat-epicfight |
| Create | ≥ 6.0.7 | cfx-compat-create |
| Exposure | ≥ 1.9.20 | cfx-compat-exposure |
| EMI | 1.1.x | cfx-compat-emi |
| Immersive Vehicles (MTS) | Whatever the matching MC line currently ships | cfx-compat-vehicles |
Core mod and config source: two roles people mix up
- control-flex is the implementation of this API, not a consumer:
ControlFlexApiAdapterexposes its controller, action, state and camera pipelines to the outside, and the core mod itself does not depend on the JitPack artifact. - cfx-compat-configs is a pure JSON config source with no Java at all, which is why it is missing from the table above — the mods it covers are listed under compat config fields.
- There are no third-party bridges yet. If you write one, mention the repository and the mod versions it targets in a control-flex issue and it will be added here.
One mod can need both paths at once
Bridges and JSON are not mutually exclusive: epicfight writes Java and ships JSON, and the community configs for create / emi use dependencies to require the bridge. Whether a mod feels right on a controller therefore comes down to two things — is the bridge installed, and does a config cover the rest.
| What the mod looks like | Who covers it |
|---|---|
A standard KeyMapping, visible under Controls |
Auto-discovery is enough; add a compat JSON to fine-tune |
| Its own input system, and a bridge already exists | Install the bridge, then override the JSON it installs as needed |
| Its own input system, and nobody has written a bridge | Fall back to editing configs by hand; long term, write the bridge |