Skip to content
InputBooster
ContributingContribute

Contribution workflow

How to propose a change, what a good pull request looks like, and what the project expects from a contributor.

3 min readInputBooster 4.1.2-alphaMinecraft 26.2 / 26.3

The project accepts bug fixes, features and documentation improvements. One change per pull request, with a description that says what changed and why.

The short version

Open an issue first for anything non-trivial

A bug report with reproduction steps, or a feature proposal that explains why it is useful. A one-line bug fix can go straight to a pull request.

Fork and branch

feature/your-feature or bugfix/your-bug, from the branch that matches your Minecraft version.

Write the code

Clean, readable Java that follows the conventions in the repository. The code conventions page lists the rules that are not obvious.

Test it in the client

The unit suite is not enough. The engine touches vanilla behaviour, so run the game.

Open the pull request

One feature or bug per request, with a description of what changed and why. Add screenshots or a short clip if it affects visuals or gameplay.

Branches

The repository has two long-lived branches:

BranchTarget
mainThe current Minecraft line (26.2 and 26.3)
fabric-26.2-26.3The Fabric 26.2 and 26.3 build line

CI runs on pushes to both, on tags and on pull requests against main.

What a good pull request looks like

RequirementWhy
One change per requestA review of three things is three reviews
A description of what changed and whyThe maintainer needs the reason, not only the diff
The unit suite passes./gradlew test in fabric/
It was run in a clientThe engine's behaviour is only observable in a game
Screenshots for visual changesA rendering change cannot be reviewed from a diff
The mixin rules are respectedA broken mixin crashes every client

The mixin rules

These are the rules that have broken a release before:

RuleWhy
An accessor for a class target is an abstract classAn interface mixin aborts the transformation
A mixin contains no non-private static methodA public helper aborts the transformation
The handler parameters match the target exactlyA mismatch is fatal even with require = 0
A critical-path injection uses require = 1A missing hook must fail loudly
An optional hook uses require = 0A missing hook must degrade, not crash
Observers cancel nothing and change no bindingAnother mod's input stays untouched

The full list with the reasoning is in the mixin inventory.

Adding a feature

The pattern every feature follows is in feature managers. The short version: a config key, a manager class, a tick hook behind the module manager, a settings control that writes a real value, and a profile field if it should travel with a profile.

Other ways to contribute

The project's contributing guide also lists:

ContributionWhat it looks like
DocumentationImproving the README, the guides or the wiki
TestingTrying new builds and reporting what breaks
SupportAnswering questions in the forums or Discord

Code of conduct

The project follows the Contributor Covenant. Be respectful and friendly. Harassment, hate speech and toxic behaviour are not tolerated.

Licence

By contributing, you agree that your contributions are under the same licence as the project — MIT.