Contributing to JEI

September 11, 2026 ยท View on GitHub

Thanks for helping improve JEI. Please keep pull requests focused and target the latest active Minecraft branch. Changes can be backported to older supported branches after they are reviewed and merged.

Pull requests

Keep each pull request scoped to one fix, feature, or cleanup. Avoid mixing unrelated refactors, formatting-only changes, dependency updates, and behavior changes in the same pull request.

Describe the problem being fixed, the behavior change, and how you tested it. Link the relevant issue when one exists.

Do not include build outputs, logs, run directories, generated IDE files, or release artifacts.

Formatting

JEI uses Spotless to enforce Java formatting. Before opening or updating a pull request, run:

./gradlew spotlessApply

To verify formatting without changing files, run:

./gradlew spotlessCheck

Tests

Pull requests that change production Java code should include relevant tests or game tests in the same pull request.

If a production-code change does not need a test, explain why in the pull request description. A maintainer can apply the no-tests-needed label to bypass the automated test-change check.

Run the standard verification suite before opening or updating a pull request:

./gradlew check

This checks formatting and API compatibility, runs unit tests and server GameTests, validates the Fabric access widener, and compiles the client GameTest source sets.

Client game tests require a graphical environment. On Linux CI they run through xvfb-run.

API compatibility

Preserve API compatibility by default. Avoid removing, renaming, or changing public API methods and types. Prefer additive APIs and long deprecation windows when migration is needed.

Breaking API changes require a JEI major version bump and should only be considered for Minecraft-version updates.

Code organization

Keep changes in the module that owns the behavior. Avoid moving code between Common, Gui, Library, Fabric, NeoForge, and their API source sets unless the change specifically requires it.

Subproject relationships are grouped by published code modules and helper modules:

flowchart TB
    subgraph published["Published code modules"]
        direction TB

        Common["Common<br/>shared API + implementation"]

        Gui["Gui<br/>client GUI"]
        Library["Library<br/>runtime implementation"]

        subgraph loaders["Loader packages"]
            direction LR

            Fabric["Fabric<br/>API + packaged mod"]
            NeoForge["NeoForge<br/>API + packaged mod"]
        end
    end

    subgraph helpers["Helper / non-published modules"]
        direction LR
        Debug["Debug<br/>development plugin"]
        Changelog["Changelog<br/>release notes"]
    end

    Common --> Gui
    Common --> Library
    Common --> loaders
    Gui --> loaders
    Library --> loaders

    classDef code fill:#e9fbe8,stroke:#1a7f37,color:#0b1f33
    classDef package fill:#f0e7ff,stroke:#8250df,color:#0b1f33
    classDef helper fill:#fff7d6,stroke:#9a6700,stroke-dasharray: 5 3,color:#0b1f33

    class Common,Gui,Library code
    class Fabric,NeoForge package
    class Debug,Changelog helper

When adding Java code in a new package or source root, add the usual package-info.java with package annotations matching nearby code.

Avoid build tooling, Java version, dependency, publishing, and version-number changes unless the pull request is specifically about that infrastructure.