Compatibility
Minecraft: Java Edition
Platforms
Supported environments
Tags
Creators
Details
Emote

Thanks to Popular Vibe for allowing us to use their animation!
Join the Discord server to share emotes you have made.
Features
Emote is a server-side emote mod that plays animations with Minecraft display entities. All server features work when the mod is installed only on the server. Installing it on the client is optional and adds an emote wheel and automatic third-person view during playback.
The web converter supports BD Engine, GeckoLib, and Animated Java. Configure skin parts, metadata, playback settings, and commands without editing Animation JSON.
On the server, LuckPerms permissions can assign emotes and idle emotes per player. Sequences can connect multiple animations or coordinate two players in a collaborative emote, with each player's skin applied to compatible animations. A server API is also available for other mods to register emotes, control playback, and receive events.
Commands
Player
| Command | Description |
|---|---|
/emote |
Opens the emote menu. |
/emote play <id> |
Plays an emote by ID. |
V |
Opens the client emote wheel. |
Use the wheel's Edit Wheel button to add, remove, or reorder entries. The order is stored on the client separately for each server.
Administration
| Command | Description |
|---|---|
/emote list |
Lists loaded emotes with their IDs, durations, and availability. |
/emote reload |
Reloads configuration and animations. |
/emote enable/disable <id> |
Enables or disables an emote. |
/emote stop <player>, /emote stop-all |
Stops one player's emote or all emotes. |
/emote stress-test [count] [packets] |
Plays multiple emotes and encodes each packet through a configurable fanout (default 20) to measure server performance. |
Administrative commands use the emote.manage permission and are granted to game master operators by default.
Server management
config/emote/
├── config.json
├── emotes.json
├── emote/
└── resource-pack/
The directory and configuration files are created automatically on first startup, with sample emotes included under emote/.
Place JSON exported by the converter under emote/. Subdirectories are loaded as well, and emotes use the id in the JSON rather than the filename. Invalid files are skipped individually, while every file sharing a duplicate ID is rejected.
config.json
{
"schema_version": 1,
"menu_page_size": 6,
"mineskin_api_key": "",
"mineskin_poll_interval_seconds": 3,
"mineskin_cache_retention_days": 30,
"mineskin_cache_max_mib": 256,
"max_active_display_entities": 512
}
Set mineskin_api_key to apply player skins.
emotes.json
{
"schema_version": 2,
"disabled": ["example:disabled"],
"permissions": [
{
"permission": "emote.vip",
"emotes": ["example:dance", "example:cry"],
"idle": {
"delay": "300s",
"emote": ["example:dance", 70, "example:cry", 30]
}
},
{
"permission": "emote.default",
"emotes": ["example:hello", "example:wave"]
},
{
"permission": "emote.admin",
"emotes": ["*"]
}
]
}
disabled turns off emotes, while permissions determines the emotes and idle emotes available to each player. Every player receives emote.default, and * grants every enabled emote. emote.bypass is an administrator and development override that ignores standalone, disabled IDs, permissions, and cooldowns.
Web converter
Emote Converter converts and configures projects without requiring direct edits to Animation JSON. All processing happens locally in the browser.
Use the 3D preview to assign skin parts and coordinate spaces, then configure metadata, playback behavior, stop conditions, and frame commands.



Animation conversion
The web converter recalculates the source animation's easing and interpolation curves for Minecraft ticks. It preserves important points in Bézier, Catmull-Rom, bounce, and elastic motion, then selects the keyframe placement with the lowest position, rotation, and scale error to keep the result as close to the original movement as possible.
Each animation can define a cooldown, player visibility, stop conditions such as movement, jumping, attacking, and taking damage, and frame commands.
Sequence
Connect short animation clips in order and combine waits, weighted random choices, and repeats to create a single emote.
{
"type": "sequence",
"schema_version": 4,
"id": "emote:sit",
"steps": [
{"emote": "emote:sit_down"},
{
"emote": [
"emote:idle_sky", 40,
"emote:idle_butterfly", 35,
"emote:idle_flower", 25
],
"repeat": 2
},
{"emote": ["emote:stand_up1", 60, "emote:stand_up2", 40]}
]
}
Collaborative emotes
Combine animations for two players in a sequence to create a collaborative emote. Nearby players facing each other are connected, then the matched or timeout branch is played. Symmetrical motion is automatically mirrored for the other player, while separate initiator and partner nodes can create asymmetric performances with different motion and skins.
{
"type": "sequence",
"schema_version": 4,
"id": "emote:handshake",
"participants": {
"initiator": {"position": "~ ~ ~", "rotation": "~ 0"},
"partner": {"position": "^ ^ ^1.2", "rotation": "~180 0"}
},
"steps": [{
"await_partner": {"emote": "emote:handshake_offer", "timeout": "10s"},
"matched": [
{"emote": "emote:handshake", "repeat": 2},
{"wait": "1s"},
{"emote": "emote:handshake_close"}
],
"timeout": [{"emote": "emote:handshake_close"}]
}]
}
Mod API
EmoteApi.getInstance() provides playback control, runtime registration, state queries, cancellable play listeners, playback lifecycle listeners, and named animation callback listeners. State changes must run on the server thread, and runtime registrations survive reloads.
Troubleshooting
| Problem | Check |
|---|---|
| An emote does not appear | Check the /emote reload result, server log, duplicate IDs, disabled, and whether the animation is sequence-only. |
| A player skin is not applied | Check the converter's skin part assignments and mineskin_api_key. Run the emote again after a new skin finishes processing. If MineSkin is unavailable, the animation's default texture is used. |
| A player skin is applied incorrectly | Reassign each node's skin part and order in the web converter. For two-player animations, also check the initiator and partner coordinate spaces. |
If the problem is not covered here, report it on Discord or GitHub Issues.
License
This project is distributed under the Apache License 2.0.

