print-buddy-nightly
Docker app from CatDuck's Repository
Overview
Readme
View on GitHub
Print Buddy
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: orcato 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.
- Copy
.env.exampleto.envand fill in the token, channel/room and allowed users for your chat platform (Discord by default; setPRINT_BUDDY__BOT__PLATFORMfor Telegram or Matrix). - 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. - Set
PRINT_BUDDY_DATAto a persistent directory owned by UID 1000. Spoolman data lives inPRINT_BUDDY_DATA/spoolmanunless you setPRINT_BUDDY_SPOOLMAN_DATA. - 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
- 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.
- 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.
- 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 withvisual_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 setupwalks a fresh install through a saved, resumable checklist (nothing is written without an explicitapply), and/print-buddy debuggingruns 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
Categories
Related apps
Explore more like this
Explore allDetails
ghcr.io/catduckgnaf/print-buddy:nightlyRuntime 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 "python3 /usr/local/bin/print-buddy-healthcheck" --health-interval 30s --health-timeout 10s --health-start-period 90s --health-retries 3
Template configuration
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
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
Print records. Back this up.
- Target
- /data/records
- Default
- /mnt/user/appdata/print-buddy-nightly/records
- Value
- /mnt/user/appdata/print-buddy-nightly/records
Regenerable cache.
- Target
- /data/cache
- Default
- /mnt/user/appdata/print-buddy-nightly/cache
- Value
- /mnt/user/appdata/print-buddy-nightly/cache
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
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
Must be standalone in Docker.
- Target
- PRINT_BUDDY__BOT__MODE
- Default
- standalone
- Value
- standalone
Secret. Leave empty to stage the listener and Spoolman without the Discord bot.
- Target
- DISCORD_BOT_TOKEN
Channel Print Buddy uses.
- Target
- PRINT_BUDDY__DISCORD__CHAT_ID
Discord user IDs allowed to use the bot, comma or space separated.
- Target
- PRINT_BUDDY__DISCORD__ALLOWED_USER_IDS
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
Klipper printers, for example http://printer.example:7125. Fluidd is not needed here.
- Target
- PRINT_BUDDY__SERVICES__MOONRAKER_URL
octoprint.marlin printers only.
- Target
- PRINT_BUDDY__SERVICES__OCTOPRINT_URL
Secret, octoprint.marlin printers only.
- Target
- OCTOPRINT_API_KEY
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
true runs the bundled Spoolman API; false uses the external Spoolman URL.
- Target
- PRINT_BUDDY_BUNDLED_SPOOLMAN
- Default
- true
- Value
- true
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 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