Skip to content

๐Ÿชจ 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)
PluginNeededNotes
Nexo 1.26+RequiredScaffolding is a Nexo addon and reads the pack Nexo builds.
Geyser 2.11.0-SNAPSHOT +RequiredOlder Geyser builds lack the mapping and extension features Scaffolding relies on.
FloodgateOptionalDetects Bedrock players so their outgoing text is remapped to the Bedrock-safe glyph codepoints.
ScaffoldingExtensionOptionalShips 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.

  1. Drop Scaffolding.jar into plugins/, alongside Nexo and Geyser-Spigot.
  2. Start the server. Scaffolding auto-detects Geyser and deploys the pack into its packs/ and custom_mappings/.
  3. 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.

  1. Install Nexo, Scaffolding & Floodgate on the backend Paper server.
    Install Geyser & Floodgate for your proxy (Velocity or BungeeCord) on the proxy.
  2. Set up Floodgate on the backend as in the Floodgate proxy guide:
  3. auth-type: floodgate in the proxy Geyser's config.yml
  4. send-floodgate-data: true in the proxy Floodgate's config.yml
  5. Copy key.pem from the proxy Floodgate's folder into the backend Floodgate's folder
  6. Player info forwarding enabled between the proxy and the backend
  7. Drop ScaffoldingExtension.jar into the proxy Geyser's extensions/ folder:
    plugins/Geyser-Velocity/extensions/ or plugins/Geyser-BungeeCord/extensions/.
  8. 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.
  9. 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:

  1. Install Nexo, Scaffolding & Floodgate on the Paper server
    Run Geyser-Standalone wherever suits you. There is no separate Floodgate for it.
  2. Connect it to Floodgate as in the Floodgate standalone guide:
  3. auth-type: floodgate in Geyser-Standalone's config.yml
  4. Copy key.pem from the Paper server's Floodgate folder into the Geyser-Standalone folder
  5. Drop ScaffoldingExtension.jar into the standalone Geyser's extensions/ folder.
  6. Start everything. The output syncs over Geyser's connection to your server, so this works across machines with no extra ports.
  7. 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

FeatureStatusNotes
Items (2D and 3D)โœ… Works3D models become held Bedrock models with an auto-rendered inventory icon; 2D items become sprites.
Bows, crossbows and tridentsโœ… WorksTheir draw and throw animations are rebuilt natively on Bedrock.
Custom blocksโœ… WorksAll 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โœ… WorksCustom armor with an equipment texture renders as worn armor, elytras included.
Armor for mobsโœ… WorksCustom 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โœ… WorksRemapped so Bedrock players hear them
Custom GUIsโœ… WorksA title glyph that draws a custom inventory background is reproduced automatically(Custom GUI & HUD)
Vanilla GUI & HUD Overridesโœ… WorksReplaced vanilla GUIs & HUD-elements are supported
NexoFurnitureโœ… With extensionRequires 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.

PluginStatusNotes
ModelEngineโœ… With extensionRequires ScaffoldingExtension
MythicHUDโœ… WorksIts HUD elements are rebuilt for Bedrock players.
MythicArmorsโœ… WorksCustom MythicArmors sets render as worn armor on Bedrock.
HMCCosmeticsโœ… WorksHats, 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.
BetterModelโœ… With extensionRequires ScaffoldingExtension. Support is still fresh, so you may hit slight issues. Please report any bugs you find in our Discord.
BetterHUDโœ… WorksSupport is still fresh, so you may hit slight issues. Please report any bugs you find in our Discord.
CustomNameplatesโœ… WorksNameplates convert, but chat bubbles do not work on Bedrock.
CustomFishingโœ… WorksSupport is still fresh, so you may hit slight issues. Please report any bugs you find in our Discord.
LuxDialoguesโœ… WorksSupport is still fresh, so you may hit slight issues. Please report any bugs you find in our Discord.
Tooltipsโœ… WorksTooltips 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:

FeatureStatusNotes
Dyeable models and furnitureโš ๏ธ Not yetBedrock 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โš ๏ธ PartialSpears look correct on Bedrock, but their animations do not play properly yet.
Custom paintingsโŒ Not convertedCustom paintings show as vanilla for Bedrock players.
Hopper / dropper / dispenser reskinsโŒ Not convertedThese 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 .

SettingDefaultPurpose
autoConverttrueConvert and deploy automatically whenever Nexo rebuilds its pack.
iconSizex64Resolution of the rendered inventory icons. One of x16, x32, x64 or x128.
compressionBALANCEDTexture encode tradeoff: FAST (biggest pack), BALANCED, or MAX (smallest, slowest).
cacheSize10How many past conversions to keep on disk so flipping settings is served from cache. 0 disables.
supportAnimatedItemstrueAnimate animated models and textures. Off renders them static, for a smaller pack.
splitPacksfalseShip 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).
packNameScaffoldingName 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.
packDescriptionGenerated by ScaffoldingDescription shown under the pack name on Bedrock. Changing it makes Bedrock players download the packs once more.

vanillaBackground.

convertOverrides

trueAlso 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

trueHide 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.
invertedCubeHalotrueRender inside-out halo/glow shells the way Java shows them. Off removes the halo.
weaponUsePosesfalseGive custom shields and bows the vanilla in-use pose (block, bow draw). May drift on very different client versions.
glyphFilterSHARPHow 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).
soundQualityoriginalHow 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.typePLUGIN_MESSAGEHow 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.channelSTABLEWhich 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.timeout10mHow 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).

CommandWhat it does
/scf helpList 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 statusShow the converter service, the last output pack, the sync target, and check that both are reachable.
/scf syncSend the last converted output to the remote Geyser again (see sync.type). Useful after wiping or moving the proxy's Geyser folders.
/scf gui listList 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 / clearInspect or clear the on-disk conversion cache.