Skip to content

Rubric Quick Start

Oliver Yasuna edited this page Jul 3, 2026 · 2 revisions

Rubric — Quick Start

Minimal mod using Rubric. Both Fabric and NeoForge entry points are shown; the config definition itself is loader-neutral. Assumes you've already followed Installation.

1. Define the config

Annotate a plain Java class. Public no-arg constructor, public fields with default values.

package com.example.mymod;

import com.oliveryasuna.mc.rubric.api.Format;
import com.oliveryasuna.mc.rubric.api.annotation.*;

@Config(id = "mymod", name = "mymod", format = Format.TOML, version = 1)
public final class MyModConfig {

    @Comment("Master toggle for the demo feature.")
    public boolean enabled = true;

    @Comment("Tick interval — server-authoritative.")
    @Range(min = 50, max = 5_000)
    @Sync(Sync.Scope.SERVER)
    public int tickIntervalMillis = 200;

    @Comment("Client-only display opacity.")
    @Range(min = 0.0, max = 1.0)
    public double opacity = 0.8;

    @Comment("Quality preset.")
    @OneOf({"low", "medium", "high"})
    public String quality = "medium";

    public MyModConfig() { super(); }
}

Rubric infers everything else from the class: boolean/double/String become toggles/sliders/text fields in the GUI, @Range sizes the slider bounds, @OneOf becomes a dropdown.

2. Register it at mod init

Rubric's loader integration has already bootstrapped the runtime by the time your mod's constructor / onInitialize runs — you just call Rubric.register.

Fabric

package com.example.mymod;

import com.oliveryasuna.mc.rubric.core.ConfigHandle;
import com.oliveryasuna.mc.rubric.core.Rubric;
import net.fabricmc.api.ModInitializer;

public final class MyMod implements ModInitializer {

    private static ConfigHandle<MyModConfig> config;

    public static MyModConfig config() {
        return config.get();
    }

    @Override
    public void onInitialize() {
        config = Rubric.register(MyModConfig.class, null);
    }
}

NeoForge

package com.example.mymod;

import com.oliveryasuna.mc.rubric.core.ConfigHandle;
import com.oliveryasuna.mc.rubric.core.Rubric;
import net.neoforged.bus.api.IEventBus;
import net.neoforged.fml.common.Mod;

@Mod(MyMod.MOD_ID)
public final class MyMod {

    public static final String MOD_ID = "mymod";

    private static ConfigHandle<MyModConfig> config;

    public static MyModConfig config() {
        return config.get();
    }

    public MyMod(final IEventBus modEventBus) {
        config = Rubric.register(MyModConfig.class, null);
    }
}

That's it. On first launch the config file is created at <gameDir>/config/mymod.toml.

3. Read values elsewhere

if(MyMod.config().enabled) {
    // ...
}

4. React to changes (optional)

MyMod.config().manager().getEvents().subscribe(event -> {
    if("opacity".equals(event.path())) {
        // opacity changed at runtime — repaint your overlay
    }
});

Or listen for reloads (config file edited externally, or the user hits Save in the GUI):

MyMod.config().manager().addReloadListener((previous, current) -> {
    // called on every reload after the first, on the main thread
});

5. Give the user a GUI entry

Nothing extra to do on Fabric — Rubric's ModMenu / Catalogue integration surfaces your config automatically as long as the @Config#id ("mymod" above) matches your loader mod id (fabric.mod.json#id).

On NeoForge, register the mod-list Config button in your client-side class via NG's standard extension point:

package com.example.mymod;

import com.oliveryasuna.mc.rubric.neoforge.gui.RubricGui;
import net.minecraft.client.Minecraft;
import net.neoforged.api.distmarker.Dist;
import net.neoforged.bus.api.IEventBus;
import net.neoforged.fml.ModContainer;
import net.neoforged.fml.common.Mod;
import net.neoforged.neoforge.client.gui.IConfigScreenFactory;

@Mod(value = MyMod.MOD_ID, dist = Dist.CLIENT)
public final class MyModClient {

    public MyModClient(final IEventBus modEventBus, final ModContainer container) {
        container.registerExtensionPoint(
                IConfigScreenFactory.class,
                (mc, parent) -> RubricGui.openFor(Minecraft.getInstance(), parent, MyMod.config().manager())
        );
    }
}

If you own more than one config, register each — Rubric groups them under a chooser sub-screen behind your single mod entry (see Frontends for the details).

What next

  • Annotations — every knob Rubric reads from your class.
  • Concepts — the vocabulary you'll see in Rubric's own APIs and Javadoc.
  • Sync — server-authoritative values (like tickIntervalMillis above).
  • Migration — writing steps for version = 2 when the schema changes.

Clone this wiki locally