πͺ¨Scaffolding
Scaffolding is a Nexo addon that brings your server's custom content to Bedrock players who connect through Geyser.
Nexo generates a Java ResourcePack for your custom items, blocks, furniture, armor, glyphs & more. Normally Bedrock-players cannot see any of this without a complex conversion of the Java-setup. Scaffolding handles all this for you automatically. It converts your entire Nexo-setup to a Bedrock compatible one, consisting of Geyser-mappings and MCPack files. It is also automatically deployed to Geyser and always kept up-to-date with your changes in Nexo.
MCModels | NexoMC | Voxel.shop
Early Access
Scaffolding is in early access. It has had thorough testing and covers the large majority of Nexo content, but it is not guaranteed bug-free yet. If something looks wrong on Bedrock, report it in our Discord with a screenshot and the item, block or furniture involved. Quick bug reports are what push it toward a stable release.
Requirements (click to expand)
Geyser 2.11.0-SNAPSHOT +
Required
Older Geyser builds lack the mapping and extension features Scaffolding relies on.
Optional
Detects Bedrock players so their outgoing text is remapped to the Bedrock-safe glyph codepoints.
ScaffoldingExtension
Optional
Ships with Scaffolding. Required for NexoFurniture and/or ModelEngine, and for Geyser on a proxy or standalone (it receives the synced output).
Your server also needs outbound internet access. Scaffolding uploads the pack to a hosted converter service and unpacks the result, so the game server never does the heavy conversion itself.
Setup
Where you run Geyser decides how Scaffolding deploys, so pick your setup below.
Nexo, Scaffolding and Geyser all run on one Paper server.
Drop
Scaffolding.jarintoplugins/, alongside Nexo and Geyser-Spigot.Start the server. Scaffolding auto-detects Geyser and deploys the pack into its
packs/andcustom_mappings/.Restart once so Geyser loads the new mappings.
That is it, nothing to configure in the common case.
Here Geyser runs on the proxy, while Nexo and Scaffolding run on a backend Paper server. Scaffolding syncs its output to the proxy's Geyser automatically - no copying files across.
Install Nexo and Scaffolding on the backend Paper server, and Geyser on the proxy.
Drop
ScaffoldingExtension.jarinto the proxy Geyser'sextensions/folder (e.g.plugins/Geyser-Velocity/extensions/). It receives the synced output.Start everything. After a conversion, Scaffolding hands the output to Geyser over the players' own Minecraft connection - no ports to open, no shared folders needed.
Restart the proxy once so Geyser loads the new mappings, and have Bedrock players reconnect.
The default transport needs a Bedrock player online to carry the data. If nobody is on when a conversion finishes, the next Bedrock player to join delivers it.
/scf sync re-sends the last output on demand, and /scf status shows whether the proxy's Geyser is up to date.
Sharing a filesystem? (same machine, Docker volume, network mount)
Set sync.type: FOLDER in both the plugin's and the extension's config.yml, and point sync.folder on both sides at the same folder. Output then applies within seconds, with no player needed to carry it.
Run Nexo and Scaffolding on one server behind the proxy. The proxy's Geyser serves that one server's converted content.
Geyser-Standalone runs as its own program and joins your server the way a Java player would. The setup is the same as on a proxy:
Install Nexo and Scaffolding on the Paper server, and run Geyser-Standalone wherever suits you - the same machine or a different one.
Drop
ScaffoldingExtension.jarinto the standalone Geyser'sextensions/folder.Start everything. The output syncs over Geyser's connection to your server, so this works across machines with no extra ports.
Restart the standalone Geyser once so it loads the new mappings, and have Bedrock players reconnect.
The same notes as the proxy tab apply: a Bedrock player carries the data (the next one to join picks it up), /scf sync re-sends the last output, and sync.type: FOLDER is available when both sides can reach one folder.
Why the restart?
Geyser loads custom mappings only at startup, and Bedrock re-downloads packs only on reconnect. So after changing your Nexo content, restart and have Bedrock players reconnect. Scaffolding logs when a restart is needed and stays quiet otherwise.
Supported
Items (2D and 3D)
β Works
3D models become held Bedrock models with an auto-rendered inventory icon; 2D items become sprites.
Bows, crossbows and tridents
β Works
Their draw and throw animations are rebuilt natively on Bedrock.
Custom blocks
β Works
All Nexo CustomBlocks (note-block, string, chorus, etc.) become real Bedrock custom blocks, with their sounds. Carpentry blocks likely work too, but are not fully tested yet.
Player armor
β Works
Custom armor with an equipment texture renders as worn armor.
Glyphs and emotes
β Works *
Rebuilt as Bedrock glyph sheets, so they show in chat, names and UI. Tune their Bedrock size per glyph or font ( Emotes & Glyphs )
Custom sounds
β Works
Remapped so Bedrock players hear them
Custom GUIs
β Works
A title glyph that draws a custom inventory background is reproduced automatically(Custom GUI & HUD)
Vanilla GUI & HUD Overrides
β Works
Replaced vanilla GUIs & HUD-elements are supported
* Glyphs on Bedrock
Bedrock renders a glyph at its baked pixel size, so scale and sharpness are tied together.
This is different from Java, where a glyph's size is set independently from its texture resolution.
A larger texture meant to render as a small icon can therefore look blurry on Bedrock.
See Emotes & Glyphs on Bedrock for how to tune this per glyph or font in glyphs.yml.
Bedrock picks an item's look once from its data; it can't react to live gameplay states like Java. So live-state model swaps, like dyeing an item or renaming it, are not going to transfer over.
Not yet supported
Scaffolding aims for parity, but a few Nexo features do not convert yet or have known rough edges on Bedrock:
Dyeable models and furniture
β οΈ Not yet
Bedrock cannot read a color from the item stack, so dyed or tinted models and furniture show their texture as-is. This may become possible once Geyser merges PR #6392, which adds Bedrock dyeable-component support to the custom item API.
Custom Elytras
β οΈ Partial
The wings render as worn armor, but Bedrock players cannot fly (glide) with them.
ModelEngine rotations
β οΈ Rare issue
Models generally render correctly via the extension, but a few can show wrong rotations in rare scenarios.
Custom mob armor
β Not converted
Custom armor worn by mobs (horse, wolf, etc.) does not render on Bedrock.
Custom paintings
β Not converted
Custom paintings show as vanilla for Bedrock players.
Hopper / dropper / dispenser reskins
β Not converted
These Bedrock screens are hardcoded and cannot be customized via a resource pack at the moment, so a reskin cannot reach them (see Custom GUI & HUD).
Custom HUD plugins (MythicHUD)
β Not yet
Custom HUDs added by plugins such as MythicHUD are not supported at the moment. Only vanilla HUD retextures convert.
Custom GUI & HUD
On Java a custom screen is one of two things: a glyph placed in a custom inventory's title (a GUI background), or a replaced vanilla HUD texture. Scaffolding reproduces both on Bedrock, along with reskins of vanilla container screens.
Automatic alignment is approximate
Bedrock and Java lay their screens out differently, so the automatic placement is not guaranteed pixel-perfect and some GUIs can show larger inconsistencies. See Custom GUI & HUD for per-screen support, the HUD elements covered, and how to nudge or override a background.
ScaffoldingExtension
Furniture and ModelEngine models are not drawn by the resource pack alone, so Scaffolding ships a companion Geyser extension that recreates them on Bedrock. Drop ScaffoldingExtension.jar into Geyser's extensions/ folder and restart.
Without the ScaffoldingExtension, items, blocks, armor and glyphs still convert and show, but furniture and ModelEngine models will not render for Bedrock players.
See ScaffoldingExtension for install detail, how furniture and ModelEngine are handled.
Configuration
Defaults work for almost everyone, and the config is found at plugins/Scaffolding/config.yml .
autoConvert
true
Convert and deploy automatically whenever Nexo rebuilds its pack.
iconSize
x64
Resolution of the rendered inventory icons. One of x16, x32, x64 or x128.
compression
BALANCED
Texture encode tradeoff: FAST (biggest pack), BALANCED, or MAX (smallest, slowest).
cacheSize
10
How many past conversions to keep on disk so flipping settings is served from cache. 0 disables.
supportAnimatedItems
true
Animate animated models and textures. Off renders them static, for a smaller pack.
splitPacks
false
Ship the output as one pack per content type instead of a single mcpack, so a change re-sends only the affected part. Animated items then become their own pack players can opt out of (needs the ScaffoldingExtension).
vanillaBackground.
convertOverrides
true
Also convert reskins of vanilla items and containers with no Nexo config. Turn off if you do not reskin vanilla content and want a smaller pack.
vanillaBackground.
hideBackground
true
Hide Bedrock's own window background behind converted vanilla GUI reskins, so nothing vanilla peeks out. Turn off to keep the gray panel drawn behind the art.
invertedCubeHalo
true
Render inside-out halo/glow shells the way Java shows them. Off removes the halo.
weaponUsePoses
false
Give custom shields and bows the vanilla in-use pose (block, bow draw). May drift on very different client versions.
glyphFilter
SHARP
How glyph art is shrunk to the size Bedrock bakes it at: SHARP (hard edges on cutout art), AREA (smooth average) or NEAREST (crispest, drops thin details).
soundQuality
original
How ogg sounds ship: original (untouched), compressed or compressed_mono (also downmixed). Needs ffmpeg on the converter host; a sound is only kept when it got smaller.
extraItemModels
β
Base item(s) for item_model ids no Nexo item claims (dummy models, items other plugins give out). Quote the model id; a model shared by several base items takes a list.
sync.type
PLUGIN_MESSAGE
How output reaches a remote Geyser (proxy or standalone, see Setup): PLUGIN_MESSAGE (over the players' connection, no ports), FOLDER (a shared folder), or OFF.
sync.folder
β
FOLDER only: a folder both this server and Geyser can reach. Absolute, or relative to the server folder.
sync.serverId
β
The name this server reports to the remote Geyser when syncing. Blank = the server folder's name.
converter.channel
STABLE
Which hosted converter to use: STABLE (production) or DEV (test builds). Ignored when a URL is set.
converter.jar
β
Path to a converter jar on this machine: conversions then run locally, and nothing is uploaded. For self-hosters.
converter.timeout
10m
How long to wait for a conversion before giving up. Accepts 30s, 10m, 1h.
Two optional files sit next to it, both generated for you and only needed for fine-tuning:
gui.yml
Per-GUI overrides for custom inventory backgrounds on Bedrock ( Custom GUIs & HUDs )
glyphs.yml
The size a glyph or font is baked at on Bedrock ( Emotes & Glyphs )
Commands
The base command is /scaffolding (aliases /scaffold, /scf).
/scf help
List the available commands.
/scf reload <-f>
Reconvert the current Nexo pack and redeploy to Geyser (rl also works). Add -f to force new conversion, even when setup is the same
/scf status
Show the converter service, the last output pack, the sync target, and check that both are reachable.
/scf sync
Send the last converted output to the remote Geyser again (see sync.type). Useful after wiping or moving the proxy's Geyser folders.
/scf gui list
List the GUI overlays configured in gui.yml.
/scf gui import <glyph> [screen]
Add a glyph to gui.yml as an overlay and reconvert (screen defaults to container).
/scf cache list / clear
Inspect or clear the on-disk conversion cache.
Last updated