The markers connect visible controls to their implementation and limitations. This page is a visual companion to the capability matrix, not a substitute for live-printer verification.
Supported has relevant live-printer evidence. Partial has an important limitation. Unsupported has no safe built-in implementation. Not verified describes a source-inspected path without equivalent live evidence. A visible control can still look available when its underlying command is unsupported.
Much of the Device tab was designed around Bambu protocol commands. Moonraker accepts generic G-code and a smaller set of print actions, but it has no general equivalent for proprietary AMS, camera, or structured control commands. Treat a closed dialog or a changed button state as UI feedback, not proof that the printer received a safe command.
Do not make proprietary Bambu commands appear available by widening capability checks. In particular, the
legacy Moonraker paths for the part fan and extrusion rely on is_enable_np staying
false. Adding cfg, fun, aux, or stat changes
routing to unsupported structured commands. The visible result can be a silent loss of a previously working
control.
Moonraker can pull installed material and slots from a compatible MMU source. It does not provide a generic, verified contract for changing slots, loading material, or delivering a selected mapping to a print.
The built-in agent uses pull-mode sync. It can populate the view from Happy Hare or AFC data, but refresh depends on the Plater sidebar sync action. Base Moonraker does not deliver a selected material mapping when a multi-material print starts.
See get_filament_sync_mode() and fetch_filament_info() in
MoonrakerPrinterAgent.
The control relies on a Bambu-specific AMS opcode. Generic Moonraker has no verified replacement. Do not widen the structured AMS path merely to expose it: that also changes filament-state handling and can turn an unavailable action into a blocking error.
The dialog is available, but generic Moonraker has no built-in write-side material or colour contract. Printer-specific macros must be known and verified before adding one.
This is the external-spool variant of the same unsupported write-side material path.
The dialog can accurately report that the feature is unavailable, but generic Moonraker has no built-in auto-refill contract.
The settings use Bambu-specific print and AMS options. The built-in Moonraker family does not map them to generic printer controls.
A generic unload macro is unsafe to assume. The required printer-side contract is not part of base Moonraker.
This uses the same unsupported generic write-side material path. Qidi has agent-specific behavior, but that does not make it a Base Moonraker capability.
Manual extrusion uses a legacy raw-G-code path while the structured capability flag remains disabled. It is a useful compatibility path, not a general proof that manual motion is safe.
The legacy path sends raw G-code through Moonraker and can move the extruder. Klipper still applies its own extrusion-temperature and safety limits.
The same legacy path handles feed. It remains conditional on is_enable_np being
false. Adding cfg, fun, aux, or stat changes
routing to unsupported structured extrusion commands.
The legacy part-fan route is available only while structured capabilities stay disabled. A chamber light also depends on a recognised light object in the printer configuration.
The Base and Qidi legacy path sends M106 through gcode_line, so part-fan
speed control works while is_enable_np is false. It is not a structured fan API:
adding capability fields routes the control to unsupported structured commands.
The value is sourced from Moonraker fan status, with fan.power as a fallback.
The displayed value still needs equivalent live-printer evidence across supported configurations.
A configured chamber light can be controlled when the agent recognises a suitable light object.
It is not a generic guarantee for every output_pin or LED configuration.
Moonraker live view can work when webcam discovery yields a usable stream. Recording, timelapse, resolution, and Bambu-specific camera controls do not have a generic Moonraker implementation.
The path is source-inspected and configuration-dependent: webcam discovery must provide a usable stream with a URL the local media pipeline accepts. Equivalent live-printer evidence is not recorded.
The Bambu local-camera transport is not a Moonraker webcam control.
This diagnostic readout is not sourced from Moonraker device status.
This tunnel subscription control has no Moonraker override.
Moonraker webcam discovery does not define a recording-control contract.
Timelapse control is printer-specific and is not provided by the Base Moonraker agent.
The Base Moonraker agent does not expose a generic stream-resolution setting.
The print display is built from Moonraker status and file metadata. The paths shown here are source-inspected unless the capability matrix records relevant live-printer evidence.
The agent requests a thumbnail for the uploaded G-code and exposes its URL through
slice_info->thumbnail_url. The request must stay off the WebSocket update path and be cached:
a blocking lookup while that path holds shared state can delay status updates and the UI.
/server/files/thumbnails →
slice_info->thumbnail_url → StatusPanel thumbnail handling.
The response shape is unverified - if the image 404s, check the path prefix first.
Real value: subtask_name is filled from print_stats.filename. It reads
N/A here only because the printer is idle; it populates once a print starts.
StatusPanel reads subtask_name.
gcode_state is mapped from print_stats.state, with a parallel
mc_print_stage for printing / paused / complete / error.
map_moonraker_state() in build_print_payload_locked()
mc_percent comes from virtual_sdcard.progress, clamped to 0-100.
StatusPanel reads task_progress.
Layer data comes from print_stats.info.current_layer and
.total_layer. It is conditional on G-code that calls SET_PRINT_STATS_INFO; where
a printer profile omits those calls, the field stays blank.
StatusPanel reads curr_layer and
total_layers from the status payload.
Remaining time is estimated from virtual_sdcard.progress. It is not a
slicer-accurate ETA, and pause or heating behavior can make the estimate differ from the printer's actual
completion time.
mc_remaining_time is derived in
build_print_payload_locked().
POST /printer/print/pause hits Klipper's
pause_resume webhook as a direct interrupt, instead of queuing a raw PAUSE behind
the G-code queue where it could stall behind a long move or a macro.
StatusPanel → DeviceManager →
post_print_action("pause") in MoonrakerPrinterAgent.
POST /printer/print/cancel is used. Note that stop is also the
discriminator emitted by HMS fault-stop, so the agent cannot distinguish a user cancel from a fault
abort.
StatusPanel → DeviceManager →
post_print_action("cancel").
Most controls in this sidebar edit the local project. The AMS sync button is the relevant Moonraker integration point and uses pull mode.
Opens the flushing-volume dialog. Never touches the printer agent, so the agent cannot break it.
Plater → open_flushing_dialog().
Local project edit only.
Plater → delete_filament().
Local project edit only.
Plater → add_filament().
The built-in Moonraker family uses pull-mode sync to read installed material and slots. It can populate the local list when Happy Hare or AFC data is available, but generic Moonraker does not deliver a selected mapping to a print. Qidi mapping is agent-specific.
Plater → sync_ams_list() →
load_ams_list() → build_filament_ams_list() →
MoonrakerPrinterAgent::fetch_filament_info(). The button is visible when the sync mode is not
FilamentSyncMode::none.
Opens ConfigWizard. Local only.
Plater opens ConfigWizard.
Pure preset selection - colour swatch, preset combo, and the Edit / Merge / Delete menu. No agent call on any of them.
Plater::init_filament_combo().