How ETA Works

ETA intercepts Minecraft’s text rendering pipeline via Mixin to add two separate surfaces for styled and animated text.

Surface A: inline markup

ETA tags work inside any text component that Minecraft renders on the client. This includes item names, lore, signs, written books, chat messages, and translation arguments. The hooks are LiteralContentsMixin (targeting PlainTextContents.LiteralContents) and TranslatableContentsMixin (targeting TranslatableContents), both injecting into the visit method that vanilla calls when walking a component tree for rendering. StringRenderOutputMixin (targeting Font$StringRenderOutput) then intercepts each glyph’s accept call to apply per-character effects.

Because the hooks sit inside the renderer, they fire for every surface that eventually calls through Font.drawString. No special API call or server-side change is needed to get markup in item names or signs.

Surface B: immersive messages

Immersive messages are HUD popups that exist outside the normal component tree. They’re created via the /eta send command or the ImmersiveMessage Java API and rendered directly to the overlay layer. Unlike inline markup, they carry their own duration, fade-in/out, anchor, offset, text scale, background, and message-level effects. These properties have no equivalent in inline markup.

When ETA processes a string of markup:

  1. MarkupParser.parse(markup) (for inline text) or MarkupParser.parseFull(markup) (for immersive messages) splits the input into a list of TextSpan objects. Each span holds a text fragment plus its style properties and an effect list.
  2. As the parser walks the tag stack it resolves nesting, applies attribute values, and attaches effect instances to each span.
  3. parseFull additionally strips [bracket] message tags from the string before span parsing and returns a ParseResult containing the spans, the extracted MessageEffect list, the MessageAttribute list, and the stripped markup string.
  4. At render time, StringRenderOutputMixin calls EffectApplicator for each character. Effects mutate the character’s position, color, alpha, or queue extra draw passes (neon glow, outline, etc.) through an EffectSettings object.
SurfaceInline markup tagsLayout and positioningMessage effects
Chat messagesyes
Item namesyes
Item loreyes
Signsyes
Written booksyes
Anvil renamesyes
Translation argumentsyes
Immersive HUD messagesyesyesyes

All inline surfaces go through the same mixin hooks; only immersive HUD messages have per-message layout controls and message-level effects.