VanDurdanDesigns logo •

Farm Control v2.175
Changelog
v2.1752026-11-02
  • ⏳ Pick the filament while the spool loads. Tap an empty or still-loading AMS slot, pick the type and color, and press Set when loaded. The slot shows your pick with ⏳. As soon as the spool finishes loading, Farm Control writes it to the printer, so the printer's last-used filament doesn't stick. No more waiting 30 seconds before you can pick.
  • The 📦 new-spool prompt waits for your pick, so it asks about the right spool. Auto-sends to that printer wait the few seconds it takes to land.
v2.1742026-10-31
  • 🧭 Each printer's AMS is read correctly on every screen. P1S-1's AMS kept flashing the 📦 new-spool prompt. One screen was reading P1S-2's AMS as P1S-1's: in Home Assistant their tray sensors still carry each other's old names (from when the AMS units were moved). Farm Control now always uses HA's device list, which says which AMS is attached to which printer, and never guesses from the names. The list is saved on each screen and loads at once on a refresh. If a screen doesn't have it yet, it tries again every minute. Until then, that screen won't send a job with the AMS on or record a new spool, and Send says why.
  • ⚠ "Can't reach Home Assistant". If HA doesn't answer within 8 seconds, the Printers tab says so in red, with the reason and how old the last data is (e.g. "Is Tailscale up?"). The Printers tile shows HA unreachable. Before, it just said "connecting…".
  • 🖐 Queue lines show how they're really printing. A line queued looped but sent direct (or the other way round) now shows 🖐 direct or 🔁 looped to match the printer.
  • 🗂 Status tiles fit on the wall tablet. Below 1366 px wide, the VDD logo and the signed-in email are hidden, so the tiles have room for their full text. Sign out is still there.
v2.1732026-10-24
  • 🗂 New top tabs: status tiles. Printers, Print Queue and Inventory are now bigger tiles that also show how things stand. Printers shows how many are printing, idle, need you or have an error, in the printer colors. Print Queue shows open lines, how many are printing and how many wait on QC. Inventory shows items low and supplies to reorder.
  • The Printers tile stays current from any tab (it checks Home Assistant every 30 s while the screen is on). On the phone the tiles sit in their own row under the logo, and the 🔕 🎨 ⚙ 📝 ? buttons move up next to it. Your tab order and default tab are kept.
v2.1722026-10-24
  • 🧩 Kit parts on different plates of one file. In 🧩 + Part file, tapping a file with several plates now shows its plates with pictures. Set how many of each go in one kit (+/−), or tap Every plate ×1, then + Add N parts. Each plate gets its own line under the order, and every future order of that SKU queues them all by itself.
  • The order's own plate is marked and can't be picked as a part, and neither can a plate that's already in the kit. Part names now include the plate ("Rod Kit · Clip").
  • Fix: a part from the order's own file no longer guesses the order's own plate.
v2.1712026-10-24
  • 🧩 Kits: several print files for one SKU. On an order card, tap 🧩 + Part file, pick the file and say how many go in one kit. It's saved on that SKU (for example FRH-ICE = the rod holder + the bucket mount), so every order of that SKU gets the part too. The single-item SKU stays one file.
  • Each part gets its own line right under the order, tagged 🧩 KIT PART, with its own send, QC, inventory pick and H2C file. The order card lists the parts and how many have passed. ✕ takes a part out of the kit. Dismissing the order offers to dismiss its part lines too.
  • The order card shows each part's real state in the same words as its progress blocks (printing, in a run, in QC, passed, to print or ✓ done) and "N of M files done". Each part's line shows the rest of the kit the same way.
  • A kit order stays in the queue until every part is done. When its own file is finished first it shows "✓ waiting on N parts", then it moves to Finished once the last part passes.
  • Not for Batchlog orders.
v2.1702026-10-24
  • 🖨 An H2C file (or P1S file) for an order again. The second-printer file from v2.108 went missing when orders moved into the Print Queue. Each order card now has a line for it: + H2C file opens the file sheet with only H2C files. Once set, the line shows the file and color, a ▶ H2C send button and ⇄ to change or remove it. Both printers print from the same order count.
  • The color is matched by plate name (Red → Red). If the names differ, pick the color on that line. It asks whether to remember the H2C file for that SKU, so future orders get it on their own.
v2.1692026-10-24
  • 🔗 Link one bed to many queue lines. A print you started from Bambu Studio can now cover as many lines as are on the plate: different orders, different products, inventory and personal lines. Tick each one in the 🔗 Link sheet. A ×N stepper sets how many of an order are on the bed (or how many plates of a line), capped at what's waiting.
  • When it finishes, every order's units go to quality check and every line ticks off. If it's cancelled or never starts, they all go back to "to print". 🔗 unlink frees them all. The printer card shows "🔗 N lines".
  • Any printer. The link sheet lists every waiting line, even when the order's file in Farm Control is for a different printer, so a combined plate on the H2C can carry P1S orders.
  • Fix: a linked order showed as "in a run" (dashed) while it printed. It shows as printing now.
v2.1682026-10-24
  • ✓ Finished orders show up in Finished. A complete order used to drop off the queue with nowhere to see it. It now lands in the queue's Finished list, newest first, with its store, SKU and finish date. ↺ Reopen puts one back in the queue.
  • Orders from the old queue. Orders sent before the Sept 30 update never counted their units. They show in Finished as "sent in the old queue" with the date they were sent.
  • 🔽 Filter Finished. Chips at the top of Finished: All · 🛒 Orders · 📦 Inventory · 🗂 Personal, each with its count. It shows the newest 40 with a Show all button. Clear only empties inventory and personal lines; orders stay.
v2.1672026-10-23
  • 💡 Suggestions say what kind of print it is. An order suggestion has a 🛒 ORDER tag with where the order came from (Website, eBay, Etsy, TikTok Shop, or the Batchlog client). An inventory or personal suggestion has a 📦 INVENTORY or 🗂 PERSONAL tag. Phone pings start with "Order (eBay):", "Inventory:" or "Personal:".
  • 🛒 Order source from ShipStation. New ShipStation orders remember which store they came from, and the queue card reads "ShipStation · eBay". Orders that came in before this update just say "ShipStation".
  • ⛓ Run screen: see the product before + Add. In Add to this run → 📦 Orders, each order shows the product name with a 🛒 source tag (eBay, Website…), the SKU and the color, instead of "#order number — item". Order jobs in the run read "ORDER · eBay", carry the product name and the SKU, and no longer show the order number.
  • ✎ Edit any waiting job in a run. Each job that hasn't gone out yet has a ✎ button (or tap its name) that opens 🔁 Looped / 🖐 Direct, the loop count, the plate (not for orders, where the plate is the color) and 🎨 Trays. Use it to make a queued order a direct print while you're still proving a file's auto-loop. An order job's loops stay within what the order has left.
  • 🧵 "New spool loaded" picks by color. The text-only dropdown is now color spool tiles, the same look as the Supplies wall (color ring, count in inventory, name, material · brand). The best matches for what's in the slot come first and the top one is pre-picked. Tap a tile, then −1 · Yes, took it out of inventory.
  • Fix: the personal-print suggestion's grey notes ("clear the plate first", "+ 2 more") no longer break onto their own lines.
v2.1662026-10-23
  • 🧾 Fees no longer land in the queue. A ShipStation order brought in a "Total Service Charge" line as if it were something to print. Lines ShipStation marks as adjustments, and SKU-less lines named like a fee, discount, tax, shipping or tip, are now skipped.
  • 💡 "Printer is idle" suggestions say what will print. Instead of the order number, each suggestion shows the item, its picture, the color (with a swatch), the material and the SKU, so you know exactly what Send sends. The phone ping says the same.
  • 🧵 Filament grams on the queue. Each queue card shows the grams one plate uses (from the sliced file) and, when more than one plate is left, the total for the plates still to go, so you can tell if a roll has enough. The 📁 Files list shows grams per plate too.
  • 🔽 Filter the queue by status. Chips above the queue: All · 📦 In inventory · 🖨 Printing · ⛓ In a run · 🔍 Needs QA · ○ Not started · ⚠ No file, each with its count. Tap one to show only those lines, and tap it again (or All) to show everything. Chips with nothing in them hide, and the search box still works on top. Finished stays hidden while a filter is on. The screen remembers your pick.
v2.1652026-10-22
  • 🔩 Hardware added to an order that's already in progress now comes out. When an order was waiting on QC and its hardware was set up afterwards, the first Unit done was treated as "passed before it had hardware" and took nothing. Now saving the hardware marks where each open order stands right then, and every unit passed after that takes its hardware.
v2.1642026-10-21
  • 📸 Read labels: close-ups in the right place. The reader was cutting its close-ups from the wrong spots (bare box, the shelf), so every label came back "couldn't read". It now gets the photo's exact size and gives label positions in pixels, which it does reliably.
v2.1632026-10-21
  • 📸 Read labels fix. The first real label photo failed with "couldn't read that (400)": the stronger AI model refused how the request was asked. The reader now asks again in a way it accepts, falls back to the original model if it still refuses, and says the reason if everything fails.
v2.1622026-10-21
  • 📷 Add a barcode to something you already have. A supply's sheet now has 📷 Add barcode: scan (or type) its code and it's remembered for that item, with how much a later scan adds. Nothing is counted. If the code already belongs to another supply, it asks before moving it.
  • "Just remember it" on the New barcode sheet links a code to the supply you pick without changing the count, for things already on the shelf.
  • 📸 Read labels actually reads them now. v2.161 shrank the whole photo until each label was a few blurry pixels, then guessed (Klein Blue PLA+ came back as "Black PETG"). Now it first finds every label in the photo, then cuts each one out of the full-size photo and reads the close-up with a stronger AI model. One label = one box, so counts come from the labels. Each line shows the close-ups it was read from, and a label it can't read is listed as skipped instead of guessed. A shelf photo costs a few cents instead of about one.
v2.1612026-10-21
  • 📷 Scan barcodes into Supplies. Inventory → Supplies → 📷 Scan. On the laptop, just scan with the Bluetooth scanner while Inventory is open. On the phone or tablet, use the camera. 📥 Receive adds, 📤 Use takes out (remembered per device). Each scan beeps and shows in a list with its own ↶ undo.
  • A new barcode asks once. Pick which supply it is (or make a new one) and how much one scan adds, like 50 for a bag of 50 mailers. Every device remembers it after that. Filament box codes, Amazon X00… stickers and UPCs all work, and several codes can point at one supply. A supply's sheet shows its barcodes, with forget.
  • 📸 Read labels. For boxes with no barcode, or a whole shelf at once: take a photo and the reader counts each box or bag by its printed label. You check every line before anything is added, and any barcode text it can read is remembered for scanning.
  • 🧵 Filament batches. A filament box's barcode is its batch number, so every spool scanned or photographed in is counted under its batch. A spool's sheet lists its batches (e.g. "0705… · 2 spools · in Oct 21") with a −1 for each, so you can pull matching spools for one order. A tile says 2 batches when the shades might not match. Scanning a box in Use takes it from its own batch; the plain −1 takes a spool with no batch recorded first, then the oldest batch. Search finds a batch number.
v2.1602026-10-21
  • 🛒 Phone ping when a supply needs reordering. When a supply drops to its Reorder at (bolts used up by orders, a spool taken, a count typed in), you get one notification through the same Home Assistant phone alerts as the printers. It won't repeat until you restock above Reorder at and it runs low again. Several going low at once come as one message. A supply with no Reorder at never pings.
  • 📁 Inventory folders are a tree. A subfolder (like Ice Anchor Holder) is its own row, tabbed in under its parent with its own ▸, showing just its name. Folder names always show in full, with the counts on the line below. A parent's LOW tag and file count include its subfolders, so you can see them even with it shut.
v2.1592026-10-21
  • 🧹 Clear Bed skips homing on a P1S that's still homed from its last print. Before, Clear Bed homed first. That dropped the bed into the Farm Control arm, dragged the toolhead across whatever was still on the plate, and the slow Z-home rise could snag the plate corner on the arm. Now the bed drops to the bend position first, the toolhead stays at the back, and it runs the same bend and sweep a looped file does. Tall parts are no longer blocked, and a clean Clear Bed after a direct print is a real test of whether the file can loop. The Clear Bed screen says which start it will use. After a power-off, or on the H2C, it still homes the old way.
  • 📦 Inventory: one card per file. The file name (your SKU, like IAH-10 or IAH-10-DB) is the big title, and each plate is a row: its filament color, name, On hand ± and Keep at. One + Refill covers every short plate of the file. 🖨 On demand, + Queue for a single plate and 🕘 History moved under ⋯. ⚠ Low and 🖨 On demand show just the plates they're about; a search for a color or SKU shows just those plates. The On hand number is big and bold (orange when short); the ± are small and quiet.
  • 🔩 New: hardware per item. In a product's ⚙ Set up, list what one finished item takes from 🧰 Supplies (e.g. 1 × M4 bolt). When an item passes QC, for an order or for inventory, that hardware comes out of Supplies automatically and its history says which order. Undo a pass and it goes back. An item picked from inventory takes nothing more (it took its hardware when it passed QC). Box supplies work as "1 box for every 25 items", so Supplies can show 3.6 boxes. Orders and inventory lines that already had passes before you set it up only count from then on.
v2.1582026-10-20
  • 📄 New: Add from order (Inventory → 🧰 Supplies). Pick a screenshot, photo or PDF of an order from Amazon, Sunlu, Uline or anywhere else. Farm Control reads the items and matches each one to your supplies, or suggests a new one. You check every count before anything is added. Multi-color filament packs split into one line per color. Adding the same order twice gets a warning, and there's an Undo.
  • 🧵 "Copy a loaded AMS tray" is grouped by printer. When you add filament, each printer gets its own row of slot tiles, just like its card. Empty slots are greyed out, and the tray you copied stays highlighted.
v2.1572026-10-20
  • 📦 Stock is now Inventory. The tab, the queue's INVENTORY lines, 📦 N IN INVENTORY and 📦 Pick from inventory all use the new name. Your counts are unchanged.
  • 🧰 New: Supplies. The Inventory tab now switches between 📦 Products and 🧰 Supplies, which is everything the shop runs on: 🧵 Filament, 🔩 Hardware, 📦 Shipping, 🛠 Printer parts, 🧴 Shop supplies. You can also add your own categories.
  • 🧵 The filament wall. Each filament is a color tile with its count of unopened spools, grouped by material. Tap a tile, then −1 · Took a spool to a printer. Every change has an ↩ Undo for 8 seconds.
  • 🔩 Everything else is a row with big −/+ buttons. Tap its name for Set to…, + Pack of N and ✎ Edit.
  • 🛒 Reorder at + Shopping list. An item at or below its Reorder at shows LOW and lands on the shopping list, with its store link and a 📋 Copy list button. The Inventory tab's badge counts these too.
  • 📦 New spool in an AMS? When a spool goes into a printer and matches an unopened one in your Supplies inventory, that tray on the printer card gets a 📦 and an orange pulse. Tap it to take one out of inventory, or say it was an opened spool. Part-used Bambu spools (under 90%) and RFID spools already seen never ask.
  • 💡 Idle printers no longer suggest low inventory. They only suggest what's in the Print Queue. Put the inventory you want in the queue, and it's suggested like any other line.
v2.1562026-10-20
  • 📁 Stock is grouped by folder. Products sit under their P:\Business folder, which you tap to open or shut. Each folder shows how many items it has, how many are on hand, and how many are LOW. A search or the ⚠ Low filter shows everything open.
  • 📁 Folders start shut. In the Stock tab and in Print Queue → 📁 Files, every folder starts closed when the page loads. Folders you open stay open until the next reload.
  • 🖨 Print on demand. Tap 🖨 On demand on a product you never keep on the shelf. It moves out of All products into its own 🖨 On demand list, loses its Keep at, and is never LOW or suggested for a refill. 📦 Keep stock puts it back.
v2.1552026-10-20
  • 📦 New Stock tab. Every business product (file + plate) has On hand and Keep at counts. Type in what's on your shelf, or use −/+. Each item keeps a 🕘 History of what changed it.
  • 📦 Stock counts itself. A STOCK line's items add to On hand as they pass QC. ↩ Undo takes them back off. A business print you send outside the queue (not for an order) now gets a stock line of its own when it finishes, so its items also count in once they pass QC.
  • 📦 Pick from stock. A ShipStation order whose item is on the shelf shows 📦 N IN STOCK and a 📦 Pick from stock button. Picking takes the items off the shelf and counts them done on the order. Anything the shelf can't cover stays to print. ↩ Put back undoes it. Batchlog orders aren't picked from stock.
  • ⚠ Low stock + refills. An item below its Keep at shows LOW. + Refill queues the shortfall in whole plates, counting what's already in QC, printing or queued. + Refill all low does every low item. The Stock tab badge counts the items that need a refill.
  • 💡 Idle printers suggest low stock. When a printer is free and has the filament for a low item loaded, a suggestion offers ⛓ Refill to run. It only pings when no order or queued print fits that printer.
v2.1542026-10-19
  • 📤 Copy to P:\ skips files already there. An app-saved file whose P:\Business spot already holds a file you exported there (like the new IAH-12) isn't copied any more. The copy would have overwritten the newer export. It hung on "Copying…" instead, because the network drive never finished swapping the file in.
  • 📤 A copy that hangs gives up after 5 minutes and says so, instead of leaving the dialog on "Copying…".
v2.1532026-10-19
  • ⛓ Adding to a finished run starts a new one. When a printer's last run was done or cancelled, the idle card's ⛓ All to run and the queue's Fill a run stopped with "This run is done — open it to start a new one." They now start a fresh run and add the jobs to it.
  • 📁 Picking an order's file shows the order. The file list was a plain dropdown that hid the order on a phone. 📁 Pick the file (and ⇄) now opens a sheet with the order's item, SKU and quantity on top, a search box, and the files with the best name match first, each with its picture. Order lines also show their SKU.
  • 🔔 Tapping a phone notification opens Farm Control. It used to open the Home Assistant app.
v2.1522026-10-18
  • 🧾 Prints sent from the Send screen show in the queue. Sending a queue line with its ▶ (or from Files) as copies, or any single P1S send since v2.151, goes out as a run. The queue didn't count those, so a line kept saying "2 plates to go" while they printed, and Fill a run could have scheduled them again. They now count as printing or in a run on the first open line for that plate.
  • 🧾 Stock lines tick off when they finish. A business stock line's prints were never credited when they finished (only personal lines were), so its plates went back to "to go". Finished stock prints now move to quality check like they should.
  • 🔎 Search where you need it. The search box moved from the top of the page into 📁 Files, under the All / Business / Personal chips. The queue has its own box, which finds lines by name, file, order number or Batchlog client. Neither one loses what you've typed when the page updates.
  • 🔗 Link a Bambu Studio print to the queue. When a printer is printing something Farm Control didn't send, its card shows 🔗 Link to queue. Pick the line it belongs to (the best name match is listed first) and the queue shows it printing. When it finishes it counts as one plate: the line ticks off, or an order's units go to quality check. Farm Control didn't add its bed clear to that file, so a run waiting on that printer still asks for ✋ Bed cleared first. Picked the wrong line? Tap 🔗 unlink on the card.
v2.1512026-10-18
  • ⚡ Direct sends don't lock the screen any more. Sending a direct print to a P1S used to keep the Send screen open until the whole upload finished, minutes for a big file on the Pi, and nothing else in the app could be used. Now it works like a looped send: Send closes in a second, the upload carries on in the background, and the ⛓ strip on the printer's card shows its progress.
  • 🎨 Run tray picker shows color tiles. 🎨 Trays on a run job used to be a dropdown. Now it shows the same tray tiles as the Send screen: color dot, filament, slot and how much is left, two to a row. Tap one to pick it. Trays of the wrong type are greyed out, and the orange underline marks the tray that's loaded in the printer now.
  • 📱 The phone shortcut reuses its tab again. Since v2.149 the address read …/#printers, so Chrome no longer saw the open tab as the shortcut's and opened a new one on every tap. The address now stays plain. Back still works the same, and a refresh still keeps the tab you were on.
v2.1502026-10-17
  • 🚪 Door closed = no looped prints. A looped print clears its bed by pushing the parts out the front, so with the door shut it has nowhere to put them. Tap 🚪 on a P1S card when you close its door (it lights up SHUT); the H2C reads its own door sensor. While a door is shut, direct prints still go, but a looped job waits. The card asks you to open the door or tap 🖐 Print direct, which turns that job into one plate at a time, each waiting for ✋ Bed cleared. You get a phone ping when a run is held this way. Send refuses a looped send to a shut door and offers 🖐 Switch to Direct.
  • 🚪 Door shut mid-print. If a door goes shut while a looped print is printing (your tap, or the H2C's sensor), the card asks ⏸ Pause before the clear or Keep going. Pausing stops it as this loop finishes, before the bend and sweep, with the parts still on the plate, and the pause prompt reminds you the door is shut. Open the door (or take the parts off) and Resume. If the door is still shut, it asks again before the next loop.
v2.1492026-10-17
  • 🔍 Tap a plate picture to see it full screen. Works on the printer cards, the Print Queue, 📁 Files, the run screen, ⚙ Set up and note photos. ‹ › (or swipe, or the arrow keys) steps through the file's plates, ⛶ goes true full screen on desktop and tablet, and tapping the picture zooms in. Files on P:\ are sharp; app-saved files only kept a small preview.
  • 📹 Tap a camera to see it full screen. Printer cameras and 📹 room cameras open in the same viewer, refresh about every 1.5 seconds while open, and show the printer's status, %, loop and finish time along the bottom, with the 💡 light button. Swipe or ‹ › to move to the next camera.
  • ⬅ Back goes back. Back closes the pop-up or full-screen view on top, then returns to the tab you were on. On the first screen it says "Press Back again to leave", so a stray swipe doesn't close Farm Control. The tab is in the address too, so a refresh stays put.
  • 🔒 Batchlog orders need the connection. On a screen that isn't connected to that Batchlog client, a Batchlog order's line shows Connect <client> instead of Done / Undo / QA. Before, those taps only counted in Farm Control and never reached Batchlog.
v2.1482026-10-17
  • ⏯ A paused print and its run resume together. When a run's print pauses, resuming the print anywhere (card, ⏸ prompt, printer screen, Handy) carries the run on too. On the run screen, ▶ Resume print + run does both. ⏸ Pause run still only holds the run: the print on the printer finishes and nothing new starts.
  • ⏰ Tap Remaining for the time it'll be done. Every card switches to clock times ("Done at 3:45 PM", or the day if it's later). Looped jobs count all their loops, not just this one. The fleet strip and run screen follow, each screen remembers its choice, and tapping again switches back.
  • 📝 Quick notes. Tap 📝 at the top (or press N on a keyboard), type or dictate an idea or fix, then Save. It remembers which screen you were on, and a half-typed note survives closing the pop-up. Open notes are listed underneath with ✓ done, and 📋 Copy puts the whole list on the clipboard to paste.
  • 📊 Notes carry the clues. Each note quietly includes a snapshot of every printer, job and run at that moment, today's event log and any errors this screen recorded. It also adds the camera frames of the printers on screen (tap one to leave it out). Use 📷 Photo, or paste a screenshot into the box, to add pictures. Never includes settings or your Home Assistant token.
v2.1472026-10-16
  • 📂 Business files live on P:\ too. Anything in P:\Business\<folder>\ is a business file, and its folders are the 🏭 folders in 📁 Files. Everything else on P:\ stays personal. A new business file shows NEW ON P: and is set up once before it can be queued or sent.
  • ⚙ Set up: one panel for every file. Loop or direct, loops, push height, cooldown, bed-clear sweep (with the diagram) and items per plate. It replaces Generate's settings, Re-Loop and ↻ Sweep. Settings stay when you re-export a file.
  • 🔁 Personal prints can loop. Set a personal file to loop and it prints ×N and clears its own bed like business stock, while staying personal. New personal files still start direct.
  • 📤 Copy to P:\. Business files saved in the app are copied onto P:\Business from Chrome on your PC, keeping their folders. Each stays the same file (SKU mappings, queue lines, settings), just on the drive. Nothing is deleted.
  • Generate tab removed. Files come from P:\, and ⚙ Set up holds their settings. The + Folder / rename buttons went with it: folders are your P:\ folders now. SD-card downloads are gone.
v2.1462026-10-16
  • 📁 Folders open and close. Tap a folder's name in Files to fold it (▸) or open it (▾); it shows how many files are inside. Collapse all / Expand all sit above the list, and a folded parent hides its subfolders too. Each screen remembers what you folded, and a search still finds files inside folded folders.
  • ⚙ Settings + ❓ Help caught up. The Tabs list is Printers · Print Queue (the old Library and Queue entries are gone; a saved "Queue" default opens the Print Queue). Settings wording matches the one-queue page, and the SKU Map explains how it relates to "N per plate". Help has new cards for folders, the stopped-print prompt, and SKU Map · Sweep, and the run-screen and Send cards are updated.
  • Empty folders show up. A new folder appears right away with its + ✎ ✕, so you can delete it without moving a file in first. Deleting never deletes files; anything inside moves up a level.
v2.1452026-10-15
  • ✋ A stopped print asks for a clear bed right away. No more red "Printer ERROR … then Resume" text followed by a second prompt after Resume. The ⚠ bed-clear prompt shows at once on the printer card and on the run screen, and ✓ Bed clear — continue run is the resume (the run's own Resume button does the same). Put it off with Later and the card shows a calm ✋ line with the same button.
v2.1442026-10-15
  • ✔ One unit at a time, like before. Every queue line has − QA · + QA · ↩ Undo · ✔ Unit Done (personal lines: ↩ Undo · ✔ Unit Done). Unit Done takes one out of quality check when one is waiting; Undo puts one back; + QA = a printed unit waiting on QC; − QA = it failed, back to not started. Batchlog orders use Batchlog's own counts, same as its buttons. The old ✓ "a plate's worth" button is gone.
  • Printing animates. Units on a printer show as moving stripes in the line's blocks — that part comes from the printers and runs on its own; only QA and done are by hand.
v2.1432026-10-15
  • 🧾 One Print Queue. The Library and Queue tabs are one Print Queue tab: printer strip on top, 📁 Files on the left (business AND personal, same look, All / Business / Personal chips, folders, ⋯ for move · send · re-loop · sweep · download · delete) and one queue on the right. ShipStation + Batchlog orders land in it on their own — after the last order, ahead of personal prints. Add business stock or personal prints with + Queue.
  • Every count is items that come off the bed. Tap "N per plate" on any plate to set how many items one plate makes (an order's SKU setting still wins for that order). +/− moves a plate's worth; tap the number to fix counts by hand.
  • Quality check on every business line: printed items wait striped until + Pass / − Fail / ✓ Pass all (a fail goes back to "to print"). Batchlog orders use Batchlog's own counts, like before. ✓ = printed a plate some other way. Personal lines skip QC.
  • ⛓ Fill a run… takes the whole queue top to bottom — orders (as batches, same Batchlog hand-off), stock (looped jobs) and personal — into one printer's run. "Business stops" are gone: a business file is just a line.
  • 🎨 Pick trays on a run job. A plate sliced in black PLA + red PETG can print with blue PETG: tap 🎨 Trays on the job and choose the spool for each filament. Any color is allowed; a different TYPE is refused. Multi-color picks made in the Send window now stick when the job goes into a run.
v2.1422026-10-15
  • 🧾 A real personal print queue. Library → 🗂 Personal prints is now 📁 Files (left — everything in P:\) and 🧾 Print queue (right). A file no longer means "print it once": it only prints once you queue it. + Queue on a plate (tap again for +1), or + Queue project… to set a count per plate / "one of each ×N", at the end or the top.
  • Each line shows one block per print — white printed, orange printing, dashed waiting in a printer's run. A finished print ticks its line by itself (✓ for one you printed another way); a full line drops into Finished (↺ Queue again). −/+ the count, ⤒ ↑ ↓ to reorder, ✕ to remove — if some are already in a run it asks whether to pull them out too.
  • 🏭 Business stop puts a business file (looped or direct) at any spot in the queue. ⛓ Fill a run… moves the queue, in order, into one printer's run (up to the next business stop, or everything for that printer type), warning about filament that isn't loaded.
  • The 💡 free-printer suggestion, the printer card's "waiting" strip and the run screen's 🗂 Personal tab now read the queue, not the whole folder. Files show their history ("printed 3× · last Oct 12").
v2.1412026-10-14
  • 💡 Free printer → personal plates suggested. When a printer is free and its AMS already holds the filament a personal plate needs, a grey 🗂 row appears in the suggestion bar on the Printers tab (with the plate's picture): ▶ Send opens Send with that printer picked, ⛓ All N to run adds every matching plate to that printer's run, ✕ mutes it for the cooldown. Orders still come first — a personal row shows under them, and your phone only gets the personal ping when no order fits that printer. Works on the H2C too. A printer showing FINISH says "clear the plate first", since a personal print leaves its part on the bed.
v2.1402026-10-14
  • 🗂 Personal prints. One-off prints (Gridfinity and the like) now have their own place: Library → 🗂 Personal prints. In Bambu Studio, slice, then Export all sliced file into P:\<project>\ (the Pi's printlist folder, mapped as a drive — works away from home over Tailscale). Each plate shows up with its picture, time, and filament, grouped by folder, as To print / In run / Printing / Printed / Failed. A plate turns Printed by itself when its print finishes; ✓ marks one you printed another way, ↺ puts it back. Personal files never show up in product pickers.
  • ⛓ Mix personal and business work in one run. Add personal plates with + Run (or a whole folder with + All to a run). In a run, ⤒ Next moves any job to right after the current print, and every add has ⤒ Add next. ⏸ parks a personal job — it stays in the run but won't print until you put it back — and ⏸ Park personal sets them all aside so only business jobs keep going. A run with nothing but parked jobs left pauses instead of finishing.
  • New run screen. The run is a list with plate pictures (business = orange underline, personal = grey), whether each job's filament is loaded, its print time, and what happens between jobs (clears itself vs ✋ you clear the bed). The add side has tabs: 📦 Orders, 🏭 Business files (pick the plate by picture, 🔁 looped with a loop count or 🖐 direct, tray), and 🗂 Personal. The header shows time left and when the run should be done. Finished jobs fold away. Full screen on a phone.
  • 🖼 Printer cards with pictures. The plate on the bed now shows its picture, name, BUSINESS/PERSONAL/ORDER and loop or direct, in place of the plain file name. The run strip is a row of plate pictures (done ✓, printing with a progress bar, next dashed while ✋ waits) with › / ✋ between them, ×loops or 🖐 badges, and +N for longer runs. A printer with no run shows how many personal plates are waiting. Same card height on the wall tablet.
v2.1392026-10-10
  • 🖐 One file, looped or direct. Every library file is now tagged Loop or direct or Direct only. Sending a "Loop or direct" file asks Print as: 🔁 Looped / 🖐 Direct (Looped by default) — from the Library or a Queue row — so you no longer need a separate direct copy of a file. Direct sends lock loops to 1, offer Copies (a chain with ✋ Bed cleared between each), and runs hold for ✋ after them exactly like a direct-only file. The run screen's "add a job" form has the same Direct box.
  • Direct only files can never be looped, even by accident. Tap the loop badge on a Library row (×19 OR DIRECT / DIRECT ONLY) to switch: going direct-only keeps the loop settings so it can switch back; a file that was saved as direct has no loop settings, so it points you to Re-Loop.
  • Generate tab follows suit. You only ever slice one file — the Library keeps the original and looping is applied when it's sent. The "Direct print" checkbox is now Save as: 🔁 Loop or direct / 🖐 Direct only; Direct only hides the loop settings. Generate & Save is now 💾 Save to Library, and a "Loop or direct" file can be downloaded either way: ⬇ Download looped or ⬇ Download direct.
  • Fixed along the way: a direct print sent through the Pi or chunked cloud storage now marks its job record as direct, so "this print won't clear its own bed" is known on every path.
v2.1382026-10-09
  • 🛑 on single prints too. A looped file sent as ×1 (e.g. testing whether a new product ejects) now shows the 🛑 tag under its Progress, with one option: ⏸ Pause before the clear. It pauses as the print finishes, before the bend and sweep — take the part off by hand (or see if it would have released), then Resume and the clear runs on the empty plate. Direct prints never clear, so they don't get it.
v2.1372026-10-08
  • 🖼 Pictures for orders imported before v2.124. Those orders still carry the old color-only product key (e.g. "white"), but Batchlog now looks pictures up by the full variation ("card holder · white"), so they showed no picture — Seoul's Mahjong #77. Farm Control now reads each Batchlog order in the queue and, when its current key isn't mapped yet, adds a mapping for it from the file and plate that order actually prints with. Its picture then goes to Batchlog by itself, and future orders of that variation match without a re-pick. Existing mappings are never overwritten.
v2.1362026-10-08
  • 🖼 Plate pictures in Batchlog. Batchlog shows each product's plate preview instead of a color dot. Farm Control sends the picture of the plate each Batchlog product prints from — automatically whenever its mapping is saved or changed, by any device signed in to that client — plus a bigger version for tap-to-enlarge (normal-size library files only; huge chunked/Pi files send just the small one). ⚙ Settings → SKU Map has 🖼 Sync pictures to Batchlog to send them all now and report per client — including when a client's Batchlog refuses them because its database rules haven't been added yet.
v2.1352026-10-08
  • 🛑 An armed stop/pause no longer carries into the next job. It used to switch off only when you answered its own prompt, so a job ended with the card's ⏹ Stop (or from Handy / the printer) left it armed — and the next job on that printer would pause at the end of its first loop. Found on P1S-1 this morning. Now every new send and every ⏹ Stop disarms it.
v2.1342026-10-08
  • ⏱ Order completion estimate. Batchlog orders on the Queue show Est. done Thu, Oct 9, ~3:45 PM, worked out from the printers themselves: each printer's time left on its current loop, the loops after it, anything queued ahead of it in its run, and the real time per loop measured on live jobs (slicer time + 20 min until a loop has been measured — shown as "rough"). Units not sent yet are spread over the printers already on the order. An order not on any printer shows how many hours of printing it still needs instead. Each estimate carries a *, explained once at the bottom of the list: it assumes every part passes quality check; reprints add time.
  • The same estimate is written to the order in Batchlog so it can show it there too.
v2.1332026-10-08
  • 🛑 now has three options. Tap 🛑 under a looped job's Loop count and pick: ⏸ Pause before the clear, then keep looping (swap the plate or clear by hand, Resume, loops carry on) · ✋ Stop without clearing (clear by hand, Resume, it stops at the loop boundary) · 🛑 Stop after the clear (the old behaviour). The tag shows which one is armed. The two "before the clear" options pause as the loop finishes printing — before the bend and sweep — so a stuck part never meets the sweep.
  • Needs one new Home Assistant helper per printer and an addition to the "arm on cooldown" automation (SETUP.md §H3). Until then those two options show greyed out.
v2.1322026-10-06
  • ⛓ Runs on the H2C. The H2C card now has ⛓ New run, and the Send screen offers Copies on an H2C direct file: copy 1 starts, then after each copy the run stops and asks ✋ Bed cleared? — tap it and the next copy starts. Library ⛓ works for H2C files too. A run only takes files sliced for its own printer.
  • On the H2C every job waits for ✋ Bed cleared before the next one, looped files included — its loop-end clear has left parts stuck, so nothing starts on an H2C plate without you confirming it.
  • Queue ⛓ works for the H2C. An order with an H2C file can go into the H2C's run (if it has a P1S file too, you pick the printer). The run screen's "from the queue" list shows each order's file for that printer. Idle-printer suggestions are still P1S-only.
v2.1312026-10-06
  • 🖨 Printer card tools rearranged. 💡 is on the camera corner · 🪄 Bend is the right half of 🧹 Clear Bed and says why when it can't run ("home" = home it first in 🕹 Move) · 🛑 Stop after this loop sits under the Loop count · ☠ Mark down = tap the status pill ("running ▾"). Pause and Resume are now one button; after a tap it reads "Pausing…" until the printer confirms, so a double tap can't undo itself. Controls are grouped: job (Pause/Resume · Stop · Skip) and plate (Clear Bed | 🪄 · Move) — two rows on a phone, one row on the tablet/desktop. ⏹ Stop never moves.
  • 🌡 The 📜 log now times the cooldown and the clear. Between loops the printer just says "running", so the log showed nothing. It now records cooling started (with the bed temp), cooling ended after 38m 12s — bed 48° → 31° (with the setpoint), clearing bed took 4m 10s, and a bed-temperature line every 2° while it cools. Pick 🌡 Cooling & clearing in the log's filter to see just those. It still only records while a Farm Control tab is open and polling (the Printers tab, or a live run).
v2.1302026-10-06
  • 📋 The Batchlog tab is gone — its buttons moved onto the Queue. A queue row that came from Batchlog now shows − QA · + QA · ↩ Undo · ✔ Unit Done under it. Orders from every other source look exactly as before. A device that isn't signed in to that client shows 🔑 Connect on the row (one-time Google sign-in per device).
  • Only orders that are in the Queue have these buttons. A Batchlog order that was never imported (📥 Batchlog Orders, bottom of the Queue tab) has none until you import it.
v2.1292026-10-04
  • 📜 Printer event log. A new 📜 button next to the fleet title opens a timestamped record of what each printer did: status and stage changes, HMS faults (with the fault text), the loop counter, and what Farm Control did (Pause/Resume/Stop presses, run sends, Clear Bed steps, run stops). Each change also saves the bed/nozzle temperatures, progress, layer and file at that moment. Filter by printer, time range or faults only, and Copy it as text. Kept 14 days. It only records while a Farm Control tab is open (Home Assistant keeps no history here), and starts from this version — it can't recover earlier events.
v2.1282026-10-04
  • 📦 Queue progress bars now match the 📋 Batchlog tab and Batchlog. Same bar and legend: green done · orange quality check · striped printing · empty not started, with "of N". The numbers themselves are unchanged.
  • 🧹 Clear Bed works while a run is holding for ✋ Bed cleared. After a direct print finishes inside a run, the run waits for you; Clear Bed was greyed out for that whole wait because a run was "live". It's allowed during the hold now (the run sends nothing then). It still does not press ✋ Bed cleared for you.
v2.1272026-10-03
  • 🧹 Clear Bed: "Skip the cooldown wait" override. A new checkbox in the Clear Bed window skips the cool-to-25° wait when you've already checked the parts are free (a bed that sits around 30° never reached 25°). Unticked every time the window opens.
  • 💡 Idle-match now also suggests a printer that shows failed/STOPPED after a cancel (a P1S keeps reading failed until something else prints, so it never got the suggestion). The banner warns to check the plate is clear first; Send still asks for confirmation.
  • 🏷 Etsy "Discount" lines no longer enter the Queue. A no-SKU line item named Discount is hidden, so it stops showing up as an unmatched order.
v2.1262026-10-03
  • 🧹 Clear Bed no longer goes through the print-job path at all. A P1S Clear Bed with a one-value Custom sweep went straight to idle, moved nothing, and refused every job until it was power-cycled — the same firmware wedge that killed the old file-based Bend Only. Clear Bed now sends its G-code as raw commands (the way 🪄 Bend already does, reliably): the exact same lines it used to put in the file, sent one step at a time — check → home → cooldown → bend → sweep → park. Each step ends by asking the printer to report a progress marker once everything above it has physically finished, and the next step only goes out after Home Assistant sees that marker. The first step moves nothing — if the printer can't answer, it stops right there. Live step-by-step progress shows in the modal and on the printer card, with ⏹ Stop after this step. Keep the page open while it runs (phones are kept awake); if the page that's running it closes or sleeps, every screen shows Clear Bed stopped partway and nothing can be sent to that printer until someone checks it and releases it. Clear Bed also no longer needs a library file of that printer model.
  • 🛠 Restored the P1S end-of-loop park. Since sweep patterns arrived (v2.116), the P1S version of the bed-clear template had silently lost its stock ending — fans off, the low-current park to Z20.2, motor-current and speed resets, and the end-of-file marker. Every looped P1S print since then ended each loop without it. It's back, byte-for-byte as it ran for months before. Pi-side looping picks it up too (re-copy farmcontrol_loop.py).
v2.1252026-10-02
  • 📥 Direct (no-loop) sending now works for Pi/chunked library files — hit live trying to send a single Mahjong board: "Direct (no-loop) sending isn't supported for Pi/chunked files yet — download it and print from the SD card." The Pi-side looper (farmcontrol_loop.py) only ever knew how to build a full loop sequence; a direct print needs none of that, just the same rear-nozzle-load move every looped print already gets. It now has a dedicated direct-send mode, byte-verified identical to the browser's own no-loop path. Requires a one-time Home Assistant update (SETUP.md §G) — two new trailing params on the farmcontrol_pi_job/farmcontrol_stage_loop shell_command lines, plus re-copying the 3 Pi scripts. Until that's done, direct sends on Pi/chunked files keep showing the old, safe error — nothing silently wrong in the meantime.
v2.1242026-10-02
  • 📥 Fixed a Batchlog order wrong-product mismatch — a single Batchlog catalog product can cover several genuinely different items through its own variation fields (e.g. "Mahjong" has an "Option" field: Card Holder / Solo Mahjong (Thin) / Charleston — not colors). The Queue's SKU-matching key used to prefer whichever ONE variation was labeled "color" and silently drop every other field, so "Card Holder · White" and "Solo Mahjong (Thin) · White" collapsed onto the same remembered mapping — caught live 2026-10-02 when a Mahjong board order inherited the Card Holder's library file. The matching key now always includes every variation value, so two combos only ever share a mapping if they're identical on every field. One-time cost: any Batchlog product with more than one variation field will show as "unmatched" again the first time its orders are re-checked — re-pick the file once via the Queue picker and it's remembered under the new, safer key going forward. Not a Batchlog data problem — nothing to change there.
v2.1232026-10-02
  • 🛑 Stop after this loop — a new title-row button on a printer card running a multi-loop job. Arms a Home Assistant automation that pauses the printer right at the next loop boundary (after the current loop's part ejects and the bed's swept — the same signal that already drives the Loop X/N counter, SETUP.md §H), instead of you eyeballing the camera and timing a manual Pause. A distinct blue prompt appears once it fires, with a direct ✕ Cancel this print so you can redirect the printer to an urgent order, or ▶ Resume instead to carry on the run as planned. One-shot — arms for just the next boundary. Bambu printers can't truly resume a loop count mid-file, so Cancel still means sending a fresh job for whatever's left afterward; this only saves you from either waiting out the whole remaining loop count or eyeballing a manual pause. Requires a one-time Home Assistant update (SETUP.md §H) — needs the Phase 5 loop-counter infra already set up, plus 4 new input_boolean helpers and one small addition to the existing "count on reheat" automation. The button is hidden entirely until that's in place.
v2.1222026-10-02
  • 🧹 Dropped the forced center sweep before a configured pattern — every rake (including Custom) was always preceded by two hardcoded passes through the bed's midpoint, regardless of direction/range/Custom-X. Tyler, after testing Custom on the real H2C: "I don't want it to have the central sweep and everything that it does in the beginning... that just doesn't make sense" — the whole point of Custom is exact control over where the toolhead goes, and a forced center pass can run straight into whatever the pattern was configured to avoid. The toolpath diagram never showed this pass either (it's only ever drawn the configured pattern), so the G-code now matches what the diagram already promised. Toolhead instead starts the configured rake directly from wherever the bend sequence left it. Only the parameterized (real, in-use) branch changed — nothing else about the push height, cooldown, or bend sequence moved.
v2.1212026-10-02
  • 🧹 Pi-side sends now use the real sweep pattern — v2.116-119 added the sweep direction/range/Custom-X picker, but it only ever reached the loop builders that run in the browser. Any send big/chunked/Pi-file enough to route through the Pi looper (farmcontrol_loop.py) instead silently fell back to the old hardcoded full-width center-out rake, ignoring whatever pattern the entry was actually configured with — caught live on the H2C 2026-10-02 (a Custom pattern configured in the app, but the real print swept center-out like the old default). The Pi looper now ports the same _sweepPlan/_sweepBody algorithm and is byte-verified identical to the browser's output across every pattern (see pi/verify.ps1). Requires a one-time Home Assistant update — see files\SETUP.md §4: add the four new sweep_* params to the farmcontrol_pi_job/farmcontrol_stage_loop shell_command lines and re-copy the three Pi scripts. Until that's done, Pi-side sends fall back to a safe native-range Right→Left rake instead of a crash — but still not the entry's configured pattern.
v2.1202026-10-02
  • 🔁 Re-Loop a direct-print file back into a looped one — a file saved or re-looped as "Direct print — no looping" had no way back: the Library row hid its Re-Loop button entirely. It's back (labeled Re-Loop… to flag that it opens the Generator rather than rebuilding in place), and loading it now correctly sets the Direct Print checkbox to match the file instead of leaving it at whatever a previous file had it set to — just uncheck it, set a loop count, and Generate & Save as usual.
v2.1192026-10-01
  • 🧹 Clear Bed can test any sweep pattern, including Custom — the standalone 🧹 Clear Bed button on each printer card previously always ran the plain full-width rake, no matter what pattern a file used. It now has its own Sweep Pattern picker (all 6 options, live diagram) so a new pattern — especially a hand-typed Custom one — can be tried with already-printed parts placed on the bed by hand before it's ever trusted on a real print. Same safety guarantee as always: nothing heats, nothing extrudes.
v2.1182026-10-01
  • 🧹 Custom sweep pattern — a 6th option alongside the 5 built-in ones: type exact X positions (e.g. 95, 205) and the rake hits only those, in that order. Built for centering the sweep on each part of a multi-up plate so the eject pushes it straight out instead of catching it off-center and skewing it. Also fixed two real bugs in the diagram found while testing this: a 3-zone pattern's center zone can structurally land back on a boundary an outer zone already swept (only the TEXT LABEL was colliding — the real rake already wasted a zero-distance move there too, now gone), and at a low inset the diagram could need up to 4 stacked label rows, more than the old fixed size had room for.
v2.1172026-10-01
  • 🧹 Three more sweep patterns, redesigned diagram — the Generate tab's sweep control is now a dropdown with 5 patterns: Right→Left, Left→Right, Right, Left, Center, Left, Right, Center, and Center (the last three split the range into thirds and visit each zone separately — useful for a 2-up plate where the gap between the parts doesn't need a continuous rake dragging through it). The toolpath diagram is now a glowing single-path "plate view" — bed panel, soft gradient edge fades, waypoint dots, pill-shaped L/C/R zone tags — with pass numbers that stack onto a free row whenever two stops would otherwise land on top of each other (a 3-zone pattern's center zone always re-touches one of the outer zones' own boundary, found live testing — fixed both the diagram's label placement AND the real rake, which no longer plans that repeat as a pointless zero-distance move). Same diagram in the Library's ↻ Sweep modal.
v2.1162026-10-01
  • 🧹 Configurable bed-clear sweep — the rake's direction (Right→Left / Left→Right) is now a choice on the Generate tab, saved per Library file and changeable later via the new ↻ Sweep button (no reslice, no reload-as-fresh-file — it's a one-click metadata change, the real G-code rebuilds automatically next time the file's downloaded or sent). A live top-down diagram shows the exact toolpath with numbered arrows. ⚙ Settings → Sweep sets how far in from each edge the rake stays (per model, default 20mm) — found live 2026-10-01: the H2C's old full-width rake clipped a vortex duct on the right AND the door frame on the left on a 2-up card-holder plate. Not yet available for 'Pi file' library entries (those loop on the Pi in Python from a fixed template).
  • Dropped the FarmLoop/3D Farmers references — this tool stands on its own now. Footer tagline simplified, the Clear Bed description no longer names it, and newly-generated/downloaded files are named VDD_x{loops}_… instead of VDD_FL_x{loops}_… (old-named files already in the Library are unaffected and still recognized so re-processing never double-prefixes them).
v2.1152026-10-01
  • 🔁 Fixed loops/layer showing ahead of reality — a freshly-sent job could immediately show "Loop 2" and an estimated layer count instead of the real one, even though it had just started. Cause: sending a job reset the HA loop counter, but not the "bed cooled" helper the counter automation also depends on — if that helper was left armed from the PREVIOUS job's last loop, the new job's own bed reheating a few seconds later re-incremented the counter right back to 1. Sending a job now clears both.
v2.1142026-10-01
  • 🔁 Swap AMS 1/2 order — new per-printer checkbox in ⚙ Settings (dual-AMS printers only, e.g. H2C). HA names the two AMS units "AMS 1"/"AMS 2" by pairing order, which doesn't have to match which physical nozzle each one feeds — on Tyler's H2C it was backwards (live 2026-10-01: sent for white PLA on one nozzle, black PETG came out the other, over-extrusion error from the temperature mismatch). Ticking it swaps which unit Farm Control calls "AMS 1" everywhere — the slot picker labels, the printer-card tray row, AND the ams_mapping actually sent to the printer. ⚠ UNVERIFIED LIVE — test with a small/cheap print first.
v2.1132026-10-01
  • ❓ New Help modal — the ? button next to ⚙ in the nav now opens a how-to covering every tab, sending/queuing a print, printer-card controls, and Settings. It had never existed before; this is the first version.
v2.1122026-10-01
  • 📋 Batchlog tab shows quality check. Each order shows done / quality check / printing / not started with the same blocks and stripes as Batchlog itself, plus + QA and − QA buttons.
  • ✔ Unit Done and ↩ Undo here now match Batchlog. Done takes the unit out of quality check, and Undo puts it back. Before this, Done here added to done without leaving quality check, so the two apps' counts would drift apart.
v2.1112026-10-01
  • 🖨 Printed parts show up loop by loop. A ×20 batch used to count all 20 as "printing" until the whole file ended, even though each loop's parts were already off the bed. Now every finished loop moves its units into quality check in Batchlog as soon as the bed clears, and loops that finished before this update are picked up right away.
  • If a batch is cancelled or fails partway, the loops it already finished stay in quality check; only the unprinted rest goes back to the queue.
v2.1102026-10-01
  • 🖨 Clients see production live in Batchlog (Batchlog v1.15.0). Each Batchlog order now shows completed / quality check / printing / not started, and Farm Control keeps "printing" up to date while batches are on a printer or waiting in a run.
  • No QA step here for Batchlog orders. When a batch finishes printing, its units go straight into that order's quality check in Batchlog, and you sign them off there (✔ Unit Done, or − QA for a failed one, which Farm Control then prints again). The queue row shows Batchlog's own done and quality-check counts.
  • Each device needs to be signed in to a client once (📋 Batchlog tab) for this to work. On a device that isn't, a finished batch keeps Farm Control's own QA box, with a note saying so.
v2.1092026-10-01
  • 🔐 H2C sends work. Three separate problems stopped them. The H2C needs a USB stick, since it has no SD card. Its file connection now reuses the login connection's encryption session, which the H2C requires (Pi script). And it's now told to print from its USB storage (ftp:///), where Home Assistant had been pointing it at an SD card it doesn't have ("Unsupported print file path or name").
  • A print that never starts is no longer counted as finished. If a printer refuses a job, it keeps showing its previous state, and three minutes later Farm Control used to take that "finish" as the new job completing and ask you to QA parts that were never printed. Now it sees the printer never moved, puts the units back in the queue (or pauses the run), and tells you what the printer said.
v2.1082026-09-30
  • 🖨 One order, a file for each printer type. A queue order can now hold a P1S file and an H2C file. Tap + H2C file on the order and pick the file sliced for it. Its color is matched to the main file's color by plate name, and if one H2C plate makes a different number of units, you set that once. The order then shows a ▶ Send batch button for each printer type, and both send from the same count. Choose "remember" and future orders of that product get both files automatically.
  • Runs stay P1S-only and always use the order's P1S file. An H2C that's still printing refuses a new send instead of being sent a second print.
  • Fixed queue orders squeezed into a thin column beside the buttons on a phone.
v2.1072026-09-30
  • ⛓ Any open screen can finish a send. The Pi does the upload, but the screen that started the send had to be the one to start the print. If your phone locked partway through, the file sat on the printer and nothing started it. Now each run job remembers its Pi upload, and when that screen goes quiet, any open screen (the wall tablet) starts the print as soon as the Pi finishes, without uploading it again.
  • No more duplicate uploads. When a sending screen went quiet, another screen used to send the whole job again, even though the Pi was still uploading the first one. The second upload of the same file is what kept printer 1's first start from taking. Recovery now checks the Pi: still working means wait, done means start the print, failed means retry. Only one screen can ever press start for a job.
  • Uploads finish about 5 minutes sooner (needs the updated Pi script). The printer rarely confirms the end of an upload, and the Pi used to wait 5 minutes for that before checking. It now checks the file on the printer every few seconds and finishes the moment it's complete. The run strip reads "checking the file on the printer" while it does.
v2.1062026-09-30
  • ⛓ Send to a busy printer lines the job up. If the printer is printing, Send now adds the job to a new run that starts by itself when the current print finishes. If the printer already has a run, the job goes on the end of it. The Send screen says which before you tap, and the button reads ⛓ Add to run. Before, it uploaded the file and tried to start it on a printer that was already printing.
  • If the print on it now doesn't clear its own bed (a direct print, a Clear Bed / Bend, or one started outside Farm Control), Send refuses and tells you to wait, so nothing can start on top of the parts.
  • ✋ A run waiting behind a direct print now holds for you. The hand-clear hold used to fire only when a direct job inside the run finished. A run queued behind a direct print it didn't send would start its next job on top of the parts. Now the run strip says it's waiting on that print, and when it finishes you get the same ✋ Bed needs clearing prompt and phone ping. Nothing starts until you press ✋ Bed cleared.
v2.1052026-09-30
  • ⛓ A stalled send recovers after a cancel. If the device sending a run job goes quiet (a phone locked mid-send), another open Farm Control screen takes the job back after 3 minutes. That never happened when the printer showed failed/STOPPED, which it does after any cancel, so the job sat on "sending" forever. It recovers now. Sending onto a stopped printer still waits for you to press ✓ Bed clear.
v2.1042026-09-30
  • 📦 Cancelled batches give their units back. Cancelling a run while its batch was still uploading left the order showing those units as "printing" forever. Now, if that upload never reaches the printer, the units go back to the queue on their own. Stopping a queue batch with ⏹ Stop also returns its units: always for a batch sent straight from Send, and for a run batch once its run is cancelled.
v2.1032026-09-30
  • 🔁 Backup spools (AMS Auto-Refill). When a spool runs out mid-print, the printer itself can switch to an identical spool. Turn on AMS Auto-Refill in the printer's AMS settings (screen or Handy). The printer only switches between spools with the same filament ID, type, color and temps. Printer cards now mark trays it will switch between with 🔁, and trays that look the same but aren't identical with ⚠.
  • Match a tray exactly. In ✎ Set Filament, Match slot N copies another tray's exact filament ID, color and temps, so a second roll counts as its backup.
  • 🧵 Load the next filament in time. In a run that mixes products, when the job printing now starts its last loop and the next job's filament isn't loaded, your phone gets a heads-up to load it. If it's still missing when the job comes up, the run pauses as before.
  • Bigger batches with a backup spool (opt-in, ⚙ Settings): once Auto-Refill is tested on a looped job, batch suggestions count every identical spool on the printer. Two spools ≈ twice the loops. Remembered batch sizes are now per spool.
v2.1022026-09-29
  • 📦 Big orders go out in batches. A queue order is now a pool of units instead of one job. ▶ Send batch (or ⛓) sends one batch — say 19 of a 200-unit order — and the row counts down: printed · printing · to QA · left. Send the next batch to another printer right away; two printers can never get the same units.
  • Batch size per product. The first batch is suggested from how many loops fit a 1 kg spool. Change it and Farm Control offers to remember it for that product.
  • ✔ QA when a batch finishes. The row asks how many passed. Only those count as printed; the rest go back to "left". Batchlog orders get ✓ Save + Batchlog to mark exactly that many done there too.
  • A failed send, a cancelled or errored print, or a batch pulled out of a run gives its units back. ✎ adjusts the printed count by hand (e.g. good parts from a cancelled batch).
v2.1012026-09-29
  • A cancelled print shows STOPPED, not FAILED. The printer reports "failed" for both and keeps saying it until the next print. When no error comes with it (no HMS fault, no print error), the card and the fleet strip now show a neutral grey STOPPED with no red border. A real failure still shows red FAILED with its error. Nothing about how runs wait for a cleared bed changed.
v2.1002026-09-29
  • "Loop X of N" no longer disappears after a slow send. Big loop runs, chunked and Pi files can take 5+ minutes to reach the printer. If the printer was still showing the last job as failed (a cancel) or finished, Farm Control mistook that for the new job ending and dropped its record — no loop count, no live flow changes for that whole run. It now waits 3 minutes from when the job actually lands, not from when the send began. The same fix stops a slow send's job from being marked done minutes after it started.
v2.992026-09-28
  • 🌊 Flow ratio per spool (P1S). Tap a filament chip on a printer card → Flow ratio, in slicer units (e.g. 0.92). Blank = the file's own slicer value. Farm Control works out the correction against what the file was sliced at, so one number is right for every file. Loading a different spool (new color or filament) puts that tray back on the slicer's value. The field shows the slicer's number in grey — from the job printing now, or the last job sent from that tray.
  • Change it mid-run. Saving a new flow while that tray is printing sends it to the printer right away, and it carries through every remaining loop. Multi-color prints get each color's own flow at every swap, and a mid-run change is re-applied after each swap while a Farm Control tab is open (the wall tablet).
  • 🎨 Your colors. Custom colors you set on a tray (anything off the preset row, like a lighter sakura pink) are remembered and shown as a second row of swatches, along with colors loaded in any tray right now. Shared across every device, newest first, last 12.
  • Layer count fixed on looped jobs. The printer's layer counter never restarts between loops, so loop 2+ read "55/55" the whole time. It now shows an estimate from progress, marked with ~.
  • Pi fixes (2026-09-27): two sends at once no longer clobber each other's temp files (the "618%" upload), and big uploads get 5 minutes instead of 30 seconds to ride out the printer's flash-write stalls.
v2.982026-09-22
  • Loop counter fix (Home Assistant side): cleaned up duplicate/dead automations from an earlier setup attempt and shortened the "bed cooled" detection window from 30s to 3s — the between-loop bend/push phase was often shorter than 30 continuous seconds, so most loop boundaries were silently never counted.
  • Big files no longer need a manual copy to the Pi share. Files over the ~7.5 MB single-upload limit (like the Ice Anchor Holder) now save in chunked pieces straight to the cloud library — sendable immediately, from anywhere, no LAN/laptop required. Old "Pi file" library entries still work the old way; only new saves use chunking.
v2.972026-09-14
  • Checkboxes no longer flip when you tap next to them. Every checkbox row was a label, so a tap anywhere on the line — including the empty space beside the text — toggled it. Tapping around to close a menu could silently uncheck Use AMS on the send screen, which changes what the printer is told to do. Now only the box itself toggles, and the box is bigger on touch screens to make up for the smaller target.
v2.962026-09-09
  • A failed print no longer means power-cycling the printer. A P1S keeps reporting failed until something else prints — it never goes back to idle on its own — so a run would sit there saying "waiting, the printer is in error" forever. Now the card asks you to take the failed part off the plate and offers ✓ Bed clear — continue run; the chain carries straight on. The clearance covers one job and expires after 30 minutes, so it can never quietly authorise a print onto a plate that has since collected another failure.
  • The "waiting" note on a run stuck this way now says what's actually happening and which button to press, instead of "the printer is err".
v2.952026-09-09
  • Pause, resume and cancel a run right from the printer card — the ⛓ run strip now carries ⏸ / ▶ and ✕ next to EDIT, so you don't have to open the run just to press them. Approving a run (GO) still lives in the run window, so a mis-tap can't start a chain.
  • An error no longer masquerades as a pause. When a printer stops itself — filament runout, cover open, any HMS fault — the prompt is now red, titled "Paused by an error", and names the fault with its wiki link, instead of the amber "put the part in now" pause card that hid the reason until you pressed Later. A pause with nothing actually wrong still looks and reads exactly as before.
  • Resuming a run whose job is marked failed now warns first when that printer is busy — that's the case where Resume would print the job a second time.
  • Fixed: Later on the ☠ printer-down prompt never actually dismissed it.
v2.942026-09-08
  • Sending to several printers at once no longer reports a false "Send failed". The Pi reported every job's progress through a single shared slot, so simultaneous sends overwrote each other and a job could miss its own "done" — the run paused with a timeout error while the printer was visibly printing. The Pi now tracks each job separately. Needs one new sensor block in configuration.yaml — see SETUP.md §G; until you add it, sends behave exactly as before.
  • A slow send no longer gets sent twice. A tab's claim on a job expired after 3 minutes even while its upload was still running, so another tab (usually the wall tablet) re-sent the same job — two uploads of the same filename to one printer. The claim now refreshes while the send is in flight, and a failed send can never overwrite a job that another tab already got printing.
v2.932026-09-07
  • New 📋 Batchlog tab — a live view of every Batchlog client's open orders (Seoul of Sueleeahn, KinTags, TEST) with the same per-unit progress blocks Batchlog itself uses. Tap ✔ Unit Done / ↩ Undo to check units off right from Farm Control (tablet or remote) without opening Batchlog. Read + mark-done only — payments, pickup/shipping, invoicing, and the order/catalog editors all stay exclusively in Batchlog.
  • KinTags added as a third Batchlog tenant to the existing 📥 Queue-tab import panel too (was Seoul + TEST only).
v2.922026-09-01
  • 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)
  • Fixed login screen brand text: "VanDurdanDesigns" (was mistakenly spaced)
v2.42026-07-06
  • 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
  • ⚙ Settings — HA connection, printer registry, SKU map. Setup guide: files\SETUP.md
v2.12026-07-05
  • 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
  • VDD brand palette + fonts migrated (Batchlog "Farm Control" theme)
  • 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)
  • Nozzle temperature auto-parsed from the base file
v1.02026-06-26
  • Initial build — reverse-engineered FarmLoop's P1S loop algorithm
  • Drag-drop upload, metadata display, loop count, push height, cooldown settings
  • 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
Pick looped or direct each time you send it — one file, no separate direct copy.
Push heights below 5 mm risk unnecessary nozzle wear or bed contact. If a lower height is needed, reduce gradually and proceed with caution.

🛑

🧹 Sweep Pattern —

Range comes from ⚙ Settings → Sweep for this model — change it there if the rake still clips something.

📜 Printer event log

State changes read from Home Assistant (status, stage, faults, loop count) plus what Farm Control did (button presses, sends, Clear Bed steps). Recorded only while a Farm Control tab is open; kept 14 days.

📝 Jot a note

⚙ Settings

Tabs (this device)
★ = default tab when the app opens · ▲▼ = nav order. Saved on this device only.
Home Assistant
Printers
Swap AMS 1 / AMS 2 order (dual-AMS printers only, e.g. H2C — fixes the slot picker and the sent job if HA's AMS numbering doesn't match the physical left/right nozzle)
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
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
Automation master switch — OFF freezes every run (nothing auto-sends) and hides idle-match suggestions
Idle-match suggestions — banner + 🔔 when an idle P1S already has the filament loaded for something in the 🧾 Print Queue (an order, inventory or a personal print)
Calibration on auto-sends (bed level + flow + vibration)
🔔 on run events (job sent / run paused / run complete)
🧵 Direct prints purge at the REAR, not the front of the bed (looped files always have)
🔁 Auto-Refill is tested on looped jobs: batch suggestions count identical backup spools (2 spools ≈ 2× the loops)
⏸ Pop-ups on the printer card when a print pauses (mid-print inserts, filament runout) or a run stops on a stopped/failed print (⚠ "clear the bed, then continue") — a pause you started yourself never pops up. OFF: the card still shows the ✋ line with its ✓ Bed clear button. Either way, resuming a paused run print anywhere carries its run on with it (v2.148).
🧹 Sweep (bed-clear rake)
Pulls the bed-clear rake in from each end of its normal path — blank = 20mm. Direction (right-to-left / left-to-right) is chosen per file in its ⚙ Set up (🧾 Print Queue → 📁 Files → ⋯).
📱 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 (order SKU → business 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. Units per loop here wins over the plate's "N per plate" for that SKU's orders. You rarely need to add mappings by hand — picking a file on an unmatched order in the 🧾 Print Queue saves one.
🖼 Batchlog products (SKUs starting BL|) send their plate picture to that client's Batchlog automatically whenever the mapping changes. To send all of them now:

▸ Send to Printer

—
Use AMS
Skip calibration (bed leveling + flow + vibration) — saves minutes on a warmed-up, known-good printer
The printer WILL physically start — make sure the bed is clear.

✎ Set Filament — slot ?

🧹 Clear Bed — —

Runs the bed-clear: 6 plate-bend strokes, slow push at the height below, fast rake, park. Nothing heats and nothing extrudes. Sent step by step as raw G-code — each step only goes out after the printer confirms the last one finished, so keep this page open until it's done (progress also shows on the printer card).
—
Skip the cooldown wait — I've checked the parts are free
⚠ 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.

⊘ Skip Objects — —

Tap the parts you want the printer to skip. Skipping is permanent for this print — the rest of the plate keeps printing.
plate

🕹 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.
—
±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.

⛓ —

The run
Add to this run
Looped jobs clear their own bed and the next starts by itself. After a 🖐 direct job — and every H2C job — the run waits for ✋ Bed cleared. Keep a Farm Control tab open on Printers.