Skip to content

Printers

Lucio edited this page May 27, 2026 · 7 revisions

Printers

Printers are managed in Settings β†’ Printers. The main app window shows the plugin catalog for whichever printer is selected in the header; use the printer selector in the top bar to switch between printers.


Discovery

Bespok3d scans your local network using mDNS (Bonjour/Zeroconf) every 15 seconds. Printers running Moonraker will appear in the Add printer discovery list automatically β€” no IP address required.

If your network blocks mDNS between devices (common on guest WiFi or corporate networks), use the manual IP option instead. You can find the U1's IP address in the Snapmaker touchscreen UI under Settings β†’ Network.


Adding a printer

Click Add printer in the app header:

  1. Select a printer from the discovery list, or switch to Manual and enter an IP address or hostname
  2. Give it a nickname
  3. Click Add

The printer appears in the header selector immediately. At this point it's online but not yet managed β€” the Bespok3d base layer hasn't been installed yet.


Status indicators

Each printer shows a status dot next to its name:

Dot Meaning
🟒 Green Managed β€” daemon is running and reachable on port 4269
🟑 Yellow Online β€” printer is reachable but the daemon is not running (not yet enrolled, or daemon stopped)
πŸ”΄ Red Offline β€” printer not reachable at the last check
βšͺ Grey Checking β€” status not yet determined
⬜ Muted Deactivated β€” Bespok3d has been soft-disabled on this printer

Status is refreshed every 15 seconds while the app is open. Managed status is saved to disk and restored when you relaunch the app β€” a previously enrolled printer will show as managed immediately on next open.


Enrollment

Enrollment installs the Bespok3d base layer and daemon on your printer. It is a one-time process, and every step is idempotent β€” safe to re-run if anything goes wrong.

See Quick Start for a step-by-step walkthrough.

Retry and resume

If enrollment fails partway through, click Retry from this step on the enrollment screen. You do not need to start over β€” steps that already completed are skipped.

Enrollment history

In Settings β†’ Printers, each managed printer row shows an Enrolled [date] link. Click it to open the full enrollment log β€” every step, its timestamp, and the adapter used. Useful for confirming what version of the base layer is installed or diagnosing issues.


Managing printers

Date fields

Each printer row shows up to three date lines below the connection info:

Line When it appears What it means
Enrolled [date] After first enrollment Original enrollment date β€” clickable, opens the enrollment log
Daemon updated [date] After any subsequent daemon update or re-enrollment When the daemon was last re-deployed
Deactivated [date] While the printer is deactivated When Bespok3d was soft-disabled

The enrolled date is set once and never changes. The daemon-updated date is set on every re-enrollment (firmware recovery, Update daemon) after the first. The deactivated date is cleared when you reactivate.

Nickname and icon

In Settings β†’ Printers, each row shows an editable icon and name. Click the icon area to open the picker: choose an accent colour, upload a custom image, and adjust zoom. Changes are saved immediately.

Deactivating a printer

In Settings β†’ Printers, click Deactivate on any managed printer. Deactivation soft-disables Bespok3d without removing any files:

  • All plugin services are stopped
  • The daemon's autostart hook is removed from S90lmd
  • The bespok3d [include] lines are removed from printer.cfg and moonraker.conf
  • All plugin files and the daemon binary remain on the printer

After deactivation the printer boots normally with no plugins running. A yellow banner appears in the main window with a Reactivate button.

A confirmation dialog appears before deactivating. Check "Don't show again" to skip the dialog in future.

Reactivating a printer

In Settings β†’ Printers (or via the banner in the main window), click Reactivate on a deactivated printer. Reactivation restores everything:

  1. Removes the deactivated marker
  2. Re-inserts the [include] lines into printer.cfg and moonraker.conf
  3. Re-patches the S90lmd boot hook
  4. Starts the daemon
  5. Re-applies all installed plugins via the recovery mechanism

No re-enrollment is required. All your plugins are restored.

Uninstalling Bespok3d from a printer

In Settings β†’ Printers, click Remove Bespok3d on any managed printer. This permanently removes Bespok3d from the printer:

  • All plugins are uninstalled and their config changes reverted
  • All config changes to printer.cfg, moonraker.conf, S90lmd, and nginx are undone
  • The /userdata/bespok3d/ workspace is deleted
  • The printer record is removed from this app

This action cannot be undone. A mandatory confirmation dialog describes what will be removed before you proceed. To use Bespok3d again you will need to re-enroll.

Removing a printer record

In Settings β†’ Printers, click Remove printer (the trash icon) on any row. This removes only the app's local record:

  • Deletes the app's local record of the printer
  • Removes it from the printer selector and all dropdowns

It does not uninstall the Bespok3d base layer or daemon from the printer hardware. The printer keeps running exactly as before. If you re-add the same printer, you can re-enroll it without any manual cleanup.


OTA recovery

Snapmaker firmware updates wipe /home/lava/ (Klipper and Moonraker sources). Plugin files in /userdata/bespok3d/ survive the update, but symlinks into Klipper and Moonraker need to be re-created.

When the app detects a printer that has an enrollment log and installed plugins but no running daemon, it shows a yellow recovery banner at the top of the window.

Recovery flow

  1. Click Recover now in the banner
  2. The enrollment screen opens in recovery mode β€” enter SSH credentials and click Start
  3. Bespok3d re-enrolls the printer from scratch (re-creates the overlay write layer, re-installs the daemon)
  4. Once the daemon is up, all installed plugins are re-applied automatically in dependency order
  5. A results modal shows per-plugin status: recovered, skipped (unmet dependency), or deactivated with reason

Deactivated plugins

If a plugin cannot be re-applied (symlink failure, patch failure, or Klipper does not recover after install), the plugin is deactivated: its files remain in /userdata/bespok3d/usr/local/plugins/ but all symlinks are removed. A deactivated.json file is written to the plugin directory recording the reason. Check the catalog for an updated version.

Dependency ordering

Plugins are re-applied in topological order β€” providers before dependents. If a provider fails, its dependents are skipped (not deactivated) until the provider is fixed. A skipped plugin is shown in the results with "dependency not satisfied" as the reason.


What enrollment installs on the printer

For the Snapmaker U1, enrollment writes the following to persistent storage (all locations survive OTA firmware updates):

Location What it is
/userdata/bespok3d/ Bespok3d workspace root
/userdata/bespok3d/var/lib/demon/ Daemon Python source
/userdata/bespok3d/etc/daemon/server.{crt,key} Daemon TLS certificate and key (unique per printer)
/userdata/bespok3d/auth/acl.json Access control list β€” your GPG public key and bearer token
/userdata/bespok3d/etc/init.d/autostart/s10bespok3d-daemon Daemon autostart entry
/userdata/cfg/wpa_config.conf WiFi credentials backed up to persistent storage
/etc/udev/rules.d/70-wlan0-mac.rules Pins the WiFi MAC address to prevent IP churn

The following overlayfs files are also written (survive reboots as long as debug mode is active):

File What was changed
/etc/init.d/S99bespok3d Added β€” the plugin init dispatcher
/etc/init.d/S90lmd One line inserted delegating to S99bespok3d at boot
/etc/nginx/sites-enabled/fluidd One include line added for plugin location blocks
/etc/wpa_supplicant.conf Symlinked to /userdata/cfg/wpa_config.conf

Klipper and Moonraker config files are extended with [include] directives pointing to Bespok3d's plugin drop-in directories. No existing config is overwritten.

Clone this wiki locally