๐ชจ 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
Warning
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)
| Plugin | Needed | Notes |
|---|---|---|
| Nexo 1.26+ | Required | Scaffolding is a Nexo addon and reads the pack Nexo builds. |
Geyser 2.11.0-SNAPSHOT + | Required | Older Geyser builds lack the mapping and extension features Scaffolding relies on. |
| Floodgate | 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). |
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, Scaffolding & Floodgate on the backend Paper server.
Install Geyser & Floodgate for your proxy (Velocity or BungeeCord) on the proxy. - Set up Floodgate on the backend as in the Floodgate proxy guide:
auth-type: floodgatein the proxy Geyser'sconfig.ymlsend-floodgate-data: truein the proxy Floodgate'sconfig.yml- Copy
key.pemfrom the proxy Floodgate's folder into the backend Floodgate's folder - Player info forwarding enabled between the proxy and the backend
- Drop
ScaffoldingExtension.jarinto the proxy Geyser'sextensions/folder:
plugins/Geyser-Velocity/extensions/orplugins/Geyser-BungeeCord/extensions/. - 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.
Info
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.
Success
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.
Warning
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, Scaffolding & Floodgate on the Paper server
Run Geyser-Standalone wherever suits you. There is no separate Floodgate for it. - Connect it to Floodgate as in the Floodgate standalone guide:
auth-type: floodgatein Geyser-Standalone'sconfig.yml- Copy
key.pemfrom the Paper server's Floodgate folder into the Geyser-Standalone folder - 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.
Info
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.
Warning
When Geyser runs on a proxy or standalone, Floodgate must be set up so the backend can tell who is a Bedrock player (proxy guide, standalone guide).
This is needed for Glyphs & ModelEngine to work correctly
Supported¶
| Feature | Status | Notes |
|---|---|---|
| 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. |
| Armor & Elytras for Players | โ Works | Custom armor with an equipment texture renders as worn armor, elytras included. |
| Armor for mobs | โ Works | Custom horse armor, wolf armor and llama decor render on Bedrock. |
| 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 |
| NexoFurniture | โ With extension | Requires ScaffoldingExtension |
Info
* 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.
Geyser-Velocity & Geyser-Standalone also requires Floodgate for glyphs to function.
Info
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.
Third-party plugins¶
Scaffolding also supports other big plugins, so your Bedrock players get the full experience.
| Plugin | Status | Notes |
|---|---|---|
| โ With extension | Requires ScaffoldingExtension | |
| โ Works | Its HUD elements are rebuilt for Bedrock players. | |
| โ Works | Custom MythicArmors sets render as worn armor on Bedrock. | |
| โ Works | Hats, backpacks and the wardrobe show for Bedrock players. The ScaffoldingExtension keeps the wardrobe camera in first person. Support is still fresh, so you may hit slight issues. Please report any bugs you find in our Discord. | |
| โ With extension | Requires ScaffoldingExtension. Support is still fresh, so you may hit slight issues. Please report any bugs you find in our Discord. | |
| โ Works | Support is still fresh, so you may hit slight issues. Please report any bugs you find in our Discord. | |
| โ Works | Nameplates convert, but chat bubbles do not work on Bedrock. | |
| โ Works | Support is still fresh, so you may hit slight issues. Please report any bugs you find in our Discord. | |
| โ Works | Support is still fresh, so you may hit slight issues. Please report any bugs you find in our Discord. | |
| โ Works | Tooltips are redrawn natively on Bedrock with their themes. Support is still fresh, so you may hit slight issues. Please report any bugs you find in our Discord. |
Not yet supported¶
Scaffolding aims for parity, but a few Nexo features do not convert yet or have known rough edges on Bedrock:
| Feature | Status | Notes |
|---|---|---|
| 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 spears | โ ๏ธ Partial | Spears look correct on Bedrock, but their animations do not play properly yet. |
| 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 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.
Warning
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.
Warning
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 .
| Setting | Default | Purpose |
|---|---|---|
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, see Resource pack options). |
packName | Scaffolding | Name Bedrock lists the pack under. Split packs append their part, e.g. Scaffolding Glyphs. Changing it makes Bedrock players download the packs once more. With splitPacks on, keep the ScaffoldingExtension on the same release or newer. |
packDescription | Generated by Scaffolding | Description shown under the pack name on Bedrock. Changing it makes Bedrock players download the packs once more. |
| 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. |
| 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:
| File | Purpose |
|---|---|
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).
| Command | What it does |
|---|---|
/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. |