Custom Item Textures for Forge 1.20.1. Lightweight, fast, and highly compatible. This is a from-scratch rewrite rather than yet another fork--as such it's lighter & more optimal in it's memory rather.
FreshCIT loads OptiFine/MCPatcher CIT resource packs without OptiFine. Any number of items can receive their own textures & change with their name or NBT. Should work out of the box with any CIT pack following the traditional Optifine form.
Why FreshCIT vs other forks?
| Compact | ~75 KB without libraries bundled with it. |
| Faster | Each item is checked at most once per game tick, and items no CIT can match are skipped right away. |
| No memory leaks | Refreshing w/ F3+T doesn't leave old models behind. Only the textures the item CITs actually use are added to the texture atlas. |
| Compatibility | Only uses non-exclusive hooks, so it doesn't fight other mods over the same code. Supports ModernFix dynamic resources, and is tested against 400+ mods alongside Embeddium-based renderers, ImmediatelyFast, Oculus and cosmetic armor mods. |
Config available at config/freshcit-client.toml
If you are a CIT resource-pack author, you can develop near-identically to original CIT--just make note that if you have a key that FreshCIT doesn't define, it will never be applied nor logged. cit.properties can support useGlint, cap, method, fade and root_fallback.
Noting FreshCIT is client-side only (can be installed on server-side, but won't do anything).
Below are a number of basic benchmarks on a small sample size--mostly just outlining how close parity is to vanilla in many cases.
Per-call costs (median of 10 launches)
| Metric | Vanilla | CIT Reforged | FreshCIT | FreshCIT vs Reforged |
|---|---|---|---|---|
| Creating an item stack | 46.8 ns / 264 B | 67.0 ns / 472 B | 44.7 ns / 264 B | 1.50× faster, −44% memory |
| Copying an item stack | 131.0 ns / 552 B | 154.0 ns / 760 B | 125.5 ns / 552 B | 1.23× faster, −27% memory |
| Model lookup, CIT matches | 11.3 ns / 16 B | 256.4 ns / 592 B | 20.2 ns / 16 B | 12.7× faster, 37× less memory |
| Model lookup, item has CITs but none match | 11.2 ns / 16 B | 34.3 ns / 104 B | 19.3 ns / 16 B | 1.78× faster, 6.5× less memory |
| Model lookup, item with no CITs | 11.1 ns / 16 B | 30.6 ns / 104 B | 21.2 ns / 16 B | 1.44× faster, 6.5× less memory |
| Fresh stack + lookup, CIT matches | 457 ns / 1528 B | 1153 ns / 2576 B | 618 ns / 1576 B | 1.87× faster, −1000 B |
| Fresh stack + lookup, no match | 143 ns / 568 B | 321 ns / 1144 B | 192 ns / 616 B | 1.67× faster, −528 B |
"Fresh stack" rows include copying the stack, as when a server re-sends inventory contents. Just wanted to make that distinction
Time to draw a 36-item inventory screen
| Grid | Vanilla | CIT Reforged | FreshCIT | FreshCIT vs Reforged |
|---|---|---|---|---|
| Plain items (no CITs) | 310.7 µs / 209 KB | 329.7 µs / 215 KB | 310.3 µs / 212 KB | 6% faster, matches vanilla |
| Enchanted items, 2 custom glint layers + vanilla glint | 971.8 µs* | 1728.9 µs / 574 KB | 1689.9 µs / 543 KB | 2% faster, −5% memory |
*Vanilla draws only its own single glint, so it does less work on that row.

