← Blog

PrintStash v0.11.3: Centauri Carbon upload and safer backups

Elegoo Centauri Carbon and Carbon 2 receive G-code over the network, spool selection warns before a print runs out, and backups capture a consistent snapshot.

release

v0.11.3 is a patch number carrying two user-facing features and an append-only database migration, so back up before upgrading. Like v0.11.1 before it, it is an explicit exception to the normal 0.x patch policy rather than a routine bugfix drop.

Centauri Carbon can receive files

Both Centauri Carbon models now accept G-code sent from the vault. The transfer runs over plain HTTP, as a chunked multipart POST in 1 MiB chunks on the original Carbon and a chunked PUT with Content-Range on Carbon 2, and it is independent of the SDCP or MQTT channel that carries status and print control. The work came with an upgraded pycentauri dependency.

Treat it as beta, because the hardware evidence is thin. The original Carbon’s path has one community report behind it, which exercised live status and an upload-only send through PrintStash against a physical machine and confirmed the file landed on printer storage. Start, pause, resume, cancel, and reconnect-while-paused were not exercised in that session, so it is a partial smoke rather than a completed validation. Carbon 2’s upload path has no real-hardware report at all.

File inventory and deletion remain switched off for both models on purpose. The original Carbon’s file-list probe can terminate its printer daemon when sent with an empty payload, and Carbon 2’s documented file-list request does not answer on the firmware that has been validated, so PrintStash never probes either operation.

Centauri setup and settings also explain the mainboard ID properly now. It is what keeps commands reliable while the printer is idle, paused, or in an error state, not merely an aid for reconnecting.

A warning when the spool cannot cover the print

Selecting a spool in the send dialog now checks it against the revision’s parsed filament weight. If the spool cannot cover the print, you get a warning. If the check cannot be made at all, because the slicer never wrote a filament weight or the spool has no tracked remaining weight, you get a warning about that too, rather than silence that reads as approval. Neither one blocks the send, so the decision stays yours.

Spoolman write-back is off until you ask for it

Consumption write-back no longer defaults to on. It stays off until an operator enables it deliberately, which matches reality: Moonraker is the only provider that reports measured consumption today, so on any other printer the setting had nothing to act on.

The spool inventory endpoint, GET /api/v1/spoolman/spools, and the picker built on it now carry Spoolman’s location field. Two spools of the same vendor, material, and color are otherwise identical in the list, which is exactly the case a multi-slot changer creates, whether that is an AMS, a CANVAS, or an MMU.

Data integrity work

Concurrent Artifact imports now reserve Revision numbers atomically. The upgrade repairs any duplicate Revision numbers or recommended markers already sitting in the database, then adds constraints that keep both invariants intact from there on.

SQLite backups now capture a transactionally consistent snapshot of the database, including committed WAL data, and archive the blob set owned by that same snapshot. Restore validates and stages the database and blobs before applying anything, pauses concurrent writers while it works, and rolls storage changes back if it fails partway.

The migration runner no longer marks an incomplete, unversioned database as current. An orphan database is adopted only when its schema matches the complete application schema, and anything ambiguous fails with recovery guidance instead of silently skipping migrations.

Smaller changes

Importing a zip archive with deeply nested folders no longer fails with “too many files”, since the entry-count cap counts real files rather than the directory records a nested tree accumulates. OctoPrint uploads stream G-code into the multipart request instead of loading the whole file into memory first. The Python cryptography dependency moved to its patched 50.0.0 release.

Upgrading follows the normal Docker Compose flow, and this release carries database migrations. Back up first, then follow the upgrade guide for the current commands. The compatibility matrix tracks what each printer provider can do in the shipped release, and sending prints to an Elegoo Centauri Carbon covers the new upload path in practice.