print-buddy-nightly

Docker app from CatDuck's Repository

Overview

Print Buddy NIGHTLY is the development build of Print Buddy in the same ONE container as the stable template: the Discord bot, the Moonraker listener, OrcaSlicer (stable 2.4.2 or alpha 2.5.0-alpha, chosen with PRINT_BUDDY_ORCA_CHANNEL) and the bundled Spoolman API under one supervisor. Print Buddy is the interface; Spoolman's web UI is not included. The Spoolman API listens on 127.0.0.1:8000 inside the container and no port is published. Printers are external services. WHAT NIGHTLY MEANS: the image is rebuilt every night from the newest commit on Print Buddy's main branch that passed the full CI suite, and this template's :nightly tag moves to that build. It passes the same offline container acceptance as a release, but features may be unfinished and settings may change without a release note. There is no fixed digest to verify because the tag floats by design. Prefer the stable print-buddy template for a printer you rely on; run nightly to try current code or to confirm a fix before it ships. This template is separate from the stable one on purpose: it installs as its own container with its own appdata paths under /mnt/user/appdata/print-buddy-nightly, so both can sit side by side. Leave the Discord token empty to stage and validate first: the listener and Spoolman run while the bot stays idle. Never give the nightly and stable bots the same Discord token at the same time.

Print Buddy logo

Print Buddy

CI

Prepare and manage 3D prints from Discord, Telegram or Matrix, with an explicit confirmation before starting a print.

Share a MakerWorld or Printables link, or upload an STL or 3MF. Print Buddy guides you through model preparation, filament choices and slicing with OrcaSlicer. For configured printers, it can submit an approved job through Moonraker and report progress back to your chat.

Get started · Documentation · Contribute · Releases

Is it for your setup?

  • Printers: built-in profiles for Flashforge AD5X, AD5M and AD5M Pro with ZMod, and the Flashforge Creator 5 and Creator 5 Pro with ZMod (four toolheads each), Sovol SV06, Prusa MK4S, CORE One, XL and MINI+ (PrusaLink LAN, opt-in) and Elegoo Neptune 4, 4 Pro, 4 Plus and 4 Max (Moonraker) plus the Centauri Carbon (SDCP LAN, opt-in), plus a generic Klipper/Moonraker adapter. A generic adapter is not a tuned or physically verified profile for every printer. The Bambu Lab A1, A1 mini, P1P, P1S, P2S, X1, X1 Carbon, X1E and H2S are supported for slicing, G-code checks and Bambu packaging, with opt-in LAN status, upload and gated print start; none has been tested on Bambu hardware, and the dual-nozzle H2D, H2D Pro, H2C and X2D are not supported yet. Bambu Lab printers slice with Bambu Studio by default (set printer.slicer: orca to use OrcaSlicer); everything else uses OrcaSlicer. See ZMod printers, Bambu Lab printers, Prusa printers and Elegoo printers.
  • Computers: Raspberry Pi 4 or 5 with 64-bit Raspberry Pi OS, or any 64-bit Debian or Ubuntu machine.
  • Chat platforms: the standalone Python bot runs on Discord, Telegram or Matrix with the same handlers, prompts and safety gates; only the transport changes. The Telegram and Matrix bots are pure bots with no LLM: unmatched text gets the command list, and no LLM setting is consulted for them. On Discord you can instead use the Hermes plugin. Use only one mode with a given bot token. See Discord bot setup, Telegram bot setup and Matrix bot setup.
  • Slicing: requires a compatible OrcaSlicer CLI and the correct printer, process and filament profiles. A Python install alone does not provide a slicer.
  • Offline delivery: vendor profiles can offer Discord file delivery or an offline Bambu package after slicing. Delivery does not authorize printing. Bambu packaging is not verified in Bambu Studio or on hardware. See printer profiles.
  • Optional integrations: Spoolman for filament records, camera checks, timelapses and Obsidian records. Requirements depend on the features you enable.

Get started

Docker

The single-container image ships with 2.1.4 (see #117 and #214); the published 2.1.1 image keeps the older three-container stack. The image is at ghcr.io/catduckgnaf/print-buddy as a multi-arch manifest for linux/amd64 and linux/arm64, built and checked offline by the publish workflow before it is pushed; see Docker for the platform matrix. 2.1.4 also published a slicer-free -light variant; from the next release only the one full image is published (#353).

One container runs the three parts of Print Buddy, started and watched by a supervisor:

Part What it does
Chat bot The interface on the configured platform (Discord, Telegram or Matrix): links, uploads, guided slicing, spool commands and print confirmation
Moonraker listener Follows printer events and reports progress, alerts and timelapses back to the chat
Spoolman API Bundled Spoolman 0.27.0 backend for filament and spool records. Print Buddy is its interface: no Spoolman web UI is included, and the API listens only on 127.0.0.1:8000 inside the container

If any part stops, the container stops so Docker can restart it. The health check covers all three.

  1. Copy .env.example to .env and fill in the token, channel/room and allowed users for your chat platform (Discord by default; set PRINT_BUDDY__BOT__PLATFORM for Telegram or Matrix).
  2. Pin the image by digest, not a tag: set PRINT_BUDDY_IMAGE=ghcr.io/catduckgnaf/print-buddy@sha256:<digest>. The digest will be in the publish run summary and that release's notes.
  3. Set PRINT_BUDDY_DATA to a persistent directory owned by UID 1000. Spoolman data lives in PRINT_BUDDY_DATA/spoolman unless you set PRINT_BUDDY_SPOOLMAN_DATA.
  4. Run docker compose up -d.

Already run your own Spoolman? Set PRINT_BUDDY__SERVICES__SPOOLMAN_URL to it and PRINT_BUDDY_BUNDLED_SPOOLMAN=false in .env. Nothing is migrated either way. Unraid users can start from docker/unraid/print-buddy.xml.

The image also includes:

Item Detail
OrcaSlicer Stable and alpha. PRINT_BUDDY_ORCA_CHANNEL=stable (default) or alpha picks one at startup, no rebuild. Any other value stops the container. Used for Flashforge and Sovol
Bambu Studio Default slicer for every Bambu Lab printer
OpenSCAD For CAD splitting (cad_split.py --execute)

See Docker setup for health checks, upgrades and rollback.

Manual install

  1. Choose a mode: Docker above is the packaged route. For a manual setup, the standalone bot is the direct route without Hermes — on Discord, or on Telegram or Matrix instead — and the Hermes installation is for existing Hermes users. Both require Python 3.11 or newer.
  2. Configure your printer and access: follow the chosen guide, then use configuration to set your printer model, Discord channel and authorized users, service addresses and slicer command. Keep local settings and tokens out of Git.
  3. Check before enabling printing: confirm the selected printer profile, bed dimensions, nozzle, filament and service permissions. Review the guide's checks before starting the bot or listener. The doctor can contact configured services; it is not an offline-only check.

Start with the installation guide, not a production print. Installation and service startup are deliberate actions, not part of reading these docs.

What you can do

  • Prepare models: take links or files through guided choices for colors, fit, supported layouts and slicing. Models that need adjustment can require operator choices; not every shape has a validated automatic placement or cut strategy.
  • Manage filament: use Spoolman and supported IFS integrations to match loaded spools and keep identity and material information consistent.
  • Run approved jobs: confirm bed clearance, work through multi-plate plans and reprint archived jobs using guarded controls.
  • Follow a print: receive configured printer events and timelapses, and keep job records.
  • Camera watchdog — spaghetti detection: while a print runs, Print Buddy checks the printer camera at layer 2, layer 5 and then periodically, and a vision model classifies each frame. Spaghetti, a detached part, an empty bed, a stalled print, an uncertain frame or a failed check posts the camera photo to Discord with Pause and It's fine buttons; tap Pause and the paused post offers Resume and Cancel. The watchdog itself never touches the printer — it only alerts, and every printer action is an operator tap. Tune how readily it alerts with visual_watch.sensitivity, 1 (quietest) to 5 (most alerts, default 3), or switch it off with visual_watch.enabled; both are settable in YAML and as Docker environment variables (PRINT_BUDDY__VISUAL_WATCH__SENSITIVITY, PRINT_BUDDY__VISUAL_WATCH__ENABLED). It needs a camera snapshot (derived from the Moonraker host when unset) and a vision endpoint (services.vision_chat_url; empty disables camera checks). See camera stall sensitivity for what each level changes and Docker for the container setup.
  • Set up and troubleshoot in Discord: /print-buddy setup walks a fresh install through a saved, resumable checklist (nothing is written without an explicit apply), and /print-buddy debugging runs read-only, redacted checks. See guided setup and debugging.
  • Optional Web UI: an off-by-default local status page and picker configuration page for the same YAML settings file. See the Web UI guide.

Printer-specific capabilities and detailed commands are in the project reference. Optional vision and conversational features may use a model; the standalone command and slicing workflow does not require one.

Safety and support boundaries

A fitting bounding box is not proof of a printable orientation. Offline tests are not a live hardware test. Check support needs, bed and brim clearance, profile compatibility and generated G-code before physical use. Keep confirmation and artifact guards enabled. Do not treat an alert or camera classification as a guarantee of safe unattended printing.

Only use models you are allowed to download and process. Never attach private models, credentials or personal printer logs to a public issue without reviewing them first.

Find the right guide

Task Guide
Install and configure Documentation site · Documentation home (source)
Run Print Buddy for two or more printers More than one printer
Set up the bot on Telegram or Matrix Telegram bot setup · Matrix bot setup
Understand commands, settings and integrations Detailed project reference
Report a problem or contribute Contribution guide · Issues
Read shipped changes GitHub releases
Write or review release notes Release-note guide · Internal history

Draft pull requests describe pending work, not installed or released capabilities.

Requirements

Appdata paths owned by UID/GID 1000. Existing Spoolman data can be copied into the Spoolman Data path before first start; nothing is migrated automatically.

Related apps

Explore more like this

Explore all

Details

Repository
ghcr.io/catduckgnaf/print-buddy:nightly
Last Updated2026-10-26
First Seen2026-10-26

Runtime arguments

Network
bridge
Privileged
false
Extra Params
--user 1000:1000 --cap-drop ALL --security-opt no-new-privileges:true --pids-limit 256 --memory 2g --cpus 2 --shm-size 256m --log-driver json-file --log-opt max-size=10m --log-opt max-file=3 --restart unless-stopped --health-cmd &quot;python3 /usr/local/bin/print-buddy-healthcheck&quot; --health-interval 30s --health-timeout 10s --health-start-period 90s --health-retries 3

Template configuration

StatePathrw

Runtime state, prompts, hardware and job records. Back this up.

Target
/data/hermes
Default
/mnt/user/appdata/print-buddy-nightly/hermes
Value
/mnt/user/appdata/print-buddy-nightly/hermes
ArchivePathrw

Sliced jobs and G-code. Back this up.

Target
/data/archive
Default
/mnt/user/appdata/print-buddy-nightly/archive
Value
/mnt/user/appdata/print-buddy-nightly/archive
RecordsPathrw

Print records. Back this up.

Target
/data/records
Default
/mnt/user/appdata/print-buddy-nightly/records
Value
/mnt/user/appdata/print-buddy-nightly/records
CachePathrw

Regenerable cache.

Target
/data/cache
Default
/mnt/user/appdata/print-buddy-nightly/cache
Value
/mnt/user/appdata/print-buddy-nightly/cache
Spoolman dataPathrw

Bundled Spoolman database, config, logs and backups. Back this up.

Target
/data/spoolman
Default
/mnt/user/appdata/print-buddy-nightly/spoolman
Value
/mnt/user/appdata/print-buddy-nightly/spoolman
Settings fileVariable

Leave as is, or point at a mounted YAML file for list settings.

Target
PRINT_BUDDY_CONFIG
Default
/app/config/docker.yaml
Value
/app/config/docker.yaml
Bot modeVariable

Must be standalone in Docker.

Target
PRINT_BUDDY__BOT__MODE
Default
standalone
Value
standalone
Discord bot tokenVariable

Secret. Leave empty to stage the listener and Spoolman without the Discord bot.

Target
DISCORD_BOT_TOKEN
Discord channel IDVariable

Channel Print Buddy uses.

Target
PRINT_BUDDY__DISCORD__CHAT_ID
Allowed user IDsVariable

Discord user IDs allowed to use the bot, comma or space separated.

Target
PRINT_BUDDY__DISCORD__ALLOWED_USER_IDS
Printer modelVariable

flashforge.ad5x, sovol.sv06, klipper.generic or octoprint.marlin.

Target
PRINT_BUDDY__PRINTER__MODEL
Default
flashforge.ad5x|sovol.sv06|klipper.generic|octoprint.marlin
Value
flashforge.ad5x
Moonraker URLVariable

Klipper printers, for example http://printer.example:7125. Fluidd is not needed here.

Target
PRINT_BUDDY__SERVICES__MOONRAKER_URL
OctoPrint URLVariable

octoprint.marlin printers only.

Target
PRINT_BUDDY__SERVICES__OCTOPRINT_URL
OctoPrint API keyVariable

Secret, octoprint.marlin printers only.

Target
OCTOPRINT_API_KEY
Spoolman URLVariable

Bundled Spoolman API by default. To use an existing external Spoolman, set its URL here and set Bundled Spoolman to false; nothing is migrated.

Target
PRINT_BUDDY__SERVICES__SPOOLMAN_URL
Default
http://127.0.0.1:8000
Value
http://127.0.0.1:8000
Bundled SpoolmanVariable

true runs the bundled Spoolman API; false uses the external Spoolman URL.

Target
PRINT_BUDDY_BUNDLED_SPOOLMAN
Default
true
Value
true
OrcaSlicer channelVariable

Bundled OrcaSlicer channel selected at startup: stable (default) or alpha. Any other value stops the container at startup.

Target
PRINT_BUDDY_ORCA_CHANNEL
Default
stable
Value
stable
Container timezoneVariable

Container timezone, an IANA name such as UTC. Print Buddy schedules use the discord.timezone setting; TZ covers container logs, the OS clock and the bundled Spoolman.

Target
TZ
Default
UTC
Value
UTC