This is a shared development library for my NeoForge mods.
It contains reusable systems that would otherwise have to be implemented separately in each project. It is intentionally focused on framework infrastructure rather than providing its own gameplay mechanics.
What it provides
- Value tracking: persistent player values with decay, thresholds, effects, diminishing returns, source memory, synergies, and milestones.
- Generic tracking: reusable counters for things such as blocks mined, entities defeated, distance traveled, machine operations, and other numeric statistics.
- Classification: configurable item classification with tags, namespaces, keywords, recipes, weighted signals, overrides, exclusions, and runtime resolution.
- Compatibility: runtime compatibility definitions with mod-provided registrations and configuration overrides.
- Resource systems: JSON, configuration, and datapack-driven definitions and overrides.
- Dynamic UI: reusable components, draggable/resizable panels, widgets, notifications, rendering utilities, and the shared Command Center.
- UI editing: module positioning, scaling, visibility, colors, layout editing, toolboxes, and editor controls.
- Developer tooling: framework commands, diagnostics, classification tracing, and request/response networking.
- KubeJS integration: experimental bindings for selected framework APIs.
Architecture
MariesLib is split into several modules:
marie-core: core APIs, tracking, classification, compatibility, and shared servicesmarie-commands: commands and diagnostic toolingmarie-resources: resource-driven definitions and overridesmarie-ui: reusable UI infrastructuremarie-editor: UI editing and configuration infrastructure
The library is designed so that consuming mods provides the actual meaning and gameplay rules.
For example:
MariesLib:: provides generic value tracking. Nourished:: defines nutrition values and how they affect the player.
Compatibility & API
MariesLib targets Minecraft 1.21.1 / NeoForge. 21.1.x / Java 21.
The library uses explicit API stability levels:
@Stable: intended for external use@Experimental: usable but subject to change@Internal: implementation detail and not intended for external use
MariesLib is distributed as a normal NeoForge dependency and is not bundled through Jar-in-Jar.
License: LGPL-3.0-only
Source: GitHub Documentation: API Reference Changelog: CHANGELOG.md
How to Install MariesLib (Mod)
MariesLib by kgbcupcake is verified for Neoforge across Minecraft versions 1.21.1 (latest release: 0.1.2-beta, file size: 1.4 MB). Follow the steps below to install it safely from ModCraft.tv:
- Click the Download button above and select your Minecraft version (1.21.1) and platform (Neoforge).
- Make sure you have the compatible loader or environment installed for Neoforge.
- Move the downloaded MariesLib file into your Minecraft
.minecraft/modsfolder and launch the game.
All Versions
+ Add VersionA big beta. Module boxes get a full look-and-feel overhaul, mods that run side by side get a lot of fixes, and several datapack and API features that never worked now do.
## ⚠️ Read before updating
- Beta.**
- Addon devs: some UI classes moved.** The layout editor, module settings, scale-config and toolbox systems left
marie-uiand now live in the new **marie-editor** module. If you use any of them, add the dependency. - Deprecated for removal:** the single-argument
registerExportResolver(ExportResolver). Use the overload that takes a registry key.
## Highlights
- Glow and Pulse tabs on every box:** text, border and bar glow with color and strength, plus a "breathing" border pulse (Smooth, Heartbeat or Flash) that stays in sync across boxes.
- More box styling:** background and border opacity and shade, border shadow, header size, and a one-click Reset This Module button.
- More Hide options:** Hide Window, Hide Text, Hide Bars and Hide Header, next to Hide Icons.
- Size snapping:** resizing a box can snap to the size of neighboring boxes.
- New Hub window:** a resizable popup with a sidebar, used by editors such as Nourished's Diet Screen editor.
- Redesigned color picker:** a round hue/saturation wheel, a brightness slider, saved favorites and hex entry.
## Fixed
- Multiple mods using MariesLib**
- Each mod now uses its own settings for decay, effects, tooltips, thresholds and tracking. Before, the most recently loaded mod's settings applied to all of them.
- Eating or using a source no longer counts value gains more than once when several mods are installed.
- A mod using default settings no longer makes other mods' tooltips and value guesses appear on every item.
- Respawning no longer wipes recent-source history for a mod set to keep values on death, and each mod resets to its own starting level.
- Item tooltips in single-player no longer show value info left over from the last multiplayer server you joined.
- Gameplay and tracking**
- Profiles, milestones and synergies added by mods no longer disappear after a second
/reload. - Daily, weekly and monthly trackers now reset when you sleep through the night or use
/time. Periods cut short by moving time backwards record when they actually ended. - Diminishing returns now count "free bites" correctly.
- Fixed full-screen black flashing on the HUD while eating.
- Datapacks and scripts**
tracking_profiles/*.jsonfiles now load. Before, they were always skipped.- Compat entries with bulk item-to-value mappings now apply those mappings.
- A runtime tooltip message override now replaces only the message it names, not the whole item's tooltip.
- Mod scans: two scanners with similar names no longer overwrite each other's cached results.
- Removed the unused
mod_compat.jsonloader that logged a missing-resource warning on every launch.
- Boxes and editor**
- Bar rows and legends now respect their own text, icon and bar size sliders and
- Recipe data can now contest keyword classifications**, not just append to them. Confidence is computed honestly over the combined keyword+recipe signal instead of being copied from the keyword match items with disagreeing names/recipes, which can now be flagged UNCERTAIN. Winner-changing overrides are opt-in per category via
contestable_values; with none configured (the shipped default), no classification winners change, only confidence/UNCERTAIN flags.
- Scanner-side recipe merge no longer silently drops contesting recipe mass. Expect the next scanner run to surface more multi-value/ambiguous items than before. This is intentional.
- New
RecipeInheritanceResolver.collectContributionswalks the *entire* recipe tree instead of stopping at the first confident match, the root cause fix for the "calzone" bug class.
CommunityTagResolutionStage's tag directory is now per-mod configurable instead of hardcoded.
compositeRatioThresholddefault raised (a stray secondary tag no longer silently attaches an unrelated category to an item).
SourceClassificationRegistryoverrides now actually reach
SourceRegistry(previously silently ignored) and now fully lock out competing tag/API registrations for that item instead of leaking through.
- New
caloriesfield onsource_classifications.json, with corrected precedence so classification no longer zeroes/miscalculates an item's calorie total.
### New UI subsystems
- Command Center**: pluggable sidebar+card dashboard for consumer mods, now drag/resizable with clipped/scrollable content and corrected rendering (blur order, sizing, translation key fixes).
- Notifications**: generic client-side toast stack above the XP bar with merge-by-key support.
- Scale Config panel**: replaces the old full-screen scale config; generic embeddable per-component text/padding adjustment.
- Edit Mode / Snap Registry**: generalized double-click edit mode and cross-mod magnetic-edge snapping for draggable HUD components.
- Color system**:
ColorKey/ColorDefinition/MarieColorslayer for defaults/overrides, pluswithOpacity/shadehelpers and a generic color-row config widget.
- New
dev.marie.framework.ui.api "facade package" consolidating all of the above's public entry points.
### Tracking & Sync
- New generic tracker/period-history framework (MarieTracking
) and parallel tracker-milestone system, both with datapack support. - Two-tier client sync for trackers (throttled dirty-flag sweep + full login snapshot) fixes previously stale client-side tracker reads.
- New generic config/registry sync API (MarieResourcesAPI
) so mods don't need to hand-roll their own sync payloads. - Client caches now correctly clear on disconnect (previously never happened at all).
### Breaking changes
- MarieNotifications
,MarieCommandCenter,EditModeCoordinatormoved todev.marie.framework.ui.api. Old import paths no longer exist.
- MarieAP
## Added
TooltipMessageRegistry/TooltipColorRegistry: configurable per-item and per-key tooltip colors and messages, with a two-tier override system (modpack config → datapack)ExcludedItemsRegistry: fully exclude specific items from tooltip/classification handlingCommunityTagResolutionStage/SuffixResolutionStage/KeywordResolutionStage: scanner signal logic extracted into a proper resolution-stage cascade- Recipe-inheritance scoring now falls back through component classification when direct tags/lookups come back empty
## Changed
SourceClassificationRegistryoverride folder layout reorganized (overrides/Overrides/,overrides/Read_Me/): migrates automatically- Recipe-inheritance scores now merge into already-tagged items instead of being skipped
- Several internal classes split for maintainability: no public API changes
DeathNutritionBehaviorrenamed toRespawnValueBehavior(old accessors deprecated, still functional)
## Fixed
SourceClassificationRegistryno longer crashes on malformed override entries: bad entries are now skipped and logged individually- Removed unreachable bundled README resources that could never actually load
- Removed dead-code
ExportResolverRegistry - Corrected
@ApiStatusvisibility tiers for several classes with real cross-mod consumers
Full details: [CHANGELOG.md](https://github.com/kgbcupcake/MariesLib/blob/main/CHANGELOG.md)
## Changes
- Improved source classification stability when resolving external or cached overrides
- Refined runtime classification tracing to better distinguish live inference vs cached results
- Improved robustness of recipe-based nutrient inheritance fallback behavior
- Internal pipeline adjustments for better handling of incomplete or non-standard recipe sources
## Internal / Technical
- Better separation between runtime inference and external classification overrides
- Improved trace clarity for resolver cache hits and misses
- Enhanced diagnostics output for unsupported recipe structures
This update expands MarieLib's tooling for both mod developers and modpack authors, with a new configuration validation framework, tag-audit system, improved developer commands, and several internal improvements to the classification pipeline.
## Highlights
### ✅ Configuration Validation Framework
Mods built on MarieLib can now register their own configuration validators.
New validation commands provide structured PASS / WARN / FAIL results with detailed findings, making it much easier to diagnose configuration issues without digging through log files.
Highlights include:
- ConfigValidator API
- ValidationResult / Finding API
- Per-mod validation runner
/\<modid> validate
### 🔍 Tag Audit Framework
MarieLib now includes a complete tag-audit system for developers.
Tag rules can inspect registered tags, identify inconsistencies, and generate suggested fixes automatically.
The framework includes:
- TagScanner
- TagRule API
- TagReport
- TagIssue
- TagFixSuggestion
This is intended to make maintaining large food registries significantly easier.
### 🛠 Developer Commands
Several new commands have been added for MarieLib-based mods.
/\<modid> validate
- Runs all registered configuration validators.
/\<modid> analyze <item>
- Produces a detailed classification trace for any food item.
/\<modid> set_all
- Sets every registered value for a player simultaneously.
These commands are designed to simplify debugging and balancing during development.
### 📈 API Improvements
New public APIs have been added for:
- Config validators
- Export resolvers
- Tag audit registration
- Source classification inspection
The RecipeInheritanceResolver has also been expanded to support pre-built recipe indexes for improved runtime performance.
### 🧹 Internal Improvements
- Improved scanner-spec loading
- Better command registration
- Additional export and tag-audit support
- Improved classification infrastructure
These changes primarily improve reliability and reduce unnecessary logging for consuming mods.
## Notes
Published artifact version: **0.1.1-beta.2**
As always, thanks to everyone testing MarieLib and providing feedback. Several improvements in this release were driven directly by real-world testing from the community.
### What's New
- Milestone system**: Cumulative intake milestones are fully operational. They track lifetime totals per value key, fire once per player, and can grant potion effects and/or vanilla advancements on completion. Define them via datapack JSON or KubeJS scripts.
- KubeJS**:
advancementIdsupport added toregisterMilestone().MarieEvents.milestoneTriggeredevent bridge added for reacting to completions in scripts.
- Export framework**: New
ExportResolver<T>API for consuming mods to export per-registry-entry data to editable JSON. Register withMarieAPI.registerExportResolver, then run:
/marieslib dump <resolverId>/marie dump <resolverId>
Output is written to
config/<modid>/<resolverId>_export.json.- Config validation**: New
ConfigValidatorAPI for consuming mods to validate their own config files on demand. Register withMarieAPI.registerConfigValidator, then run:
/marieslib validate <modid>/marie validate <modid>/<modid> validate
- Tag audit**: New tag-audit framework for consuming mods to register rules and scan tag data for issues. Register with
MarieAPI.registerTagRuleandMarieAPI.registerTagAuditContext, then run:
/marieslib audit_tags <modid>/marie audit_tags <modid>
Report is written to
config/<modid>/tag_audit_report.json.- Explicit bootstrap**: Consuming mods must now call
MariesLibBootstrap.attachorbootstrapexplicitly. MariesLib no longer auto-bootstraps whenMarieLibContextis unregistered.
### Fixed
- Bundled
scanner_spec.jsonnow loads from the consuming mod's jar instead of failing withBundled scanner_spec.json missing.
### Notes
- Requires explicit bootstrap wiring — see
MariesLibBootstrap.attach. - Nourished **0.2.6-beta.1+** is required to use the milestone system end-to-end.
- Toolkit commands (
scan,diagnostics,reload, etc.) remain under each consumer mod's namespace (e.g./nourished scan). Library-only commands (status,mods,api,registries,dump,validate,audit_tags) are on/mariesliband/marie.
## Added
- Added
MarieValueColors.resolvedDefaultArgb(String key) - Returns the true default ARGB value for a value key
- Checks
ValueDefinition.colorOverridefirst - Falls back to the built-in palette
- Ignores transient overrides when detecting actual customization
- Added per-value decay rate resolution:
IMarieLibConfig.decayRateFor(String valueKey)MarieLibContext.Builder.decayRateFor(Function<String, Float>)- Uses configured values when available
- Falls back to default decay rates
## Fixed
- Fixed ARGB parsing for
0x/0Xcolor values - Full ARGB literals now parse correctly
- Fixed value decay rates ignoring config overrides
- Consuming mods can now properly customize decay behavior
- Fixed decay display commands using hard-coded defaults
- Commands now show resolved configured decay rates
- Fixed API/KubeJS registered classifications being lost during reloads
- External classifications now survive tag reload passes
- Fixed missing translation names in
CriticalValueToast - Falls back to the raw value key instead of displaying translation paths
## Notes
- Published artifact version:
0.1.0-beta.5
SourceRegistryregistration logs dropped from INFO to DEBUG, no more per-item classification spam on every reload
- External classification cap warnings now log once per item per server session instead of repeating on every reload
## Datapack Support
- Effect definitions now parse correctly from datapacks: no more "not yet implemented" warnings
- _comment_* keys in datapack JSON are silently skipped: no false validation warnings
- Milestone definitions fully load from data/<namespace>/<modid>/milestones/<id>.json at datapack apply time
## Milestone System
- Cumulative intake now accumulates at runtime per player and per value key
- Milestones fire on first completion, grant mob effects, and award advancements
- MilestoneProgressData and MilestoneProgressAttachment persist cumulative intake and completion state across sessions and death
- generate_milestone_template command writes a starter milestone + advancement datapack to your world folder
## Colors
- MarieEvents.MilestoneTriggeredEvent: fired on milestone completion: getPlayer(), getMilestone(), getValueKey(), getCumulativeIntake()
- KubeJS milestoneTriggered — playerId, milestoneId, valueKey, cumulativeIntake, cumulativeGoal
## Fixes
- neoforge.mods.toml dependency entries corrected
- EMI / REI / JEI plugin registration
- Mod icon asset paths normalized
- Milestone progress attachment now correctly copies on death
- Configurable death respawn behavior for tracking bars (
preserve,reset_to_starting,vanilla_half) - Consuming mods can override death handling via
MarieLibContext - Initial bar fill now uses your mod's
startingValueFillconfig instead of a fixed 50%
### Changed
- Default death behavior is now **preserve** (bars kept on respawn)
- Several API types promoted to
@Stablefor addon authors - Admin value commands and KubeJS bindings use the shared value write pipeline
### Fixed
neoforge.mods.tomldependency entries- EMI / REI / JEI plugin registration
- Mod icon asset paths
First Stable Beta of the shared library powering Marie mods on **NeoForge 1.21.1**.
### Highlights
- Item scanner**: auto-classifies modded food and items with token stemming, recipe inheritance, and confidence validation; outputs tag recommendations and diagnostic reports
- Three-tier compat**: mod, addon, and modpack override layers via JSON without recompiling
- Player tracking**: memory windows, decay, diminishing returns, streaks, synergies, milestones, and threshold effects
- Classification traces**: inspect every pipeline stage and scoring decision for debugging
- Datapack support**: source classifications, compat entries, source families, and module locks
- Integrations**: KubeJS scripting, Cloth Config presets/import-export, JEI/REI/EMI tooltips
- Stable API**:
MarieAPIandMarieLibContextwith@Stable/@Experimentalmarkers
### Requirements
- Minecraft **1.21.1**
- NeoForge **21.1.x**
- Java **21**
### Note
MariesLib is **required as a separate install** alongside any Marie mod that depends on it. It is infrastructure, not standalone gameplay.