Lattice
0.8.9A Java 21 shared runtime and framework for structured Paper/Folia plugin development.
0.8.9latestLattice 0.8.9Jul 2, 2026 Lattice 0.8.9 - Testability, Diagnostic Clarity, and Release Docs
Added
-PaperDiagnosticContributorsnapshot detail keys are now documented in Javadoc:plugin,version,dataFolder,enabled,currentThread. Plugin authors reading the contributor class directly can see the snapshot shape without consulting the source. -PaperIntegrationBootstrap.failureMessage(Throwable)andfailureDetails(Throwable)are nowstaticpackage-private so the formatting contract can be locked by a unit test without going through the reflective bridges. -PaperDiagnosticContributor.detailsFor(Path, String, String, boolean)is now a package-private helper, parameter-validated, so the snapshot detail-map shape is unit-testable without instantiatingJavaPlugin(whose constructor is unsupported outside the Bukkit loader). -PaperIntegrationBootstrapFailureLoggingTestlocks the failure-logging contract for the 7 reflective integration bootstrap paths. -PaperDiagnosticContributorTestlocks thecurrentThreadsnapshot detail so it cannot accidentally drift to a hardcoded value.Changed
-PaperDiagnosticContributor.detailsFor(...)parameter order is now(Path dataFolder, String pluginName, String pluginVersion, boolean enabled). ThePathis first to visually break up two adjacentStringparameters of different meaning and remove a call-site transposition footgun. The sole caller (snapshot()) was updated to match. Observable output (the snapshot detail map keys and values) is unchanged. -docs/api-guide.md#diagnosticsnow spells out the snapshot detail keys for thepapercontributor plus the integrationdetailsmap shape (reason/messagefor failures,apiClass/versionfor anAVAILABLEPacketEventsbinding). -docs/build-and-release.mdclarifies that bothGitHub ReleaseandModrinth Releaseworkflows auto-trigger on push events matchingv*tag patterns. A normalgit push origin v<version>therefore publishes to Maven Central, the GitHub Packages mirror, GitHub Release, and Modrinth in parallel. Manualgh workflow run "Modrinth Release"is reserved for recovery; the workflow already performs its own idempotency check against the Modrinth API before publishing. -PaperIntegrationBootstrapFailureLoggingTest.failureDetailsMapIsImmutablenow usesassertThrows(UnsupportedOperationException.class, ...)to actually verify theMap.ofimmutability claim (replaced a previouscontainsKeytautology).Fixed
- A transposition footgun inPaperDiagnosticContributor.detailsFor(...): the previous(String, String, Path, boolean)parameter list placed two strings of different meaning adjacent to each other. Reorder eliminates this hazard without changing observable behavior.Compatibility
- No plugin authoring API changes. - No stable@StableApitypes were modified. - No new transitive dependencies. - Tests are new additions only; no existing tests were changed or removed. -failureDetailsandfailureMessagewere previouslyprivate staticand remain@InternalApi; they are nowstaticpackage-private to satisfy the same internal-only contract.Still Experimental (no change in status)
-dev.beryl.lattice.update-dev.beryl.lattice.hook-dev.beryl.lattice.templateand annotation processors0.8.8Lattice 0.8.8Jul 2, 2026 Lattice 0.8.8 - Integration Failure Surfacing And Diagnostics Cleanup
Added
-PaperDiagnosticContributor.snapshot()now includes the current JVM thread name as acurrentThreaddiagnostic detail. This makes it easier to verify Folia scheduler context when inspecting a runtime snapshot through diagnostics. - Reflective integration bootstrap failures now consistently surface the offending exception class and message throughSimpleIntegration.failed(...)details. Diagnostics commands can read the samereasonandmessagekeys for every optional integration (previously onlyPacketEventsexposed them).Changed
-PaperIntegrationBootstrapfailure logging is now a concise single-line warning per integration instead of a full reflective stack trace. The exception class and message are still preserved in thedetailsmap on the returnedSimpleIntegrationso diagnostics remain rich. -PaperDiagnosticContributor.snapshot()entries are still keyed by their original ordering;currentThreadis appended afterenabled.Fixed
- Inconsistent diagnostic detail population for failed reflective integrations:Junction,PlaceholderAPI,Nexo,Oraxen,ItemsAdder, andCraftEnginebootstrap failures now reportreasonandmessageconsistently withPacketEvents.Compatibility
- No plugin authoring API changes. - No stable@StableApitypes were modified. - No new transitive dependencies. - Server owners who relied on full reflective stack traces in plugin logs see a single-line summary instead; the underlying exception class and message are still available through the diagnostic snapshot for anyIntegrationwithFAILEDstatus.Still Experimental (no change in status)
-dev.beryl.lattice.update-dev.beryl.lattice.hook-dev.beryl.lattice.templateand annotation processors0.8.7Lattice 0.8.7Jun 13, 2026 Lattice 0.8.7 - Folia Thread-Safety Hardening
Fixed
Critical (AsyncCatcher Errors)
- [CRITICAL] FixedPaperTaskService.scheduleEntity()thread validation - Added thread ownership validation before entity access - Prevents unsafe entity lookups from async contexts - UsesReentrantLockfor better granularity - [CRITICAL] Fixed race conditions in UI event handlers - SynchronizedonInventoryClick()withReentrantLock- SynchronizedonPrepareAnvil()withReentrantLock- Addedclosed()checks to prevent operations on closed sessions - [CRITICAL] Fixed block/player access in text input renderers - ProtectedgetBlock()calls inPaperVirtualSignTextInputRenderer.restore()- ProtectedgetLocation()calls in both virtual sign and anvil renderers - Prevents AsyncCatcher errors during text input UI operations - [CRITICAL] Fixed PacketEvents callback thread safety - WrappedPacketEventslisteners to execute in global region scheduler - Prevents unsafe operations from packet threadImportant (Race Conditions)
- [IMPORTANT] Added volatile modifiers toPaperTextInputUiSession-completed,anvilView,signPosition,signLocationare now volatile - Ensures visibility across event handler and scheduler threads - [IMPORTANT] SynchronizedhandleVirtualSignChange()withReentrantLock- Prevents race condition with concurrent session removal - [IMPORTANT] SynchronizedPaperInventorySurfaceRenderer.render()page access - Copies button list atomically to avoid concurrent modification - PreventsIndexOutOfBoundsException- [IMPORTANT] SynchronizedrunOnPlayer()ownership check - Prevents race condition between region ownership check and schedule - [IMPORTANT] Added thread-safety documentation to PlaceholderAPI integrations - Documents that handlers are called from arbitrary threads - Lists unsafe and safe operationsMinor (Edge Cases)
- Improved lock granularity insession(Inventory)lookup - Prevented double registration inregisterRefreshEvent()0.8.6Lattice 0.8.6Jun 11, 2026 Added
- Added direct standalone host contract coverage for managed plugin registration, duplicate registration protection, handle detach, host diagnostics, reverse-order shutdown, and shared storage cleanup. - Added an experimentalUpdateServicefor GitHub release checks, typed update results, release assets, and explicit jar install requests. - AddedPaperUpdateInstallerso Paper plugins can implement confirmed update commands that back up the old jar intoLattice/Old, replace the plugin jar, and prompt for a server restart.Changed
- Standalone host shutdown now disables all managed plugin runtimes in reverse registration order even when one dependent plugin fails during disable. - Standalone host close now continues through managed plugin disable, shared storage pool close, and handle cleanup before rethrowing a collected shutdown failure. - The standalone Lattice plugin shutdown path now continues through managed plugin disable, host runtime disable, Bukkit service unregister, and host close before rethrowing a collected shutdown failure. -LatticeRuntime#disable()now closes registered services and cancels tasks even when called before the runtime has loaded. - The standalone Lattice plugin now performs a best-effort startup check for newer Lattice GitHub releases and stays silent when it is already current. - Public docs now describe the shared runtime host lifecycle, dependent plugin detach behavior, and thedisable()beforeload()cleanup guarantee. - Public docs now include update-check and confirmed-install examples for plugin-owned admin commands.Fixed
- A failed dependent plugin disable no longer prevents later managed plugins from being disabled during standalone host shutdown. - Shared JDBC pools are now closed during standalone host close even if a managed plugin fails while disabling. - Hosted plugin handles are now detached when a newly created runtime is disabled before it has loaded. - The runtime lifecycle docs no longer duplicate theenable()lifecycle step.Compatibility
- ExistingLatticeHost,LatticePluginHandle, andLatticeRuntimemethod signatures are unchanged. - Dependent plugins usingLatticePaperPluginorLatticePaper.bootstrap(...)do not need code changes. - Shutdown failures are still surfaced to the caller, but cleanup now continues before the failure is rethrown. - Update installs are opt-in and must be triggered by plugin code; no dependent plugin jar is replaced automatically.0.8.5Lattice 0.8.5Jun 10, 2026 Added
- Added optional lifecycle failure context onLifecycleException, including runtime id, phase, failed operation, and module id when available. - Added structured startup report entries while keeping the existing string-based startup event list. - Added optional config failure context onConfigException, including config path and operation when Lattice can identify them. - Added lifecycle diagnostics details for failed runtime operations, including event count, failed operation, module id, and failure message.Changed
- Module lifecycle callback failures now preserve module id and operation context across load, enable, ready, and disable paths. - YAML config load, parse, render, defaults, deserialize, validate, migrate, serialize, save, and update validation failures now use context-awareConfigExceptionreporting. - Public diagnostics and getting-started docs now describe how plugin-owned logging and diagnostics commands can surface lifecycle and config context.Fixed
- Lifecycle diagnostics no longer report a failure finding for a fresh runtime that has not started. - Lifecycle diagnostics now keep an error status when a failed lifecycle entry remains after a later phase transition. - Disable failures now use lifecycle-neutral diagnostic wording instead of startup-specific wording.Compatibility
- ExistingLifecycleExceptionandConfigExceptionconstructors remain supported. - ExistingStartupReport#events()callers continue to receive the legacy string event list. - Structured startup report write helpers remain runtime-owned and are not exposed as stable plugin authoring API.0.8.4Lattice 0.8.4Jun 10, 2026 Added
- AddedConfiguredUiExceptionfor configured inventory authoring failures, including a stablepath()accessor and contextual messages. - Added configured inventory authoring documentation with a YAML-style menu example, fallback icons, configured actions, and resolver ownership guidance.Changed
-ConfiguredInventoryUiCompilernow reports invalid configured UI input with screen, page, button, icon, fallback, and action context. - Configured UI resolver and text rendering failures are wrapped with configured UI paths so plugin authors can report actionable admin-facing errors. -Lattice.VERSIONis generated from the GradlelatticeVersionused by the build instead of being maintained as a separate Java literal. - The GitHub Release workflow now supports stable0.8.xreleases as latest releases, recovery switches for publication steps, and tag-pinned reruns for existing release updates.Fixed
- Maven CentralPUBLISHINGvalidation timeouts no longer prevent the workflow from continuing to mirror publication and GitHub Release creation. - GitHub Release notes now only claim GitHub Packages mirror publication when the mirror publish step succeeds. - Existing GitHub Release refreshes now refuse to upload assets built from a commit that does not match the release tag. - Generated version sources are now wired into source jar task dependencies.Compatibility
-ConfiguredUiExceptionextendsIllegalArgumentException, so existing callers that catch authoring failures through the previous exception type continue to work. - Existing configured inventory defaults are preserved, including default rows for non-positive row counts and default icon amount for non-positive amounts. -ConfiguredUiActionremains a lightweighttype + datadeclaration. Plugins still own action resolution throughConfiguredUiActionResolver.0.8.3Lattice 0.8.3Jun 10, 2026 Added
- AddedCommandExceptionMappersas the reusable default command failure mapper for plugins that build command registration manually. - AddedLatticeRuntime.COMMAND_EXCEPTION_MAPPERso Paper plugins can customize command failure wording through the runtime service model. - Added explicitLatticeBuilderhelpers for default service registration, intentional service replacement, and service lookup during bootstrap. - Added standalone descriptor coverage to keep the Paper release jar dependency list intentional.Changed
- TypedLatticeBuilderservice helpers now provide defaults only when a service has not already been supplied. - Paper bootstrap now creates the default command registrar after plugin customization and passes the configured command exception mapper into it. - The standalone Paper descriptor no longer declares Junction as an optional dependency; Junction remains available through reflective integration detection when present. - Public authoring docs now spell out service customization, command feedback ownership, command help ownership, and optional integration checks.Fixed
- Supplying a customCOMMAND_SERVICEno longer constructs the default Paper command registrar or registers its lifecycle handler as a side effect. - The standalone descriptor test now fails on accidental optional dependency additions, not just missing expected dependencies.Compatibility
- Existing strictLatticeBuilder#service(key, service)behavior is unchanged. - Plugin code that intentionally replaces a service should usereplaceService(key, service). - Plugin code that only needs custom command failure text should prefercommandExceptionMapper(...)instead of replacing the full command service. - Plugins using Junction integration should checkPaperIntegrations.JUNCTION_VARIABLES; declare a plugin dependency only when their own load order requires Junction.0.8.2Lattice 0.8.2Jun 1, 2026 Added
- Added typed PacketEvents listener registration with Lattice-owned unregister handles, listener priority, packet event wrappers, and a safe API handle for version-specific access. - Added command argument builders for custom parsers, completions, and greedy final string arguments. - Added command help entries for flattened command-tree diagnostics and plugin-owned help commands. - Added integration detail metadata, hook diagnostics, command-tree diagnostics, and isolated-mode active JDBC health reporting. - Added README examples of public plugins built on Lattice: Tabular, Junction, and Onboard.Changed
- PacketEvents binding now reports API class/version details when available. - Runtime diagnostics now include hooks and richer integration, command, and storage details. -DefaultIntegrationManagerclosesAutoCloseableintegration services during runtime shutdown.Fixed
- PacketEvents bootstrap now catches linkage failures in the same defensive style as PlaceholderAPI. - Isolated storage diagnostics now report active JDBC connection health instead of only registered providers.Compatibility
- Existingnew CommandArgument<>(name, type, required)calls continue to work. - Existingnew CommandDiagnostics(name, aliases, description, permission)calls continue to work. - ExistingPacketEventsService#api()callers continue to work; new code should preferapiHandle()and typed listener registration.0.8.1Lattice 0.8.1May 27, 2026 Changed
- Added Maven Central publishing forlattice-api,lattice-core, andlattice-paper. - Kept GitHub Packages as a permanent Maven mirror for the same artifacts. - Updated developer documentation to use Maven Central as the default dependency source. - Added Apache-2.0 project licensing metadata for Maven Central publication.Compatibility
- Maven Central coordinates are nowio.github.hydr46605:lattice-api,io.github.hydr46605:lattice-core, andio.github.hydr46605:lattice-paper. - GitHub Packages keeps the originaldev.berylcoordinates as an authenticated mirror. - Existing GitHub Packages consumers can keep using the authenticated GitHub Packages repository.0.8.0Lattice 0.8.0May 27, 2026 Added
- Added thelattice-apiartifact as the first small shared API boundary for the 1.0 runtime split. - Added a standalone Lattice host service that dependent plugins can discover through Paper services. - Added shared JDBC pool management for the standalone runtime, with ref-counted HikariCP pools and storage diagnostics.Changed
- Prefer the standalone shared-runtime deployment model for new Paper/Folia plugins. - Keep legacy shaded library usage available as isolated mode for self-contained plugin jars. - Updated GitHub release automation to attachlattice-apiartifacts. - Added explicit Modrinth workflow checks for the project id and token.Compatibility
- Existing shaded plugins can keep usingLatticePaperPluginin isolated mode. - Shared-runtime plugins should install the standaloneLatticeplugin, compile against Lattice without relocation, and declare a hard Paper dependency withjoin-classpath: true.0.7.2Lattice 0.7.2May 19, 2026 Fixed
- Made the Paper bootstrap resilient when Paper reachesonEnable()before a Lattice runtime was created inonLoad(). - Deferred Paper UI listener registration until the plugin is enabled, avoidingIllegalPluginAccessExceptionduring plugin loading. - Regenerated the standalone plugin descriptor when the Lattice version changes so the packaged Paper metadata stays accurate.Compatibility
- No plugin authoring API changes are required. - Existing plugins extendingLatticePaperPluginkeep the same entrypoint shape.0.7.1Lattice 0.7.1May 16, 2026 No changelog was specified.
Similar projects
Plugin →VeinMiner
Mine the whole vein on mining a single ore/block. Make the tedious mining experience to something satisfying and fun! FTB Ultimine alternative
99.3MSueta
Simple Voice Chat
A working voice chat in Minecraft!
76.8MSueta
Let Me Despawn
Improves performance by tweaking mob despawn rules. Say bye to pesky unintentional persistent mobs.
25MSueta
Chunky
Pre-generates chunks, quickly and efficiently
18.4MSueta
VeinMiner Enchantment
Veinminer Addon - Adds vineminer enchantment to enchanting tables. Only tools with the enchantment can veinmine
18MSueta
JourneyMap
Real-time map used for mapping in-game or your browser as you explore.
14.7MSueta