X3DStudios

How a Print Farm Detects Failures Before You Do

X3D Studios··9 min read

A print farm detects failures in layers, and most of those layers fire before a nozzle ever moves. Your file is checked for holes and for fit at upload, the sliced G-code is read for commands that could damage a machine, the printer streams its own fault codes while it runs, a server-side sweep watches for telemetry that has quietly stopped moving, and a live camera covers every plate. By the time you would notice anything was wrong — an order that has not shipped, a tracking number that never arrived — five separate systems have already had their chance to catch it.

Failure Detection Is a Stack, Not a Camera

Ask most people how a print farm spots a failed print and they describe a camera watching for spaghetti. That is real, and we have it on every machine, but it is the last line rather than the first. A camera can only see a failure that has already happened, on plastic you have already paid for, on a machine that has already spent hours making it. Everything upstream of the camera exists to make sure the camera has less to find.

The stack has a shape: the cheapest checks run earliest, and each later layer costs more to reach. A malformed mesh caught at upload costs nothing. The same mesh caught by a camera at hour six costs six printer-hours, a plate of filament and a slot somebody else could have used.

Five detection layers with what each catches and when: upload checks for holes and build-volume fit before pricing, G-code scan for dangerous commands before a printer accepts the file, printer HMS fault codes every few seconds, a freshness check swept every five minutes for telemetry stale after eight, and camera plus operator at any hour
Cheap checks first. The camera is layer five, not layer one.

Layer 1: The Print That Never Starts

The upload at /print is not a file drop with a spinner on it. Before you are shown a price, the mesh is parsed and analysed: how many boundary edges it has, how many separate holes those edges form and how wide the widest one is in millimetres, whether any edge is shared by three or more faces, whether there are zero-area triangles or normals pointing the wrong way, and whether the bounding box fits inside the 340 by 320 by 340 mm build volume of an H2S.

Those are not aesthetic complaints. A 12 mm gap in a wall does not slice into a wall; it slices into two disconnected shells that the printer will happily draw in mid-air. Winding errors turn a solid into confetti. An oversized part fails at the moment the plate runs out, not at the moment you upload it, which is the worst possible time to find out. /blog/why-print-ready-matters-mesh-validation walks through what each of these looks like on a real model and how to repair one.

⚠️Uploads are STL, GLB, 3MF and G-code (.gcode or .gcode.3mf). OBJ is not accepted — export or convert to STL first. Meshes go up to 100 MB, already-sliced files up to 40 MB.

One flag matters more than it sounds: whether the file declared its units. STL and 3MF are millimetres by convention and GLB is metres, so a GLB authored at the wrong scale is out by a factor of a thousand. The check says it is assuming rather than printing a confident number nobody measured.

Layer 2: G-code Is a Program, So We Read It

This is the layer most people have never thought about. A sliced file is not a shape — it is a list of instructions for a machine that heats metal to 260 degrees and moves a gantry at speed. Running an unvetted program on that hardware is a farm waiting for an incident. So every sliced file is parsed and scored from 0 to 100 against a list of commands that have no business being in a print file, and the catastrophic ones are treated differently from the merely suspicious.

CommandWhat it would doResult
M112Emergency stop — hard-kills the printer mid-jobRejected
M211 S0Disables software endstops — head into the frameRejected
M502Factory reset — wipes the machine's calibrationRejected
M301 / M304Rewrites hotend or bed PID valuesRejected — thermal runaway risk
M851 / G28.1Moves the Z-probe offset or the home positionRejected — nozzle crash risk
M500 / M999Writes settings, or restarts the boardFlagged for a human to read

Alongside the command scan, nozzle and bed temperatures are checked against per-material ceilings — PLA is capped at a 260 degree nozzle and a 75 degree bed — and the file's declared printer model and plate footprint are compared against the machine it is headed for. A file sliced for a 256 mm bed does not silently go to a larger one. None of this says your model is wrong; it says a file is a program, and a program deserves a read before it runs.

💡Uploading your own G-code is the fastest path through this layer, not the slowest. We price the slicer's own numbers with no reinterpretation, and the safety scan is the only thing standing between the upload and the queue.

Layer 3: The Printer Reports Its Own Faults

Once a job is running, the richest source of failure information is the machine itself. Bambu printers publish a Health Management System array — HMS for short — alongside their live state. Healthy printers publish an empty one. Everything else arrives as a code with a severity baked into it, plus a single print error field for a fault that stopped the running job.

SeverityWhat it meansWhat the farm does
FatalThe machine cannot continueJob marked failed, printer pulled from the pool
SeriousPrint is compromised or haltedAlert raised, operator request opened
CommonRecoverable, usually filament or AMSAlert raised, cleared automatically when it stops
InfoStatus, not a problemRecorded, no request opened

The interesting engineering problem here is not reading the codes. It is deciding which ones deserve a human. A printer will tell you that the chamber is cooling more slowly than it would like, or that it reloaded a G-code file and resumed printing on its own. Those are worded like faults and are not faults: nothing is stuck, no fix unblocks anything, and paging an operator for them trains everyone to ignore alerts. So advisory messages are separated out by their wording rather than by code, because gateways substitute their own text and a code list would miss the ones they reword.

We also do not ship a guessed lookup table of code meanings. A code mapped to the wrong sentence is worse than an honest one, because it sends an operator to fix the wrong thing on the wrong machine. Codes without a verified name are shown as-is and logged so they can be named properly later. If the fault is on the AMS side, /blog/ams-errors-decoded reads the symptom on the plate and names the cause.

Layer 4: Watching the Watcher

Here is the failure mode nobody expects, and it is the one that taught us the most. Each printer talks to the farm through a small gateway box. When that gateway's connection to the printer dies, its API does not start returning errors. It keeps answering, cheerfully, with the last snapshot it received. The state reads RUNNING. The temperatures are plausible. The percentage is plausible. A finished print showed as RUNNING, layer 8 of 33, 33 percent, for hours.

Three panels comparing a healthy printer, a frozen gateway snapshot, and an unreachable gateway; the healthy and frozen panels both report gcode_state RUNNING at layer 8 of 33 and 33 percent, and only the liveness mark distinguishes them
Two of these report the same layer and the same percentage. One is fiction.

Any check that asks is there printer state? reports a healthy printer in all three cases. The field that actually moves is a liveness mark stamped when a message genuinely arrives. Frozen link, frozen mark. So the mark is stored along with when we first saw it, staleness is measured in real time rather than in memory, and a mark that has not changed in eight minutes raises a fault of its own. Eight is deliberate: a sweep runs every five minutes, so the threshold has to clear one interval or a single quiet gap between observations would read as an outage.

SymptomWhat it looks likeWhat actually catches it
Printing normallyRUNNING, layer 8/33, 33%Nothing — the mark is moving
Gateway link diedRUNNING, layer 8/33, 33%Mark unchanged for 8 minutes
Gateway unreachableThe last state we saved, so: idleNothing answered on any path
Job finished, nobody noticedStill RUNNING, foreverThe same sweep, closing it out

That sweep does something else worth mentioning: it clears alerts as well as raising them. Detection used to live inside the dashboard's own live stream, which meant an alert could only be cleared by the same page that raised it. Close the tab and whatever was on screen froze there — including faults the printer had already stopped reporting. A fault that cannot clear itself is a fault nobody trusts. Now a cron re-evaluates every machine from the server, real faults keep their timestamps fresh, and anything the printer no longer reports clears on its own.

Layer 5: The Camera and the Person

Everything above is telemetry, and telemetry has a blind spot: a print can fail perfectly. The machine believes it is doing exactly what it was told, and it is. None of the following raises a single fault code:

  • A first layer that lifted at one corner three hours ago and has been extruding into air ever since
  • A support that snapped at hour two, under an overhang the slicer was confident about
  • A colour that is genuinely the filament in the tray and still reads wrong against the customer's reference
  • Warping on a wide flat base, which arrives as a part that will not sit level

So every plate is covered by a live camera stream: a spaghetti failure at 3 a.m. is visible at 3 a.m. rather than discovered at 8. And a person still looks at the finished part before it is packed, because the last check in the stack is the only one that can compare an object against what somebody expected.

ℹ️There is a sixth gate that is not detection at all: auto-eject. A finished plate only pushes itself off unattended if it passes on material, height, footprint, aspect ratio, bed temperature and safety score. Anything tall, skinny or oddly balanced waits for a human, because a tipped part is a scrapped part.

What Happens Once a Failure Is Confirmed

The part goes back in the queue. That sentence is short because the interesting work already happened: the file, the material, the colour, the quantity and the note you typed at checkout are all still sitting there in the order manifest, so a reprint is a scheduling decision rather than a conversation. It lands on whichever machine is free, which usually costs hours rather than days. /blog/what-happens-after-you-click-print covers where that manifest comes from and what else it carries.

This is the actual product of a print farm, and it is worth being blunt about it. Redundancy is what you are buying. One printer in a garage has the same failure rate as one printer in a farm; what it does not have is a fleet around it, a queue that can absorb a reprint, and somebody in the room. /blog/what-is-a-3d-print-farm makes the same argument from the business side, and you can see the current fleet on /farm.

The economics explain the order of the stack. At $0.12 per gram all-in for PLA, a failed 40 gram part is under five dollars of plastic, and that is not the expensive part. The printer-hours, the plate, the queue position and the day it adds to somebody's order are. Which is why the cheap checks run first and the camera runs last.


FAQ

How do print farms detect failed 3D prints?

In layers. Geometry is checked at upload, sliced G-code is scanned for unsafe commands before any printer accepts it, the printer's own HMS fault codes and print errors are read while it runs, a server sweep every five minutes catches telemetry that has stopped moving, and a live camera plus a human covers what none of those can see — a lifted corner, a snapped support, a colour that reads wrong.

Can a print farm tell if a print failed overnight?

Yes, and the harder case is a printer that stops reporting rather than one that reports a fault. A gateway with a dead link keeps serving its last snapshot, so a finished or failed job can read as RUNNING indefinitely. That is caught by watching a liveness mark instead of the state: unchanged for eight minutes, and a stale-telemetry fault is raised whether or not anyone has the dashboard open.

What happens to my order if the print fails?

It is requeued and reprinted. The file, material, colour, quantity and your order note are stored with the order, so nothing needs to be re-uploaded or re-agreed. It usually costs hours rather than days, because the reprint goes to whichever machine is free rather than waiting for the one that failed.

Does a failed print cost me anything?

No. You are quoted from a real slice of your model and pay for the part, not for our attempts at it — $0.12 per gram all-in for PLA, with a $1.00 minimum per part and billable weight rounded up to the whole gram. Wasted filament and printer time on a failure are the farm's problem, which is the correct incentive for building five layers of detection.

Ready to get started?

Upload a 3D model for instant pricing, or generate one with AI.