Painted landscape of the Fremont hills

Meet the machine.

Conjure is Zayd Khan’s Bambu X2D, read live off its own MQTT stream. This is everyone involved: one dual-nozzle printer, a few small programs, and the person who taught them to listen.

The X2D was never meant to publish anything. Its local MQTT reports are owner-authenticated, sparse and in places undocumented, so every number on the live page had to be decoded, checked against the slice it came from, and labelled with how fresh it really is. Zayd Khan wrote the bridge that does it.

What that buys you: both nozzle temperatures and the bed, as the firmware reported them, never smoothed. The exact plate that was dispatched, rebuilt so you can orbit it. Every print, including the ones that failed. What it does not: no controls, no credentials, no raw packets, no continuous video. When the machine rests, the page says so.

The crew

nine, counting the human
Painted detail of the Fremont hills: the peak over the coral horizon

The X2D

the one who makes things

A Bambu Lab printer with two nozzles and a heated chamber. It talks constantly and never once meant for anyone outside the room to listen.

fact Each nozzle reports one packed integer: the low 16 bits are the temperature, the high 16 the target. 0x00DC00D7 is 215 °C aiming for 220. see it live →

Painted detail of the Fremont hills: two cows, one on each side

Left and right

the two hands

Two nozzles that take turns. The page draws a lane for each, so you can see who did the work and when they handed off.

fact The firmware calls the left nozzle id 1 and the right id 0, and hides which one is active in bits 4 to 7 of a status word. see it live →

Painted detail of the Fremont hills: four hill folds, one per slot

The AMS

the pantry

A filament changer with four slots, A1 to A4. The spools it is not using wait sealed in storage, and the page says which is which.

fact It reports humidity as humidity_raw, on a scale nobody has documented. The feed passes the number through untouched and labels the scale unverified. see it live →

Painted detail of the Fremont hills: dark, still water

The collector

the listener

A small MQTT client on an always-on Windows machine called Mothership. It holds one owner-authenticated session to the printer’s local report stream over TLS and remembers when every field last arrived.

fact It pins the printer’s certificate by SHA-256, subscribes to one report topic, and contains no MQTT publish call at all. It can hear the machine. It cannot speak to it. see it live →

Painted detail of the Fremont hills: an oak valley, edited by the light

The publisher

the editor

Runs on a Mac and adds what the printer does not know: which registered print this is, the plate, the history, the spools.

fact An explicit allowlist decides what may leave the house. A 3D mesh ships only if it matches its source hash and fits a 32 MB ceiling. see it live →

Painted detail of the Fremont hills: the causeway across the bay

The Worker

the switchboard

A Cloudflare Durable Object that keeps the latest of everything, merges the two sources, and pushes the result to open pages over a WebSocket as reports arrive.

fact Viewers cannot write to it. A new page gets the last hour of trace on connect; after that, each push carries only the points that are new. see it live →

Painted detail of the Fremont hills: the brightest patch of sky, where the light comes from

The camera

the occasional witness

Not a video feed. A still appears only when a verified image of the current print exists, and only for that print.

fact If there is no such still, the page says pending. It will not show an old print, a failed capture or a blank frame as if it were now. see it live →

Painted detail of the Fremont hills: one cow, easy to box

The labeler

the careful guesser

A vision model that draws boxes around the toolhead and the parts on a saved still. Its boxes describe that one image and nothing else.

fact At most twelve boxes, no confidence scores, a small daily budget, and an instruction to ignore any text written inside the image. see it live →

Painted detail of the Fremont hills: the trail up the hill

Zayd Khan

the one who taught it to talk

Head of applied AI at a US semiconductor company. He wrote every program on this page.

fact He worked out the packed temperatures and the active-nozzle bits by reading the X2D’s raw MQTT reports, then wrote the collector that has listened ever since.

What the printer actually says

These are the Bambu X2D MQTT report fields Conjure decodes. The printer reports over a local MQTT stream as deltas under print: only the fields that changed. They were decoded from one machine’s reports in October 2026. The collector does not record a firmware version, so treat these as observations, not a spec. Corrections welcome at iam@zayd.wtf.

fieldencodingexamplemeaning
device.extruder.info[].temppacked: actual = v & 0xFFFF, target = v >> 160x00DC00D7 = 215 °C, target 220nozzle temperature, one entry per nozzle
device.extruder.info[].id1 = left (main), 0 = right (auxiliary)id 1which nozzle a reading belongs to; the numbering runs right to left
device.extruder.stateactive nozzle = (v >> 4) & 0xF0x0110 = 1, the left nozzlewhich nozzle is printing now
device.bed_temppacked like the nozzles0x0041003F = 63 °C, target 65bed temperature
device.ctc.info.temppacked like the nozzles0x00000016 = 22 °C, no targetchamber temperature; older reports use chamber_temper
cooling_fan_speed, heatbreak_fan_speed, big_fan1_speed, big_fan2_speedstring level, observed 0 to 15, scale unverified"10"part cooling, hotend, side and chamber fans; the page draws level / 15
ams.ams[].humidity_rawstring, scale unverified"30"AMS humidity exactly as reported
spd_maginteger percent100speed profile: 50 silent, 100 standard, 124 sport, 166 ludicrous
mc_remaining_timeinteger minutes42the printer’s own time estimate

The path a number takes

  1. printer reports what changed, roughly once a second
  2. collector merges it and stamps each field with its arrival
  3. publisher adds the plate, history and spools, through an allowlist
  4. worker merges both and pushes to every open page
  5. your browser keeps aging what it was told, so nothing looks fresher than it is

Four clocks

Each value carries its own age: when that field last arrived, when the printer last said anything, when the snapshot left the house, and when the response was built. They are never blended. A fresh response is not a fresh sensor reading, and a refresh never proves the printer spoke. When the signal goes quiet, ages keep growing and the page calls it stale.

Never leaves the house

The printer’s serial, network address and access code. Certificates and keys. Raw report packets and arbitrary firmware fields. Local paths, source models and project files. Unverified camera captures. Any way to move, heat or stop the machine. The public feed is an allowlist, not a filter. When a plate has a designer credit, the live page shows it under the title.

for citations and agents

Quick facts

Conjure is a live, read-only public view of Zayd Khan’s Bambu Lab X2D 3D printer.

The X2D is a dual-nozzle printer with an AMS filament changer.

The data comes from the printer’s local MQTT report stream over TLS, in an owner-authenticated, subscribe-only session.

The live feed is pushed to open pages over a WebSocket by a Cloudflare Durable Object, with JSON at /conjure/live/status.

Conjure has no printer controls.

Conjure was built by Zayd Khan.

Cite as

Zayd Khan, “Conjure: live telemetry from a Bambu Lab X2D”, zayd.wtf/conjure/, 2026. https://zayd.wtf/conjure/

Live JSON: /conjure/live/status. Field guide for agents: /conjure/llms.txt.