Skip to content

Releases: catduckgnaf/print-handy

Print Handy 2.1.7

Choose a tag to compare

@catduckgnaf catduckgnaf released this 28 Oct 02:56
14ce57a

Print Handy 2.1.7

The first release under the new name. One Docker image for amd64 + arm64: ghcr.io/catduckgnaf/print-handy:2.1.7 (digest: sha256:2e84b255190efa74bef3d375fb049b5e072d203b629626396d5e7747f5936e95).

Upgrading from Print Buddy? Read this first. The rename is a clean break. The image, the PRINT_BUDDY__… environment variables, the state file names, the systemd units, the /print-buddy command group and the ZMod plugin name all changed, and the old names are not read. Follow docs/RENAME-MIGRATION.md (scripts/migrate-names.sh does the file and variable renames). The old ghcr.io/catduckgnaf/print-buddy image stays frozen at 2.1.6. Unraid: install the new print-handy template (one template; pick the latest or nightly tag) and remove the old app once the new one is healthy.

What you can do

Follow every printer family's prints

  • Prints started on Prusa, Elegoo Centauri (SDCP), Bambu Lab and stock-firmware Flashforge printers now get start, pause and completion posts, the same as Moonraker printers (#470, #447, #451).
  • Completion timelapses for Prusa (a camera registered with PrusaLink), Bambu Lab (A1/P1 stills camera; X1 through go2rtc) and stock Flashforge (camera accessory) when [timelapse] capture_enabled is on (#447, #453, #454). Elegoo SDCP has no verified camera endpoint yet, so its posts carry no video.
  • On Telegram and Matrix, timelapses are sized to that platform's own upload limit instead of Discord's.

Prepare models from more places

  • Thingiverse links work through Thingiverse's official API (needs a Thingiverse app token) (#469).
  • MyMiniFactory links are checked for their file inventory; downloading isn't supported yet, and the bot says so (#482).
  • Printables models whose files have no usable geometry are refused with a clear reason instead of failing later (#469).

More printers with built-in profiles

  • Qidi Q1 Pro, X-Plus 3, X-Max 3 and X-Smart 3, and Creality's Klipper line (Ender-3 V3, V3 KE, V3 Plus, K1, K1C, K1 Max), with per-model sizes and slicer templates (#463).
  • Built-in OctoPrint presets for the Ender-3, Ender-3 Pro, Ender-3 V2 and Ender-3 V3 SE (#465).

Manage filament

  • /spool is now guided with buttons: bare /spool, an incomplete /spool new or /spool change, and plain requests like "add new filament" or "swap the filament" start the same button flow, no LLM needed. The complete typed forms work exactly as before (#479).
  • A spool added directly in Spoolman now gets a one-time Discord prompt: Load into a slot, Leave on the shelf or Dismiss. Loading walks through the slot, what happens to the spool already there, and one confirmation. Spools Print Handy creates itself are never prompted, archived spools aren't mistaken for new ones, and a prompt lost to a chat outage is retried (#493, #497).
  • A runout pause is classified from the head sensor and slot state, and the post offers reload and resume (#452).

Chat

  • Discord can run as a pure bot: set discord.chat_llm_enabled: false (PRINT_HANDY__DISCORD__CHAT_LLM_ENABLED=false) and unmatched text gets the command list instead of going to a model, while [llm] stays available for /print-design (#473).
  • Failure and refusal posts are written in plain language and say what to do next (#474).
  • Typing print 42 reprints job 42, like /print-again (#449).
  • The camera watchdog never posts a dark camera frame as a print alert, and its alerts carry a Stop asking for this print button (#480).

Diagnose problems

  • /print-handy debug on (or the Web UI status page) captures DEBUG logs from the bot and the listener for 30 minutes, with no restart. When it ends, a sanitized log export arrives in chat, ready to attach to an issue. Nothing is uploaded anywhere (#481).
  • logging.level, logging.format (text or json) and logging.file control logging. Slicer runs log their exit code and time, and credentials are redacted from every log line and traceback.

Fixes

  • The camera watchdog no longer posts false print alerts on installs with no vision endpoint configured (including no-LLM installs): it now stays off unless a vision endpoint is set (#499).
  • Multi-copy jobs quote the time and filament for all copies, not one (#456).
  • Bambu Studio filament totals are read from the 3MF header, and Bambu Studio output is recognised by the G-code guard (#448, #441).
  • A print that ends at the printer while paused now posts its cancelled notice, and stale Resume/Cancel buttons are retired.
  • Unraid: the WebUI link works (Web UI port 8088, not 8080), and the bundled Spoolman API can be opted onto the LAN (#445, #439).
  • Matrix print confirmations register under the live session (#429).

Upgrade and compatibility

  • Rename: see the box at the top. Nothing migrates automatically.
  • Unraid: one print-handy template with a latest/nightly tag choice. The Print Buddy templates are deprecated.
  • Rollback: the 2.1.6 image (ghcr.io/catduckgnaf/print-buddy:2.1.6) and tag are untouched, but rolling back means the old names again.

Technical details

Verification and known limitations

  • Automated: the offline suite on Python 3.12 and 3.14, the real-slicer legs (OrcaSlicer stable and alpha, Bambu Studio), Spoolman, the standalone no-Hermes leg and the docker static checks all pass on the release commit. Each image leg passes offline container acceptance before it is pushed.
  • Not verified on live hardware: the new Prusa, Elegoo SDCP, Bambu and stock Flashforge monitors and timelapses, and the Qidi and Creality profiles. They are pinned by offline tests only. The printer support guide (docs/PRINTER-SUPPORT.md) explains how to confirm a printer and report it.
  • Not tested live on Telegram or Matrix: the platform-sized timelapses.

Print Buddy 2.1.6

Choose a tag to compare

@catduckgnaf catduckgnaf released this 27 Oct 16:38
2189e8b

Print Buddy 2.1.6

One full Docker image for amd64 + arm64. This release finishes two big arcs — the diagnostics overhaul and the AI design feature — and fixes the 2.1.5 Bambu listener start failure. If you run a Bambu printer on 2.1.5, update: the Bambu listener never started in that release (#409).

Fixed: the Bambu listener never started in 2.1.5 (#409)

In 2.1.5 the Bambu listener died at startup on an import error, the adapter came up with no vendor, and the container stayed unhealthy — Bambu printers simply never connected. The listener entry point now imports the package the same way the rest of the app does and checks the adapter transport before launching (#415, #420).

Cancel a print from the pending spool question (#414)

When a filament runout paused a print and the spool question was open, there was no way to cancel: the question's buttons were Same / Existing / New spool, and typing "Cancel the print" was rejected as a non-answer while usage accounting stayed frozen for every spool. The spool question now carries a Cancel print button, and an unambiguous typed reply ("cancel the print", "stop the print") routes to the same cancel path as /print-stop. The question closes only once the print is actually over, reminders stop, and usage is settled exactly as for any cancelled print; if the printer refuses the cancel, the bot says so and the question stays open and answerable.

Diagnostics overhaul (#390)

Failures now explain themselves, in Discord and in the logs:

  • A consistent error taxonomy with stable, greppable markers. Failure posts and log lines carry a classified PB_<SUBSYSTEM>_<CATEGORY> marker, so a support conversation can start from one searchable string. The generic Discord action-handler failure posts (colour selection, next plate, stop, resume, print again, restart, alert buttons) all route through one helper that posts the operator detail plus the likely cause and remedy (#403, #421).
  • Discord messages meet one bar: what failed, the most likely cause, and what the operator can do about it — no bare exception text, no silent drops (#405).
  • A diagnostics bundle for bug reports. A bot command (and CLI) assembles versions, image digest, a redacted config summary (secrets never included — env names only), printer/roster summary, doctor output, and a bounded tail of recent logs, ready to attach to a GitHub issue; the repo's issue forms ask for it (#407).
  • Structured logging, consistently: per-subsystem log levels, printer_id bound to every record in multi-printer setups, a documented way to raise one subsystem's verbosity, and a supervisor that names the child that exited and why (#408).
  • Doctor tripwires: bot check / the doctor gained named rows (logging writability, listener heartbeats, and the surfaces stages 1–2 added) with remedies, and Web UI status equivalents where one exists (#410).

AI design with OpenSCAD is complete (#388)

The /print-design feature shipped its remaining stages: the create loop, editing with natural-language routing, the Web UI designs catalog, and the close-out — a /design alias, Telegram/Matrix entry points, and automatic enablement when a design endpoint is configured. When design is not set up, natural-language design triggers now answer "not set up" instead of failing obscurely (#393, #400, #419, #422, #426).

More fixes

  • Fail-soft state readers survive malformed timestamps (#404). Readers for recent links, print alert buttons, and print-next state could crash on a stored timestamp that parses but is malformed; they now treat it the way they treat missing data instead of raising into a print path (#418).
  • Matrix message-ordering flake fixed (#416). The Matrix adapter could post a prompt's close-out note after the flow it was unblocking had already sent its next message, occasionally flipping the visible order; the answer note is now posted before the prompt is resolved (#423).
  • Camera watchdog reads from the go2rtc fan-out (#424). While go2rtc runs, the Moonraker visual watchdog now fetches stills through the fan-out instead of pulling the camera a second time (#311).

Test expansion (#391)

The suite grew where it was thin: regression tests for shipped fixes that lacked them (startup-retry classification branches, platform-disable detection variants, the one-roast-per-print fail-soft paths, timelapse media-refusal fallbacks), failure-path coverage for uploads (Bambu FTPS, OctoPrint, and PrusaLink timeouts mid-transfer), and a three-family multi-printer cross-product suite (Bambu LAN + Moonraker + OctoPrint sharing routing and Spoolman without cross-contaminating state). tests/README.md now carries a maintained coverage map of which suites pin which subsystems (#406, #411, #413).

Housekeeping

  • The shipped Unraid template now references the published image correctly (#412), and the README's Bambu support list matches what actually ships (H2 family + A2L) (#417).
  • The post-release surfaces check (#394) runs for this release as for 2.1.5: a checklist issue covering docs, the Pages site, the wiki, README/About, these notes, and the CA templates opens automatically.

Image: ghcr.io/catduckgnaf/print-buddy:2.1.6 (also :latest), digest sha256:a18f67c6551a488175abd1ccbf53dd400ee8284a9878ce5bd28f76b41e103d56, built from tag 2.1.6 on commit 2189e8bbc49fed25063a0cc0e299edeea619e3a5 (revision label verified on both the amd64 and arm64 configs). Candidate run: https://github.com/catduckgnaf/print-buddy/actions/runs/40540415525 — publish run: https://github.com/catduckgnaf/print-buddy/actions/runs/40541540278.

Print Buddy 2.1.5

Choose a tag to compare

@catduckgnaf catduckgnaf released this 27 Oct 02:39
961ea0a

Print Buddy 2.1.5

One full Docker image for amd64 + arm64 — the -light variant is gone. This release is mostly about failures that used to be silent becoming loud, and about finishing several multi-part features (multi-printer, in-container timelapse, live camera).

Reliability: no more silent failures

  • Moonraker timelapses can no longer vanish quietly (#373). If a printer-rendered timelapse is not attached to the completion post, the post now says why. A restart during the render wait re-drives the retrieval instead of abandoning the video.
  • Discord platform tripwire (#384). If the Hermes profile has the Discord platform explicitly disabled, bot check, the post-update doctor, and the Web UI status page now name it as a problem with the remedy — instead of intake silently not existing.
  • Spoolman can never block a print again (#387). Every Spoolman call routes through one best-effort client: an outage (connection refused, timeout, HTTP error) logs a warning and the slice/print proceeds on the slot data on hand, with usage recorded as pending. A contract test fails CI if a future call site bypasses the wrapper. A live Spoolman answer that contradicts the slot record (archived spool, different material) still refuses a launch — that is data, not an outage.
  • Paused-print prompt fix (#370). A print that ends at the printer while paused now posts its terminal message and retires the stale Resume/Cancel prompt.
  • Bot startup retries transient Discord failures instead of dying on the first one (#364).

Discord access is the channel by default (#386)

Anyone who can post in the configured print channel can use the bot — the channel is the access boundary. ALLOWED_USER_IDS is now an opt-in whitelist, and a new DENIED_USER_IDS excludes specific users in any mode (a deny beats everything, including the approver). Refusals are never silent: an INFO log with the reason, and one in-channel notice per user per hour. Approvals still require APPROVAL_USER_ID, and the live camera allowlist is unchanged. Startup logs the access mode. One operational rule is now documented: one bot token, one running instance per channel.

Print records are JSON files now

Per-print records are written as JSON in the data folder (/data/records/Prints/print-NNNN.json): title, G-code file, printer, start/finish, outcome (completed/failed/cancelled), filament and spool — made for looking past prints up later with jq or grep. The Obsidian Markdown note write is retired; existing notes are left untouched.

New and finished features

  • Live camera in Discord (#311): the /print-live command and in-Discord Activity are complete, with the supervised Activity service and operator guide.
  • Multi-printer support, stages 2a–2e: a [[printers]] roster with per-printer state, channel→printer routing, per-printer listener instances (supervisor + healthcheck), and the setup/Web UI surfaces.
  • In-container timelapse (#246): frame capture, encoder selection (CPU by default, optional hardware GPU encoding), assembly and delivery; listener timelapses are sized to the configured platform's upload limit. ffmpeg is pinned in the shipped image.
  • Completion posts for more printers: an OctoPrint launched-print monitor now posts completions with the rendered timelapse, and stock-firmware AD5X prints get timelapses via a launched-print monitor.
  • OrcaSlicer v2.5.0-alpha is the pinned slicer (packed preset-cache reader + profile identity migration), adding the Bambu Lab H2C and A2L; operator filament presets can be imported as checked profiles.
  • Web UI: browser login with session cookies, and the picker configuration page.
  • Per-toolhead colour questions for multi-tool printers; the vision.roast_enabled switch (on by default when a vision endpoint is available, one roast per print); firmware macro registry growth from verified evidence; Print Buddy branding assets.

Housekeeping

  • The -light image variant is removed completely; 2.1.4 was the last release with -light tags. One full image is published for amd64 + arm64.
  • Docs: the stock Elegoo Neptune Moonraker endpoint is documented as direct :7125; the Web UI browser login is documented.
  • A post-release surfaces check workflow now reviews each release's merged PRs against docs, wiki, the Pages site, README, About, and the CA templates (#394).

Image: ghcr.io/catduckgnaf/print-buddy:2.1.5 (also :latest), built from tag 2.1.5 on commit 961ea0a11775e9774c7cfa8af417bf8199435a22.

Release provenance

The 2.1.5 tag was initially placed on commit 4dce7670ea4c8d6493f6a79dc26dae702a566b62, and the first candidate build from it failed the offline acceptance gate — nothing was published from that tree (no image was pushed and no release was created). The failure had four causes: two genuine Dockerfile defects (an amd64-only VAAPI driver package broke the arm64 build, and the image's global library path let OrcaSlicer's bundled FFmpeg libraries shadow the system ffmpeg, breaking it at runtime), plus two defects in the acceptance harness itself (a probe that ran the slicer from an unwritable working directory, and a listener check that still polled a legacy heartbeat path). PR #399 fixed all four. Per the maintainer's decision, the tag was then re-pointed to the fixed tree, commit 961ea0a11775e9774c7cfa8af417bf8199435a22, and the candidate and publish runs were re-executed from the tag — so the published image, verified by its revision label, is built from 961ea0a, the commit the tag now names.

Print Buddy 2.1.4

Choose a tag to compare

@catduckgnaf catduckgnaf released this 26 Oct 17:51
c729a24

Print Buddy 2.1.4

Print Buddy 2.1.4 is a large feature release on top of 2.1.3: every single-nozzle Bambu Lab printer plus the dual-nozzle H2 family, PrusaLink printers, and every ZMod Flashforge model are now supported; the standalone bot also runs on Telegram and Matrix; and this is the first release published as multi-arch (amd64 + arm64) images with a slicer-free -light variant.

New printer support

  • Bambu Lab — every single-nozzle model (#127 Stage 1, PR #247): A1 mini, P1P, X1, X1C, X1E, P2S and H2S join the A1 and P1S, with identities pinned to the checked OrcaSlicer profiles.
  • Bambu Lab — dual-nozzle H2D, H2D Pro and X2D (#308, PR #330): real AMS mapping at print start — both ams_mapping forms, reconciled use_ams, and per-job submission IDs. The AMS itself is now read, not just written: tray state is decoded from the status snapshot into colour/fit and Spoolman matching (#307, PR #327), and HMS / print-error codes are decoded into plain status and readiness messages (#306, PR #318).
  • Bambu Lab — material-aware filament profiles (#264 phase 1, PR #265): the A1 slices with Generic PLA/PETG/TPU/PVA and the P1S with checked Bambu profiles instead of everything going through Generic PLA.
  • Bambu Lab — camera parity (#294, PR #323): the A1/P1 camera image appears in status and completion posts like the Moonraker snapshot path, and the visual watchdog covers Bambu cameras (X1 stills remain on the go2rtc path).
  • Prusa — PrusaLink LAN support (#242, PR #251): MK4S, CORE One, XL and MINI+ over PrusaLink.
  • Flashforge ZMod — every model (#301): AD5M and AD5M Pro (PR #310), and the Creator 5 / Creator 5 Pro as four-toolhead models — tools are modelled as tools, never as IFS slots (PR #325). The AD5X remains supported as before.

New features

  • The standalone bot now runs on Telegram and Matrix (#164): a platform interface with Discord behind it (PR #249), the Telegram platform (PR #258) and the Matrix platform (PR #260). No Hermes required on any platform; the LLM stays optional for natural language.
  • Optional Web UI — status and settings foundation (#286): a settings catalog with provenance and validated YAML write-back (PR #296), a read-only status server (snapshot page, /api/status, /healthz; PR #316) that runs in the container and is wired into the Unraid template (PR #331), timelapse and camera/image fields in the catalog (PR #326), and a Web UI guide (PR #339). The picker configuration page is not in this release.
  • Printer macros (#291): /print-macros lists the macros your Moonraker/Klipper printer actually exposes, discovered live (PR #302), and a macro can be run from the bot behind the guarded confirmation flow (PR #324).
  • Listener registry (#299 Stage A, PR #320; #298 Stage 3, PR #332): listeners are now per connection domain instead of one Moonraker-shaped path — the long-lived Bambu LAN MQTT listener is the second domain, which is also the architecture multi-printer support builds on.
  • Better fit (#221): reorientation beyond solo split plates (R3, PR #244) and diagonal bed turns (PR #255) — more models fit at 100% on one plate.
  • Timelapse extras (#317): a native 9:16 vertical short is produced alongside the timelapse (PR #329), and per-print event markers are recorded now so blooper reels can be built from them later (PR #328).
  • Live-stream groundwork (#311 Stages 1–2, PR #319): camera sources are derived for Moonraker/Fluidd/Mainsail and OctoPrint with a codec-aware encoder plan. This is plumbing for the future Discord live camera, not a live feature yet.
  • Multi-printer households — guidance (#257): a multi-instance recipe for running one instance per printer today (PR #292), and the Stage 2 design spike for true multi-printer support is written (PR #338). One instance still serves one printer in this release.

Fixes

  • Bambu LAN reliability batch (from live A1 use): a LAN print start is confirmed over a polling window instead of one snapshot (#271, PR #285); Print Next reads the adapter's live status for Bambu LAN and OctoPrint instead of a Moonraker query (#269, PR #278); stopping a Bambu LAN print goes through the adapter instead of a Moonraker cancel (#276, PR #280); handoff packages carry plate thumbnails and the support threshold angle (#275, PR #283); single-slot printers hash colour decisions so the post-slice check passes (#268, PR #277); single-extruder intake offers the configured spool as slot 1 (#263, PR #267).
  • Intake summaries name your actual printer (#273, PR #279) instead of a hard-coded AD5X.
  • Oversized packages say so (#272, PR #284): delivery reports when a package exceeds the Discord upload limit instead of offering a send that then fails.
  • Settings from the environment: PRINT_BUDDY__DELIVERY__METHODS is accepted like every other setting (#270, PR #282).
  • ZMod plugin: the plugin config is renamed to print-buddy.cfg so ENABLE_PLUGIN works (#289, PR #293).
  • Docker: the Moonraker listener now starts only for Moonraker connections, so non-Moonraker instances no longer restart-loop (#256, PR #259).

Container and Docker

  • Multi-arch + light publishing (#192, PR #245): the publish workflow builds amd64 and arm64, full and slicer-free -light, and publishes by digest under multi-arch manifests. 2.1.4 is the first release published this way; the 2.1.1–2.1.3 single-arch tags are unchanged and are never republished.
  • Nightly channel (PR #305): the nightly branch promotes to :nightly / :nightly-light GHCR tags.
  • Deployment files: the feature-enabling variables are exposed in Compose and the Unraid template (#252, PR #254), and push-by-digest uses the docker-container buildx driver it requires (#313, PR #313).

Docs

  • The README links the GitHub Pages documentation site (PR #321); a Docker + Bambu A1 walkthrough goes from the published image to a first print (PR #281); the stock Neptune Moonraker address is corrected to port 80 (PR #322); pairing with ZMod's moonraker-telegram-bot is documented (PR #309); the MakerWorld account token is documented (PR #266); the README platform story and docs index are complete (PR #297); the camera watchdog is advertised in the Docker/YAML config docs (PR #250).

Upgrade and compatibility

  • No configuration migration is required: existing configurations load unchanged, and every new capability above is opt-in or additive (Web UI off by default, Telegram/Matrix only when configured as the bot platform).
  • Published 2.1.1, 2.1.2 and 2.1.3 images and tags are unchanged.

Verification and known limitations

  • Cut from main @ a46f043 — CI run 40365377787 SUCCESS on that exact head. The version-bump squash merge c729a24 carries tag 2.1.4; the publish workflow's candidate run 40370510659 (publish=false, dispatched from the tag) passed all four build legs with offline runtime acceptance before publish run 40371485909 pushed anything.
  • Publish provenance: the first publish (run 40369070616, digests e2725c92…/fe253654…) was built from a main checkout that had raced ahead of the tag and was replaced by this from-the-tag rebuild — the digests below are the from-the-tag ones, verified anonymously against GHCR, and their image revision label matches the tag commit exactly.
  • Live hardware evidence in this release is the Bambu A1 LAN path (Docker, LAN Only + Developer Mode). The other new Bambu models, the dual-nozzle H2 family, PrusaLink models and the Creator 5 / 5 Pro rest on offline/fixture evidence and checked upstream profiles — treat a first print on a new model as a test print you watch.
  • Not in this release (still in flight): the Web UI picker configuration page and browser login, the Discord live-camera stages beyond the core, go2rtc container capture (#246 Stage 1), macro registry growth, and Bambu H2C / A2L (no profile in the pinned OrcaSlicer 2.4.2 index).

Image

  • ghcr.io/catduckgnaf/print-buddy:2.1.4 (plus :latest, :2.1.4-light, :latest-light)
  • Digest: sha256:633f15493dbd93ed3ccefe7c79db0fd3c947c5533a4e291a620fe6a58d13a932 (:2.1.4 and :latest); light sha256:32e76c433ec5e00aa4596bfba60e331c9936eba9c2bc17165711bad7bccf7bec (:2.1.4-light and :latest-light) — all verified anonymously via GHCR.
  • Source commit: c729a24e7ae3d172f4973e23e3b2b1c7cbc0f178 — the squash merge of the release/2.1.4 bump PR onto a46f043, carrying tag 2.1.4; the images' org.opencontainers.image.revision label matches it exactly.
  • Publish run: 40371485909 (candidate run 40370510659, publish=false, SUCCESS first) — both dispatched from the 2.1.4 tag.
  • 2.1.3 (sha256:da73faf9f77afb80125a7b81d469e1bc4d970cb8940a7500e8ee555e803cafc5), 2.1.2 and 2.1.1 images/tags are unchanged.

Print Buddy 2.1.3

Choose a tag to compare

@catduckgnaf catduckgnaf released this 26 Oct 02:37
0aab883

Print Buddy 2.1.3 — two fixes on top of 2.1.2, shipped at catduck's direction as a single release.

Fixes

  • #236 (PR #239): runtime image now installs curl and jq. The 2.1.2 combined runtime image sliced a native print but could not upload it, because the shipped bin/moonrakerctl needs curl (Moonraker G-code upload) and jq, and the Dockerfile runtime stage installed neither. Uploads failed with curl: command not found while the bot misleadingly reported the printer was not ready. A Docker contract test now guards the wrapper/runtime dependency so this cannot regress silently.
  • #235 (PRs #240 + #238): Spoolman can only warn, never block slicing or a print. Spoolman lookup failures first became warnings instead of fatal hardware-check failures (#240). The fuller fix (#238) makes every Spoolman outcome warning-only — unreachable, timeout, HTTP error, missing/archived record, or a name/material mismatch — adds a settings-based spoolman_url() resolver (services.spoolman_url / PRINT_BUDDY__SERVICES__SPOOLMAN_URL wins over the mutable printer_hardware.json cache), and guards the Spoolman fetch in the Orca slicing path so it proceeds on the recorded spool state. Independent printer readiness failures remain fatal.

Image

  • ghcr.io/catduckgnaf/print-buddy:2.1.3
  • Digest: sha256:da73faf9f77afb80125a7b81d469e1bc4d970cb8940a7500e8ee555e803cafc5
  • Source commit: 0aab883de700f278377df3dac9fbdff321a18ebc (tag 2.1.3; moved from the version-bump commit df27040 at catduck's direction because PR #238 merged after PR #241 — see the audit note on PR #241)
  • Publish run: https://github.com/catduckgnaf/print-buddy/actions/runs/40259432313 (candidate run 40258969189, publish=false, also SUCCESS; full offline runtime acceptance passed on both)
  • 2.1.2 (sha256:b3810664084369362b9114df616ad537fda0bb7f8fa3d78c1060de565c4236ae) and 2.1.1 images/tags are unchanged.

Print Buddy 2.1.2

Choose a tag to compare

@catduckgnaf catduckgnaf released this 26 Oct 00:42
e0e5010

What you can do

Run Print Buddy as one Docker container

  • One container runs everything. The Discord bot, the Moonraker listener, the bundled Spoolman API and OrcaSlicer now run together in a single supervised container (#225, #214). Install one Unraid DockerMan template (docker/unraid/print-buddy.xml) or one Compose service (combined) instead of three.
  • If any required part stops, the container stops so Docker can restart it. The health check covers the bot, the listener and Spoolman.
  • Leave DISCORD_BOT_TOKEN empty to stage the install: the listener and Spoolman run while the bot stays idle, so you can validate before cutover without a duplicate Discord consumer.
  • Spoolman is built in. Filament and spool records live in the bundled Spoolman 0.27.0 API backend (no web UI; Print Buddy is the interface) on their own persistent path, /data/spoolman. Existing Spoolman databases migrate forward on startup. Already run your own Spoolman? Point PRINT_BUDDY__SERVICES__SPOOLMAN_URL at it and set PRINT_BUDDY_BUNDLED_SPOOLMAN=false; nothing is migrated either way.
  • OrcaSlicer is prebuilt-only. Both channels install pinned official releases, verified by SHA-256 at build time: stable 2.4.2 and alpha 2.5.0-alpha. Pick at startup with PRINT_BUDDY_ORCA_CHANNEL=stable (default) or alpha. OrcaSlicer is never compiled from source.
  • The 2.1.2 image is published to ghcr.io/catduckgnaf/print-buddy (amd64) from this release tag. Pin it by digest: ghcr.io/catduckgnaf/print-buddy@sha256:b3810664084369362b9114df616ad537fda0bb7f8fa3d78c1060de565c4236ae (publish run https://github.com/catduckgnaf/print-buddy/actions/runs/40250181754).

Upgrade and compatibility

  • Breaking (Docker only): the three 2.1.1 containers/templates are replaced by one. Stop the old bot, listener and Spoolman containers first, map your existing Spoolman data to the new container's /data/spoolman path, and never run old and new Discord consumers at the same time. Rollback is redeploying the published 2.1.1 image and its three templates; there is no automatic Spoolman database downgrade.
  • No configuration changes are required for non-Docker installs.
  • Light installer: install-light.sh --ref 2.1.2.

2.1.1

Choose a tag to compare

@catduckgnaf catduckgnaf released this 25 Oct 17:18
bd21489

What you can do

Use a Flashforge AD5X on stock firmware

  • New printer route: Flashforge stock firmware (AD5X). Pick it in the installer, or set printer.model: flashforge_stock.ad5x. Status, filament bay occupancy, upload, and print start go through the printer's stock LAN API. No Moonraker or ZMod needed (#211, #208).
  • A print start is refused when the selected bay has no filament or its state is unknown. A heating or pausing printer is treated as busy, not idle.
  • ZMod and Klipper start code (START_PRINT, PRINT_START) is refused before anything is sent to a stock printer.
  • The serial and check code are stored as the AD5X_SERIAL and AD5X_CHECK_CODE secrets, not as settings.
  • Not yet tested on a real printer. This route is covered by offline tests against a fake printer API only.

Slice with Flash Studio (optional)

  • If you already have Flash Studio installed, set [slicer] flash_studio_path to its executable and Print Buddy uses it for that run. A missing or broken path is an error, never a silent switch back to OrcaSlicer. With the setting empty, OrcaSlicer stays the default (#211).
  • Print Buddy never downloads, bundles, or redistributes Flash Studio. See Flash Studio.

Run in Docker

  • The Docker image now uses the official OrcaSlicer 2.4.2 Linux release, pinned and checked by SHA-256 at build time, instead of compiling OrcaSlicer from source (#210, #117). The candidate image built, sliced a test model headless, and passed the offline runtime and persistence checks.
  • The 2.1.1 image is published to ghcr.io/catduckgnaf/print-buddy (amd64) from this release tag. Pin it by digest: ghcr.io/catduckgnaf/print-buddy@sha256:1a958282f0451be748c76c5102c982ea358ed8b02f4fe4eede549de8a1c86488 (publish run).

Upgrade and compatibility

  • No configuration changes are required. The stock Flashforge route and Flash Studio are off unless you select or configure them.
  • Light installer: install-light.sh --ref 2.1.1.

2.1.0

Choose a tag to compare

@catduckgnaf catduckgnaf released this 25 Oct 14:08
c2eee79

What you can do

Use a Bambu Lab printer

  • P1S is now supported offline alongside the A1: slice, check the G-code, package. Pick it in the installer under Bambu Lab, or set printer.model: bambulab.p1s (#184).

  • LAN connection, opt in (not yet tested on a real printer). Set [bambu] lan_host and lan_serial, and supply the printer's LAN access code as an environment secret. Three staged pieces ship:

    • read-only telemetry over LAN MQTT for the health check: state, progress, temperatures, remaining time (#197);
    • FTPS upload of a .gcode.3mf, with a size readback to confirm it arrived (#198);
    • guarded print start through the configured delivery method, only after the existing slice and G-code checks pass (#199).

    None of this has been run against a real Bambu printer. Without LAN settings, Bambu printers behave exactly as in 2.0.9 (offline only).

  • The research behind the LAN plan, including firmware requirements (LAN Mode and Developer Mode), ports, and licences of reused clients, is in Bambu connectivity (#195).

Prepare models

  • Huge models no longer hang the model check. A 1,057,040-triangle model that sat in the audit for 15+ minutes now finishes. Print Buddy also says up front when a large model will take a minute or two (#188).
  • Faster 3MF intake. Bounds and volume checks are about 2x faster as measured. The 3MF reader takes a guarded fast path only for plain files and falls back to the existing reader for anything unusual (#196).

Fixes

  • Split and scale offers now check every part at full size. Before, Print Buddy could offer a split or a scale percentage based only on bounding-box math, even when one part could never fit the plate at 100%. It now checks each part (with rotation, against the printer's real height limit). If a part can't fit alone, no split is offered and you're told which part blocks and why (#191, #76).
  • Flat or zero-volume meshes are refused at intake. A degenerate STL used to pass intake and start. It's now refused before any question, slice, or printer action (#190, #194).
  • Thin print-in-place models slice. Models such as the Flexy Ring failed in both OrcaSlicer and the Bambu Studio fallback. They now slice with the Arachne wall generator, and G-code checks accept Orca's width metadata on those layers (#189).
  • An expired or cancelled Resume prompt now records the job as failed or cancelled and says so, instead of escaping the handler (#190).
  • A model-check worker that dies without output now says so instead of failed: . (#188).
  • A multi-plate fit check that could not read a plate now fails clearly instead of reporting that one copy fits (#204).

Upgrade and compatibility

  • No configuration changes are required. Bambu LAN features are off unless you add the [bambu] LAN settings.
  • Docker is not part of 2.1.0. No image has been published; Docker is planned for 2.1.1 (#117). Use the light installer: install-light.sh --ref 2.1.0.

Technical details and contributors

  • Discord flow corpus recovered with timing tooling and a CI timing gate (three-run medians against a reviewed baseline; baseline increases need a written reason) (#190).
  • Test hangs fixed: the corpus harness caps unanswered prompts, and home updater tests use a small smoke suite instead of nesting the whole suite (#190, #196).
  • Issue forms and an issue filing policy in CONTRIBUTING.md (#193).
  • Docker build fixes and docs kept for 2.1.1 (#185, #186).
  • Discord bot setup guide expanded: supported configuration, overrides, offline check, first launch, health and recovery (#203, #161).
  • README and Docker docs corrected to say no 2.1.0 Docker image exists (#202).
  • CI jobs now run in Debian 13 containers, matching the planned 2.1.1 Docker base; real-slicer jobs stay on Ubuntu runners (#200).
  • A manually dispatched 171-model corpus workflow runs the full Discord flow against an external model set; its first full run passed all six shards (#201).
  • Contributor: @catduckgnaf.

Verification and known limitations

  • Offline tests, real-slicer (OrcaSlicer stable and alpha), Spoolman, standalone-without-Hermes, arm64 light install, and Discord timing CI jobs: see the CI run on the tagged commit.
  • Bambu LAN telemetry, upload, and print start were tested only against fake MQTT/FTPS clients. They are not verified on a real printer.
  • No live printer verification is claimed for this release.
  • A local 16-model stress set (real models, not redistributable) passed the mock Discord flow on both transports. A real OrcaSlicer pass through the Discord flow then sliced 15 of those models with 0 failures (1,048 s total). The 16th, a 287 MB mesh, was left out of the real-slicer pass to protect host memory (see next item).
  • Very large single meshes use a lot of memory during intake: a 46.8 MB 3MF that expands to a 287 MB mesh peaked at about 7.5 GB. Bounds are tracked in #205 for 2.1.1.
  • STL files under 10 mm on every side are still assumed to be inches and scaled 25.4x; the print summary says so. Confirming units is tracked in #206.
  • Multi-color, negative-volume, and non-square-bed paths are not validated beyond the AD5X and single-filament Bambu A1 routes (#76, #127).

2.0.9

Choose a tag to compare

@catduckgnaf catduckgnaf released this 25 Oct 02:20

2.0.9 (2026-10-24)

New

  • One-line install for Raspberry Pi and Debian/Ubuntu. Run
    curl -fsSL https://raw.githubusercontent.com/catduckgnaf/print-buddy/main/scripts/install-light.sh | bash
    and answer a few questions:

    • printer brand and model, with Other / generic if yours isn't listed;
    • nozzle and filament;
    • Klipper, OctoPrint or Bambu;
    • Spoolman;
    • camera and timelapse;
    • Discord bot;
    • Hermes or standalone.

    Re-running it keeps your existing settings. Pin a release with | bash -s -- --ref 2.0.9. See docs/INSTALL-LIGHT.md and docs/DISCORD-BOT-SETUP.md.

  • Bambu Lab A1 offline support. It uses Bambu Studio by default, as every Bambu Lab printer now does. Everything else slices with OrcaSlicer.

  • Clearer "didn't start" messages with a Retry button. If the printer refuses a print, Print Buddy says why in plain words (for example, a nozzle or bed still heating from the last job) and what to do. The dead Stop button is replaced with Retry, which re-runs every safety check.

Fixed

  • Very large models (about a million triangles) no longer hang at the model check, and Print Buddy says up front when a big model will take a minute or two. (Re-tagged 2026-10-24 with this fix.)
  • Thin print-in-place models such as the Flexy Ring now slice instead of failing with "Failed slicing the model". Print Buddy keeps the designer's Arachne walls, or retries once with a flex-safe profile (2 Arachne walls, 15% infill, no brim or supports). (Re-tagged 2026-10-25 with this fix.)
  • Chat messages use your printer's own name and firmware instead of hardcoded Klipper or AD5X wording.
  • The app version now reports correctly.

Coming in 2.1.0: the Docker image on GHCR (both OrcaSlicer channels, OpenSCAD) and Bambu Lab P1S support.

What's Changed

Full Changelog: 2.0.8...2.0.9

2.0.8

Choose a tag to compare

@catduckgnaf catduckgnaf released this 24 Oct 15:55
21bae2a

2.0.8 respin (2026-10-24)

Fixed

  • The Discord print plugin now loads on Hermes installs without PyYAML. Before this, intake was slow and offered made-up colors (#170).
  • Quieter intake: the preview is the first reply to a link, and there is one "Uploading" prompt with Stop.
  • The roast is the last line of the "Print started" post. Warmup no longer adds a stray line after it.
  • The model page estimate no longer names the source printer.
  • Force restart from the error. If the printer is stuck from an earlier job, the refusal offers a Force restart button. The print waits until you press Print again.
  • Stop while slicing.
  • Rotated fits just happen. If rotating makes the model fit at 100%, Print Buddy rotates it without asking.
  • Shorter fit questions with no GitHub links, no debug lines in refusals, one firmware-stopped alert per job, and stale Cancel buttons are removed after a clear.

What's Changed

New Contributors

Full Changelog: 2.0.7...2.0.8