Cheese is a client-side Fabric mod for Minecraft 1.21.11 that lets you pose your player model in game with a Blender-style bone gizmo. Pick a joint, drag a ring, save the pose, and assign it to yourself or to other players on your client.
Everything is visual and local: poses are never sent to the server, do not move hitboxes, and other players see their own game normally.
One jar covers one compatibility group. Use the jar that matches your Minecraft version.
| Minecraft | Branch | Jar |
|---|---|---|
| 26.2 | 26.2/stable |
cheese-2.2.0-26.2.jar |
| 26.1.x | 26.1/stable |
cheese-2.2.0-26.1.x.jar |
| 1.21.9-1.21.11 | 1.21.11/stable |
cheese-2.2.0-1.21.9-1.21.11.jar |
| 1.21.6-1.21.8 | 1.21.8/stable |
cheese-2.2.0-beta-1.21.6-1.21.8.jar |
| 1.21.5 | 1.21.5/stable |
cheese-2.2.0-1.21.5.jar |
| 1.21.4 | 1.21.4/stable |
cheese-2.2.0-beta-1.21.4.jar |
| 1.21.2-1.21.3 | 1.21.3/stable |
cheese-2.2.0-beta-1.21.2-1.21.3.jar |
| 1.21-1.21.1 | 1.21.1/stable |
cheese-2.2.0-beta-1.21-1.21.1.jar |
| 1.20.5-1.20.6 | 1.20.6/stable |
cheese-2.2.0-beta-1.20.5-1.20.6.jar |
| 1.20.3-1.20.4 | 1.20.4/stable |
cheese-2.2.0-beta-1.20.3-1.20.4.jar |
| 1.20.2 | 1.20.2/stable |
cheese-2.2.0-beta-1.20.2.jar |
| 1.20-1.20.1 | 1.20.1/stable |
cheese-2.2.0-beta-1.20-1.20.1.jar |
main tracks the latest line (currently 1.21.11). Repository branches and release
rules are documented in docs/repository-layout.md and docs/versioning.md.
- Smooth limbs — arms and legs are built from 12 texture slices. Hips, elbows and knees bend along a curved centreline instead of rotating around one pivot, so the back edge does not fold. The torso stays rigid.
- Gear follows the pose — armor uses the same 12-slice limbs as the skin, and elytra ride the posed torso instead of hanging straight.
- Bones and Poses tabs — click the mannequin or a saved pose; the gizmo sits on the real joint.
- Multi-target loading — every pose row has a
+button. The panel lists yourself and every online player; checkboxes apply immediately and support adding or removing targets.Select allflips toDeselect allwhen everyone is checked. - One pose per player — checking a different pose replaces that player's previous pose.
- Usage tint — a pose row's background follows the share of online players using it: unused = no tint, 30% = 30% opacity, 50% = 50%, 100% = opaque.
- Unload all — clears your pose and every remote assignment in one click.
- Preview skin — the Skin button at the top-right of the viewport loads a Mojang player's skin or a local PNG (64x64, or legacy 64x32). It is editor-only, supports Classic/Slim and has an Original skin button.
- Clean start — the panel opens on the Poses tab with nothing selected. Press New or pick a saved pose before editing.
- New / Rename dialog — names are entered in a modal, not by typing into a name field; renames are drafts until Save.
- Standing check — the panel only opens when you are standing still and upright on solid ground. Crawling, swimming, sneaking, sleeping, riding, climbing, water/lava and elytra are blocked.
- Compatibility warnings — the COMPAT badge lists model/animation overrides and explains what to disable.
| Minecraft | 1.21.11 |
| Fabric Loader | >= 0.20.1 |
| Fabric API | any (built against 0.141.6+1.21.11) |
| Java | >= 21 |
- Install Fabric Loader for 1.21.11 and put Fabric API
in
mods/. - Drop
cheese-<version>.jarintomods/. - Start the game. The mod is client-side, so it works in singleplayer and on any server you can join.
- Stand still and upright, then press Backspace to open the panel. (Rebind it in Options → Controls → Cheese.)
- The panel opens on Poses. Press New and enter a name, or click a saved pose to edit it.
- Click a part on the mannequin (or press
1–9), then drag a ring to rotate it. Switch to Move to drag an axis line instead. - Press Save. A new pose is not applied just by closing the editor — save first.
- Click the
+next to the pose and tick yourself and/or any online players. Each checkbox applies or removes the pose immediately. - Press Done or
ESC. Remote assignments stay until you uncheck them, press Unload all, or change world/server.
A saved pose can be assigned to several players at once, but each player (including you) carries at most one pose. Ticking a player for another pose replaces the previous one.
| Input | Action |
|---|---|
Backspace |
Open/close the panel (rebindable; requires standing still and upright) |
Bones / Poses tabs |
Switch between the mannequin and the saved-pose list |
| Click a part on the mannequin | Select that bone |
1–9 |
Select a bone by row (cape is click-only) |
| Click a pose row | Select it for editing (amber frame) |
+ on a pose row |
Open the multi-target panel |
| Click the name bar | Open the Rename dialog (applied by Save) |
Save |
Write the working pose and the pending name |
Unload all |
Clear your pose and all remote assignments |
R / G |
Rotate / Move mode |
| Drag a coloured ring / axis line | Rotate or translate on that axis |
| Drag empty viewport space, or middle-drag | Orbit the camera |
| Scroll | Zoom the viewport, or scroll the pose list |
Ctrl+Z / Ctrl+Y |
Undo / redo (one step per drag) |
ESC |
Close the panel |
Red is X, green is Y, blue is Z. Rotations are clamped to ±180°, translations to ±2 blocks per axis.
Body, Head, left/right upper arm and forearm, left/right upper leg and
shin, plus Cape / Elytra (one click-only chip under the mannequin).
- Picking a part picks its joint. Rotations hinge where the part is attached; there is no separate pivot to place.
- Arms and legs are sliced into 12 segments. The hip uses a 4-unit curved band; elbows and knees use a symmetric band that straddles the joint (one pixel on each side), so the parent segment shares the bend and the inner side does not fold.
- Cape / Elytra is one bone: a player can never wear both, so the editor drives the model that is actually on your back and the chip/label switches between "Cape" and "Elytra" by itself. If you own no cape, a Demo chip appears left of it and puts a bundled cape on the preview; click it again to go back. In elytra mode an Elytra Control panel at the top-left of the viewport has three vertical sliders for the opening angles around X, Y and Z (X is centred so it can go negative). Click its caption to fold the panel away; it starts open.
- Armor is sliced exactly like the skin. Chestplates, leggings and boots bend with the elbow and knee instead of staying a straight box, and they use the armor texture as-is.
The + button on a saved pose opens the target panel:
- Self and every player in the tab list.
- Checkboxes apply immediately; there is no Apply button.
Select allbecomesDeselect allwhen every target has the pose.- A player who already carries another pose is marked with
[~]and the pose name. Checking the new pose replaces the old one. - Assignments are client-side and are cleared when you change world or server.
Pose rows are tinted by how many online players currently carry that pose. The online set
is you plus the tab list. Opacity is the used share: no users = no tint, 30% = 30%, 50% =
50%, 100% = fully opaque. The selected amber frame and the + button stay on top.
The Skin button in the top-right of the viewport changes only the model in the editor:
- The header has Skin / Cape tabs. The Skin tab loads a body skin; the Cape tab previews back gear without touching your account.
- On the Cape tab, pick one of the bundled official capes (Migrator, Mojang, Vanilla, MINECON, Cherry Blossom, Purple Heart, and more) or Import file to load any 64x32 cape PNG. Original cape goes back to your real cape.
- A small front view beside the list shows the picked cape.
- One input field with a Player / File pair (same style as Rotate / Move) beside it. The active mode is highlighted and switching clears the field.
- In Player mode, type a Mojang name and press Load (or Enter). That player's cape and elytra textures come along too, so the back of the preview matches their skin; if they have no cape the preview stays capless instead of borrowing yours.
- In File mode, paste a path or press Browse, then Load. Modern 64x64 skins and legacy 64x32 skins both work; legacy skins are expanded so both arms and legs render.
- The field has no length limit, and a pasted path (a separator or
.png) is loaded as a file even if the switch still shows Player. - Arms: Classic / Slim switches the model used for a local file.
- Original skin restores your real skin.
The preview never changes your actual player skin, the entity, or anything sent to the server. It is cleared when you close the editor.
The Eyes button at the top-left of the Bones tab opens an editor-only eyelid panel. It never changes your real skin, the entity or anything sent to the server.
- Two sliders, L Eye and R Eye. 100% is open, 0% is closed, and the eyelids are real geometry on the model, so they work in every camera angle.
- A slider only lights up when the loaded preview skin carries blink pixels for the
selected format; the status beside it reads
blinkorno pixels. - With no blink pixels the panel offers the bundled demo skin instead of doing nothing.
| Format | What the skin has to contain |
|---|---|
| SkinSpice | Control pixel #00C0FF at [0,0], a closed-eye copy of the face at [24,0]-[31,7], and the same copy for the hat layer at [56,0]-[63,7] when the skin has an overlay |
| Just Expressions | A small stack of eye frames in a spare head corner, usually [24,0]-[31,7] and sometimes the hat corner [56,0]-[63,7]. One row per blink phase (lash, half closed, open), both eyes side by side and mirrored. The eye boxes themselves are matched on the face, so the lids follow whatever eye position the artist used |
Notes:
- The two formats share the same spare corner, so a skin is one or the other. SkinSpice is recognised by its control pixel and wins when both could apply.
- The eyelid colour is the closed-frame colour from the skin, so a dark face gets dark lids. Use a skin with a lighter lash colour if you need the closed eye to stand out.
- Eye animation packs (EMF + Just Expressions/Fresh Moves) draw their own eyes; the panel warns that the pack may override the preview.
- Load demo skin swaps in the bundled sample, which carries both layouts so either format can be tried. While the demo is loaded the same button becomes Original skin and puts your own skin back.
The editor shows a COMPAT badge when something can override the rig. Hover it for the full list. Most conflicts are cosmetic; a few need a file edit, and those are the ones nobody guesses on their own.
| Mod / feature | What you see | Fix |
|---|---|---|
| Sodium 0.9+ | Forearm/shin bends and sliced armor stop following the pose, or look rigid | Edit config/sodium-mixins.properties (below) |
| 3D Skin Layers | Hat/jacket/sleeve/pants second layer bends only partly | Expected; limit or disable those layers in its settings |
| EMF / OptiFine player CEM (Fresh Animations: Player Extension) | Pose applies, but one-piece limbs bend around their midpoint | Disable the pack's player model for exact elbow/knee bends |
| Not Enough Animations | Walking / eating / bow / third-person actions pull the arms and legs back | Stand still for a static pose, or turn those animations off |
| Player Animator, Emotecraft | Bone rotations are overridden while an emote plays | Nothing to change; the pose returns after the emote |
| Figura | Your avatar replaces the player model, so no pose is visible | Not compatible with a custom Figura avatar |
| Physics Mod | Limb or cape motion is overridden | Disable the affected physics features |
| Cape / wavey-cape mods | The cape bone is overridden | Disable their cape animation |
| Armor resource packs with remapped UVs | Stretched pixels on the armor limbs | Sliced armor assumes the vanilla 64x32 armor layout |
Sodium 0.9+ bakes entity cubes and skips the per-vertex path this mod deforms. The fix is a config file line, not a GUI option:
-
Open
config/sodium-mixins.propertiesin your game directory (create the file if it is missing). -
Add this line, or change the existing one:
mixin.features.render.entity=false -
Restart the game completely.
The COMPAT badge shows the same instruction while the line is missing, and the editor offers
a one-click Sodium conflict detected prompt on first open (once per game session; click
COMPAT to reopen it). Fix it writes the line for you and leaves every other Sodium
setting untouched — restart afterwards. To undo it, set the line back to true or delete
it and restart; the prompt links to a step-by-step restore guide.
The Entity Culling, Entity Distance and Entity Shadows options in Sodium's video settings are unrelated — turning those off does nothing for this.
The compat hook bends the second layer together with the limb, but only approximately: the
voxelised layer is a separate mesh, so its outer surface can separate slightly at sharp
angles. If that bothers you, disable the specific layer (hat, jacket, sleeves, pants) in
config/skinlayers.json.
Plain JSON in config/player-pose/, one file per pose:
{
"name": "wave",
"skin": "Tagin_T",
"bones": [
{ "bone": "leftArm", "x": 1.2, "y": 0.0, "z": 0.0, "tx": 0.0, "ty": 0.0, "tz": 0.0 }
]
}x/y/zare rotations in radians;tx/ty/tzare translations in model units (16 units = 1 block).- The cape's rest rotation is 180° around Y; a cape pose's
yis added to that, so0keeps it hanging normally. skinis the local binding used when picking the pose for a skin. Remote targets are tracked per player UUID for the current session; they are not saved to disk.- Each player carries at most one pose. The local active pose and the remote map are separate, so assigning a pose to another player does not unbind yours.
- Files are read at startup and written on save, so saved poses survive restarts.
- Plain ASCII names keep their name as the file name; other names get a readable stem plus
a short hash (e.g.
挥手~bc5f31b3.json), so non-ASCII names cannot overwrite each other. Thenameinside the file is unchanged.
The mod writes config/player-pose/player-pose.log with load/bind/apply decisions and a
state dump of all poses. Useful when a pose is not the one you expected:
[00:51:22 INFO] bind: 'Steve' -> 'bbb'; unbound [aaa]
[00:51:22 INFO] save: 'bbb' skin='Steve' bones=3
[00:51:22 INFO] apply: 'bbb' (active pose)
./gradlew build # -> build/libs/cheese-<version>.jarJava 21 is required for the 1.21.x line; 1.20.5+ also uses 21, while 1.20.1-1.20.4 use Java 17. The first build resolves Minecraft, mappings and Fabric Loom from the
network; later builds work offline (--offline).
flowchart LR
E[Pose editor] -->|Save| M[PoseManager]
M -->|JSON| F[(config/player-pose)]
E -->|+ targets| R[PlayerPoseClient]
M -->|local pose| R
R --> A[PoseModelMixin]
R --> B[PoseCapeMixin]
R --> C[PoseElytraMixin]
A -->|rotation + translate| H[HumanoidModel bones]
A -->|same slices| G[Armor model]
B -->|cape part| K[PlayerCapeModel]
C -->|body anchor| W[ElytraModel]
The editor renders your real player model through the same GUI entity path as the
inventory screen. The gizmo uses the live ModelPart pivots published by the mixins.
JointBend moves cross-sections along a curved centreline for the hip, elbow and knee;
PoseLimbSplitMixin builds the 12 slices, PoseArmorSplitMixin rebuilds the armor meshes
with the same slices, and the render mixin applies the per-player pose. Remote targets are
resolved by UUID on each frame, so other players on your client can carry different poses.
- Open Panel defaults to Backspace; rebind under Controls → Cheese.
- This is a visual, client-side mod: poses do not move hitboxes and are invisible to other players' clients.
- Saved poses are matched by player name for the local skin binding; remote assignments use UUIDs and last for the session.
- Armor and elytra follow the pose too; see What you can pose and Compatibility.
MIT — see LICENSE.
