
Remnant
Remnant lets mods read registered player data after a player logs out. It is a server-side library for Minecraft 1.21.1 on Fabric and NeoForge, continuing Offline Player Cache (OPC).
An integrating mod registers a value, a Mojang Codec, and a serializer for reading that value from a live player. On disconnect, Remnant snapshots every registered value into world SavedData. When the player comes back, the stale offline snapshot is removed and reads return to the live player.
Use it for leaderboards, statistics, progression, and server tools that need player data while someone is offline. Remnant stores the values registered by integrating mods.
Requirements
- Fabric 1.21.1 — requires Fabric API and Fabric Language Kotlin
- NeoForge 1.21.1 — requires Kotlin for Forge
- Java 21
Install the JAR for your loader. Remnant does not add player-facing features on its own; other mods use its API.
Commands
All commands require permission level 2.
/remnant keys
/remnant players
/remnant get name <name> <key>
/remnant get uuid <uuid> <key>
/remnant list name <name>
/remnant list uuid <uuid>
/remnant remove name <name> <key>
/remnant remove uuid <uuid> <key>
/remnant clear name <name>
/remnant clear uuid <uuid>
get and list can inspect either a live player or an offline snapshot. remove and clear only modify offline cache data.
For developers
A registered value is identified by a ResourceLocation, serialized with a Mojang Codec, and produced from a live Player.
public static final PlayerLedgerKey<Contract> CONTRACT = PlayerLedger.register(
ResourceLocation.fromNamespaceAndPath("example", "contract"),
Contract.CODEC,
player -> new Contract(player.getName().getString(), true)
);
Read through PlayerLedger.getPlayer(...) to get either a live LedgerPlayer.Online or a cached LedgerPlayer.Offline.
For Modrinth Maven, use the project ID so the coordinate stays stable if the public slug changes:
repositories {
exclusiveContent {
forRepository {
maven("https://api.modrinth.com/maven")
}
filter {
includeGroup("maven.modrinth")
}
}
}
dependencies {
implementation("maven.modrinth:oLPaySSb:<version>")
}
Full API examples, source, development notes, and release history are available on the main GitHub repository.
Links
Sponsor
Use code bareminimum to get 25% off your first month.
License
Remnant is licensed under the Bare Minimum License (BML) v1.0. See the full license.
How to Install Remnant (Mod)
Remnant by bibireden is verified for Fabric, Forge, Neoforge, Quilt across Minecraft versions 1.20.1, 1.20.2, 1.20.3, 1.20.4, 1.20.5, 1.20.6, 1.21, 1.21.1 (latest release: 3.0.0+1.21.1-fabric, file size: 51 KB). Follow the steps below to install it safely from ModCraft.tv:
- Click the Download button above and select your Minecraft version (1.20.1, 1.20.2, 1.20.3, 1.20.4, 1.20.5, 1.20.6, 1.21, 1.21.1) and platform (Fabric, Forge, Neoforge, Quilt).
- Make sure you have the compatible loader or environment installed for Fabric, Forge, Neoforge, Quilt.
- Move the downloaded Remnant file into your Minecraft
.minecraft/modsfolder and launch the game.
All Versions
+ Add VersionStable release for Minecraft 1.21.1 on Fabric and NeoForge. Remnant continues Offline Player Cache (OPC).
### Added
- Separate Fabric and NeoForge publishing jobs for Modrinth and CurseForge, plus a single GitHub release containing both loader JARs.
- Manual recovery options for each loader and destination, so one failed upload can be retried without repeating successful uploads.
- Release validation for version tags, loader JARs, and missing marketplace credentials.
- A refreshed Remnant logo and banner based on the original OPC artwork, with a 256×256 icon and a 1920×640 banner optimized for web use.
- GitHub, Modrinth, and CurseForge descriptions, with the Bare Minimum Studios BisectHosting banner and sponsor code.
- MixinMCP 1.5.0 development tooling and an IntelliJ/Gradle setup guide.
- Dependabot configuration for Gradle and GitHub Actions maintenance.
### Changed
- Public versions use
3.0.0+1.21.1-fabricand3.0.0+1.21.1-neoforge; the internal mod version remains3.0.0and the GitHub tag isv3.0.0+1.21.1. - Publishing builds both loaders once, then uploads to each destination independently with stable Release status.
- GitHub release authentication uses the automatic
GITHUB_TOKENwith permission to write repository contents. - Publishing stages verified runtime JARs under consistent filenames and uses only the current release's changelog section as release notes.
- Project version and Maven group are configured in
gradle.properties. - Builds use Java 21, Gradle build and configuration caches, and a checksum-verified Gradle distribution.
- Gradle parallel execution is disabled for the MixinMCP/Vineflower development workflow to reduce decompilation memory pressure.
- Cached UUID and name collections now return snapshots instead of mutable backing-map views; the registered-key map is exposed as an unmodifiable view.
- Offline cache loading and per-key serialization handle malformed or failing data more safely.
- Documentation reflects the current API, commands, dependencies, project links, and BML v1.0 license. Maven examples use Modrinth project ID
oLPaySSb. - GitHub Actions and mc-publish references remain pinned to commit SHAs.
### Removed
- Unused repositories, buildscript dependencies, compiler flags, and the unused
maven-publishplugin.
### Fixed
- Build-tool incompatibilities by aligning Gradle 9.8.0, Cloche 0.18.10, Kotlin 2.2.21, and matching Fabric Language Kotlin, with Kotlin 2.2 language/API output.
- Fabric dependency transforms running before their required mapping archive was generated.
- Duplicate ledger registrations returning an unregistered key instead of rejecting the duplicate ID.
- Offline player persistence using an unstable player-data directory when a player entry is closed.
- Username changes leaving inconsistent UUID/name mappings, and case-sensitive offline name lookups.
- Command registration conflicts involving
/remnant clear. getandlistfailing to handl
Stable release for Minecraft 1.21.1 on Fabric and NeoForge. Remnant continues Offline Player Cache (OPC).
### Added
- Separate Fabric and NeoForge publishing jobs for Modrinth and CurseForge, plus a single GitHub release containing both loader JARs.
- Manual recovery options for each loader and destination, so one failed upload can be retried without repeating successful uploads.
- Release validation for version tags, loader JARs, and missing marketplace credentials.
- A refreshed Remnant logo and banner based on the original OPC artwork, with a 256×256 icon and a 1920×640 banner optimized for web use.
- GitHub, Modrinth, and CurseForge descriptions, with the Bare Minimum Studios BisectHosting banner and sponsor code.
- MixinMCP 1.5.0 development tooling and an IntelliJ/Gradle setup guide.
- Dependabot configuration for Gradle and GitHub Actions maintenance.
### Changed
- Public versions use
3.0.0+1.21.1-fabricand3.0.0+1.21.1-neoforge; the internal mod version remains3.0.0and the GitHub tag isv3.0.0+1.21.1. - Publishing builds both loaders once, then uploads to each destination independently with stable Release status.
- GitHub release authentication uses the automatic
GITHUB_TOKENwith permission to write repository contents. - Publishing stages verified runtime JARs under consistent filenames and uses only the current release's changelog section as release notes.
- Project version and Maven group are configured in
gradle.properties. - Builds use Java 21, Gradle build and configuration caches, and a checksum-verified Gradle distribution.
- Gradle parallel execution is disabled for the MixinMCP/Vineflower development workflow to reduce decompilation memory pressure.
- Cached UUID and name collections now return snapshots instead of mutable backing-map views; the registered-key map is exposed as an unmodifiable view.
- Offline cache loading and per-key serialization handle malformed or failing data more safely.
- Documentation reflects the current API, commands, dependencies, project links, and BML v1.0 license. Maven examples use Modrinth project ID
oLPaySSb. - GitHub Actions and mc-publish references remain pinned to commit SHAs.
### Removed
- Unused repositories, buildscript dependencies, compiler flags, and the unused
maven-publishplugin.
### Fixed
- Build-tool incompatibilities by aligning Gradle 9.8.0, Cloche 0.18.10, Kotlin 2.2.21, and matching Fabric Language Kotlin, with Kotlin 2.2 language/API output.
- Fabric dependency transforms running before their required mapping archive was generated.
- Duplicate ledger registrations returning an unregistered key instead of rejecting the duplicate ID.
- Offline player persistence using an unstable player-data directory when a player entry is closed.
- Username changes leaving inconsistent UUID/name mappings, and case-sensitive offline name lookups.
- Command registration conflicts involving
/remnant clear. getandlistfailing to handl
- Added extension (reified) functions that could prove to be useful to Kotlin users.
- Added extension (reified) functions that could prove to be useful to Kotlin users.
- Added extension (reified) functions that could prove to be useful to Kotlin users.
- Added extension (reified) functions that could prove to be useful to Kotlin users.
- Updated to 1.21 (yes, other mods will follow suit as well).
- Updated to 1.21 (yes, other mods will follow suit as well).
- This update just served to remove a duplicate initializer (Forge).
- This update just served to remove a duplicate initializer (Forge).
- Hey, hey, I figured out how to do a multi-loader project! (sorta)
- This update is compatible for (hopefully) all loaders.
## Changes 🌽
- Rewrote the cache (again).
- The cache now uses a record-based system for registering with a provided Codec.
- Register your record using
OfflinePlayerCacheAPI#register. - Get your cache using
OfflinePlayerCacheAPI#getCache. - Proper documentation will arrive upon release.*
- Hey, hey, I figured out how to do a multi-loader project! (sorta)
- This update is compatible for (hopefully) all loaders.
## Changes 🌽
- Rewrote the cache (again).
- The cache now uses a record-based system for registering with a provided Codec.
- Register your record using
OfflinePlayerCacheAPI#register. - Get your cache using
OfflinePlayerCacheAPI#getCache. - Proper documentation will arrive upon release.*
- Hey, hey, I figured out how to do a multi-loader project! (sorta)
- This update is compatible for (hopefully) all loaders.
## Changes 🌽
- Rewrote the cache (again).
- The cache now uses a record-based system for registering with a provided Codec.
- Register your record using
OfflinePlayerCacheAPI#register. - Get your cache using
OfflinePlayerCacheAPI#getCache. - Proper documentation will arrive upon release.*
- Hey, hey, I figured out how to do a multi-loader project! (sorta)
- This update is compatible for (hopefully) all loaders.
## Changes 🌽
- Rewrote the cache (again).
- The cache now uses a record-based system for registering with a provided Codec.
- Register your record using
OfflinePlayerCacheAPI#register. - Get your cache using
OfflinePlayerCacheAPI#getCache. - Proper documentation will arrive upon release.*