Text rendering and styling API with effects, animations, and custom font support https://tysontheember.dev/embers-text-api/
  • Java 98.8%
  • GLSL 1.2%
Find a file
TysonTheEmber 6692dc1372 ci: cache Gradle dependencies to speed up Actions
Adds actions/cache@v4 for ~/.gradle so publish runs restore the
Loom/ForgeGradle/NeoForge dependency set instead of re-downloading.

[skip ci]
2026-07-04 23:31:54 -06:00
.forgejo ci: cache Gradle dependencies to speed up Actions 2026-07-04 23:31:54 -06:00
common-1.20.1 fix: honor hard line breaks in unwrapped immersive text 2026-07-04 22:59:12 -06:00
common-1.21.1 fix: honor hard line breaks in unwrapped immersive text 2026-07-04 22:59:12 -06:00
common-26.1 fix: honor hard line breaks in unwrapped immersive text 2026-07-04 22:59:12 -06:00
common-26.2 fix: honor hard line breaks in unwrapped immersive text 2026-07-04 22:59:12 -06:00
fabric-1.20.1 feat(ftbquests): port composer to 1.20.1 forge and fabric 2026-06-21 00:47:12 -06:00
fabric-1.21.1 feat(ftbquests): render markup effects live in the editor while keeping tags 2026-06-20 19:59:17 -06:00
fabric-26.1 chore(26.1): bump target to MC 26.1.2 2026-06-21 14:38:40 -06:00
fabric-26.2 feat(26.2): port SDF and neon glow to the bind-group pipeline API 2026-06-21 20:29:50 -06:00
forge-1.20.1 chore(release): 3.0.1 2026-07-04 22:59:56 -06:00
gradle/wrapper v3 2026-05-07 16:40:16 -06:00
neoforge-1.21.1 feat(ftbquests): render markup effects live in the editor while keeping tags 2026-06-20 19:59:17 -06:00
neoforge-26.1 chore(26.1): bump target to MC 26.1.2 2026-06-21 14:38:40 -06:00
neoforge-26.2 feat(26.2): port SDF and neon glow to the bind-group pipeline API 2026-06-21 20:29:50 -06:00
tools feat(dev): add effect capture tool for wiki webps 2026-06-11 21:04:22 -06:00
.gitattributes Initial Commit 2025-09-13 14:54:37 -06:00
.gitignore chore: ignore local dev-run jars and pin kubejs to the bundled build 2026-06-10 15:21:39 -06:00
build.gradle fix(build): resolve forge 1.20.1 compat deps from ftb and architectury mavens 2026-06-11 22:08:41 -06:00
CHANGELOG.md chore(release): 3.0.1 2026-07-04 22:59:56 -06:00
FONT_LICENSES.md 2.9.1 fix 2026-03-25 11:11:01 -06:00
gradle.properties chore(release): 3.0.1 2026-07-04 22:59:56 -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: finalize v3.0.0 release notes and drop beta labels 2026-06-21 21:35:21 -06:00
settings.gradle feat(26.2): add neoforge and fabric support 2026-06-21 19:29:11 -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, glow/neon, 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

Quick start

Client-side display — runs entirely on the client; no server required.

import net.tysontheember.emberstextapi.client.ClientMessageManager;
import net.tysontheember.emberstextapi.immersivemessages.api.ImmersiveMessage;
import java.util.UUID;

ImmersiveMessage msg = ImmersiveMessage.builder(60, "Hello world")
        .fadeInTicks(10)
        .fadeOutTicks(10);
ClientMessageManager.open(UUID.randomUUID(), msg);

Full guides: Client-side usage · Markup from Java · Message attributes · External docs: tysontheember.dev

Supported Versions

Minecraft Version Loader Status
1.20.1 Forge Supported
1.20.1 Fabric Supported
1.21.1 NeoForge Supported
1.21.1 Fabric Supported
26.1.x NeoForge Supported
26.1.x Fabric Supported
26.2 NeoForge Supported
26.2 Fabric Supported

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), Java 21 (1.21.1) and Java 25 (26.1, 26.2) 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/26.2, NeoForge 1.21.1/26.1/26.2 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
./gradlew :fabric-26.2:runClient
./gradlew :neoforge-26.2: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), 1.21.1 (NeoForge/Fabric), 26.1 (NeoForge/Fabric) and 26.2 (NeoForge/Fabric)
  4. Submit a pull request

License

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