From 40803e9c5c960979e6770ba6e67f628eeae30088 Mon Sep 17 00:00:00 2001 From: Jess Sullivan Date: Sat, 6 Jun 2026 18:53:16 -0400 Subject: [PATCH] post(blog): UV-reactive bed glue PSA (draft, published:false) Stronger-than-Frank PVP/PVA bed glue dosed with strontium-aluminate phosphor so a 365 nm flash shows coverage; by-weight batch scalers (main + in-a-pinch on-hand derivation), UV coverage-sensing BOM, and a Klipper pre-print gate. Companion to https://transscendsurvival.org/tinyland-goo/. Left published:false for pre-publish edits. --- src/lib/components/GlueScaler.svelte | 27 +++++ src/lib/components/GlueScalerPinch.svelte | 35 ++++++ src/lib/components/WeightScaler.svelte | 112 +++++++++++++++++++ src/posts/2026-06-06-uv-reactive-bed-glue.md | 83 ++++++++++++++ 4 files changed, 257 insertions(+) create mode 100644 src/lib/components/GlueScaler.svelte create mode 100644 src/lib/components/GlueScalerPinch.svelte create mode 100644 src/lib/components/WeightScaler.svelte create mode 100644 src/posts/2026-06-06-uv-reactive-bed-glue.md diff --git a/src/lib/components/GlueScaler.svelte b/src/lib/components/GlueScaler.svelte new file mode 100644 index 0000000..817168f --- /dev/null +++ b/src/lib/components/GlueScaler.svelte @@ -0,0 +1,27 @@ + + + diff --git a/src/lib/components/GlueScalerPinch.svelte b/src/lib/components/GlueScalerPinch.svelte new file mode 100644 index 0000000..abd9003 --- /dev/null +++ b/src/lib/components/GlueScalerPinch.svelte @@ -0,0 +1,35 @@ + + + diff --git a/src/lib/components/WeightScaler.svelte b/src/lib/components/WeightScaler.svelte new file mode 100644 index 0000000..b89d94e --- /dev/null +++ b/src/lib/components/WeightScaler.svelte @@ -0,0 +1,112 @@ + + +
+
+

{title}

+
+
+ {#each presets as p (p.factor)} + + {/each} +
+ +
+
+ + + + + + + + + + + {#each rows as row (row.item)} + + + + + {/each} + + + + + +
+ {title}, ~{totalOz.toFixed(1)} oz, shown in {unit === 'g' ? 'grams' : 'ounces'} +
WeightIngredient
{row.amount} {unit} + {row.item} + {row.role} +
+ {unit === 'oz' ? totalOz.toFixed(3) : totalGrams.toFixed(2)} + {unit} + {totalLabel} (~{totalOz.toFixed(1)} oz)
+ + {#if footnote} +

{footnote}

+ {/if} +

Showing ~{totalOz.toFixed(1)} oz in {unit === 'g' ? 'grams' : 'ounces'}.

+
diff --git a/src/posts/2026-06-06-uv-reactive-bed-glue.md b/src/posts/2026-06-06-uv-reactive-bed-glue.md new file mode 100644 index 0000000..f70c77e --- /dev/null +++ b/src/posts/2026-06-06-uv-reactive-bed-glue.md @@ -0,0 +1,83 @@ +--- +title: "Bed glue you can see in UV (and a Klipper gate that won't print without it)" +date: "2026-06-06" +description: "A 3D-printer bed adhesive stronger on paper than Frank's Instagoo, infused with strontium-aluminate phosphor so a 365 nm flash shows coverage — with a by-weight batch scaler, an off-the-shelf UV sensing BOM, and a Klipper pre-print gate." +tags: ["3d-printing", "klipper", "chemistry", "adhesives", "strontium-aluminate", "uv", "phosphor", "diy", "maker", "recipe"] +category: "tutorial" +published: false +slug: "uv-reactive-bed-glue" +excerpt: "Stronger-on-paper PVP/PVA bed glue dosed with strontium-aluminate phosphor, a by-weight batch scaler, a Mouser UV-sensing BOM, and a Klipper macro that aborts on a bare bed." +--- + + + +[Frank's "Instagoo"](https://goo.by.frank.af/) is a tidy 3D-printer bed glue: 21 g PVP-K30 + 9 g PVA in 200 ml of ~50% isopropyl alcohol — a 70:30 PVP:PVA solution at roughly 15% solids. It's the same chemistry family as the [DIY "Super Goop"](https://hackaday.com/2022/12/06/homebrew-3d-printer-goop-promises-better-bed-adhesion/) lineage and the commercial brush-ons: [Vision Miner Nano](https://visionminer.com/products/nano-polymer-adhesive)'s SDS discloses only an IPA carrier and a trade-secret polymer, and [Luke's Laboratory](https://www.lukeslabonline.com/products/bed-adhesive) sells Standard/Double/Triple "strength," which is just the same liquid at different solids. None of them publishes a real bond number. + +I wanted two things on top: glue that is **stronger**, and glue I can **see** 👀. The seeing part is the fun bit — dose it with strontium-aluminate phosphor and a coat lights up green under UV, so a sensor (and a Klipper macro) can check the bed is actually covered before a print starts. + +Fair warning up front: the "stronger" claim here is mechanistic, not yet measured. I haven't put a force gauge on a peel test — that's the next post. What follows is three changes each backed by a named source, which is the most I'll assert until I have numbers. + +The full build — BOM, wiring, the Klipper config and host script — lives at **[transscendsurvival.org/tinyland-goo](https://transscendsurvival.org/tinyland-goo/)**. This post is the short version. + +## The recipe + +Everything by weight, for a 0.01 g scale. 1× (~2 oz) is the smallest worthwhile batch; **2× (~4 oz) is the recommended minimum**, so that's the default below. + + + +## Three honest knobs + +Each of these is a documented lever, not a hunch: + +| Knob | Change | Why it should help | The number to watch | +| --- | --- | --- | --- | +| Film former | PVP-K30 → [PVP-K90](https://ulipolymer.com/difference-between-pvp-k30-and-pvp-k90/) | ~30× the molecular weight (~1.3M vs ~40k) → more viscosity, film cohesion, tack | it's a drop-in swap | +| Tackifier | add PEG-400 | pressure-sensitive tack in [PVP/PEG blends peaks near 36 wt% PEG](https://www.tandfonline.com/doi/abs/10.1080/00218460213491) | start at ~20% so the film still releases | +| Crosslink | trace boric acid | [boric acid bonds PVA](https://iopscience.iop.org/article/10.1088/2631-8695/ad4cb4) for cohesion while staying water-redispersible | keep it ≤1% of the PVA — past that it stops releasing | + +That last row is the one number worth getting right: enough crosslink to stiffen the film, not enough to weld your print to the bed. + +## The catch: strontium aluminate hates water + +`SrAl₂O₄:Eu,Dy` excites across UV-A (peak ~365 nm) and [emits green at ~520 nm](https://en.wikipedia.org/wiki/Strontium_aluminate) — that's the whole trick. But bare phosphor [hydrolyzes in water](https://www.sciencedirect.com/science/article/abs/pii/S0254058407003719) to non-luminescent hydroxides and quietly stops glowing. You can't dodge it by going anhydrous, because the PVA needs water to dissolve. The fix is a silica/fluoride-coated ("waterproof") grade plus a modest water fraction. Coated powder is mandatory here, not a nicety. + +It's non-toxic with no GHS hazard class, but it's a hard mineral dust — mask and gloves when weighing. + +## In a pinch + +The recipe above wants PVP-K90, an encapsulated phosphor, and a boric-acid crosslink — specialized stock that's still in the mail. So here's a derivation from what's already on the shelf: PVP-40, PVA lab powder, 91% IPA, distilled water, a heavy PEG/PEO powder, and plain strontium aluminate. It's for an automated applicator on **less mission-critical** printers, in 1/2/4 oz mini batches. + +It still beats Frank's — same PVP/PVA backbone, a hair more solids, and the PEG/PEO tackifier doing the heavy lifting instead of K90 + crosslink. Two honest trade-offs: the uncoated phosphor hydrolyzes over time (mix small, use fresh), and heavy PEO is stringy (keep it low or the applicator cobwebs). Both glues read the same under UV. + + + +## Seeing coverage + +Flood the bed with 365 nm UV and read the green that comes back. An [AMS AS7341 spectral sensor](https://www.adafruit.com/product/4698) has channels at 515 nm and 555 nm straddling the phosphor peak, and its on-chip interference filters reject the 365 nm excitation — so a single-point read often needs no separate glass filter. Baseline the bare bed once; coverage is the green rise above it. The whole sensing BOM (OSRAM 365 nm LED, MEAN WELL driver, the sensor, a Pi) is on the [project page](https://transscendsurvival.org/tinyland-goo/). + +## The Klipper gate + +`PRINT_START` runs a host script (via the `gcode_shell_command` extension) that reads the sensor and writes the result back through Moonraker's `SAVE_VARIABLE`. A second macro reads that value and aborts — before any heating or motion — if coverage is too low: + +```toml +[gcode_macro _COVERAGE_GATE] +gcode: + {% set min_cov = params.MIN_COVERAGE|default(70)|float %} + {% set cov = printer.save_variables.variables.coverage_pct|default(-1)|float %} + {% if cov < min_cov %} + { action_raise_error("COVERAGE GATE: %.1f%% < %.1f%%. Re-glue and restart." % (cov, min_cov)) } + {% endif %} +``` + +Two-point calibration (bare bed → 0%, fully glued → 100%) is required. The complete `coverage_gate.cfg` and `coverage_gate.py` are in the [tinyland-goo repo](https://github.com/Jesssullivan/tinyland-goo). + +## Safety, briefly + +Flammable alcohol carrier (mix away from flame; let it flash off before the bed heats) · phosphor dust (N95/P2 + eye protection when weighing) · boric acid (reproductive hazard if ingested — gloves, away from food) · 365 nm UV-A (eye/skin hazard at power; enclose it and pulse only during the read). + +Next time, hopefully, with a force gauge and actual peel numbers. Until then it glows, which is most of the fun anyway. + +Cheers, -Jess