Text rendering and styling API with effects, animations, and custom font support https://tysontheember.dev/embers-text-api/intro/
  • Java 99.4%
  • GLSL 0.6%
Find a file
2026-05-22 02:52:41 -06:00
.forgejo/workflows ci: use dedicated MAVEN_PUBLISH_TOKEN for Forgejo Maven publish (GITHUB_TOKEN got 401) 2026-05-22 02:52:41 -06:00
.github/ISSUE_TEMPLATE ci: port publish workflow to Forgejo Actions 2026-05-22 02:17:54 -06:00
common-1.20.1 fix(sdf): mark SDFGlyphProvider.closed volatile for cross-thread visibility 2026-05-12 15:10:39 -06:00
common-1.21.1 fix(sdf): mark SDFGlyphProvider.closed volatile for cross-thread visibility 2026-05-12 15:10:39 -06:00
common-26.1 fix(sdf): mark SDFGlyphProvider.closed volatile for cross-thread visibility 2026-05-12 15:10:39 -06:00
fabric-1.20.1 build: add Forgejo Maven publish repository 2026-05-22 02:16:27 -06:00
fabric-1.21.1 build: add Forgejo Maven publish repository 2026-05-22 02:16:27 -06:00
fabric-26.1 build: add Forgejo Maven publish repository 2026-05-22 02:16:27 -06:00
forge-1.20.1 build: add Forgejo Maven publish repository 2026-05-22 02:16:27 -06:00
gradle/wrapper v3 2026-05-07 16:40:16 -06:00
neoforge-1.21.1 build: add Forgejo Maven publish repository 2026-05-22 02:16:27 -06:00
neoforge-26.1 build: add Forgejo Maven publish repository 2026-05-22 02:16:27 -06:00
.gitattributes Initial Commit 2025-09-13 14:54:37 -06:00
.gitignore v3 2026-05-07 16:40:16 -06:00
build.gradle v3 2026-05-07 16:40:16 -06:00
CHANGELOG.md fix(hud): don't leak depth/blend state from ImmersiveMessage HUD layer 2026-05-12 17:05:47 -06:00
FONT_LICENSES.md 2.9.1 fix 2026-03-25 11:11:01 -06:00
gradle.properties v3 2026-05-07 16:40:16 -06:00
gradlew v3 2026-05-07 16:40:16 -06:00
gradlew.bat v3 2026-05-07 16:40:16 -06:00
LICENSE.md Update LICENSE.md with formatting and content changes 2026-03-02 16:45:36 -07:00
README.md docs: document <lang:...> translation-key tag 2026-05-09 19:04:38 -06:00
settings.gradle v3 2026-05-07 16:40:16 -06:00

EmbersTextAPI

Minecraft Forge NeoForge Fabric

Advanced text rendering API for Minecraft mods with visual effects, animations, and markup parsing.

For full documentation, guides, and examples, visit tysontheember.dev.

Features

  • Visual Effects: Rainbow, glitch, wave, shake, pulse, and more
  • Animations: Typewriter text, fade in/out, progressive reveal
  • Markup Parser: XML-style tags for easy text styling
  • Translation Keys: <lang:KEY> resolves to each viewer's localized text; supports args for %s substitution
  • MSDF Font Rendering: Crisp TrueType/OpenType fonts at any scale using Multi-Channel Signed Distance Fields with sharp corner reproduction
  • Inline Rendering: Items and entities within text
  • Server-Side Control: Send styled messages from server to clients
  • Highly Customizable: Per-character effects, gradients, backgrounds

Supported Versions

Minecraft Version Loader Status
1.20.1 Forge Fully Supported
1.20.1 Fabric Fully Supported
1.21.1 NeoForge Fully Supported
1.21.1 Fabric Fully Supported
26.1.x NeoForge Alpha (NeoForge 26.1 itself is beta)
26.1.x Fabric Alpha (NeoForge 26.1 itself is beta)

Patchouli Compatibility

EmbersTextAPI is compatible with Patchouli including books that use "i18n": true. Patchouli's tokenizer runs without interference: user-defined book macros, $(...) codes, and translations behave as authored.

ETA markup that survives Patchouli's pipeline still renders effects on the resulting components. To avoid clashing with user-defined Patchouli macros, prefer namespaced ETA tags inside book entries — for example <eta-rainbow>...</eta-rainbow> rather than <rainbow>...</rainbow>. If a Patchouli book defines a macro for an unprefixed name (e.g. "<b>": "$(l)"), the macro takes precedence; the ETA tag will not run on that text.

Translation Keys

Embed any vanilla translation key in markup; each viewer sees their own client locale:

/eta send @p 50 <lang:item.minecraft.diamond>

Two forms are accepted:

  • Shorthand: <lang:item.minecraft.diamond>
  • Attribute: <lang key=item.minecraft.diamond> or <lang key='commands.give.success.single' args='1,Diamond,Steve'>

args is comma-separated; quote the whole args value if any token contains whitespace. Missing keys render literally (matching Component.translatable's default behavior). Translation file content is treated as plain text — ETA tags written inside a translation are not re-parsed.

Installation

  1. Download the appropriate jar for your Minecraft version and loader
  2. Place the jar in your mods folder
  3. Launch Minecraft with the corresponding loader installed

Building from Source

Requires Java 17 (1.20.1) and Java 21 (1.21.1) toolchains; everything else (Gradle, Forge, Loom, MDG) is fetched by the wrappers.

The root Gradle build runs Fabric 1.20.1/1.21.1/26.1, NeoForge 1.21.1/26.1 and the common-* shared modules. Forge 1.20.1 is a separate Gradle 8.8 build inside forge-1.20.1/ (ForgeGradle 6 doesn't support Gradle 9), exposed through forge1201* lifecycle tasks on the root.

# Build everything
./gradlew assemble forge1201Build

# Per-loader run-in-dev
./gradlew forge1201RunClient        # Forge 1.20.1 (delegates to forge-1.20.1/gradlew)
./gradlew :fabric-1.20.1:runClient
./gradlew :fabric-1.21.1:runClient
./gradlew :neoforge-1.21.1:runClient
./gradlew :neoforge-26.1:runClient

If you want to work on forge-1.20.1 directly, cd forge-1.20.1 && ./gradlew runClient works too — same effect, slightly less typing.

Contributing

Contributions are welcome! Please:

  1. Fork the repository
  2. Create a feature branch
  3. Test your changes on MC 1.20.1 (Forge/Fabric) and 1.21.1 (NeoForge/Fabric)
  4. Submit a pull request

License

This project is licensed under my own License - see the LICENSE file for details.