For the complete documentation index, see llms.txt. This page is also available as Markdown.

πŸͺ¨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

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.

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.

  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 and Scaffolding on the backend Paper server, and Geyser on the proxy.

  2. Drop ScaffoldingExtension.jar into the proxy Geyser's extensions/ folder (e.g. plugins/Geyser-Velocity/extensions/). It receives the synced output.

  3. 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.

  4. 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.

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 and Scaffolding on the Paper server, and run Geyser-Standalone wherever suits you - the same machine or a different one.

  2. Drop ScaffoldingExtension.jar into the standalone Geyser's extensions/ folder.

  3. Start everything. The output syncs over Geyser's connection to your server, so this works across machines with no extra ports.

  4. 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

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.

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

NexoFurniture

βœ… With extension

ModelEngine

βœ… With extension

* 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:

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 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.

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.

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).

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:

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.

Last updated