-
Ember's Text API 3.0.1
StableAll checks were successfulPublish / Build Fabric 26.1 (push) Successful in 12m3sPublish / Build Fabric 1.21.1 (push) Successful in 13m50sPublish / Build Fabric 1.20.1 (push) Successful in 15m4sPublish / Build Fabric 26.2 (push) Successful in 13m33sPublish / Build NeoForge 1.21.1 (push) Successful in 16m10sPublish / Build NeoForge 26.2 (push) Successful in 14m18sPublish / Build NeoForge 26.1 (push) Successful in 16m17sPublish / Build Forge 1.20.1 (push) Successful in 6m48sPublish / Publish Fabric 1.21.1 (push) Successful in 32sPublish / Publish Fabric 26.2 (push) Successful in 32sPublish / Publish Fabric 26.1 (push) Successful in 32sPublish / Publish Fabric 1.20.1 (push) Successful in 33sPublish / Publish Forge 1.20.1 (push) Successful in 8sPublish / Publish NeoForge 26.2 (push) Successful in 9sPublish / Publish NeoForge 26.1 (push) Successful in 10sPublish / Publish NeoForge 1.21.1 (push) Successful in 8sPublish / Create Forgejo release (push) Successful in 9sPublish / Publish to Maven (Forgejo registry) (push) Successful in 15m42sPublish / Announce release in Discord (push) Successful in 4sreleased this
2026-07-04 22:59:56 -06:00 | 1 commits to master since this releaseDownloads
Pick the jar that matches your loader and Minecraft version. The same files are also on:
- Modrinth
- CurseForge
- Forgejo Maven (
net.tysontheember.emberstextapi:emberstextapi-<loader>-<mc>:3.0.1)
Changelog
- Fixed a dedicated-server crash when a command built an immersive message,
such as an FTB Quests command reward running/eta queue.ImmersiveMessage
carried its client-only rendering, so loading the class on a server threw
NoClassDefFoundError: MultiBufferSource. The rendering now lives in a
client-only holder, leaving the message data safe to load server-side. This
affected every loader and version; single-player was unaffected because the
client classes are present there. - Unwrapped text now honors hard line breaks. Without
wrapset, a\nin the
message rendered as a missing-glyph box instead of starting a new line; it now
breaks correctly whether or not wrapping is enabled.
Downloads
-
Source code (ZIP)
0 downloads
-
Source code (TAR.GZ)
0 downloads
-
Ember's Text API 3.0.0
StableAll checks were successfulPublish / Build Fabric 1.20.1 (push) Successful in 3m26sPublish / Build Fabric 1.21.1 (push) Successful in 4m11sPublish / Build Fabric 26.1 (push) Successful in 3m49sPublish / Build Fabric 26.2 (push) Successful in 3m19sPublish / Build NeoForge 1.21.1 (push) Successful in 5m38sPublish / Build NeoForge 26.1 (push) Successful in 4m9sPublish / Build NeoForge 26.2 (push) Successful in 4m5sPublish / Build Forge 1.20.1 (push) Successful in 3m15sPublish / Publish Fabric 1.20.1 (push) Successful in 9sPublish / Publish Fabric 1.21.1 (push) Successful in 6sPublish / Publish Fabric 26.1 (push) Successful in 7sPublish / Publish Fabric 26.2 (push) Successful in 7sPublish / Publish Forge 1.20.1 (push) Successful in 8sPublish / Publish NeoForge 1.21.1 (push) Successful in 7sPublish / Publish NeoForge 26.1 (push) Successful in 7sPublish / Publish NeoForge 26.2 (push) Successful in 6sPublish / Create Forgejo release (push) Successful in 8sPublish / Publish to Maven (Forgejo registry) (push) Successful in 15m5sPublish / Announce release in Discord (push) Successful in 4sreleased this
2026-06-21 22:45:37 -06:00 | 5 commits to master since this releaseDownloads
Pick the jar that matches your loader and Minecraft version. The same files are also on:
- Modrinth
- CurseForge
- Forgejo Maven (
net.tysontheember.emberstextapi:emberstextapi-<loader>-<mc>:3.0.0)
Changelog
- NeoForge and Fabric support for MC 26.1.x and 26.2, including the neon glow
and SDF text pipeline ported to 26.2's new bind-group render API. The FTB
Quests and Emojiful integrations are not present on 26.2. - FTB Quests composer: an ETA button on the quest text editor opens a composer
with effect and preset pickers, a font picker, per-parameter controls, and a
live preview that writes the composed markup back into the editor. Available
on 1.20.1, 1.21.1, and 26.1. - Effect parameters reworked for consistent naming with multiple accepted
aliases per parameter. Gradient and rainbow gained an angle; rainbow gained
length, saturation, and brightness; neon gained flicker controls. <shadow>is now independent of the host text's drop shadow, so it renders
even where the host draws without one (such as FTB Quests titles), and an
explicit shadow color is no longer dimmed.- Twemoji coexistence: Twemoji's emoji render alongside ETA markup.
- Lang tag
argsnow supports escaping commas with a backslash so a single
argument can contain commas:<lang key='commands.give.success.single' args='$9\,000'>passes$9,000as one argument. A literal backslash is
written\\. - Emojiful compat: text effects now apply to chat messages on Forge 1.20.1.
The render hook targeted the dev-mapped method name, which silently no-ops
against the SRG-named build that ships in production. The integration also
reads Emojiful's renderer state through accessor mixins instead of
reflection.
Downloads
-
Source code (ZIP)
0 downloads
-
Source code (TAR.GZ)
0 downloads
-
Ember's Text API 3.0.0-beta.2
Pre-releaseSome checks failedPublish / Build Fabric 1.20.1 (push) Has been cancelledPublish / Build Fabric 1.21.1 (push) Has been cancelledPublish / Build Fabric 26.1 (push) Has been cancelledPublish / Build NeoForge 1.21.1 (push) Has been cancelledPublish / Build NeoForge 26.1 (push) Has been cancelledPublish / Build Forge 1.20.1 (push) Has been cancelledPublish / Publish Fabric 1.20.1 (push) Has been cancelledPublish / Publish Fabric 1.21.1 (push) Has been cancelledPublish / Publish Fabric 26.1 (push) Has been cancelledPublish / Publish Forge 1.20.1 (push) Has been cancelledPublish / Publish NeoForge 1.21.1 (push) Has been cancelledPublish / Publish NeoForge 26.1 (push) Has been cancelledPublish / Publish to Maven (Forgejo registry) (push) Has been cancelledPublish / Create Forgejo release (push) Has been cancelledPublish / Announce release in Discord (push) Has been cancelledreleased this
2026-06-11 22:08:41 -06:00 | 50 commits to master since this releaseDownloads
Pick the jar that matches your loader and Minecraft version. The same files are also on:
- Modrinth
- CurseForge
- Forgejo Maven (
net.tysontheember.emberstextapi:emberstextapi-<loader>-<mc>:3.0.0-beta.2)
Changelog
Neon glow
- New
gloweffect (aliasneon) renders an SDF-based halo around glyphs:
<glow>,<glow radius=4 intensity=1.5 color=#00ffcc>,
<glow softness=0 core=0.6>for a sharp neon-tube look,freqfor pulsing.
When no color is given the halo picks up each glyph's final color, so
<glow><rainbow>animates the halo with the text. - Glow color resolves per glyph at emit time. Replaces
NeonEffect— the
neonmarkup name still works and now maps to the new effect. - Per-version render paths: core shaders on 1.21.1, the new render-pipeline
API on 26.1, and a bitmap-only runtime SDF path on 1.20.1 (no FreeType
required at runtime). - Glow distance fields bake off the render thread with a per-frame budget;
the atlas uploads only changed slots. Drop shadows are suppressed on
glowing glyphs so halos don't double-darken.
MSDF font pipeline
- Pre-baked MSDF glyphs now persist to disk on all versions — fonts skip the
bake cost on every launch after the first. - SDF providers attach once per resource reload; fixed the glyph baseline on
1.20.1. - Forge 1.20.1 embeds the FreeType natives in the
-alljar and fails the
binding probe cleanly on servers without them.
KubeJS integration (NeoForge 1.21.1)
- New
EmbersTextbinding for scripts: send/queue immersive messages, manage
HUD elements, and style item names and tooltips. - New
EmbersTextEvents.itemTooltipclient event for per-stack tooltip
styling from scripts.
Version parity
- Item-name styling and the
EmbersTextFacadeentry point now ship on every
loader/version target, and the item-name mixin is correctly registered on
NeoForge 26.1. - FTB Quests view tracking ported to 26.1.
- Emojiful compat (1.20.1/1.21.1): effect shadows are dimmed and glow emits
in the Emojiful render path. Not yet available on 26.1. - Obfuscate reveal/hide order is now computed relative to the span start on
1.20.1/1.21.1, matching 26.1 — spans that start mid-text reveal correctly. - Immersive overlay messages now attach span effect data (effect list,
typewriter track, obfuscate keys) to their component styles, so typewriter,
obfuscate reveal/random, scroll, and shadow animate in overlays the same way
they do in chat. The per-char render tier is gated against re-applying
style-carried effects (26.1 covers this with its existing render bypass).
Performance
- Eliminated multiple per-frame allocation and draw-call hot spots in the message
renderer. Stress-test FPS at 50 concurrent messages on NeoForge 26.1 improved
from ~70 to ~1500+ against a ~2000 FPS baseline. EffectApplicator.applyEffectsno longer recursively applies sibling-spawning
effects onto siblings they just created — those level-2 grandchildren never
render. NewEffect#spawnsSiblings()opt-out lets sibling-spawning effects
skip the redundant pass.ImmersiveMessage.buildComponentFromSpanscaches its output keyed on the
typewriter index snapshot.- Per-codepoint glyph width and
FormattedCharSequencenow cached per
(font, codepoint, bold)on each message. - Effects can opt out of per-char dispatch via
Effect#requiresPerChar().
TypewriterEffectopts out whencursor=false— its cropping is already
handled at the component layer. GuiGraphics.drawManagedwraps message rendering on 1.21.1/1.20.1 to collapse
per-text-call buffer flushes (not applicable on 26.1's queued render model).- Background border drawing replaced per-pixel
fillloops with single rotated
fillGradientcalls per strip. Top/bottom borders use a 90° pose rotation so
vanilla's vertical gradient becomes a smooth GPU-interpolated horizontal one. fillHorizontalGradient(multi-stop background fill) uses the same rotation
trick — N-stop gradient renders as N-1 rotated calls per strip instead of one
fill per pixel.
Background gradient extensions
[bg gradient=a,b,c,...]markup now accepts any number of stops (previously
capped at 2).[bg border=a,b,c,...]markup adds N-stop border gradient support. Side
borders use the first and last stops so corners blend cleanly with the N-stop
top/bottom edges.- New
ImmersiveMessage.borderGradient(ImmersiveColor... stops)varargs API.
The existing 2-arg overload continues to work unchanged.
Effect system unification
- Fade is now a
MessageEffectunder the hood.fadeInTicks/fadeOutTicksbuilders
construct and addFadeInMessageEffect/FadeOutMessageEffectto the message's
effect list. The parallel field-based fade state onImmersiveMessageis gone. - New effect names available in markup and
MessageEffectRegistry:fadein,fadeout. MessageEffect#target()(defaultEffectTarget.TEXT) controls whether the effect's
pose transform scopes to text, background, or both.- New
AlphaContributorsub-interface lets effects contribute to a per-frame alpha
multiplier shared by text and background.FadeInMessageEffectand
FadeOutMessageEffectimplement it.
Slide effect background option
<slide>now accepts atargetparam (text,background,all). Default is
all, which slides text and background together. The previous beta.1 behavior of
sliding text only matchestarget=text.
Metadata
- Loader metadata now declares the EML licence (was incorrectly GPL-3.0) and
the licence text is embedded in every jar.
Breaking changes from 3.0.0-beta.1
ImmersiveMessageconstructor,builder,fromMarkup,fromSpans,getDuration,
andsetDurationnow take/returnintticks instead offloat. The internal field
remainsfloatfor partial-tick interpolation.ImmersiveMessage.typewriter(float, boolean),.typewriter(float),
.typewriterCentered(float), and.obfuscate(ObfuscateMode, float)are removed.
Use<type>/<obfuscate>markup, or set typewriter/obfuscate at the span level
viaTextSpan.typewriter(float)/.typewriterCentered(float)/.obfuscate(...).TextSpan.typewriter(float speed, boolean center)is removed. Use
TextSpan.typewriter(float speed)orTextSpan.typewriterCentered(float speed).ImmersiveMessageno longer exposes publicfadeInTicks/fadeOutTicks/
typewriter*/obfuscate*fields.fadeInTicks/fadeOutTicksbuilders still
work and now construct effects; reflection-based consumers must read from
getMessageEffects().- NBT key
"Duration"is now stored asIntTag(previouslyFloatTag). NBT saved by
3.0.0-beta.1will not load. - NBT: legacy
fadeIn,fadeOut,Typewriter,TypewriterSpeed,TypewriterCenter,
ObfuscateMode,ObfuscateSpeedkeys are no longer read or written. Fade state
lives in the existingMessageEffectslist (e.g."fadein t=20"); typewriter and
obfuscate live onTextSpanor come from markup. - S2C message wire format encodes duration as
VarInt(previouslyFloat), the
legacy fade/typewriter/obfuscate per-feature fields are gone from the payload, and
the payload gained a trailing(boolean, VarInt, int[])block for
borderGradientStops. The effects list is the sole carrier for fade.
3.0.0-beta.1clients/servers are incompatible. - NBT gained an optional
BorderGradientlist. Saves without the key load
unchanged. - Default
<slide>behavior changed from text-only to text+background. Pass
target=textin markup, or constructSlideMessageEffectwith that param, to
restore the old shape.
Downloads
-
Source code (ZIP)
1 download
-
Source code (TAR.GZ)
1 download
-
Ember's Text API 3.0.0-beta.1
Pre-releaseSome checks failedPublish / Publish Fabric 1.20.1 (push) Has been cancelledPublish / Publish Fabric 1.21.1 (push) Has been cancelledPublish / Publish Fabric 26.1 (push) Has been cancelledPublish / Publish NeoForge 1.21.1 (push) Has been cancelledPublish / Publish NeoForge 26.1 (push) Has been cancelledPublish / Publish Forge 1.20.1 (push) Has been cancelledPublish / Publish to Maven (Forgejo registry) (push) Has been cancelledPublish / Announce release in Discord (push) Has been cancelledreleased this
2026-05-23 00:33:06 -06:00 | 153 commits to master since this releaseDownloads
Pick the jar that matches your loader and Minecraft version. The same files are also on:
- Modrinth
- CurseForge
- Forgejo Maven (
net.tysontheember.emberstextapi:emberstextapi-<loader>-<mc>:3.0.0-beta.1)
Changelog
Changed
- Replaced the config system. Options are now defined by a single schema split
into two files:emberstextapi-client.toml/.json(per-client: which effects
render, performance) andemberstextapi-server.toml/.json(authoritative:
player markup permissions, message limits, anvil rename length). The old
emberstextapi-common.toml,emberstextapi-client.toml(old layout) and
emberstextapi.jsonare no longer read — settings must be re-applied in the
new files, which generate with defaults on first run. - Player markup access is now permission-gated.
playerMarkup.modeisALL,
PERMISSION(nodesemberstextapi.markup.use,.effect.<name>,
.category.<cat>,.bypass, with an OP-level fallback), orNONE. Effects
can be allowed/denied per-effect or per-category for both the client render
gate and the server markup gate. LuckPerms and FTB Ranks back the permission
nodes automatically. - Unified effect parameter naming across visual, message, and animation effects.
Every public param now has a canonical fully-spelled name and a short alias
(e.g.,amplitude/amp,frequency/freq,duration/dur). Old ad-hoc
shorts (a/f/w, etc.) no longer work — see
docs/superpowers/specs/2026-05-18-effect-parameter-refinement-design.md
for the full rename table. - Effects now declare params via
ParamSchema; unknown params log a warning
instead of being silently ignored. obfuscate'sspeedis renamed tointerval(ms per step).shatter'sspeedis renamed toduration(animation length in seconds).matrix'sresolveis renamed toduration.vibrate'sintensityis renamed toamplitude;speedtofrequency.breathe'samountis renamed toamplitude;speedtofrequency.circle'sais renamed toradius(the param was always a radius, not an
amplitude).drift'srx/ryare renamed toamplitudeX/amplitudeY.gradient'sspanis renamed tolength;speedtofrequency.fade'sais renamed tominAlpha.neon'sp/fare renamed tofrequency/falloff;ctocolor.RainbowEffect.getName()now returns"rainbow"(was"rainb").GradientEffect.getName()now returns"gradient"(was"grad").TurbulenceEffect.getName()now returns"turbulence"(was"turb").PendulumEffect.getName()now returns"pendulum"(was"pend").typewriter'scursorparam is now boolean-only; usecursorCharto set
the glyph. Thecursor=<char>overload is dropped.
Added
- Seven new immersive-message motion effects:
grow(continuous scale
oscillation),slam(one-shot drop-in with damped bounces),float
(slow sinusoidal drift),drift(independent X/Y wander),vibrate
(high-frequency jitter),spin(full Z-axis rotation), andslide
(one-shot slide-in or slide-out from any screen edge). All compose with
the existingrock/breatheeffects and with each other. slideaccepts aneasingparam:linear,easeInCubic,easeOutCubic,
easeInOutCubic. Defaults match prior behavior (easeOutCubicfor
mode=in,easeInCubicformode=out).- Three per-character message effects:
drip(characters fall and trail
downward in staggered order),shatter(characters fragment outward at a
configurable trigger time), andmatrix(characters scramble via random
glyph cycling then resolve in stagger order). outlinespan effect: renders a stroked outline around glyphs using a
second SDF draw pass with a configurable color (c) and width (w).
Requires an SDF font; logs a warning and skips the outline draw on vanilla
fonts.- Per-character effect dispatch:
MessageEffectimplementations can opt in
viaperCharacter()to receive anapplyToCharcall for each rendered
glyph, enabling effects that vary per character. Existing whole-message
effects are unaffected. [sound ...]message effect plays a Minecraft sound at a configurable time
offset (at), volume, and pitch. Built-in presets (click,whoosh,
static,magic,pop,thud,shatter) map to vanilla sound ids;
any resource location works as well.drip,shatter,matrix, and
slameach accept an inlinesoundparam that fires on their respective
key moment (first drip, shatter trigger, matrix resolve, slam land).- ETA markup inside
Component.translatablestring arguments now renders.
<...>tags in arguments passed totranslatable(key, args...)are
parsed by the existing markup pipeline instead of being forwarded as
literal strings. EffectRegistry.getSchema(name)andMessageEffectRegistry.getSchema(name)
return theParamSchemafor an effect, enabling introspection and doc
tooling.- The server syncs each player's effective markup policy on join; the client
caches it for accurate previews and feedback. /emberstextapi reloadreloads config from disk and re-syncs policy to
online players;/emberstextapi policy [player]prints a player's resolved
markup policy.- MSDF font rendering now works on MC 26.1 (NeoForge and Fabric); pipelines
are registered against the 26.1 RenderPipelines API.
Downloads
-
Source code (ZIP)
3 downloads
-
Source code (TAR.GZ)
1 download