A Pi file whose .3mf hasn't been copied to the share now says exactly that, and names the file to copy — instead of a raw [Errno 2] No such file or directory.
v2.912026-09-01
Fixed: files between ~7.5 MB and 11.5 MB failed to save with a raw Firebase error. The size guard measured the raw file, but the library stores it base64-encoded (+⅓) — so the real ceiling is ~7.5 MB, not 11.5.
Files over that are now correctly registered as Pi files, and the Generate tab says so before you press Save.
v2.902026-08-30
The fleet strip now says what the card says — ☠ DOWN, ✋ CLEAR BED or ⏸ PAUSED instead of the raw printer state, so the summary can't contradict the detail below it.
v2.892026-08-30
☠ Flag a printer down for maintenance — ☠ button on the card, pick the fault from a list (or "Not diagnosed yet").
A flagged printer stops receiving jobs: the engine won't send to it and 💡 idle-match won't suggest it. 🧹 Clear Bed, 🕹 Move and 🪄 Bend stay on — those are the tools you fix it with.
Flagging never interrupts a running print; only the next job is refused.
Shows as a gold ☠ prompt on that card; dismiss it and the card stays marked ☠ DOWN with the fault named.
v2.882026-08-29
👉 Sending a job jumps you to that printer's card — the Printers view opens, scrolls the card into view and flashes it, so you can watch the job start.
v2.872026-08-29
🧵 Direct prints no longer purge at the front of the bed — they now use the same rear nozzle-load every looped file has always used, including every copy of a chained run.
The nozzle is still primed (same E50 extrude), just off the front edge — nothing is skipped.
Switchable in ⚙ Settings if you ever want the slicer's original start back.
v2.862026-08-29
⚡ Looped sends don't make you wait any more — the modal closes straight away and the run engine does the upload, the same way chained copies always have.
Deliberately picked up by the next poll rather than your own tab, so the always-on wall tablet usually does the uploading instead of your phone.
Progress and any failure now show on the card's ⛓ strip instead of a closed modal and silence.
P1S only (runs are); H2C, direct sends and a busy printer keep the old behaviour.
v2.852026-08-29
📱 Notifications can go to your phone via Home Assistant — ⚙ Settings → Phone notifications. Reaches you from whichever device is running Farm Control, and only buzzes once however many tabs are open. (A tab still has to be open somewhere.)
📐 The bed goes back up after a bend — to the exact height the last job parked it at, read out of that job's own G-code (nothing reports bed position, so Farm Control records it at send time).
Never closer to the nozzle than 60mm, whatever the recording says — a looped job parks at Z20.2 only because the rake cleared the plate first.
Uses Bambu's own M17 Z0.4 reduced-current park, so a collision stalls the motor instead of driving through.
Z jogs keep the recorded height in step; a Home forgets it, and then the bed is simply left low.
v2.842026-08-29
🪄 Bend plate from the printer card — icon button next to 💡, no need to open 🕹 Move. Confirms first, and never on a paused print.
📷 Pressing 🪄 pans the card camera down to the bed for 30s so you can see the part let go, then it pans back by itself.
Attention prompt rebuilt as a proper dialog: ⚠ hero icon above the title, centered, ✋ Bed cleared now green, Later readable instead of a grey slab.
Fixed the scrollbars on the right and bottom of a card showing a prompt, and the prompt swallowing your scroll on mobile — the pulse ring was overflowing its own box by 1px.
The prompt's slow pulse now actually survives the 10s re-render (v2.83's phase sync never applied).
v2.832026-08-24
The ✋ and ⏸ prompts now cover only their own printer card. They used to take over the whole screen. Now the card that needs you goes dark with the pulsing border and the message on it, and every other card stays fully usable — you can start a print on printer 2 while printer 1 waits for its bed to be cleared. Cards keep their exact size either way, so nothing shuffles on the wall tablet. If two printers need you at once, each one asks on its own card
v2.822026-08-24
A pause you pressed yourself no longer pops up at you. Hitting ⏸ Pause on a card is a deliberate act, so Farm Control stays quiet about it. A runout or an insert pause on the same printer later still asks
The pause pop-up can be switched off. ⚙ Settings → Automation → ⏸ Pop up when a print pauses. The ✋ bed-clear prompt deliberately has no switch — it's the only thing that moves a chained direct print along, so turning it off would strand a run
v2.812026-08-24
⏸ A paused print now pops up too — with Resume right there. Same window style as the bed prompt. Built for prints that pause mid-layer so you can drop a magnet or a nut in: it tells you which layer it stopped on and how long ago, you put the part in, and press Resume print. It also catches every other kind of pause — filament runout, or a pause from Handy or the printer screen — so a stopped printer can't sit unnoticed. Later hides it for that pause only; the next pause on the same printer asks again
Only one of these windows is ever up at a time, and a bed waiting to be cleared takes priority over a paused print
v2.802026-08-24
✋ The clear-the-bed prompt is a proper pop-up. It now dims the page and opens over whatever you're on — printer cards, library, anywhere — with a slowly pulsing border. Cards behind it keep their exact size, so nothing shuffles around on the wall tablet. Later dismisses it without releasing the hold, and the run strip on the card reads ✋ HOLD until you deal with it. There's no second "are you sure" dialog anymore — the pop-up itself is the confirmation
v2.792026-08-24
▸ Send a DIRECT file ×N straight from the Library — it repeats like a looped file, but stops for you between each one. The Send window now has a Copies box on direct prints. Set it to 5 and Farm Control chains five prints on that printer: copy 1 starts immediately, and each time one finishes the chain stops and waits for you to clear the plate and press ✋ Bed cleared. Ten bins, two per plate, one send. Your AMS tray and Skip-calibration choices from the Send window carry through to every copy
v2.782026-08-24
⛓ You can finally chain DIRECT prints — the run waits for you to clear the bed. Ten bins as five plates of two used to be impossible to build as a run: the builder refused to add anything after a direct file, because a direct print leaves its parts on the plate and the next job would have crashed into them. Now you can add the same direct file as many times as you like. When one finishes, the chain stops and asks — a ✋ Clear the bed window comes up over whatever you're looking at, with a slowly pulsing border, and the next plate goes out the moment you confirm the plate is empty. You also get a phone notification, so you don't have to be watching
The prompt is an overlay on purpose — the printer cards keep their exact size behind it, so nothing reflows on the wall tablet. Hit Later and the run stays held; the card's run strip reads ✋ HOLD and both it and the run window get you back to it
v2.772026-08-19
💡 Chamber light switch on every printer card. Tap the little lamp at the top-right of a card to turn that printer's light on or off — handy when the camera picture is too dark to tell what's going on. It works at any time, including mid-print, and lights up amber while the light is on. The button only appears on printers that actually report a light to Home Assistant
v2.762026-08-19
A cancelled print no longer locks you out of the printer. When you stop a print it shows as failed — and it keeps saying failed until the next job starts, so 🧹 Clear Bed and 🕹 Move were greyed out for good. Both are now available on a failed print, which is exactly when you want them: to bend the plate or jog the head and free a stuck part without walking out to the printer. Nothing else changed — a run still refuses to auto-print onto a failed bed
The leftover job record clears itself after a failure. Previously the record from a cancelled print stayed on that printer forever (it only ever cleared on a finish or after two idle minutes, and a failed printer never goes idle), which made the printer read as busy and kept Clear Bed disabled even once it was allowed
Opening Clear Bed on a failed print now warns that what's left on the plate may not be the height you expect, and points at 🕹 Move → 🪄 Bend plate for when you can't see the bed
v2.752026-08-18
🕹 Move fits on a phone screen. The 🪄 Bend button now sits directly under the camera instead of at the bottom, so you can watch the plate while you bend it without scrolling back and forth. On short screens the panel also tightens up its spacing and trims the explanatory text to keep everything in view
🪄 Bend only is gone from the Clear Bed window. Bending lives in 🕹 Move → 🪄 Bend plate now, so the option no longer has a reason to sit here. Clear Bed goes back to being one thing that does one thing. The old code behind it has been deleted outright rather than left switched off
v2.742026-08-18
The old 🪄 Bend only checkbox is switched off. It never worked on any printer, and every press cost a power cycle — the printer would take the job, sit there, then refuse everything afterwards. The option stays visible but disabled so it's clear where bending went, rather than quietly disappearing. Clearing a bed the normal way is unchanged
Never told to home over your own print. The Move panel unlocks by itself once Farm Control has seen that printer print or finish, so a bed that just finished is ready to bend without homing. If you come back later and the tab has forgotten, there's now a "Still homed — unlock without homing" button, for when the printer hasn't been powered off since its last print. Homing drags the toolhead across the plate with very little clearance, which is the last thing you want with a part still stuck to it
🪄 Bend the plate from the 🕹 Move panel — one stroke at a time, watching the camera. Press Bend ×1 as many times as you like. It uses the same bed positions and speed as the proven Clear Bed, but sends them as a direct command instead of as a print job — so unlike the old Bend Only, it can't leave the printer stuck needing a power cycle. Pure up-and-down: nothing travels over the plate, nothing heats. Works on the P1S and the H2C. Locked until you've homed, because the moves are absolute
v2.732026-08-18
🪄 Bend Only — second attempt at the lockup, and it's now P1S only. v2.72 didn't fix it: the printer still did nothing at all and still needed a power-cycle. Since nothing ever ran, the ending was never the cause. A side-by-side test proved a full Clear Bed works on the same printer, and both are built and sent by identical code — so the only thing left was the motion Bend Only removes. Comparing the two files, Clear Bed's has 55 side-to-side moves and Bend Only's had none at all, which may be why the printer doesn't accept it as a real job. The rear park move is now kept. The move that raises the bed back toward the nozzle is still removed — your stuck part is still sitting on the plate. Bend Only is disabled on the H2C: its sequence has no rear park move to keep, and inventing one is what caused the original bug. Use the full Clear Bed there
v2.722026-08-07
🪄 Bend Only fixed — it was locking up the printer. Bend Only sent fine but the printer did nothing: no motion, no job name, no error, and it refused every later job until it was power-cycled. The bend strokes were correct — the ending was hand-written and quietly dropped eleven commands the working Clear Bed file sends, including every print-progress report after the opening one, so the job never registered as a real print. Bend Only now reuses the proven Clear Bed ending exactly as-is, with only the park moves taken out. Those stay out on purpose: the normal park raises the bed back toward the nozzle, which is fine after a rake has swept the plate but not here, where the stuck part is still sitting on it
v2.712026-07-29
📹 Room cameras on the Printers view. Add any HA camera that isn't tied to a printer — a Wyze via the Wyze Bridge add-on, or anything already going through go2rtc — under ⚙ Settings → Extra cameras. They appear in a collapsible 📹 panel at the top of the Printers view, refreshing every ~3s while it's open. The panel is collapsed by default and remembered per device, so the wall tablet keeps all four printer cards on one screen while your desktop can leave it open. View-only: these never touch a printer
v2.702026-07-29
🪄 Bend Only — pop parts loose without the nozzle sweep. Clear Bed has a new Bend only option that runs just the 6 plate-bend strokes and stops. For a prime tower or part welded to the plate, where the full clear's rake would drive the toolhead straight into it — and on a looping job would do it every cycle. Parts pop loose but stay on the plate; the bed is left low and the toolhead parked at the rear, so you can lift them off by hand or reposition with 🕹 Move. Nothing heats, nothing extrudes, and after homing nothing travels over the plate at all
v2.692026-07-29
🛑 Fixed: long file names crashed the printer instead of printing. Sending a job whose project + plate name ran past 80 characters uploaded the file with its .gcode.3mf extension chopped off — the printer would say "extracting 3mf", then power itself off and reboot, with no error reported back. The name is now trimmed so the extension always survives. Affected any long-named file (the Craftsman VersaStack plates hit 100+ characters); short-named files were never affected and their names are unchanged
v2.682026-07-28
⬜ White filament shows as white on the wall tablet. White AMS swatches rendered black/transparent on the tablet but were fine on desktop and phone — the Android WebView behind Fully Kiosk was "force-darkening" the page because it never declared that it handles its own dark mode. Farm Control now declares its color scheme (and keeps it in sync with the selected theme), so the tablet leaves the colors alone. Native dropdowns and scrollbars should match the theme better too
v2.672026-07-28
📤 Uploads work when the sliced plate isn't plate 1. Slicing a single plate out of a multi-plate Bambu Studio project keeps that plate's number — a project sliced on plate 2 exports only plate_2.gcode — but the Generate tab only ever looked for plate 1 and rejected the file with "No G-code found inside this 3MF." It now uses the first plate that actually has G-code, and carries that plate number through generating, downloading, saving, Re-Loop and sending (previously a Download of such a file would have quietly handed back the unlooped original)
v2.662026-07-24
🔁 Big-loop remote sends (e.g. 20 loops). High loop counts used to fail with a raw Firebase error — the looped file was too big to stage in the cloud (10 MB cap). Now, when the looped file would be too big, Farm Control stages only the small base file and the Pi does the looping — so a 20-loop, ~1 kg run sends remotely just like any other. Small sends are unchanged. (One-time Pi setup: add farmcontrol_stage_loop — files\SETUP.md §G.)
Clearer over-size message. The remote-send size guard was checking the wrong limit; it now matches Firebase's real 10 MB cap and, if a file truly can't be sent, says exactly what to do instead of dumping a raw error
v2.652026-07-23
🧭 Z Up/Down corrected. The Move panel's UP button was moving the bed the wrong way — flipped the Z direction so UP raises and DOWN lowers, and dropped the confusing "(bed up/down)" text
v2.642026-07-23
🧭 Direction labels on the jog controls. The Move panel's X/Y buttons are now a directional pad — Left / Right / Forward / Back — with Up / Down for Z, instead of bare +/−. The selected step shows in the middle of the pad. Directions are from the front of the printer; if any axis is reversed on your machine it's a one-line flip
v2.632026-07-23
📷 Live camera inside the Move panel. The Move/jog popup now shows the printer's camera right above the controls, refreshing ~every 1.5s — so you can watch the toolhead while you position it instead of jogging, closing the popup to check, and reopening. Works for the P1S cameras and the H2C's go2rtc feed
v2.622026-07-23
🕹 Move panel — home + jog X/Y/Z like Handy. Each idle/finished printer card gets a Move button that opens a Home-all button plus X/Y/Z jog controls with 1/10/50 mm steps. Since Home Assistant can't tell whether a printer is actually homed, jogging stays locked until you press Home this session (or the tool saw the printer print/finish) — un-homed axes can crash into the frame. A power-cycle re-locks it. Sends bambu_lab.move_axis
✓ Finished-at time on the cards. When a print finishes, the card now shows what time it finished in Mountain time plus how long ago (e.g. "✓ Finished 2:45 PM MT · 3h ago"), so you can tell at a glance whether you've already cleared/ejected that bed. Read straight from Home Assistant's own timestamp, so it's right even if the print finished while no tab was open
v2.612026-07-21
🖥️ Desktop Printers view now fits on one screen — no scroll. The card compaction that keeps everything visible on the wall tablet (shorter camera, buttons on one row, tighter padding) now applies to desktop too, so all four printer cards + the fleet glance bar fit without scrolling. Add enough printers and it'll scroll again — expected
v2.602026-07-21
🖥️ Desktop Printers view now fits 4 cards per row. The view was capped at a narrow centered column that only fit 3 cards, so a 4th printer wrapped to a second row. Widened the cap and trimmed the card min-width so all four printer cards sit on one row on a normal desktop/laptop screen (matches the wall-tablet layout)
v2.592026-07-21
📧 Email/password sign-in, for the wall tablet. Google's login refuses to run inside kiosk-browser webviews (Fully Kiosk) — it blocks with "403 disallowed_useragent". Email/password auth isn't subject to that, so the login screen now has a "Sign in with email (tablet)" option beneath the Google button. Same authorized-email allowlist gates both; desktop/phone keep using Google as before. Requires enabling the Email/Password provider + adding the account in the Firebase console
v2.582026-07-21
📱 Wall-tablet layout — the Printers view now fits on one screen. On a touch tablet in landscape, the printer cards spread across the full width (no more centered 1080px column), the buttons drop to a single row, and the camera/padding tighten up — so every printer card and the fleet-glance bar are visible without scrolling. Desktop and phone layouts are unchanged
v2.572026-07-16
⊘ Skip Objects is back for LAN-only printers. Going LAN-only removed Bambu's cloud-gated skip button; the printer still accepts the skip command over LAN, so this adds it directly. A ⊘ Skip button on each printing card opens a picker showing the plate — tap the parts to skip, confirm, and the printer finishes the rest
The picker reads Farm Control's own copy of the file — no cloud, no printer download. It maps taps to objects via the slice's pick image, so what you tap is exactly what gets skipped
Guards: only enabled while actively printing on a Farm-Control-sent job; skipping is permanent and asks for confirmation; multi-select skips one object per command so none get dropped
v2.562026-07-15
💡 The idle banner no longer guesses an order's color. It checked the file's plate-1 color, not the order's — so a WHITE Ford handle order on a file whose only plate is red "matched" every red-loaded printer. An order with no plate picked now has no known color, so nothing suggests it, grades it green, or adds it to a run
Pick an order's color right in the queue. A matched row with no plate shows a color/plate picker and a ⚠ marker, and offers to remember SKU → plate so future orders of that variant carry it automatically. Adding an unresolved order to a run is now refused rather than silently printing plate 1
🔔 The "filament loaded" popup stopped repeating on every launch. Its once-per-cooldown memory lived in a page variable, so every refresh — and every open of the home-screen app, which is a full page load — started empty and re-fired. It now persists like the ✕ mute does
Remembering a SKU → file mapping no longer wipes the mapping's other fields (unitsPerLoop, plate)
v2.552026-07-15
Clear Bed: tall-part guard. Before it can measure anything, homing drives the toolhead across the bed with only the last print's park height for clearance — and nothing senses a part in the way. A stock print end parks the bed low (part + ~98 mm, loads of room), but a FarmLoop clear parks at a flat Z20.2, leaving only ~40 mm whatever the part height — and the tool can't tell which it's looking at. So: a push height implying a part over ~40 mm now turns the warning red and asks for a second confirm. Clear tall parts by hand
Retired the old "watch the first bend stroke" warning — that risk died when the P1S probe point moved to the exposed steel behind the plate (a part can no longer corrupt the Z reference)
v2.542026-07-15
Hotfix: Clear Bed always refused with "Printer data is stale" even with live data — the new checks read window._haStates, but that global is a top-level let and never exists on window. Bed-temp line in the modal had the same bug (always "unknown")
v2.532026-07-15
🧹 Clear Bed button on every printer card — runs the FarmLoop clear (6 plate-bend strokes → slow push → fast rake → park) on demand on an idle printer, for direct/no-loop prints or anything left on the bed. Homes safely first: the P1S probes Z at Bambu's own exposed-steel point behind the plate (a part can never corrupt the reference); the H2C probes rear-center instead of its stock bed-center point. Push height is configurable with your last-used value remembered per printer, and the cooldown is bed-temp-aware — a cool bed skips the wait. Nothing heats and nothing extrudes
⚠ Supervise the first runs — especially the H2C, and any part taller than ~15 mm: watch the first bend stroke and be ready to power off
v2.522026-07-15
GO now actually starts the run — including a run with a single job. Two separate causes, both silent: (1) the engine only runs while the HA poll is on, which was tied to the Printers view — approving a run from the Queue tab left it sitting there until you opened Printers. A live run now keeps polling from any tab, and GO kicks a poll immediately instead of waiting ~10s. (2) A leftover job record from a print that finished while no tab was watching made the printer look busy forever, blocking every send with nothing on screen to show it (a ×1 job has no Loop X/N stat to give it away). A record left on a printer that's been idle 2 minutes is now cleared as the orphan it is
A waiting run says why. Every reason the engine holds off — printer busy, offline, no fresh data from Home Assistant, a leftover job record — now shows as ⏳ a note on the run strip and in the run modal. "I hit GO and nothing happened" should never be a silent state again
v2.512026-07-13
3-min post-send grace on FINISH handling. Right after a chain send, the printer still reports the previous job's FINISH until the new print spins up — that window deleted the fresh job record (Loop X/N vanished mid-run; long-standing) and, since v2.50, also marked the brand-new job done and advanced the chain early (blue showed done + "JOB 3 OF 3" while printing loop 1). FINISH within 3 minutes of a send is now ignored — same grace the loop counter has always used
v2.502026-07-13
Chain handoff fix #2 (pink ✓ → blue never sent, job stuck PRINTING): the FINISH cleanup that clears Loop X/N could run from a stale background tab and delete the job record before any fresh tab marked the run job done — with no recovery, the chain wedged. Now the cleanup never acts on stale data and advances the run before deleting the record
New self-heal: a run job stuck PRINTING with no job record and a finished/idle printer is marked done and the chain moves on — so an already-wedged run un-sticks by itself (expect the next job to auto-send shortly after this loads; make sure the bed is clear)
v2.492026-07-13
Loaded-filament marker actually fires now. v2.48 read each tray's active attribute, which stays false even mid-print on this ha-bambulab build (verified in HA Dev Tools). The marker (and Unload's AMS targeting) now reads the printer's active_tray sensor — ams_index/tray_index are 0-based, none = nothing loaded
v2.482026-07-13
Run job dots respect the v2.47 tray override. A job forced onto tray S3 now shows S3's loaded color on its dot (run modal, card strip, queue strip) instead of the sliced color it replaces — three S2/S3/S4 jobs no longer all look green
● Loaded-filament marker — the AMS slot whose filament is physically in the extruder (Bambu Studio's PTFE-tube line) is highlighted everywhere trays render: orange underline + tint on the chip, and printer cards drop a little orange tube from the slot into the camera. Reads the tray sensor's active attribute
⤒ Load / ⏏ Unload from the tray editor — tap any AMS slot on a printer card: "Load this filament" feeds that tray into the extruder (load_filament), "Unload" retracts whatever's loaded (unload_filament, aimed at the active tray's AMS unit on dual-AMS). Blocked while the printer is mid-print
v2.472026-07-13
Pick the filament when adding a run job. The run builder's Add-Job form has an AMS tray dropdown: Auto — match sliced color (default, unchanged) or a specific slot to force a different filament than the file was sliced with (e.g. a red-sliced part printed from the blue spool). A manual pick skips the color check on purpose, but the engine still refuses to send onto the wrong filament TYPE (PLA file ↛ PETG tray) and pauses if the picked tray is empty. Jobs show "tray S3" in their meta; multi-filament plates stay fully auto
v2.462026-07-13
⛓ Runs got the "Chain Track" look (picked from 3 mockups in design-samples\): printer cards and the Queue-tab overview show the run as color-dot nodes on a connecting rail — done = white ✓, the active job pulses orange, queued dashed, failed red ✕ — with a RUN/PAUSED/DRAFT tag and JOB X OF N counter. The run modal's job list is now a vertical timeline with job cards, status stamps (DONE 8:02 AM / SENDING ⇡ / QUEUED) and the same rail. Pure restyle — behavior unchanged
Send modal: retired the "⚗️ Experimental (unverified live)" paragraph — the send pipeline has long since proven itself. The warning is now just the part that matters: the printer WILL physically start — make sure the bed is clear
v2.452026-07-13
Fixed runs wedging on a stuck send (the Blue-never-started-after-Purple bug). Three layers: engine sends now show live progress on the printer card ("⇡ Regenerating… / Staging… / Asking the Pi…") instead of silently doing nothing visible; a job stuck in sending with a dead claim and an idle printer is automatically reset and retried; and every HA network call in the send path has a hard timeout, so a hung Tailscale/HA connection fails into "run paused + reason" instead of hanging forever. Any error anywhere in the engine send now pauses the run with the message — a run can no longer wait silently
v2.442026-07-13
AMS filaments load near-instantly now. Three fixes to the 15-20s wait: (1) the app warms printer status + the AMS registry once at load, whatever tab you open on (it used to fetch nothing until you visited Printers); (2) the last-known trays and a slim copy of the AMS registry persist on the device, so tray pickers, the Send modal and the run builder render immediately from cache while live data replaces it within a poll; (3) opening a run now fetches the registry too, not just states. Auto-sends still use live data ONLY — the cache is display-side
v2.432026-07-13
Removing imported orders actually removes them now. The Batchlog list's ✓ queued rows have a ✕ that un-queues the order right there (it becomes re-importable) — for orders already completed outside Farm Control
Dismissing a queue row that's in a run now pulls the job out of the chain too (with a confirm) instead of leaving it to print anyway; a job that's mid-print can't be dismissed away
v2.422026-07-12
Run jobs now show their color — with one multi-plate file per product, every job read as the same file name + a meaningless plate number. Jobs in the run modal, the printer-card run strips, and the Queue-tab runs overview now lead with the plate NAME (the color) and its filament color dot — "● Purple ×1" instead of "ALLCOLORS_TCG… plate 7"
Print Queue rows show a color dot next to the matched plate name too
Removed the wall-tablet mention from the run modal note
v2.412026-07-12
Fixed "everything matches" in the run builder — the matcher used "closest color wins" (inherited from the Send modal's auto-pick), so with only 4 spools loaded, every queue order "matched" its nearest tray: White showed ✓ against a blue spool — and the engine would have printed it that way. All AUTOMATED matching (run sends, run-builder grading, idle-match) is now strict: a tray only counts if it's genuinely the same color (small tolerance for slicer-vs-tray rounding); unknown tray colors never pass. The Send modal keeps the loose closest-color convenience since you confirm manually there (with the mismatch warning)
v2.402026-07-12
⏹ Stop now plays safe with runs. Stopping a print (from the tool, Handy, HA, or the printer — errors count too) used to leave the job record stuck (stale Loop X/N, run engine reading the printer as busy forever) — and worst case, a waiting GO'd run could fire its first job onto the stopped print still sitting on the bed. Now: the job record is cleaned up, a stopped run-job is marked failed, and the run auto-pauses with "clear the bed, then Resume" — Resume retries the stopped job
Run modal: "Loaded in this printer right now" strip — the printer's AMS slots (color + type + slot #) shown at the top while you build, and the from-the-queue list now sorts color matches first, each with a green edge and a ✓ chip showing exactly which slot it matched — configure runs by what's physically loaded at a glance
v2.392026-07-12
Fixed Batchlog import treating every color as the same product — the color isn't always the FIRST variation (a "Card Holder / Fuschia" order has the color second), so all colors collapsed into one remembered mapping and defaulted to the first plate (Magenta). Imports now find the variation labeled Color (falling back to the full variant combo), each color gets its own remembered mapping, and the plate auto-match tries every variant name with exact matches beating partial ones
Run modal: new "From the queue" panel — every pending order graded for the open printer: colors already loaded get a + Add button, colors NOT loaded show grayed (still addable — the run just pauses at that job until you load the filament), and orders already in a run are marked with which printer has them, so nothing gets missed when building runs across printers
Queue tab: ⛓ Print Runs overview at the top — one row per P1S with the same live chain strip as the printer cards; tap to build/edit the run right from the queue screen. (Library files that aren't in the queue can be added from the run modal's "Add job" picker, or the ⛓ button on any Library row)
v2.382026-07-12
⛓ Print Runs — queue jobs back-to-back on a P1S (e.g. White ×5 then Cyan ×1), approve once with GO, and the chain runs unattended: when a looped job finishes (bed already cleared by the last loop), the next job auto-sends with its AMS tray auto-matched to the file's sliced filament. Build runs from the printer card's ⛓ strip, queue rows, or Library rows. Pause / Resume / Cancel any time; printer errors or a missing filament pause the run and notify instead of guessing. Nothing ever auto-sends outside a GO-approved run
💡 Idle-match — when a printer sits idle with filament already loaded that a pending queue order needs, a banner (+ one 🔔 per pairing per cooldown) suggests sending it there. Send opens the normal confirm modal; ⛓ adds it to that printer's run
📥 Batchlog orders — the Queue tab can pull open orders straight from Batchlog (Seoul + TEST tenants; first load per device pops a one-time Google sign-in). Orders map product + color → library file + plate, the color name auto-picks the matching plate, and the mapping is remembered for every future order of that color
New 🤖 Automation section in ⚙ Settings: master kill-switch, idle-match toggle + cooldown, calibration-on-auto-send, run-event notifications
Under the hood: the send pipeline was refactored so the run engine and the Send modal share one core; failed sends no longer leak staged files in Firebase
v2.372026-07-09
Fixed the printer stat row cutting off the Bed temp with a “…” during a loop print — the Loop counter now takes the numeric Progress stat's slot (the progress bar above already shows it), so the row stays 4 columns and the Noz / Bed cell always fits
Added the VanDurdanDesigns skull logo to the top-left header, beside the VDD wordmark (embedded, so it works offline too)
Removed the leftover “Bambu P1S / H2C” chip from the top-right header — a holdover from when this was just the FarmLoop generator; the detected printer still shows on the file's info card after upload
v2.362026-07-08
Nested folders in the Library — folders can now hold subfolders (any depth). The sidebar is a collapsible tree; clicking a folder shows its files and everything in its subfolders. Renaming or deleting a folder cascades safely (delete reparents subfolders up one level; no files are ever lost)
Direct-print files (no looping) — a new toggle on the Generate screen saves a file to the Library unmodified, with no bed-clear injection, for parts that won't pop off on their own (e.g. signs). They're tagged DIRECT · NO LOOP in the Library, and the Send screen shows a bold warning that the bed will NOT auto-clear and must be cleared by hand
v2.352026-07-08
COOLING vs CLEARING BED now split by the bed target (what the g-code actually commands) instead of a guessed bed temperature — temp-mode cooldown holds the target at the setpoint while the bed cools (COOLING), then drops it to 0 when the mechanical push runs (CLEARING BED). Fixes a still-cooling bed at ~31° wrongly showing CLEARING BED
v2.342026-07-08
Printer stat row now truly stays on one line — the row forces all stats into a single row of equal columns (no wrapping), and Nozzle + Bed are combined into one Noz / Bed cell so a looping print's extra Loop stat still fits
New COOLING status (blue) shown between loops while the bed is still hot and waiting for the part to release; it flips to cyan CLEARING BED only once the bed has cooled and the mechanical push actually runs
v2.332026-07-08
Fixed a looping print's Loop stat pushing Bed onto its own line and growing the card — the printer stat row now lays out as evenly-sized grid columns instead of wrapping flex items
v2.322026-07-08
Fixed AMS rows disappearing on printers that had an AMS-prefix set in Settings (P1S-2/3, H2C) — v2.31 let a stale prefix skip the reliable device-registry lookup. The registry now always runs first, so those printers show their AMS again (and the H2C shows both units)
v2.312026-07-08
Dual-AMS detection rewritten to be fully name-agnostic — it now finds a printer's AMS units through HA's device tree (following chained units) and groups trays by device, so it works even when the two AMS units have unrelated entity IDs and HA-added _2 dedup suffixes (exactly the H2C's case). Orders + maps by the AMS number in the friendly name
v2.302026-07-08
Dual-AMS H2C now shows BOTH units — the second AMS chains off the first in Home Assistant (only the first is directly linked to the printer), so the picker now expands to every AMS sharing the printer's serial. All 8 slots appear
v2.292026-07-08
Multiple AMS units per printer are now supported — all of a printer's AMS trays show in the Send picker and on the printer card (AMS 1 = slots 1–4, AMS 2 = slots 5–8), matching how the printer maps them. Slots are labeled by AMS unit when there's more than one
v2.282026-07-08
Fixed loop tracking + CLEARING BED reading the wrong sensor — the bed-target temperature is bed_target_temperature in HA, not target_bed_temperature. Loop counting and the CLEARING BED status now actually work (they'd silently never triggered before)
v2.272026-07-08
Printers tab loads much faster on refresh/open — it now reuses the saved HA connection to start polling immediately (before sign-in finishes) instead of waiting ~30s for the next poll tick
v2.262026-07-08
Multi-color sends — the Send screen now gives every filament in a multi-color plate its own AMS tray picker (auto-matched by type + closest color); it warns if any is unassigned or mismatched, and builds the full positional ams_mapping
Queue: ⇄ Change on a matched order lets you swap to a different product if the SKU matched the wrong file (offers to remember the correction)
Fixed repeat notifications — reopening the site on your phone no longer re-fires "finished/failed" alerts (a brief no-data gap on reconnect was misread as a fresh finish/fail)
Optional HA-side loop counter — with the helpers from SETUP.md §H, loops count inside Home Assistant even with every tab closed; the tool shows that count when present
⚙ Settings → printers: 🔍 Detect next to the entity-prefix field lists the printer prefixes HA actually exposes — click one to fill it in (fixes cards that show only dashes because the prefix didn't match)
v2.252026-07-07
Printer-card AMS slots: full filament type always visible (was truncating to "P") — the ✎ is gone and the whole slot is now tappable to open the filament editor
Tray row no longer disappears while a printer is busy — if HA's tray data drops out mid-print, the last-known filaments stay shown (slightly dimmed)
v2.242026-07-07
"Loop X of N" is live — printer cards and glance tiles show which loop a tool-sent job is on. Loops are counted by the bed's thermal signature (target dropping to cooldown temp then reheating), the only reliable per-loop signal the printer gives on concatenated files
New CLEARING BED status (cyan) — shown during the between-loop cooldown/push phase, which the printer itself reports as plain RUNNING
v2.232026-07-07
Printer cards: AMS tray row is now a single line at the top of the card, above the camera — matching how the AMS physically sits on top of the P1S
Pause / Resume / Stop are now big color-coded buttons (amber/green/red) sized for farm monitoring on any device, and state-aware — only the actions that apply to the printer's current state are active (Stop still asks for confirmation)
v2.222026-07-07
Fixed all Send ▸ buttons doing nothing (v2.21 left two references to the removed in-modal tray form, which crashed the Send modal before it opened)
🔔 notification toggle moved from the Printers tab into the nav next to 🎨, and the icon buttons (🔔🎨⚙) are spaced tighter
v2.212026-07-07
✎ Set Filament is now its own popup and opens from the printer cards too — set a tray right when you load a spool, no send needed
Preset color swatches in the filament editor (black/white/gray + 9 common colors); the gradient picker stays for odd colors
"Generic" is hidden from filament labels everywhere, and the false "PETG vs Generic PETG" mismatch warning is fixed
🔔 Notifications (toggle on the Printers tab): get notified when a printer finishes, errors, or pauses — works while a Farm Control tab is open on any device
Printer cards show the live sub-stage (heating, leveling, cooling…) under the status chip
Fixed sends with "Use AMS" unchecked: the call no longer carries a leftover AMS slot mapping, which the printer rejected as an external-spool mapping error (HMS 07FF "failed to get AMS mapping table")
Fixed the "failed to get AMS mapping table" (HMS 0700-7000-0002-0008) send failures: ams_mapping is positional on the file's slicer filament slot — a file sliced with filament 3 now sends -1,-1,0 instead of 0. Files sliced on filament 1 are unaffected (identical call as before)
v2.202026-07-07
✎ on each AMS slot in the Send screen — set that tray's filament (type, color, temps) from the tool, no Bambu Studio/Handy needed. Writes to the printer via HA's set_filament; generic third-party filament IDs auto-filled per type (PLA GFL99, PETG GFG99, …)
v2.192026-07-07
Generate tab: 💾 Generate & Save (to the library, no download — the primary flow now) and Generate & Download are separate buttons; the save-to-library checkbox is gone. Local file mode keeps download only
Printers tab: glance tiles redesigned — model badge (P1S/H2C) with a status dot that pulses while printing replaces the printer emoji; bottom stats line is bigger and brighter, especially on phones
Printer cards now show why a printer is paused or errored (Handy-style): the pause reason from current_stage plus any HMS error codes with wiki links
v2.182026-07-07
Library rows now show the plate's slicer preview image and the filament(s) the file was sliced for (color dot + type, e.g. PETG) — captured when a file is saved, so re-save older entries to add them
Send screen shows "this plate needs" (filament type + grams), auto-picks the AMS slot with matching filament (type, then closest color), and warns loudly if the picked slot's filament doesn't match the file (PETG file → PLA slot)
v2.172026-07-07
Fixed printer 1 showing printer 2's AMS colors — the picker now asks HA's device registry which AMS actually belongs to each printer (via_device link) instead of trusting entity names, which HA freezes at creation and can point at the wrong printer after renames
v2.162026-07-06
AMS slot picker now finds the AMS automatically — matches AMS devices named "{printer name}_AMS_n" (how ha-bambulab names them in Tyler's HA), and recognizes trays even while their sensors are unavailable
v2.152026-07-06
Printers tab: fleet glance card at the top (Home-Assistant-style tile per printer — icon, state, mini progress; tap to jump to its detail card)
Status colors across the tab: green printing · blue idle · amber paused · red error/failed · gray offline · white finished (state chips, card borders, progress bars)
Send screen: visual AMS slot picker — shows each slot's loaded filament color + type (+ remaining %) live from HA instead of bare slot numbers; per-printer "AMS entity prefix" field in ⚙ Settings for when auto-detect can't match the AMS to the printer
v2.142026-07-06
The Send screen can no longer be closed mid-send (click-outside/Cancel are ignored while a job is in flight — the browser drives the hand-off, so leaving early could upload a file without ever starting the print)
v2.132026-07-06
"Skip calibration" option in the Send screen — turns off bed leveling / flow cali / vibration sweep for a send (default stays ON)
Print-start WebSocket frame is now byte-identical to the proven Dev Tools call (dropped the extra target block — device_id rides in the service data only)
v2.122026-07-06
Print-start now sends the FULL parameter set from the proven-working call — the missing ams_mapping made the printer silently discard jobs. New AMS slot picker in the Send screen (first piece of the full AMS color-mapping feature)
v2.112026-07-06
Fixed the print never starting after upload: device-targeted HA calls silently no-op over REST — print_project_file now goes through HA's WebSocket API with a proper device target (found live with Tyler: Dev Tools worked, app call didn't)
v2.102026-07-06
⏸ ▶ ⏹ Pause / Resume / Stop controls on printer cards (Stop asks for confirmation) — replaces Bambu Handy's controls for LAN-only printers; button entities auto-discovered from HA
Camera entity now edits through the ✏️ printer form like every other field (inline 📷 field removed)
v2.92026-07-06
Fixed small-file sends (found in Tyler's first live test): HA runs templated shell_commands without a shell, so the old curl pipeline never executed — small files now go through the same Python FTPS path as Pi files, with real progress + errors in the send modal (no more false "✓ Sent")
HA-side update required: copy farmcontrol_send.sh + re-copy farmcontrol_loop.py to /config/, replace the farmcontrol_send yaml line (SETUP.md §G), restart HA
v2.82026-07-06
🖥 Pi file server — files over ~11 MB now save as "Pi files": metadata in the library, bytes on \\homeassistant\share\farmcontrol\. At send time the Pi loops the file (byte-verified Python port of the loop engine) and FTPS-pushes it to the printer — no size limits, still $0. Setup: files\SETUP.md §G
Order quantity drives loops — SKU mappings now use Units per loop; a ShipStation order's loops = qty ÷ units-per-loop (qty 2 × 1-per-plate = 2 loops; qty 20 on a 20-per-plate = 1 loop)
Per-plate max-Z stored at save so push height is right for every plate on every path
v2.72026-07-06
✏️ Printers are now editable in ⚙ Settings — fill in device id / IP / access code after adding (a "send info missing" flag shows what's incomplete)
Loops are chosen at send time — the Send screen has a Loops field (saved count is just the default); save your base at ×1 and pick the count per send
Multi-plate support — plate names are read from the sliced file (e.g. IAH_8DB), the Send screen's plate box is now a named dropdown, and the looper loops the plate you pick (push height auto-recomputed per plate)
SKU map entries now carry plate + loops — ShipStation orders auto-resolve to file + plate + count, and Queue ▶ Start opens the confirm screen fully pre-filled
Files over ~11 MB can't be stored in the free-tier library — save is now cleanly disabled with a note (generation and download still work)
v2.62026-07-06
Printer cards now show a live bed camera (periodic still from Home Assistant, refreshes on the poll)
Camera entity is auto-detected per printer (camera.{prefix}_camera) and editable in ⚙ Settings — leave blank for printers with no cam (e.g. the H2C until it gets a feed)
Mobile-friendly layout — header wraps with a scrollable tab row, library/printers/queue stack to one column, modals and buttons go full-width on phones
v2.52026-07-06
Printers tab — remaining time now shows as Xh Ym (ha-bambulab reports it in decimal hours)
Tabs are now reorderable + a default tab can be set (⚙ Settings → Tabs) — e.g. open straight to Library during a batch-print day, or Printers to check the farm. Saved per device, works in local mode too
v2.32026-07-06
🎨 Theme picker (header) — 5 themes shared with Batchlog: VDD (default), Control Room, Blueprint, Route Card, Mahjong Parlor; live mini-preview cards, choice saved per device
All fonts/colors routed through CSS variables (--font-display/body/mono, --on-accent) so themes restyle everything, including light themes
v2.22026-07-05
New Printers tab — live fleet status via Home Assistant (state, job, progress, layers, temps, staleness stamp)
New Queue tab — ShipStation orders land automatically via webhook, matched to library files by SKU; unmatched orders get a resolve picker that can save the mapping
Send ▸ to printer (⚗️ experimental) — regenerates, stages in Firebase, HA pulls + FTPS-pushes to SD card, starts via bambu_lab.print_project_file; manual confirm always required
New Library tab — every generated file can be saved (base .3mf + settings in Firebase) and regenerated on demand; folders, search, sort, move, re-loop, delete
Loop start-line boundaries captured on save — groundwork for live "Loop X of N" tracking
Library is hosted-only; opening the file locally stays generator-only
v2.02026-07-05
Renamed to VDD Farm Control — the hub growing around the FarmLoop looping engine (Phase 1 of the Farm Control build plan)
Google sign-in gate when hosted (farmcontrol.vandurdandesigns.com) — opening the file locally still works exactly as before, no sign-in
Firebase foundation added (project vdd-farm-control) for the upcoming G-code library, printer status, and ShipStation queue phases
New deploy.ps1 — pushes to GitHub → Netlify like Batchlog
v1.62026-07-02
Added Bambu H2C support — printer auto-detected from the uploaded file's printer_model comment
H2C uses a different algorithm from P1S: one injection point instead of three, different nozzle-load body, bigger bed sweep coordinates (X0–300, Y0–315)
H2C auto push-height currently reuses the P1S formula (max Z − 10mm), unverified — a note under the field flags this until confirmed against a taller H2C print
v1.52026-06-30
Default push height floor lowered to 1.2 mm (was 2 mm) — tested ideal for current parts
Push height slider step refined to 0.1 mm for finer control
v1.42026-06-29
Renamed output files to VDD_FL_x{loops}_… — loop count moved up front for at-a-glance scanning
Prefix-strip now handles all prior naming styles so re-processing never stacks prefixes
v1.32026-06-29
Output files prefixed with VDD_FL_ to distinguish from FarmLoop app exports
v1.22026-06-29
Fixed purge-line removal: anchor the nozzle-load search to EXECUTABLE_BLOCK_START so it no longer matches the marker text inside the machine_start_gcode metadata comment
Verified output matches real FarmLoop command-for-command
v1.12026-06-29
Replace the front-of-bed purge line with FarmLoop's rear nozzle-load + extrude sequence (Injection Point C)
Auto push height from max Z; generate & download looped .gcode.3mf
Drop your .gcode.3mf file here
Or click to browse — your base G-code file from Bambu Studio
.gcode.3mf • Bambu Studio exports only
—
File Info
Printer—
Est. print time—
Filament weight—
Total layers—
Max Z height—
Loop Settings
H2C auto-height reuses the P1S formula (max Z − 10mm) — not yet verified against a tall H2C print. Double-check before sending to the printer.
Push heights below 5 mm risk unnecessary nozzle wear or bed contact. If a lower height is needed, reduce gradually and proceed with caution.
🖥 Over the ~7.5 MB cloud limit — saves as a Pi file: also copy the .3mf to \\homeassistant\share\farmcontrol\. Looping/sending then run on the Pi (no size limit), but direct no-loop sending isn't supported for Pi files.
LIBRARY
Printer Fleet
⛓ Print Runs
Print Queue — ShipStation Orders
📥 Batchlog Orders
⚙ Settings
Local file mode — only the Tabs section applies here; everything else needs the hosted version.
Tabs (this device)
★ = default tab when the app opens · ▲▼ = nav order. Saved on this device only.
Home Assistant
Printers
Entity prefix = the part after sensor. in HA (e.g. sensor.p1s_left_print_status → p1s_left). Device id: HA → Settings → Devices → printer → copy id from URL.
📹 Extra cameras (v2.71)
Any HA camera entity that can serve a still — room cams, a Wyze via the Wyze Bridge add-on, or anything already going through go2rtc. These show in a collapsible 📹 panel at the top of the Printers view; they are view-only and never tied to a printer.
🤖 Automation (v2.38)
📱 Phone notifications (via Home Assistant)
Find it in Home Assistant → Developer Tools → Actions, search “notify”. notify.notify hits every registered device.
Sends the same alerts the browser shows (finish · error · pause · ✋ bed needs clearing · run events), but to your phone from
whichever device is running Farm Control — and only once, however many tabs are open.
It still needs a tab open somewhere: Farm Control does the watching. For alerts with everything closed, use an HA automation on the printer's print_status sensor.
SKU Map (ShipStation SKU → library file)
Loops = order qty ÷ units per loop (rounded up). A 1-per-plate SKU with qty 2 → 2 loops; a 20-per-plate SKU with qty 20 → 1 loop.
🎨 Theme
CLICK TO PREVIEW LIVE · SAVED ON THIS DEVICE
▸ Send to Printer
—
⚠ NOT A LOOPED FILE. This is a direct print — the bed will NOT auto-clear. Take the finished part off by hand before anything else prints, or you'll crash the next print into it.
The printer WILL physically start — make sure the bed is clear.
✎ Set Filament — slot ?
🧹 Clear Bed — —
Homes safely, then runs the FarmLoop clear: 6 plate-bend strokes, slow push at the height below, fast rake, park. Nothing heats and nothing extrudes.
⚠ Below 5 mm the nozzle plows through the part — right for popping flat parts off the plate, but watch nozzle wear.
—
⚠ Homing moves the toolhead across the bed before it can measure anything — a part over ~40 mm may be in its path, unsensed. Clear those by hand.
⚠ H2C from-idle clear is new — supervise the first runs.
✕ This printer's last print failed or was cancelled. Set the push height above whatever is actually still on the plate — a failed print can be taller or messier than the part was meant to be. If you can't see the bed on the camera, use 🕹 Move → 🪄 Bend plate instead: it's pure up-and-down and never travels over the plate.
⊘ Skip Objects — —
Tap the parts you want the printer to skip. Skipping is permanent for this print — the rest of the plate keeps printing.
🕹 Move — —
Camera loading…
Same bed positions and speed as Clear Bed, sent as a direct command. Pure up-and-down — nothing travels over the plate. Press again to repeat.
—
Use this when a print has already finished on this bed and the printer has not been powered off since. Homing would drag the toolhead across whatever is still on the plate.
±10
Directions are as seen from the front of the printer. If any axis moves the opposite way on your machine, let me know and I'll flip it.
⛓ Print Run — —
From the queue
Add job
Jobs run back-to-back: each looped job clears its own bed after the last loop, then the next job auto-sends. A DIRECT job can't clear its own bed, so the chain stops after it and waits for you to press ✋ Bed cleared — chain as many as you like — the AMS tray is auto-matched to each file's sliced filament at send time. Load every color before GO. A Farm Control tab must stay open (on the Printers view) for the chain to advance.