Compatibility
Minecraft: Java Edition
Platforms
Supported environments
Links
Tags
Creators
Details
Custom Splash
A mod that replaces or extends the yellow splash text on the Minecraft title screen. Configure it with a JSON file or from code, add colours, gradients, rainbows, placeholders and conditions — all without touching the game files.
- Fabric, Forge and NeoForge, no other mods required.
- Fabric: Minecraft 1.14 through 26.3 — every stable release, 48 versions.
- Forge: Minecraft 1.16.1 through 1.20.6 — every release with a Forge build, 20 versions.
- NeoForge: Minecraft 1.20.5 through 26.3 — 18 versions, including the 26.x line.
Minecraft 1.16.0 and 1.17.0 have no Forge build and stay Fabric-only; 1.20.5 is Fabric + NeoForge (Forge never shipped for it).
Client-side only; nothing changes in multiplayer.
Installation
Drop the JAR for your Minecraft version into mods/. On first launch the mod
creates config/customsplash.json. Until you edit it the title screen shows
Check your custom splash config file to customize!.
Forge downloads use the jars with -forge- in the filename, NeoForge downloads
the -neoforge- jars and Fabric downloads use the plain
customsplash-<mc>-… jars.
Upgrading from 1.x
Version 2.0.0 drops the hyphen from the mod id: NeoForge rejects custom-splash
and Forge 1.17 and newer derive an invalid Java module name from it, so before
this release the mod could not load on NeoForge at all or on Forge 1.17–1.19.4.
Two paths have to move with the id:
- rename
config/custom-splash.jsontoconfig/customsplash.json— the file format is unchanged, so its contents need no edits; - if you ship a resource pack, move its
assets/custom-splash/splashes.txt(orsplashes.json) toassets/customsplash/.
Nothing else about the config format or the SplashRegistry API changed.
Configuration
{
"splashes": [
{ "text": "Check your custom splash config file to customize!" },
{ "text": "Hello, {player}!", "weight": 5, "color": "#FFAA00" },
{ "text": "Rainbow time", "color": "rainbow:25" },
{ "text": "Enjoy the weekend!", "conditions": { "weekend": true } },
{ "text": "Late night coding", "conditions": { "time": "night", "chance": 0.5 } },
{ "text": "You run Fabric!", "conditions": { "mods": ["fabric"] } }
]
}
text— the splash text. Placeholders are replaced when the splash is drawn; unknown tokens are left untouched.weight— relative chance, default1. Higher shows more often.color— a solid colour, a gradient or a rainbow, see below.conditions— every listed condition must match:time:dayornightdate:MM-DDorMM-DD..MM-DD(ranges may wrap across new year)weekend:true/falseplayer: list of usernamesmods: list of required mod idschance:0.0–1.0random chance
Entries from the config file, from enabled resource packs and from
SplashRegistry.add(...) are all combined. When nothing matches, the vanilla
splash is used.
Placeholders
| Placeholder | Expands to |
|---|---|
{player}, {username} |
your username, or player when unknown |
{date} |
today as yyyy-MM-dd |
{time} |
the current time as HH:mm |
{mc_version}, {mc}, {version} |
the running Minecraft version |
{mods}, {mods_count} |
the number of loaded mods |
Placeholders are expanded once, when the splash is picked, so {time} is the
moment the title screen renders rather than a live clock. Placeholders that
cannot be resolved stay literal instead of showing a blank space.
Colours
| Value | Meaning |
|---|---|
#RRGGBB |
a single colour for the whole text |
#RRGGBB,#RRGGBB |
a gradient spread across the characters |
#RRGGBB,#RRGGBB,… |
a gradient with more than two stops |
gradient:#RRGGBB,… |
the same, spelled explicitly |
rainbow |
a hue cycle, 15° per character |
rainbow:45 |
a hue cycle with a custom degrees-per-character |
Anything that does not parse is ignored and falls back to the vanilla yellow. A gradient is sampled per character, so each character gets its own interpolated value and the first and last characters always match the stops exactly.
{
"splashes": [
{ "text": "Solid!", "color": "#FFAA00" },
{ "text": "Gradient!", "color": "#FF0000,#00FF00" },
{ "text": "Rainbow!", "color": "rainbow:25" }
]
}
On versions before 1.20, where the splash is a plain string that cannot carry
per-character styling, a gradient is approximated by prefixing each character
with the nearest legacy § code, and a solid #RRGGBB becomes a single §
code.
Resource packs
A resource pack can add splash texts by providing
assets/customsplash/splashes.txt. Each non-empty line becomes a splash text
and lines starting with # are ignored. Enabled packs are re-read
automatically, and SplashRegistry.reload() forces an immediate refresh.
For mod developers
Call SplashRegistry.add(String) during mod initialization (or any time
before the title screen renders):
import dev.arrbrants.customsplash.SplashRegistry;
public class MyMod implements ModInitializer {
@Override
public void onInitialize() {
SplashRegistry.add("Hello! Fabric!");
SplashRegistry.add("Powered by Mixin", 3); // weight 3
}
}
The API also exposes remove(String), clear(), list(), count(), and
reload() (re-reads the config file and enabled resource packs). pick()
returns the chosen text and pickEntry() returns it together with its colour.
For Forge mods, register splashes during mod construction:
import dev.arrbrants.customsplash.SplashRegistry;
@Mod("mymod")
public class MyMod {
public MyMod() {
SplashRegistry.add("Hello! Forge!");
}
}
NeoForge mods use the injected mod event bus:
import dev.arrbrants.customsplash.SplashRegistry;
import net.neoforged.bus.api.IEventBus;
import net.neoforged.fml.common.Mod;
@Mod("mymod")
public class MyMod {
public MyMod(IEventBus modEventBus) {
SplashRegistry.add("Hello! NeoForge!");
}
}
The SplashRegistry API is identical on all loaders.


