Repository navigation
Configuration
NebulaScreen reads nebulascreen.json from the directory of its own executable. On a NebulaOS printer
that is /opt/nebulascreen/nebulascreen.json, a bind mount of the persistent file
/usr/data/nebulaos/nebulascreen/nebulascreen.json. The same file is visible in Mainsail as
config/nebulascreen/nebulascreen.json, so you can edit it in the browser. Restart the screen
afterwards (Settings → System → Restart GUI).
The image's default copy is /usr/share/nebulaos/nebulascreen/nebulascreen.default.json
(NebulaOS-firmware ships it); Settings → Reset → Reset GUI settings copies it over your file.
If the file is missing or is not valid JSON, NebulaScreen starts with built-in defaults. Saves are
power-cut safe: a complete copy is written to nebulascreen.json.saving next to the persistent file
first, and an interrupted save is finished or dropped at the next start.
Most settings are changed on the screen (Settings → Display / Printer / Reset); the file is for the rest.
| Field | Meaning |
|---|---|
default_printer |
Key of the active entry in printers
|
printers |
Named printer (Moonraker) configurations, see below |
display_rotate |
Framebuffer rotation. 2 is the KE value (see below) |
display_sleep_sec |
Screen sleep after this many seconds (-1 = never); set by Settings → Display → Sleep after |
theme |
Colour theme name (blue, red, green, purple, pink, yellow); file themes/<name>.json next to the executable |
touch_beep |
Click on every tap |
default_extruder_temp |
Target used by Load/Unload when none is set |
prompt_emergency_stop |
Ask before an emergency stop (default true) |
invert_y_direction, invert_z_direction
|
Swap the Y / Z jog arrows |
touch_calibrated, touch_calibration_coeff
|
Touch calibration, see below |
log_path |
Log file (/opt/printer_data/logs/nebulascreen.log on NebulaOS) |
thumbnail_path |
Directory for cached G-code thumbnails |
nebulascreen_init_script |
The screen's service script (/etc/init.d/S58nebulascreen) |
config_path |
The path of this file, stored inside it. Re-read when switching printers; legacy-mapped from /opt/guppyscreen/guppyconfig.json
|
input_shaper_graphs |
Show the resonance graphs during guided input-shaper calibration. Absent means on - the code treats any non-boolean value as on - and the switch lives on the calibration page itself, not in Settings |
invert_y_ke_default_applied, invert_z_ke_default_applied
|
One-shot markers, not settings. See below |
| Field | Meaning |
|---|---|
moonraker_host / moonraker_port
|
Moonraker address (default 127.0.0.1:7125) |
moonraker_api_key |
API key string, or false if not required |
monitored_sensors |
Temperatures shown on the Home tab. Each entry has id (Klipper object), display_name, controllable, color
|
fans |
Fans shown as editable sliders on the Fans panel. Each entry has id and display_name. Empty: the part-cooling fan, generic fans and PWM fan pins are editable |
default_macros |
Macro names for cooldown, load_filament, unload_filament
|
log_level |
spdlog level (info, warn, debug); set by Settings → System → Report a problem |
The NebulaOS default shows Extruder, Bed and MCU Temp (temperature_sensor mcu_temp).
NebulaScreen puts these three back whenever monitored_sensors is missing or empty. If none of the
listed ids exists in Klipper, every heater and sensor is shown under its Klipper name instead.
invert_y_ke_default_applied and invert_z_ke_default_applied are not preferences. They record
that the KE's defaults have been applied once.
On start, if the marker is absent, NebulaScreen sets the matching invert_*_direction to true
and writes the marker. If the marker is present it does nothing. That is the whole mechanism, and
it exists so that turning an inversion off stays off: without the marker, every start would
helpfully set it back to the KE default and a user could never change it.
Delete a marker and the next start re-applies the default. That is the only supported way to get the KE's jog directions back by hand.
primary_color and secondary_color are read from themes/<theme>.json, not from
nebulascreen.json - the config only holds theme, the name. Both are hexadecimal strings
without a prefix ("2196F3"), parsed with base 16.
If a theme file omits one, the built-in fallback is used: 0x2196F3 for primary, 0xF44336 for
secondary. A theme file that cannot be parsed falls back to the built-in defaults rather than
failing to start, the same way the config does.
A file copied from a GuppyScreen-era image still has the old default paths
(/opt/guppyscreen/..., .../guppyscreen.log, /etc/init.d/S58guppyscreen) and the key
guppy_init_script. NebulaScreen maps exactly those old values to the new ones when it starts and
writes them on the next save; values you set yourself are left alone.
Macro and console favorites are not in this file: they are in Moonraker's database, namespace
guppyscreen (kept on purpose, so favorites survive the rename).
The KE screen is mounted upside down and the kernel display driver rotates the framebuffer 180°, so NebulaScreen also rotates 180° for the two to cancel out:
-
display_rotate: 0→ upside down -
display_rotate: 1→ 90° off -
display_rotate: 2→ correct (KE default)
Changed
display_rotate? Redo touch calibration. The coefficients are rotation-specific. Use Settings → Reset → Reset touch calibration.
The resistive panel works without calibration (raw mode), but taps can be 10–20 px off near the edges. A one-time calibration fixes that.
Running it: Settings → Reset → Reset touch calibration. The screen restarts and shows three crosshairs one at a time; tap each one three times (lift your finger between taps). The taps are averaged, the result is saved, and the screen restarts with it.
touch_calibrated |
touch_calibration_coeff |
Effect |
|---|---|---|
false or absent |
— | Raw mode, no correction |
true |
present | Calibration active |
true |
absent | Calibration wizard shown at the next start |
To get back to raw mode or to force the wizard without the screen, edit
config/nebulascreen/nebulascreen.json in Mainsail accordingly and restart the screen
(/etc/init.d/S58nebulascreen restart over SSH).
Read by the Makefile (and scripts/build-mips.sh / scripts/build-release.sh), not at runtime:
| Variable | Effect |
|---|---|
CROSS_COMPILE |
Toolchain prefix (e.g. mipsel-buildroot-linux-musl-). Unset = SDL simulator build (SIMULATOR define, links -lSDL2) |
GUPPY_SMALL_SCREEN |
480×272 layout and the material_46 icon set (always set for the KE) |
GUPPY_ROTATE |
Changes the built-in display_rotate default from 0 to 3 (270°) |
NEBULASCREEN_VERSION |
Version string shown in the System panel (GUPPYSCREEN_VERSION is still accepted) |
EVDEV_CALIBRATE |
Enables touch calibration (set by scripts/build-mips.sh) |
The GUPPY_* names are the upstream GuppyScreen build flags and are kept as they are. The build
scripts also pass GUPPY_THEME (from NEBULASCREEN_THEME, default blue), but the current
Makefile and source do not read it; the theme is chosen at runtime.
Colour themes are JSON files in themes/ (blue, green, pink, purple, red, yellow), shipped
next to the executable. The release zip contains them too.
Get started
Get great prints
- Calibration guide (4 steps)
- Calibration walkthrough (A→Z)
- Bed tramming
- Load cell calibration (water bottle)
- Axis Twist Compensation
- Adaptive meshing + purge
- Square parts (Skew Correction)
- Quieter steppers (TMC Autotune)
Using the screen
Help
- Working on NebulaScreen
- Build from source
- Dev & simulator
- Architecture
- Configuration
- Releases & deployment
- Testing
- CI
- Contributing
- Publishing this wiki
NebulaOS