Ghost Hand
Public Unreviewedby John Lauer
A small battery gadget that keeps an automatic sink faucet running while you use the sink: it learns the faucet's timeout, re-arms with the shortest blip, and stops after 10 minutes or when picked up.
Ghost Hand
Rev 2 finished November 8, 2026.
The film shows how rev 1 was built: one prompt in Adom Hydrogen, AI Flow and three AI threads (two Claude, one Codex) taking Ghost Hand from idea to a priced, finished board and case; rev 2 below was built the same way. Download the film (captions).
Ghost Hand is a small battery gadget you set on the counter beside a sink with an automatic faucet. It aims infrared light at the faucet's sensor so the water keeps running while you wash your hair, do the dishes or fill a jug, then hands the faucet back when you are done. It learns each faucet's safety timeout by itself and re-arms with the shortest possible blip, so the water does not stop. There are no settings and no power button: it wakes when it is set down and sleeps when it is picked up.
This page shows rev 2: half the footprint of rev 1 so it leaves room on the counter, a 150 mAh battery that needs charging about once a month, small dot lights instead of the logo, a board silkscreen that names every light, and a 5 degree tilt worked out from a real drawing of the faucet. Rev 1's files stay at release 0.1.0 "Rev 1"; see Revisions.
Safety. Ghost Hand is for someone standing at the sink. It never runs unattended: a hard cap of 10 minutes per session, it stops the moment it is picked up or tipped, and it stops when its battery is low. It will not run while it is charging. Nothing beyond what an ordinary manual tap already allows.
| Rev 2 | |
|---|---|
| Size on the counter | 38 x 32 mm, 17 mm tall (rev 1: 54 x 44 mm, 27 mm tall) |
| Board | Adom molecule, 30 x 22 mm, 2 layers on a 3rd party fab's rules, 4 corner machine pins |
| Brain | ATtiny1616, asleep between faucet pulses |
| IR | one 850 nm emitter (8.2 ohm) and one 940 nm emitter driven harder (4.7 ohm), two VEMD2023 photodiodes (750 to 1050 nm) |
| Aim | board tilted 5 degrees nose up (rev 1: 12), from the faucet's real window height |
| Battery | Adafruit 1317, 150 mAh 1S LiPo, USB-C charging at 77 mA in 2.4 h |
| Battery life | 40 days at six 10-minute sessions a day, 74 at three, 170 at one |
| Lights | five WS2812B-2020 under 1.5 mm clear-resin dots: STATUS plus a 25 / 50 / 75 / 100 % charge gauge |
| License | MIT |
How it works
An automatic faucet is an active reflective sensor. Behind its dark window an IR LED flashes for 10 to 20 us every 0.3 to 2 s, and a receiver listens only during that flash. When enough light comes back (a hand), the water turns on. Every faucet also has a safety timeout: after 10 to 60 s it shuts off even with a hand there, and ignores that still hand until it goes away.
Ghost Hand hears the faucet's own flash on two photodiodes. A TLV9062 turns the photocurrent into volts (a 150 k transimpedance stage, then gain 11), the ATtiny1616's analog comparator trips, and the event system fires two single-shot timers that light the emitters, all in hardware, under 1 us after the faucet's pulse begins. The echo therefore lands inside the faucet's own listening window and reads as a strong reflection. The CPU only decides when to echo.

Wavelengths and faucets covered
Faucet sensors work at 850 to 950 nm. One 850 nm emitter (VSMY2853SL) and one 940 nm emitter (VSMB2948SL) cover that band, and the VEMD2023 photodiodes hear 750 to 1050 nm, so one Ghost Hand works on the common brands:
| Faucet | Safety timeout | Notes |
|---|---|---|
| Moen M-Power 8551/8553 | 30 s | range 3 to 12 in, optional metering 10 to 180 s |
| Sloan EBF-615 | 30 s | range 2 to 7 in; EAF-700 sets its range at power-up |
| American Standard Selectronic | 55 s default (5 to 120 s) | 1.5 s run-on after hands leave |
| Zurn AquaSense Z6950 | 30 s default (5, 10, 15, 60 s) | self-calibrates to the basin |
| Kohler K-13460 | 30 s maximum run | |
| TOTO EcoPower | 10 or 60 s by model |

Learning the faucet
Just before the faucet's timeout, Ghost Hand goes quiet for a moment (a blip) so the faucet sees the hand leave and come back, and starts a fresh run. The faucet's pulse rate is the window into its state: most pulse faster while they see a user. Ghost Hand listens for 2 s, measures the faucet's idle period and pulse width, echoes until the rate drops (that is the timeout), then re-arms at the timeout minus a 1.5 s margin. Each good blip is 15 % shorter than the last, never below a floor it learns from its first miss. Faucets whose rate never changes get a blip every 8 s. What it learns is kept in EEPROM, keyed to the faucet's idle period.

Where it sits and how it tilts
Rev 1 tipped its board 12 degrees nose up. That was a guess, and too steep: on the faucet this was built for, the sensor window sits only 40 mm above the counter. Rev 2 starts from a real drawing of the faucet (Moen 8551 spec sheet: column 57 mm deep and 53 mm wide, 166 mm tall, spout reach 155 mm; window centre 40 mm above the counter on pre-2017 units and 56 mm on current ones) and computes the angle.

With the IR lens 14 mm above the counter, the window is tilt = atan((window height - lens height) / distance) above the horizon: 14.7 degrees from 100 mm away and 4.3 degrees from 350 mm (22.9 and 6.9 for the 56 mm units). The emitters' half-intensity angles are +/-28 degrees (VSMY2853SL, 850 nm) and +/-25 degrees (VSMB2948SL, 940 nm), and the VEMD2023 photodiode's is +/-35 degrees, so the beams are wide enough that the tilt only has to point them roughly. Signal falls as 1/d2, so the far placement is the one that limits: rev 2 tilts 5 degrees, which aims the beam axis at the window from the far end. The best worst-case margin over 100 to 350 mm is at 4.25 degrees for the 40 mm window; 5 degrees is within a fraction of a percent of it and a little better for the 56 mm units (5.4x a hand at 5 degrees, 5.3x flat, 5.0x at rev 1's 12; 5.2x, 5.0x and 5.1x on 56 mm units). The case is built at 5 degrees. Rev 2 has room on its front edge for two emitters, not rev 1's three, so the 940 nm one is driven harder: the 850 nm emitter sits behind 8.2 ohm and the single 940 nm emitter behind 4.7 ohm (about 0.53 A at the start of a 25 us pulse), which nearly matches what two 940 nm emitters at 8.2 ohm would send.
| Window to lens | Window elevation (40 mm) | 940 nm beam at 0 / 5 / 12 degrees tilt | Echo margin at 5 degrees | Elevation (56 mm units) | Margin at 5 degrees (56 mm) |
|---|---|---|---|---|---|
| 100 mm | 14.7 deg | 0.79 / 0.9 / 0.99 | 48.3x | 22.9 deg | 27.0x |
| 150 mm | 9.9 deg | 0.9 / 0.97 / 1.0 | 26.2x | 15.7 deg | 20.3x |
| 200 mm | 7.5 deg | 0.94 / 0.99 / 0.98 | 15.7x | 11.9 deg | 13.7x |
| 250 mm | 6.0 deg | 0.96 / 1.0 / 0.96 | 10.3x | 9.6 deg | 9.5x |
| 300 mm | 5.0 deg | 0.97 / 1.0 / 0.95 | 7.3x | 8.0 deg | 6.9x |
| 350 mm | 4.3 deg | 0.98 / 1.0 / 0.94 | 5.4x | 6.9 deg | 5.2x |
Echo margin is Ghost Hand's echo at the faucet's receiver divided by what a hand at the default 5.5 in range returns (the faucet's own trigger level), with the battery at its low limit and 940 nm only; 2x (6 dB) is comfortable, 1x still works.

The faucet's window looks forward over the basin, so Ghost Hand has to sit in front of it or to the side, turned to face it. Seen from above, the best spot is the front strip in front of the basin (454 mm out, 8 degrees off axis, 3.1x margin). Beside the basin it works from about 325 mm out (315 mm and 43 degrees off axis gives 1.5x). Diagrams: side view SVG, top view SVG, numbers in aim.json.
What is assumed:
- Faucet receiver acceptance +/-30 deg half sensitivity (cos^n), +/-45 deg shown as the wide case; its axis level and straight out over the basin.
- Faucet emitter 50 mW/sr, +/-30 deg.
- Hand reflectance 0.5 over 50 cm2 at the 5.5 in default range sets the faucet's trigger level.
- Basin 17 x 14 in (432 x 356 mm) oval undermount, back lip 25 mm in front of the column.
- Ghost Hand IR lens axis 14 mm above the counter, turned by the user to face the window.
- Two photodiodes and the rev 1 receiver chain and threshold; 850 nm behind 8.2 ohm, one 940 nm behind 4.7 ohm (rev 1: three emitters behind 12 ohm), low battery 3.45 V.
The lights
Rev 2 has no logo light. Five WS2812B-2020 LEDs sit under small round clear-resin light pipes about 1.5 mm across, with opaque walls between them: STATUS (D4) takes over everything rev 1's logo showed, and four dots (D5 to D8) are the 25, 50, 75 and 100 % charge gauge. Each one is named on the board silkscreen and laser engraved on the case. A dot sitting right on its LED looks several times brighter than rev 1's spread-out logo at the same drive, so the firmware runs every light at about half of rev 1's level and caps all five at about 30 mA.
| State | STATUS dot | Charge gauge (25 / 50 / 75 / 100 %) |
|---|---|---|
| Session start | wakes dim | fills to the battery level over 1.5 s (amber at 25 % or less) |
| Armed | soft cyan-white breathing, 4 s | off |
| Echoing | the breath 50 % brighter | off |
| Re-arm blip | quick flicker | off |
| Done (10 min) | slow warm fade | off |
| Low battery | red blink | first dot red |
| Charging | off | filled to the level, the next dot pulses |
| Full | off | all four green 5 s, then a dim pulse every 10 s |
| Unplugged | off | the level for 2 s |

Charging and battery life
John's bar for rev 2: smaller on the counter, and charging about once a month is fine. USB-C 5 V feeds an MCP73831 linear charger set to 77 mA by a 13k program resistor (0.51 C, inside the pack's 1 C limit, and a quarter of rev 1's charger heat): constant current, then constant voltage at 4.2 V, full in about 2.4 h. A TPS7A02 makes the 3.3 V rail on 25 nA of quiescent current.

The budget is built from the typical current of every part (Adafruit 1317, 150 mAh 1S LiPo, 128 mAh usable, stop at 3.45 V):
| Asleep on the counter | 4.7 uA (the pack's protection IC is most of it) |
| During a session | 2.93 mA average |
| One 10-minute session | 0.488 mAh |
| Sessions per charge | about 261 |
| Days per charge | 40 at six sessions a day, 74 at three, 170 at one |
| Once a month | holds up to 8.2 sessions a day for 30 days |
| Running time per charge | about 44 h |
| Charge time | 2.4 h at 77 mA |
At the pack's minimum capacity it is still 38 days at six sessions a day. Self-discharge of the cell (3.0 %/month assumed (0.15 mAh/day), larger than the sleep current) matters more than the sleep current. The faucet's pulse rate and the light pattern are the two big unknowns.

The battery, and which pin is +
The cell is an Adafruit 1317: a PKCell LP402025 pouch, 150 mAh 1S LiPo with its own protection board (S-8261), about 4 x 20 x 26 mm and 4.65 g, with leads ending in a JST PH plug. It is Mouser 485-1317, USD 5.95, 111 in stock when checked on 2026-11-08. It is BT1 in the BOM and lies flat under the board; it plugs into J2 and is not fitted by the fab, so the fab BOM lists it as a do-not-place line.
Polarity: PKCell's drawing for this pack (QA.S.0228) wires red and black into a reversed JST PH-2P plug, which is Adafruit's order: red (+) on JST circuit 1 and black (-) on circuit 2, as on every Adafruit and SparkFun board. J2 pin 1 is VBAT (+) and pin 2 is GND, with + and - printed beside the connector, as in rev 1. Batteries from other sellers are often wired the opposite way, so check any pack with a meter before plugging it in.
The current budget, part by part
| Asleep | uA |
|---|---|
| TPS7A0233 IQ | 0.025 |
| ATtiny1616 power-down, pin-change wake on PA2 and PB2 | 0.1 |
| LIS2DW12 LP mode 1, 12.5 Hz, wake-up detection | 1.0 |
| MCP73831 reverse discharge (no VBUS) | 0.15 |
| VBAT monitor divider, 9.4 Mohm | 0.42 |
| WS2812B rail switched off (Q3) | 0.0 |
| TLV9062 unpowered (PA4 low) | 0.0 |
| LiPo pack protection IC S-8261AAJMD (3 uA assumed) | 3.0 |
| Total | 4.7 |
| During a session | mA |
|---|---|
| ATtiny1616 standby with OSC20M at 5 MHz for AC + TCB (idle 0.6 mA at 3 V) plus wake-ups | 0.8 |
| TLV9062 two channels (538 uA each typ) | 1.08 |
| receiver bias divider 3.3 V / 110 k | 0.03 |
| IR echo pulses (850 + 940 nm emitters, 25 us at 20 Hz) | 0.411 |
| status dot: breathing at 2 % average white, 20 % rail duty | 0.6 |
| LIS2DW12 LP 50 Hz (pick-up and tilt watch) | 0.004 |
| Total | 2.93 |
Asleep and never used, the 128 mAh would last 3.1 years; in practice the cell's own self-discharge sets the shelf life. Typical datasheet currents at 25 C. The echo's 0.93 A, 25 us pulse comes mostly from a 100 uF capacitor, so the pack only ever sees about 3 mA on average.
Components
Every part of one rev 2 Ghost Hand, with its live price, the break a build reaches and the date it was checked. The table covers the board parts, the battery, the bare PCB, the printed case parts and the case hardware.
| Part | Qty | Refs | Value | Role | Unit cost | Line cost (1 / 100 units) | Buy |
|---|---|---|---|---|---|---|---|
![]() ATTINY1616-MNR Microchip Technology |
1 | U1 | ATtiny1616-MNR | MCU: hardware IR echo (AC0, event system, TCB single-shot) | USD 0.900 each at 1; USD 0.873 at 100 units (buy 25+), checked 2026-11-08 | USD 0.900 / USD 0.873 | Mouser 556-ATTINY1616MNR |
![]() MCP73831T-2ACI/OT Microchip Technology |
1 | U2 | MCP73831T-2ACI/OT | LiPo charger, 77 mA (Rprog 13k) | USD 0.760 each at 1; USD 0.750 at 100 units (buy 25+), checked 2026-11-08 | USD 0.760 / USD 0.750 | Mouser 579-MCP73831T-2ACIOT |
![]() TPS7A0233PDBVR Texas Instruments |
1 | U3 | TPS7A0233PDBVR | 3.3 V LDO, 25 nA Iq | USD 0.950 each at 1; USD 0.540 at 100 units (buy 100+), checked 2026-11-08 | USD 0.950 / USD 0.540 | DigiKey 296-TPS7A0233PDBVRCT-ND |
![]() LIS2DW12TR STMicroelectronics component page requested |
1 | U4 | LIS2DW12TR | accelerometer: set-down, pick-up, tilt | USD 1.79 each at 1; USD 1.30 at 100 units (buy 100+), checked 2026-11-08 | USD 1.79 / USD 1.30 | Mouser 511-LIS2DW12TR |
![]() TLV9062IDGKT Texas Instruments |
1 | U5 | TLV9062IDGKT | receiver TIA and gain | USD 1.76 each at 1; USD 1.05 at 100 units (buy 100+), checked 2026-11-08 | USD 1.76 / USD 1.05 | Mouser 595-TLV9062IDGKT |
![]() VSMY2853SL Vishay component page requested |
1 | D1 | VSMY2853SL | 850 nm emitter | USD 1.01 each at 1; USD 0.532 at 100 units (buy 100+), checked 2026-11-08 | USD 1.01 / USD 0.532 | Mouser 78-VSMY2853SL |
![]() VSMB2948SL Vishay component page requested |
1 | D2 | VSMB2948SL | 940 nm emitters | USD 0.680 each at 1; USD 0.385 at 100 units (buy 100+), checked 2026-11-08 | USD 0.680 / USD 0.385 | Mouser 78-VSMB2948SL |
![]() VEMD2023SLX01 Vishay |
2 | PD1 PD2 | VEMD2023SLX01 | IR photodiodes, 750 to 1050 nm | USD 0.860 each at 1; USD 0.460 at 100 units (buy 100+), checked 2026-11-08 | USD 1.72 / USD 0.920 | Mouser 78-VEMD2023SLX01 |
![]() WS2812B-2020 Worldsemi |
5 | D4 D5 D6 D7 D8 | WS2812B-2020 | lights: STATUS dot + 4 gauge dots | USD 0.045 each at 1; USD 0.045 at 100 units (buy 1+), checked 2026-11-08 | USD 0.227 / USD 0.227 | Adom stock adom/ws2812b-2020 |
![]() DMN2041L-7 Diodes Incorporated |
2 | Q1 Q2 | DMN2041L-7 | emitter switches | USD 0.530 each at 1; USD 0.222 at 100 units (buy 100+), checked 2026-11-08 | USD 1.06 / USD 0.444 | Mouser 621-DMN2041L-7 |
![]() DMG2305UX-13 Diodes Incorporated |
1 | Q3 | DMG2305UX-13 | LED rail switch | USD 0.410 each at 1; USD 0.169 at 100 units (buy 100+), checked 2026-11-08 | USD 0.410 / USD 0.169 | Mouser 621-DMG2305UX-13 |
![]() USB4105-GF-A GCT |
1 | J1 | USB4105-GF-A | USB-C charge input | USD 0.800 each at 1; USD 0.575 at 100 units (buy 100+), checked 2026-11-08 | USD 0.800 / USD 0.575 | Mouser 640-USB4105-GF-A |
![]() S2B-PH-K-S JST |
1 | J2 | S2B-PH-K-S | battery connector (pin 1 +) | USD 0.120 each at 1; USD 0.084 at 100 units (buy 100+), checked 2026-11-08 | USD 0.120 / USD 0.084 | Mouser 306-S2BPHKSLFSNPP |
![]() SMF5.0A Littelfuse |
1 | D10 | SMF5.0A | VBUS surge clamp | USD 0.420 each at 1; USD 0.162 at 100 units (buy 100+), checked 2026-11-08 | USD 0.420 / USD 0.162 | Mouser 821-SMF5.0ARQG |
1317 Adafruit |
1 | BT1 | 150mAh 1S LiPo | 150 mAh LiPo (PCM, JST PH), under the board on J2 | USD 5.95 each at 1; USD 5.95 at 100 units (buy 1+), checked 2026-11-08 | USD 5.95 / USD 5.95 | Mouser 485-1317 |
![]() base printed |
1 | PETG | base, prints in PETG | USD 0.105 per unit at 1; USD 0.105 at 100 units, checked 2026-11-08 (note 1) | USD 0.105 / USD 0.105 | Quote required | |
![]() cover printed |
1 | PETG | cover with the light pipes and engraved names (PETG) | USD 0.106 per unit at 1; USD 0.106 at 100 units, checked 2026-11-08 (note 2) | USD 0.106 / USD 0.106 | Quote required | |
![]() gasket printed |
1 | TPU 95A | perimeter gasket (TPU 95A) | USD 0.006 per unit at 1; USD 0.006 at 100 units, checked 2026-11-08 (note 3) | USD 0.006 / USD 0.006 | Quote required | |
![]() foot printed |
1 | TPU 95A | non-slip foot (TPU 95A) | USD 0.018 per unit at 1; USD 0.018 at 100 units, checked 2026-11-08 (note 4) | USD 0.018 / USD 0.018 | Quote required | |
![]() usb plug printed |
1 | TPU 95A | tethered USB-C seal (TPU 95A) | USD 0.019 per unit at 1; USD 0.019 at 100 units, checked 2026-11-08 (note 5) | USD 0.019 / USD 0.019 | Quote required | |
![]() ir window printed |
1 | clear SLA resin | IR window (clear resin) | USD 0.005 per unit at 1; USD 0.005 at 100 units, checked 2026-11-08 (note 6) | USD 0.005 / USD 0.005 | Quote required | |
![]() lightpipe status printed |
1 | clear SLA resin | STATUS light pipe, 1.5 mm dot (clear resin) | USD 0.001 per unit at 1; USD 0.001 at 100 units, checked 2026-11-08 (note 7) | USD 0.001 / USD 0.001 | Quote required | |
![]() lightpipe 25 printed |
1 | clear SLA resin | gauge light pipe 25 % | USD 0.001 per unit at 1; USD 0.001 at 100 units, checked 2026-11-08 (note 8) | USD 0.001 / USD 0.001 | Quote required | |
![]() lightpipe 50 printed |
1 | clear SLA resin | gauge light pipe 50 % | USD 0.001 per unit at 1; USD 0.001 at 100 units, checked 2026-11-08 (note 9) | USD 0.001 / USD 0.001 | Quote required | |
![]() lightpipe 75 printed |
1 | clear SLA resin | gauge light pipe 75 % | USD 0.001 per unit at 1; USD 0.001 at 100 units, checked 2026-11-08 (note 10) | USD 0.001 / USD 0.001 | Quote required | |
![]() lightpipe 100 printed |
1 | clear SLA resin | gauge light pipe 100 % | USD 0.001 per unit at 1; USD 0.001 at 100 units, checked 2026-11-08 (note 11) | USD 0.001 / USD 0.001 | Quote required | |
![]() screw seals printed |
4 | TPU 95A | screw seals (TPU 95A) | USD 0.001 per unit at 1; USD 0.001 at 100 units, checked 2026-11-08 (note 12) | USD 0.001 / USD 0.001 | Quote required | |
screws hardware |
4 | M1.6 x 14 stainless, 0.35 pitch, pan head 3.2 mm diameter and 1.42 mm high | cover screws, from below | USD 0.800 per unit at 1; USD 0.800 at 100 units, checked 2026-11-08 (note 13) | USD 0.800 / USD 0.800 | Quote required | |
inserts hardware |
4 | PSM MINI-TECH MTEC-B-M1.6, 2.5 mm length, 2.5 mm OD, 2.15 mm pilot | heat-set inserts in the cover | USD 0.600 per unit at 1; USD 0.600 at 100 units, checked 2026-11-08 (note 14) | USD 0.600 / USD 0.600 | Quote required | |
adhesive coating grease hardware |
1 | adhesive, conformal coating, grease | USD 0.250 per unit at 1; USD 0.250 at 100 units, checked 2026-11-08 (note 15) | USD 0.250 / USD 0.250 | Quote required | ||
![]() RC0402FR-075K1L Yageo |
2 | R1 R2 | 5.1k | 5.1k (input) | USD 0.100 each at 1; USD 0.007 at 100 units (buy 100+), checked 2026-11-08 | USD 0.200 / USD 0.014 | Mouser 603-RC0402FR-075K1L |
![]() CC0603KRX5R7BB475 Yageo |
2 | C1 C2 | 4.7uF 16V | 4.7uF 16V (input) | USD 0.240 each at 1; USD 0.085 at 100 units (buy 100+), checked 2026-11-08 | USD 0.480 / USD 0.170 | Mouser 603-CC603KRX5R7BB475 |
RC0402FR-0713KL Yageo |
1 | R3 | 13k | 13k (charger) | USD 0.100 each at 1; USD 0.007 at 100 units (buy 100+), checked 2026-11-08 | USD 0.100 / USD 0.007 | Mouser 603-RC0402FR-0713KL |
![]() RC0402FR-0768KL Yageo |
1 | R4 | 68k | 68k (charger) | USD 0.100 each at 1; USD 0.007 at 100 units (buy 100+), checked 2026-11-08 | USD 0.100 / USD 0.007 | Mouser 603-RC0402FR-0768KL |
![]() RC0402FR-07100KL Yageo |
8 | R5 R6 R13 R16 R17 R21 R25 R26 | 100k | 100k (charger) | USD 0.100 each at 1; USD 0.007 at 100 units (buy 100+), checked 2026-11-08 | USD 0.800 / USD 0.056 | Mouser 603-RC0402FR-07100KL |
![]() RC0402FR-07150KL Yageo |
2 | R7 R15 | 150k | 150k (charger) | USD 0.100 each at 1; USD 0.007 at 100 units (buy 100+), checked 2026-11-08 | USD 0.200 / USD 0.014 | Mouser 603-RC0402FR-07150KL |
![]() CL05A105KA5NQNC Samsung Electro-Mechanics |
4 | C3 C4 C8 C11 | 1uF 25V | 1uF 25V (power) | USD 0.310 each at 1; USD 0.113 at 100 units (buy 100+), checked 2026-11-08 | USD 1.24 / USD 0.452 | Mouser 187-CL05A105KA5NQNC |
![]() C0603C106M8PACTU KEMET |
2 | C5 C21 | 10uF 10V | 10uF 10V (power) | USD 0.980 each at 1; USD 0.394 at 100 units (buy 100+), checked 2026-11-08 | USD 1.96 / USD 0.788 | Mouser 80-C0603C106M8PACTU |
![]() RC0402FR-074M7L Yageo |
2 | R8 R9 | 4.7M | 4.7M (power) | USD 0.120 each at 1; USD 0.008 at 100 units (buy 100+), checked 2026-11-08 | USD 0.240 / USD 0.016 | Mouser 603-RC0402FR-074M7L |
![]() CL05B104KO5NNNC Samsung Electro-Mechanics |
9 | C6 C7 C9 C14 C16 C17 C18 C19 C20 | 100nF | 100nF (power) | USD 0.100 each at 1; USD 0.008 at 100 units (buy 500+), checked 2026-11-08 | USD 0.900 / USD 0.072 | Mouser 187-CL05B104KO5NNNC |
![]() RC0402FR-074K7L Yageo |
2 | R11 R12 | 4.7k | 4.7k (mcu) | USD 0.100 each at 1; USD 0.007 at 100 units (buy 100+), checked 2026-11-08 | USD 0.200 / USD 0.014 | Mouser 603-RC0402FR-074K7L |
![]() RC0402FR-0710RL Yageo |
1 | R28 | 10R | 10R (receiver) | USD 0.190 each at 1; USD 0.011 at 100 units (buy 100+), checked 2026-11-08 | USD 0.190 / USD 0.011 | Mouser 603-RC0402FR-0710RL |
![]() RC0402FR-0710KL Yageo |
2 | R14 R18 | 10k | 10k (receiver) | USD 0.100 each at 1; USD 0.007 at 100 units (buy 100+), checked 2026-11-08 | USD 0.200 / USD 0.014 | Mouser 603-RC0402FR-0710KL |
![]() GRM1555C1H4R7WA01D Murata Electronics |
1 | C12 | 4.7pF | 4.7pF (receiver) | USD 0.130 each at 1; USD 0.042 at 100 units (buy 100+), checked 2026-11-08 | USD 0.130 / USD 0.042 | Mouser 81-GRM1555C1H4R7WA1D |
![]() GRM1555C1H102JA01D Murata Electronics component page requested |
1 | C13 | 1nF | 1nF (receiver) | USD 0.110 each at 1; USD 0.020 at 100 units (buy 100+), checked 2026-11-08 | USD 0.110 / USD 0.020 | Mouser 81-GRM1555C1H102JA1D |
RC0603FR-078R2L Yageo |
1 | R19 | 8.2R | 8.2R (emitter) | USD 0.100 each at 1; USD 0.016 at 100 units (buy 100+), checked 2026-11-08 | USD 0.100 / USD 0.016 | Mouser 603-RC0603FR-078R2L |
RC0603FR-074R7L Yageo |
1 | R22 | 4.7R | 4.7R (emitter) | USD 0.100 each at 1; USD 0.012 at 100 units (buy 100+), checked 2026-11-08 | USD 0.100 / USD 0.012 | Mouser 603-RC0603FR-074R7L |
![]() RC0402FR-07100RL Yageo |
2 | R20 R24 | 100R | 100R (emitter) | USD 0.100 each at 1; USD 0.007 at 100 units (buy 100+), checked 2026-11-08 | USD 0.200 / USD 0.014 | Mouser 603-RC0402FR-07100RL |
![]() JMK316BJ107ML-T Taiyo Yuden |
1 | C15 | 100uF 6.3V | emitter pulse reservoir | USD 1.07 each at 1; USD 0.488 at 100 units (buy 100+), checked 2026-11-08 | USD 1.07 / USD 0.488 | Mouser 963-JMK316BJ107ML-T |
![]() RC0402FR-0733RL Yageo |
1 | R27 | 33R | 33R (lights) | USD 0.100 each at 1; USD 0.007 at 100 units (buy 100+), checked 2026-11-08 | USD 0.100 / USD 0.007 | Mouser 603-RC0402FR-0733RL |
Per unit: USD 29.09 building 1, USD 18.11 each building 100 (electronics and battery USD 27.18 / 16.19).
Line cost is the quantity one unit consumes times the price break that the build quantity (1 or 100 units) reaches. Buying for one unit still means whole packs, spools and bottles; those minimum outlays are larger than the consumed cost. Excluded: bare PCB (quote from the 3rd party fab); case shipping, tax, machine time, labour, resin wash and cure consumables; assembly labour, PCB assembly fees, tax and shipping.
- base: 3.4904 g of PETG with a 15 % print allowance at USD 0.02999/g; planning budget; see case/mech_costs_sources.md
- cover: 3.5388 g of PETG with a 15 % print allowance at USD 0.02999/g; planning budget; see case/mech_costs_sources.md
- gasket: 0.0929 g of TPU 95A with a 15 % print allowance at USD 0.06998/g; planning budget; see case/mech_costs_sources.md
- foot: 0.2562 g of TPU 95A with a 15 % print allowance at USD 0.06998/g; planning budget; see case/mech_costs_sources.md
- usb plug: 0.2786 g of TPU 95A with a 15 % print allowance at USD 0.06998/g; planning budget; see case/mech_costs_sources.md
- ir window: 0.0997 g of clear SLA resin with a 15 % print allowance at USD 0.05/g; planning budget; see case/mech_costs_sources.md
- lightpipe status: 0.0099 g of clear SLA resin with a 15 % print allowance at USD 0.05/g; planning budget; see case/mech_costs_sources.md
- lightpipe 25: 0.0115 g of clear SLA resin with a 15 % print allowance at USD 0.05/g; planning budget; see case/mech_costs_sources.md
- lightpipe 50: 0.0115 g of clear SLA resin with a 15 % print allowance at USD 0.05/g; planning budget; see case/mech_costs_sources.md
- lightpipe 75: 0.0115 g of clear SLA resin with a 15 % print allowance at USD 0.05/g; planning budget; see case/mech_costs_sources.md
- lightpipe 100: 0.0115 g of clear SLA resin with a 15 % print allowance at USD 0.05/g; planning budget; see case/mech_costs_sources.md
- screw seals: 0.0156 g of TPU 95A with a 15 % print allowance at USD 0.06998/g; planning budget; see case/mech_costs_sources.md
- screws: 4 x USD 0.2; Vital Parts TPH14583-M16-14-A2: GBP 0.13 ex VAT at 1-99; USD 0.20 conservative budget including FX variation
- inserts: 4 x USD 0.15; RFQ required; comparable CNC Kitchen 100-pack is USD 11.50, different pilot/minimum wall
- adhesive coating grease: planning allowance, compatible products require coupons
The sourcing BOM with stock checks and every price column is docs/fab/ghost-hand-rev2-sourcing-bom.csv.
Board
The rev 2 board is an Adom molecule designed with Adom AI Flow in KiCad, from a new run: schematic, placement, routing, copper pours, current and heat analysis, silkscreen and 3D, on a 3rd party fab's 2-layer rules. It is 30 x 22 mm (rev 1: 44 x 28), with its four corner machine pins on a 24 x 16 mm span (the molecule grid wants multiples of 8 mm): the same pins that seat it in an Adom workcell, and in the case they press into printed sockets that hold it. The IR parts look forward off the front edge, USB-C is on the right edge, the battery lies under the board and its lead turns up into J2 at the back.
The silkscreen is new: every reference at 0.6 mm and every value at 0.3 mm, grouped by function; every light named for what it shows (STATUS, 25%, 50%, 75%, 100%), every IR part for what it is (IR 850 TX, IR 940 TX, PD RX), test points with their nets, J2 with + and -, and the power inputs with their voltage. The back carries the name, rev 2, the date and this page's address.
The board's own page, written by AI Flow, is in board/.
The finished board
| Parts | 66 fitted, 35 BOM lines, every placement rotation checked |
| Routing | 830 mm of track in 1326 segments, 77 vias, 0 DRC errors, 0 unconnected |
| Programming | UPDI on machine contacts MC4 (UPDI), MC3 (3V3), MC1 (GND) |
| Battery connector | J2 pin 1 = VBAT (+, red), pin 2 = GND (-, black), + and - in the silkscreen |
Why an ATtiny1616 and not an STM32C0
Keep the ATtiny1616. It is the only part compared here that runs the whole echo in hardware: a comparator with a learnable DAC threshold, the event system and two single-shot timers, all while the CPU sleeps. It also sleeps at 0.1 uA, which gave rev 1 about 10 years on the counter between charges (about 3 years on rev 2's smaller pack).
- STM32C011: about $0.38 cheaper at 1000 units. But it has no comparator: an ADC analog-watchdog workaround can trigger TIM1, but only while the chip is awake. Its Stop mode draws 80 uA, so the design would have to use Standby, with a reset on every wake. That cuts idle life from 10 years to 4, and it needs a firmware rewrite and a new layout.
- Next-revision candidate: TI MSPM0L1306, if its two on-chip op-amps can replace the TLV9062. The MCU plus op-amp would drop from $1.77 to $0.97 at 1000 units, keeping a hardware echo path and 1 uA standby. That needs a bench test first. Rev B would change:
- U1 becomes an MSPM0L1306 (VQFN-24).
- The TLV9062 goes, if the bench test passes.
- Programming moves from UPDI to SWD (SWDIO, SWCLK and NRST on machine contacts).
- The AC0 and DAC0 threshold becomes COMP with its 8-bit DAC.
- The two TCB single-shots become event-triggered timer one-shots.
- The firmware is ported. Rev 2 keeps the ATtiny1616.
| Chip | at 1 | at 100 | at 1000 | Sleep current | Echo in hardware, CPU asleep | Programming | Idle years on one charge | Fits the board? |
|---|---|---|---|---|---|---|---|---|
| ATtiny1616-MNR VQFN-20 3x3, 16 KB / 2 KB |
$0.900 | $0.873 | $0.873 (25+ break) | 0.1 uA power-down; 0.71 uA standby with RTC (DS40002204A t.36-5, 3 V 25 C) | Yes: AC0 with DAC0 threshold -> event system -> TCB0/TCB1 single-shot, runs in standby | UPDI, 1 wire + GND (serialUPDI on any USB-serial adapter, pymcuprog/avrdude, avr-gcc; or PICkit 5) | 10.3 | rev A: fits as built (13.1 KB flash, 368 B RAM used) |
| ATtiny1606-MNR VQFN-20 3x3, same pinout, 16 KB / 1 KB |
$0.820 | $0.796 | $0.796 (25+ break) | same family figures as the 1616 | Partly: AC0 has only fixed references (no DAC0), so the learnt receiver threshold is lost | UPDI, same tools | 10.3 (no DAC) | does not fit: no DAC0 for the learnt threshold |
| STM32C011F4U6TR UFQFPN-20 3x3, 16 KB / 6 KB |
$1.49 | $0.653 | $0.497 | Stop 80 uA typ; Standby 7.45 uA (RAM lost, wake = reset); Shutdown about 20 nA (DS13866 t.31; ST C0 training) | No comparator. Workaround: ADC at 1 Msps with analog watchdog -> TIM1 one-pulse, Run/Sleep only (about 0.5 mA: 0.32 mA Sleep at 16 MHz + 0.19 mA ADC) | SWD, 2 wires + NRST + GND (ST-LINK V3 or any CMSIS-DAP; STM32CubeIDE / OpenOCD) | 4.0 in Standby, 0.6 in Stop | fits with a firmware rewrite and Standby-based sleep |
| STM32C031K4U6 UFQFPN-32 5x5, 16 KB / 12 KB |
$1.06 | $0.638 | $0.628 (250+ break) | same C0 family figures (Stop about 80 uA, Standby about 7.5 uA) | No comparator; same ADC-watchdog workaround | SWD, same tools | about 4 in Standby | fits with a rewrite; larger package |
| MSPM0L1306SRGER VQFN-24 4x4, 64 KB / 4 KB |
$1.85 | $1.10 | $0.968 | STANDBY 1.0 uA with RAM kept; SHUTDOWN 61 nA (ti.com product page) | Yes: COMP with 8-bit DAC (32 ns) -> event fabric -> timer one-shot; also 2 chopper op-amps (could replace the TLV9062: bandwidth not yet checked) | SWD, same tools (TI XDS110 or CMSIS-DAP; Code Composer / GCC) | 8.7 | fits analog best; rewrite and re-layout; worth a bench test |
| MSPM0C1104SDDFR SOT-23-8 / small, 16 KB / 1 KB |
$0.720 | $0.399 | $0.355 (500+ break) | STANDBY 5 uA; SHUTDOWN 200 nA (ti.com) | No comparator, no event fabric listed: no hardware echo path | SWD | 5.1 | does not fit the echo path |
Prices: Mouser, live 2026-11-07. Idle years: rev 1's 425 mAh usable (rev 2: 128 mAh, about 0.3 of these), the rest of the board sleeping at 4.6 uA. Sleep figures:
- ATtiny1616: DS40002204A, table 36-5.
- STM32C011: DS13866, table 31, and ST's STM32C0 training.
- MSPM0: ti.com product pages.
ATtiny806, 416 and the other 8 KB and 4 KB parts are too small for the 13.1 KB firmware.

The AI Flow run
Each board went from the prompt to fab files in one measured Adom AI Flow run: intake, requirements, sourcing, test plan, schematic, placement, routing, vias, copper pours, current, thermal, Adom Fields, silkscreen, 3D, finish and export. Rev 2 is a new run; every step left its proof, screenshots and clips in the page repo. The runs, step by step: board-claude-opus-5-5-20261106-1434, board-claude-opus-5-5-20261108-1620, ghost-hand-claude-opus-5-5-20261106-1434, ghost-hand-claude-opus-5-5-20261108-1620. Build clips: docs/clips.md.
When a tool got in the way, the board thread fixed it at the source instead of working around it quietly. These went back to AI Flow from the rev 1 build:
- Issue #165: the router ignored trackWidth and scalar wideNets, so a 0.25 mm default track made the 0.4 mm pitch QFN unroutable
- Issue #166: flat test-pad 3D models were flagged as upside down
- Issue #167: nets past --rip-global were dropped without a word
- PR #73: adds a UPDI programming interface to the molecule flow, so the finished board can be flashed on its machine contacts
How it was built: three AI threads in Hydrogen
Rev 1 was built in one day, and rev 2 the same way, by three AI threads working side by side in Adom Hydrogen, each owning its own folder and handing work to the others through files, never by editing each other's work:
| Thread | Owned | Delivered |
|---|---|---|
| Board (Claude) | the design, AI Flow and KiCad | parts, schematic, the molecule board driven live in KiCad through Adom Bridge, Fields analysis, fab files |
| Case (Codex) | the case | the parametric case, STEP and STL, light pipes, gasket and seals, the laser engraving, a 528-pair interference check |
| Studio (Claude) | this page and the dashboard | Ghost Hand Studio, the 3D model of the whole gadget, firmware notes, battery life, this page |
The board thread published the board's STEP and GLB at each milestone (placed, routed and poured, final). The case thread read the board envelope and the pin positions from it and fitted the sockets and the battery around it. The studio thread rebuilt the assembled 3D model each time either one landed, and checked that the board's outline sits exactly on the case's board envelope. Hydrogen kept all three on one screen: the chat on the left, the AI Flow dashboard, the Studio and this page in webview tabs on the right.
Case
The 3D view at the top of this page is the assembled rev 2 gadget on a bathroom counter, 330 mm from the sensor window of a Moen 8551 sensor faucet with a hand washing under the stream, all at true size: open its Layers panel to hide the sink and faucet, the hand, the case shell, the light pipes or the battery, zoom in on Ghost Hand, and press Replay to watch it assemble.
The hand is cut from the MakeHuman base mesh (CC0); the faucet is modelled from Moen's spec sheet. How the scene was made: docs/3d/size-hand.

A compact sage pebble with a crowned roof, rounded edges and five tiny clear indicator dots. The front window separates IR transmit and receive paths. The screws enter from underneath, with a continuous perimeter seal and a recessed non-slip foot. There is no logo and no recess on the roof to collect water.

The top in the 3D model above: the UV laser engraving (STATUS, 25, 50, 75, 100 and GHOST HAND) is built straight from the engraving file and mapped onto the crowned roof, each name next to its own light pipe. Toggle it in Layers, 'Laser engraving'.
It is 38 x 32 x 17 mm overall, about half of rev 1's footprint. The board sits 5 degrees nose up, which puts the IR axis 13.6 mm above the counter; the aim above uses that height. Four cross-slotted collets squeeze the board's machine pins, the same pins that seat it in an Adom workcell, with open bottoms so the pin tips never bottom out. The Adafruit 1317 lies in its own floor pocket under the board, its leads coiled in a service loop that returns into J2 from the back. A TPU gasket seals the seam at 25 % compression, four M1.6 screws enter from below through TPU washers into heat-set inserts, a tethered TPU stopper with two sealing ribs closes the USB-C port, and a recessed TPU foot keeps it from sliding. Five 1.5 mm clear-resin pipes carry the lights to the roof, and a UV fiber laser engraves their names. A 513-pair interference check found no unexpected contact.
Design notes, print settings and assembly: case/README.md; engraving guide: case/laser_engrave.md; parametric source: case/ghost_hand_case.py.
Firmware
Plain C for the ATtiny1616, updated for rev 2 (the STATUS dot takes the logo's job at about half the drive, a 30 mA light cap for the small cell, the 77 mA charge), updated for rev 2 (the STATUS dot takes the logo's job at about half the drive, a 30 mA light cap for the small cell, the 77 mA charge), updated for rev 2 (the STATUS dot takes the logo's job at about half the drive, a 30 mA light cap for the small cell, the 77 mA charge), updated for rev 2 (the STATUS dot takes the logo's job at about half the drive, a 30 mA light cap for the small cell, the 77 mA charge), updated for rev 2 (the STATUS dot takes the logo's job at about half the drive, a 30 mA light cap for the small cell, the 77 mA charge), updated for rev 2 (the STATUS dot takes the logo's job at about half the drive, a 30 mA light cap for the small cell, the 77 mA charge), updated for rev 2 (the STATUS dot takes the logo's job at about half the drive, a 30 mA light cap for the small cell, the 77 mA charge), updated for rev 2 (the STATUS dot takes the logo's job at about half the drive, a 30 mA light cap for the small cell, the 77 mA charge), updated for rev 2 (the STATUS dot takes the logo's job at about half the drive, a 30 mA light cap for the small cell, the 77 mA charge), updated for rev 2 (the STATUS dot takes the logo's job at about half the drive, a 30 mA light cap for the small cell, the 77 mA charge), updated for rev 2 (the STATUS dot takes the logo's job at about half the drive, a 30 mA light cap for the small cell, the 77 mA charge), updated for rev 2 (the STATUS dot takes the logo's job at about half the drive, a 30 mA light cap for the small cell, the 77 mA charge), updated for rev 2 (the STATUS dot takes the logo's job at about half the drive, a 30 mA light cap for the small cell, the 77 mA charge), updated for rev 2 (the STATUS dot takes the logo's job at about half the drive, a 30 mA light cap for the small cell, the 77 mA charge), updated for rev 2 (the STATUS dot takes the logo's job at about half the drive, a 30 mA light cap for the small cell, the 77 mA charge), updated for rev 2 (the STATUS dot takes the logo's job at about half the drive, a 30 mA light cap for the small cell, the 77 mA charge), updated for rev 2 (the STATUS dot takes the logo's job at about half the drive, a 30 mA light cap for the small cell, the 77 mA charge), updated for rev 2 (the STATUS dot takes the logo's job at about half the drive, a 30 mA light cap for the small cell, the 77 mA charge), updated for rev 2 (the STATUS dot takes the logo's job at about half the drive, a 30 mA light cap for the small cell, the 77 mA charge), updated for rev 2 (the STATUS dot takes the logo's job at about half the drive, a 30 mA light cap for the small cell, the 77 mA charge), updated for rev 2 (the STATUS dot takes the logo's job at about half the drive, a 30 mA light cap for the small cell, the 77 mA charge), updated for rev 2 (the STATUS dot takes the logo's job at about half the drive, a 30 mA light cap for the small cell, the 77 mA charge) (avr-gcc, about 13.1 KB of the 16 KB flash). The echo path is pure hardware:
AC0, the event system and TCB0/TCB1 single-shots. The CPU runs the state machine, the learner, the
lights and the safety checks, and a 1 s watchdog guards the main loop. Full source is in
firmware/, with a host test that runs the learner against simulated faucets
(make test, 36 checks). Flash over UPDI on machine contacts MC4 (UPDI), MC3 (3V3) and MC1 (GND).
| File | What |
|---|---|
| firmware/src/main.c | state machine and safety checks |
| firmware/src/echo.c | AC0 + event system + TCB transponder |
| firmware/src/learn.c | faucet timeout and blip learner |
| firmware/src/accel.c | LIS2DW12 set-down, pick-up and tilt |
| firmware/src/leds.c | WS2812B-2020 driver and light patterns |
| firmware/src/power.c | clocks, sleep, battery, ADC, watchdog, EEPROM |
| firmware/build/ghost-hand.hex | ready-to-flash image |
Ghost Hand Studio
The build dashboard: an Adom app that shows the architecture, the faucet and its beam, the aim, the learning state machine, the lights, charging, battery life and the 3D models, live as the board and case come together.

Revisions
| Rev 1 (0.1.0) | Rev 2 (0.2.0) | |
|---|---|---|
| Case on the counter | 54 x 44 mm, 27 mm tall | 38 x 32 mm, 17 mm tall, much lower |
| Board | 44 x 28 mm, 2 layers | 30 x 22 mm, 2 layers, parts on both sides |
| Battery | Adafruit 1578, 500 mAh, 196 mA charge in 3.2 h | Adafruit 1317, 150 mAh, 77 mA charge in 2.4 h |
| Battery life | about a year at one session a day | 40 days at six sessions a day, 170 at one: charge about once a month |
| Lights | Adom logo light pipe and four gauge pills | 1.5 mm dots: STATUS and a four-dot gauge, half the drive |
| Tilt | 12 degrees, a guess | 5 degrees, from a scale drawing of the faucet |
| IR emitters | one 850 nm and two 940 nm, all at 12 ohm | one 850 nm at 8.2 ohm and one 940 nm at 4.7 ohm, for the off-axis counter spots in a smaller board |
| Silkscreen | references only | every reference 0.6 mm and value 0.3 mm, every light and IR part named, J2 + and -, test point nets |
Rev 1's complete design (board KiCad files, Gerbers, BOM, CPL, case STEP and STL, firmware) is the 0.1.0 "Rev 1" release (Gerbers).
Downloads
License
MIT. Build it, change it, share it.
<!-- studio:begin -->
# Ghost Hand
<!-- rev2-status:begin -->
**Rev 2 finished November 8, 2026.**
<!-- rev2-status:end -->
::adom-video{src="/john/ghost-hand/render/docs/videos/ghost-hand-film.video.json"}
The film shows how **rev 1** was built: one prompt in Adom Hydrogen, AI Flow and three AI threads (two
Claude, one Codex) taking Ghost Hand from idea to a priced, finished board and case; rev 2 below was built
the same way. [Download the film](docs/videos/ghost-hand-film.mp4) ([captions](docs/videos/ghost-hand-film.vtt)).
Ghost Hand is a small battery gadget you set on the counter beside a sink with an automatic faucet. It
aims infrared light at the faucet's sensor so the water keeps running while you wash your hair, do the
dishes or fill a jug, then hands the faucet back when you are done. It learns each faucet's safety
timeout by itself and re-arms with the shortest possible blip, so the water does not stop. There are no
settings and no power button: it wakes when it is set down and sleeps when it is picked up.
This page shows **rev 2**: half the footprint of rev 1 so it leaves room on the counter, a 150 mAh
battery that needs charging about once a month, small dot lights instead of the logo, a board
silkscreen that names every light, and a 5 degree tilt worked out from a real drawing of the faucet.
Rev 1's files stay at release [0.1.0 "Rev 1"](https://wiki.adom.inc/download/john/ghost-hand/0.1.0/ghost-hand-rev1-design.zip); see
[Revisions](#revisions).
> **Safety.** Ghost Hand is for someone standing at the sink. It never runs unattended: a hard cap of
> 10 minutes per session, it stops the moment it is picked up or tipped, and it stops when its battery is
> low. It will not run while it is charging. Nothing beyond what an ordinary manual tap already allows.
| | Rev 2 |
|---|---|
| Size on the counter | 38 x 32 mm, 17 mm tall (rev 1: 54 x 44 mm, 27 mm tall) |
| Board | Adom molecule, 30 x 22 mm, 2 layers on a 3rd party fab's rules, 4 corner machine pins |
| Brain | ATtiny1616, asleep between faucet pulses |
| IR | one 850 nm emitter (8.2 ohm) and one 940 nm emitter driven harder (4.7 ohm), two VEMD2023 photodiodes (750 to 1050 nm) |
| Aim | board tilted 5 degrees nose up (rev 1: 12), from the faucet's real window height |
| Battery | Adafruit 1317, 150 mAh 1S LiPo, USB-C charging at 77 mA in 2.4 h |
| Battery life | 40 days at six 10-minute sessions a day, 74 at three, 170 at one |
| Lights | five WS2812B-2020 under 1.5 mm clear-resin dots: STATUS plus a 25 / 50 / 75 / 100 % charge gauge |
| License | MIT |
## How it works
An automatic faucet is an active reflective sensor. Behind its dark window an IR LED flashes for 10 to
20 us every 0.3 to 2 s, and a receiver listens only during that flash. When enough light comes back (a
hand), the water turns on. Every faucet also has a safety timeout: after 10 to 60 s it shuts off even
with a hand there, and ignores that still hand until it goes away.
Ghost Hand hears the faucet's own flash on two photodiodes. A TLV9062 turns the photocurrent into volts
(a 150 k transimpedance stage, then gain 11), the ATtiny1616's analog comparator trips, and the event
system fires two single-shot timers that light the emitters, all in hardware, under 1 us after the
faucet's pulse begins. The echo therefore lands inside the faucet's own listening window and reads as a
strong reflection. The CPU only decides *when* to echo.

### Wavelengths and faucets covered
Faucet sensors work at 850 to 950 nm. One 850 nm emitter (VSMY2853SL) and one 940 nm emitter
(VSMB2948SL) cover that band, and the VEMD2023 photodiodes hear 750 to 1050 nm, so one Ghost Hand works on
the common brands:
| Faucet | Safety timeout | Notes |
|---|---|---|
| Moen M-Power 8551/8553 | 30 s | range 3 to 12 in, optional metering 10 to 180 s |
| Sloan EBF-615 | 30 s | range 2 to 7 in; EAF-700 sets its range at power-up |
| American Standard Selectronic | 55 s default (5 to 120 s) | 1.5 s run-on after hands leave |
| Zurn AquaSense Z6950 | 30 s default (5, 10, 15, 60 s) | self-calibrates to the basin |
| Kohler K-13460 | 30 s maximum run | |
| TOTO EcoPower | 10 or 60 s by model | |

### Learning the faucet
Just before the faucet's timeout, Ghost Hand goes quiet for a moment (a *blip*) so the faucet sees the
hand leave and come back, and starts a fresh run. The faucet's pulse rate is the window into its state:
most pulse faster while they see a user. Ghost Hand listens for 2 s, measures the faucet's idle period
and pulse width, echoes until the rate drops (that is the timeout), then re-arms at the timeout minus a
1.5 s margin. Each good blip is 15 % shorter than the last, never below a floor it learns
from its first miss. Faucets whose rate never changes get a blip every 8 s. What it learns is kept in
EEPROM, keyed to the faucet's idle period.

## Where it sits and how it tilts
Rev 1 tipped its board 12 degrees nose up. That was a guess, and too steep: on the faucet this was built
for, the sensor window sits only 40 mm above the counter. Rev 2 starts from a real drawing of
the faucet (Moen 8551 spec sheet: column 57 mm deep and 53 mm wide, 166 mm tall, spout
reach 155 mm; window centre 40 mm above the counter on pre-2017 units and
56 mm on current ones) and computes the angle.

With the IR lens 14 mm above the counter, the window is
tilt = atan((window height - lens height) / distance) above the horizon: 14.7 degrees from
100 mm away and 4.3 degrees from 350 mm (22.9 and 6.9 for the 56 mm units).
The emitters' half-intensity angles are +/-28 degrees (VSMY2853SL, 850 nm) and
+/-25 degrees (VSMB2948SL, 940 nm), and the VEMD2023 photodiode's is
+/-35 degrees, so the beams are wide enough that the tilt only has to point them
roughly. Signal falls as 1/d<sup>2</sup>, so the far placement is the one that limits: rev 2 tilts
**5 degrees**, which aims the beam axis at the window from the far end. The best worst-case margin over
100 to 350 mm is at 4.25 degrees for the 40 mm window; 5 degrees is within a fraction of a percent of it and a
little better for the 56 mm units (5.4x a hand at 5 degrees, 5.3x flat, 5.0x at rev 1's 12;
5.2x, 5.0x and 5.1x on 56 mm units). The case is built at 5 degrees.
Rev 2 has room on its front edge for two emitters, not rev 1's three, so the 940 nm one is driven harder: the 850 nm emitter
sits behind 8.2 ohm and the single 940 nm emitter behind 4.7 ohm (about 0.53 A at the start of a 25 us pulse), which nearly
matches what two 940 nm emitters at 8.2 ohm would send.
| Window to lens | Window elevation (40 mm) | 940 nm beam at 0 / 5 / 12 degrees tilt | Echo margin at 5 degrees | Elevation (56 mm units) | Margin at 5 degrees (56 mm) |
|---|---|---|---|---|---|
| 100 mm | 14.7 deg | 0.79 / **0.9** / 0.99 | 48.3x | 22.9 deg | 27.0x |
| 150 mm | 9.9 deg | 0.9 / **0.97** / 1.0 | 26.2x | 15.7 deg | 20.3x |
| 200 mm | 7.5 deg | 0.94 / **0.99** / 0.98 | 15.7x | 11.9 deg | 13.7x |
| 250 mm | 6.0 deg | 0.96 / **1.0** / 0.96 | 10.3x | 9.6 deg | 9.5x |
| 300 mm | 5.0 deg | 0.97 / **1.0** / 0.95 | 7.3x | 8.0 deg | 6.9x |
| 350 mm | 4.3 deg | 0.98 / **1.0** / 0.94 | 5.4x | 6.9 deg | 5.2x |
Echo margin is Ghost Hand's echo at the faucet's receiver divided by what a hand at the default 5.5 in
range returns (the faucet's own trigger level), with the battery at its low limit and 940 nm only; 2x
(6 dB) is comfortable, 1x still works.

The faucet's window looks forward over the basin, so Ghost Hand has to sit in front of it or to the side,
turned to face it. Seen from above, the best spot is the **front strip in front of the basin**
(454 mm out, 8 degrees off axis, 3.1x margin). Beside the basin it works
from about 325 mm out (315 mm and 43 degrees off axis gives 1.5x). Diagrams:
[side view SVG](docs/aim/side-view.svg), [top view SVG](docs/aim/top-view.svg), numbers in
[aim.json](docs/aim/aim.json).
What is assumed:
- Faucet receiver acceptance +/-30 deg half sensitivity (cos^n), +/-45 deg shown as the wide case; its axis level and straight out over the basin.
- Faucet emitter 50 mW/sr, +/-30 deg.
- Hand reflectance 0.5 over 50 cm2 at the 5.5 in default range sets the faucet's trigger level.
- Basin 17 x 14 in (432 x 356 mm) oval undermount, back lip 25 mm in front of the column.
- Ghost Hand IR lens axis 14 mm above the counter, turned by the user to face the window.
- Two photodiodes and the rev 1 receiver chain and threshold; 850 nm behind 8.2 ohm, one 940 nm behind 4.7 ohm (rev 1: three emitters behind 12 ohm), low battery 3.45 V.
## The lights
Rev 2 has no logo light. Five WS2812B-2020 LEDs sit under small round clear-resin light pipes about
1.5 mm across, with opaque walls between them: **STATUS** (D4) takes over everything rev 1's logo
showed, and four dots (D5 to D8) are the 25, 50, 75 and 100 % charge gauge. Each one is named on the
board silkscreen and laser engraved on the case. A dot sitting right on its LED looks several times
brighter than rev 1's spread-out logo at the same drive, so the firmware runs every light at about half
of rev 1's level and caps all five at about 30 mA.
| State | STATUS dot | Charge gauge (25 / 50 / 75 / 100 %) |
|---|---|---|
| Session start | wakes dim | fills to the battery level over 1.5 s (amber at 25 % or less) |
| Armed | soft cyan-white breathing, 4 s | off |
| Echoing | the breath 50 % brighter | off |
| Re-arm blip | quick flicker | off |
| Done (10 min) | slow warm fade | off |
| Low battery | red blink | first dot red |
| Charging | off | filled to the level, the next dot pulses |
| Full | off | all four green 5 s, then a dim pulse every 10 s |
| Unplugged | off | the level for 2 s |

## Charging and battery life
John's bar for rev 2: smaller on the counter, and charging about once a month is fine. USB-C 5 V feeds
an MCP73831 linear charger set to 77 mA by a 13k program resistor (0.51 C, inside the
pack's 1 C limit, and a quarter of rev 1's charger heat): constant current, then constant voltage at 4.2 V,
full in about 2.4 h. A TPS7A02 makes the 3.3 V rail on 25 nA of quiescent current.

The budget is built from the typical current of every part (Adafruit 1317, 150 mAh 1S LiPo, 128 mAh usable,
stop at 3.45 V):
| | |
|---|---|
| Asleep on the counter | 4.7 uA (the pack's protection IC is most of it) |
| During a session | 2.93 mA average |
| One 10-minute session | 0.488 mAh |
| Sessions per charge | about 261 |
| Days per charge | 40 at six sessions a day, 74 at three, 170 at one |
| Once a month | holds up to 8.2 sessions a day for 30 days |
| Running time per charge | about 44 h |
| Charge time | 2.4 h at 77 mA |
At the pack's minimum capacity it is still 38 days at six sessions a day.
Self-discharge of the cell (3.0 %/month assumed (0.15 mAh/day), larger than the sleep current) matters more than the sleep current. The faucet's
pulse rate and the light pattern are the two big unknowns.

### The battery, and which pin is +
The cell is an [Adafruit 1317](https://wiki.adom.inc/adom/adom-1317): a PKCell LP402025 pouch, 150 mAh 1S LiPo with its own protection board
(S-8261), about 4 x 20 x 26 mm and 4.65 g, with leads ending in a JST PH plug. It is
[Mouser 485-1317](https://www.mouser.com/c/?q=485-1317), USD 5.95, 111 in stock when checked on
2026-11-08. It is BT1 in the BOM and lies flat under the board; it plugs into J2 and is not fitted by the
fab, so the fab BOM lists it as a do-not-place line.
**Polarity:** PKCell's drawing for this pack (QA.S.0228) wires red and black into a *reversed* JST PH-2P
plug, which is Adafruit's order: red (+) on JST circuit 1 and black (-) on circuit 2, as on every
Adafruit and SparkFun board. **J2 pin 1 is VBAT (+) and pin 2 is GND**, with + and - printed beside
the connector, as in rev 1. Batteries from other sellers are often wired the opposite way, so check any
pack with a meter before plugging it in.
### The current budget, part by part
| Asleep | uA |
|---|---|
| TPS7A0233 IQ | 0.025 |
| ATtiny1616 power-down, pin-change wake on PA2 and PB2 | 0.1 |
| LIS2DW12 LP mode 1, 12.5 Hz, wake-up detection | 1.0 |
| MCP73831 reverse discharge (no VBUS) | 0.15 |
| VBAT monitor divider, 9.4 Mohm | 0.42 |
| WS2812B rail switched off (Q3) | 0.0 |
| TLV9062 unpowered (PA4 low) | 0.0 |
| LiPo pack protection IC S-8261AAJMD (3 uA assumed) | 3.0 |
| **Total** | **4.7** |
| During a session | mA |
|---|---|
| ATtiny1616 standby with OSC20M at 5 MHz for AC + TCB (idle 0.6 mA at 3 V) plus wake-ups | 0.8 |
| TLV9062 two channels (538 uA each typ) | 1.08 |
| receiver bias divider 3.3 V / 110 k | 0.03 |
| IR echo pulses (850 + 940 nm emitters, 25 us at 20 Hz) | 0.411 |
| status dot: breathing at 2 % average white, 20 % rail duty | 0.6 |
| LIS2DW12 LP 50 Hz (pick-up and tilt watch) | 0.004 |
| **Total** | **2.93** |
Asleep and never used, the 128 mAh would last 3.1 years; in practice the cell's own
self-discharge sets the shelf life. Typical datasheet currents at 25 C. The echo's 0.93 A, 25 us pulse
comes mostly from a 100 uF capacitor, so the pack only ever sees about 3 mA on average.
## Components
Every part of one rev 2 Ghost Hand, with its live price, the break a build reaches and the date it was checked. The table covers the board parts, the battery, the bare PCB, the printed case parts and the case hardware.
| Part | Qty | Refs | Value | Role | Unit cost | Line cost (1 / 100 units) | Buy |
|---|---|---|---|---|---|---|---|
| <a href="https://wiki.adom.inc/adom/attiny1616-mnr"><img src="docs/parts/attiny1616-mnr.png?v=b1a8105a" width="64" alt="ATTINY1616-MNR"></a><br>**[ATTINY1616-MNR](https://wiki.adom.inc/adom/attiny1616-mnr)**<br>Microchip Technology | 1 | U1 | ATtiny1616-MNR | MCU: hardware IR echo (AC0, event system, TCB single-shot) | USD 0.900 each at 1; USD 0.873 at 100 units (buy 25+), checked 2026-11-08 | USD 0.900 / USD 0.873 | [Mouser 556-ATTINY1616MNR](https://www.mouser.com/en/ProductDetail/Microchip-Technology/ATTINY1616-MNR?qs=HXFqYaX1Q2yKNpuKQU9qww%3D%3D) |
| <a href="https://wiki.adom.inc/adom/mcp73831t-2aci"><img src="docs/parts/mcp73831t-2aci-ot.png?v=fccd44a9" width="64" alt="MCP73831T-2ACI/OT"></a><br>**[MCP73831T-2ACI/OT](https://wiki.adom.inc/adom/mcp73831t-2aci)**<br>Microchip Technology | 1 | U2 | MCP73831T-2ACI/OT | LiPo charger, 77 mA (Rprog 13k) | USD 0.760 each at 1; USD 0.750 at 100 units (buy 25+), checked 2026-11-08 | USD 0.760 / USD 0.750 | [Mouser 579-MCP73831T-2ACIOT](https://www.mouser.com/en/ProductDetail/Microchip-Technology/MCP73831T-2ACI-OT?qs=yUQqVecv4qvbBQBGbHx0Mw%3D%3D) |
| <a href="https://wiki.adom.inc/adom/tps7a0233pdbvr"><img src="docs/parts/tps7a0233pdbvr.png?v=fccd44a9" width="64" alt="TPS7A0233PDBVR"></a><br>**[TPS7A0233PDBVR](https://wiki.adom.inc/adom/tps7a0233pdbvr)**<br>Texas Instruments | 1 | U3 | TPS7A0233PDBVR | 3.3 V LDO, 25 nA Iq | USD 0.950 each at 1; USD 0.540 at 100 units (buy 100+), checked 2026-11-08 | USD 0.950 / USD 0.540 | [DigiKey 296-TPS7A0233PDBVRCT-ND](https://www.digikey.com/en/products/detail/texas-instruments/TPS7A0233PDBVR/12165099) |
| <a href="https://wiki.adom.inc/part-request/n8mib0MeRoaROvu4dI106rCYAxewTQXi"><img src="docs/parts/lis2dw12tr.png?v=756fe101" width="64" alt="LIS2DW12TR"></a><br>**[LIS2DW12TR](https://wiki.adom.inc/part-request/n8mib0MeRoaROvu4dI106rCYAxewTQXi)**<br>STMicroelectronics<br>component page requested | 1 | U4 | LIS2DW12TR | accelerometer: set-down, pick-up, tilt | USD 1.79 each at 1; USD 1.30 at 100 units (buy 100+), checked 2026-11-08 | USD 1.79 / USD 1.30 | [Mouser 511-LIS2DW12TR](https://www.mouser.com/en/ProductDetail/STMicroelectronics/LIS2DW12TR?qs=u4fy%2FsgLU9NZAt0DqrAehA%3D%3D) |
| <a href="https://wiki.adom.inc/adom/tlv9062idgkt"><img src="docs/parts/tlv9062idgkt.png?v=6f6a7fdb" width="64" alt="TLV9062IDGKT"></a><br>**[TLV9062IDGKT](https://wiki.adom.inc/adom/tlv9062idgkt)**<br>Texas Instruments | 1 | U5 | TLV9062IDGKT | receiver TIA and gain | USD 1.76 each at 1; USD 1.05 at 100 units (buy 100+), checked 2026-11-08 | USD 1.76 / USD 1.05 | [Mouser 595-TLV9062IDGKT](https://www.mouser.com/en/ProductDetail/Texas-Instruments/TLV9062IDGKT?qs=1mbolxNpo8fe4ip52k%252B7Aw%3D%3D) |
| <a href="https://wiki.adom.inc/part-request/8MK0A64vuebcJ7-Y0bAGGN3PVLNitp8J"><img src="docs/parts/vsmy2853sl.png?v=4cae8128" width="64" alt="VSMY2853SL"></a><br>**[VSMY2853SL](https://wiki.adom.inc/part-request/8MK0A64vuebcJ7-Y0bAGGN3PVLNitp8J)**<br>Vishay<br>component page requested | 1 | D1 | VSMY2853SL | 850 nm emitter | USD 1.01 each at 1; USD 0.532 at 100 units (buy 100+), checked 2026-11-08 | USD 1.01 / USD 0.532 | [Mouser 78-VSMY2853SL](https://www.mouser.com/en/ProductDetail/Vishay-Semiconductors/VSMY2853SL?qs=5csRq1wdUj5LLuw5br%2F28g%3D%3D) |
| <a href="https://wiki.adom.inc/part-request/o5md74npPDN2dqrLqUB6CkClqbT3ukpe"><img src="docs/parts/vsmb2948sl.png?v=4cae8128" width="64" alt="VSMB2948SL"></a><br>**[VSMB2948SL](https://wiki.adom.inc/part-request/o5md74npPDN2dqrLqUB6CkClqbT3ukpe)**<br>Vishay<br>component page requested | 1 | D2 | VSMB2948SL | 940 nm emitters | USD 0.680 each at 1; USD 0.385 at 100 units (buy 100+), checked 2026-11-08 | USD 0.680 / USD 0.385 | [Mouser 78-VSMB2948SL](https://www.mouser.com/en/ProductDetail/Vishay-Semiconductors/VSMB2948SL?qs=5csRq1wdUj7tHqVBoZkgQA%3D%3D) |
| <a href="https://wiki.adom.inc/adom/vemd2023slx01"><img src="docs/parts/vemd2023slx01.png?v=f5d4d7a1" width="64" alt="VEMD2023SLX01"></a><br>**[VEMD2023SLX01](https://wiki.adom.inc/adom/vemd2023slx01)**<br>Vishay | 2 | PD1 PD2 | VEMD2023SLX01 | IR photodiodes, 750 to 1050 nm | USD 0.860 each at 1; USD 0.460 at 100 units (buy 100+), checked 2026-11-08 | USD 1.72 / USD 0.920 | [Mouser 78-VEMD2023SLX01](https://www.mouser.com/en/ProductDetail/Vishay-Semiconductors/VEMD2023SLX01?qs=5csRq1wdUj48jE77ZOyA1Q%3D%3D) |
| <a href="https://wiki.adom.inc/adom/ws2812b-2020"><img src="docs/parts/ws2812b-2020.png?v=81bc6999" width="64" alt="WS2812B-2020"></a><br>**[WS2812B-2020](https://wiki.adom.inc/adom/ws2812b-2020)**<br>Worldsemi | 5 | D4 D5 D6 D7 D8 | WS2812B-2020 | lights: STATUS dot + 4 gauge dots | USD 0.045 each at 1; USD 0.045 at 100 units (buy 1+), checked 2026-11-08 | USD 0.227 / USD 0.227 | [Adom stock adom/ws2812b-2020](https://wiki.adom.inc/adom/ws2812b-2020) |
| <a href="https://wiki.adom.inc/adom/dmn2041l-7"><img src="docs/parts/dmn2041l-7.png?v=3f2108a3" width="64" alt="DMN2041L-7"></a><br>**[DMN2041L-7](https://wiki.adom.inc/adom/dmn2041l-7)**<br>Diodes Incorporated | 2 | Q1 Q2 | DMN2041L-7 | emitter switches | USD 0.530 each at 1; USD 0.222 at 100 units (buy 100+), checked 2026-11-08 | USD 1.06 / USD 0.444 | [Mouser 621-DMN2041L-7](https://www.mouser.com/en/ProductDetail/Diodes-Incorporated/DMN2041L-7?qs=tiksPeNXt0LSbn3jTreVOg%3D%3D) |
| <a href="https://wiki.adom.inc/adom/dmg2305ux-13"><img src="docs/parts/dmg2305ux-13.png?v=3f2108a3" width="64" alt="DMG2305UX-13"></a><br>**[DMG2305UX-13](https://wiki.adom.inc/adom/dmg2305ux-13)**<br>Diodes Incorporated | 1 | Q3 | DMG2305UX-13 | LED rail switch | USD 0.410 each at 1; USD 0.169 at 100 units (buy 100+), checked 2026-11-08 | USD 0.410 / USD 0.169 | [Mouser 621-DMG2305UX-13](https://www.mouser.com/en/ProductDetail/Diodes-Incorporated/DMG2305UX-13?qs=L1DZKBg7t5Hgw5KN3G2IRg%3D%3D) |
| <a href="https://wiki.adom.inc/adom/usb4105-gf-a"><img src="docs/parts/usb4105-gf-a.png?v=4eed2bf6" width="64" alt="USB4105-GF-A"></a><br>**[USB4105-GF-A](https://wiki.adom.inc/adom/usb4105-gf-a)**<br>GCT | 1 | J1 | USB4105-GF-A | USB-C charge input | USD 0.800 each at 1; USD 0.575 at 100 units (buy 100+), checked 2026-11-08 | USD 0.800 / USD 0.575 | [Mouser 640-USB4105-GF-A](https://www.mouser.com/en/ProductDetail/GCT/USB4105-GF-A?qs=KUoIvG%2F9IlY%2FMLlBMpStpA%3D%3D) |
| <a href="https://wiki.adom.inc/adom/s2b-ph-k-s"><img src="docs/parts/s2b-ph-k-s.png?v=cc5c1032" width="64" alt="S2B-PH-K-S"></a><br>**[S2B-PH-K-S](https://wiki.adom.inc/adom/s2b-ph-k-s)**<br>JST | 1 | J2 | S2B-PH-K-S | battery connector (pin 1 +) | USD 0.120 each at 1; USD 0.084 at 100 units (buy 100+), checked 2026-11-08 | USD 0.120 / USD 0.084 | [Mouser 306-S2BPHKSLFSNPP](https://www.mouser.com/en/ProductDetail/JST-Commercial/S2B-PH-K-SLFSN?qs=cdbOS8ANM9A5Ie4gXeMjTA%3D%3D) |
| <a href="https://wiki.adom.inc/adom/smf5-0a"><img src="docs/parts/smf5-0a.png?v=8e37e223" width="64" alt="SMF5.0A"></a><br>**[SMF5.0A](https://wiki.adom.inc/adom/smf5-0a)**<br>Littelfuse | 1 | D10 | SMF5.0A | VBUS surge clamp | USD 0.420 each at 1; USD 0.162 at 100 units (buy 100+), checked 2026-11-08 | USD 0.420 / USD 0.162 | [Mouser 821-SMF5.0ARQG](https://www.mouser.com/en/ProductDetail/Taiwan-Semiconductor/SMF5.0A?qs=1mbolxNpo8eR5rZB%252BCLtCw%3D%3D) |
| <a href="https://wiki.adom.inc/adom/adom-1317"></a><br>**[1317](https://wiki.adom.inc/adom/adom-1317)**<br>Adafruit | 1 | BT1 | 150mAh 1S LiPo | 150 mAh LiPo (PCM, JST PH), under the board on J2 | USD 5.95 each at 1; USD 5.95 at 100 units (buy 1+), checked 2026-11-08 | USD 5.95 / USD 5.95 | [Mouser 485-1317](https://www.mouser.com/c/?q=485-1317) |
| <a href="https://wiki.adom.inc/john/ghost-hand/files/case"><img src="docs/parts/case-base.png?v=e1c65b57" width="64" alt="base"></a><br>**[base](https://wiki.adom.inc/john/ghost-hand/files/case)**<br>printed | 1 | | PETG | base, prints in PETG | USD 0.105 per unit at 1; USD 0.105 at 100 units, checked 2026-11-08 (note 1) | USD 0.105 / USD 0.105 | Quote required |
| <a href="https://wiki.adom.inc/john/ghost-hand/files/case"><img src="docs/parts/case-cover.png?v=5161c89f" width="64" alt="cover"></a><br>**[cover](https://wiki.adom.inc/john/ghost-hand/files/case)**<br>printed | 1 | | PETG | cover with the light pipes and engraved names (PETG) | USD 0.106 per unit at 1; USD 0.106 at 100 units, checked 2026-11-08 (note 2) | USD 0.106 / USD 0.106 | Quote required |
| <a href="https://wiki.adom.inc/john/ghost-hand/files/case"><img src="docs/parts/case-gasket.png?v=1243f881" width="64" alt="gasket"></a><br>**[gasket](https://wiki.adom.inc/john/ghost-hand/files/case)**<br>printed | 1 | | TPU 95A | perimeter gasket (TPU 95A) | USD 0.006 per unit at 1; USD 0.006 at 100 units, checked 2026-11-08 (note 3) | USD 0.006 / USD 0.006 | Quote required |
| <a href="https://wiki.adom.inc/john/ghost-hand/files/case"><img src="docs/parts/case-foot.png?v=23f0c63e" width="64" alt="foot"></a><br>**[foot](https://wiki.adom.inc/john/ghost-hand/files/case)**<br>printed | 1 | | TPU 95A | non-slip foot (TPU 95A) | USD 0.018 per unit at 1; USD 0.018 at 100 units, checked 2026-11-08 (note 4) | USD 0.018 / USD 0.018 | Quote required |
| <a href="https://wiki.adom.inc/john/ghost-hand/files/case"><img src="docs/parts/case-usb-plug.png?v=b0a38616" width="64" alt="usb plug"></a><br>**[usb plug](https://wiki.adom.inc/john/ghost-hand/files/case)**<br>printed | 1 | | TPU 95A | tethered USB-C seal (TPU 95A) | USD 0.019 per unit at 1; USD 0.019 at 100 units, checked 2026-11-08 (note 5) | USD 0.019 / USD 0.019 | Quote required |
| <a href="https://wiki.adom.inc/john/ghost-hand/files/case"><img src="docs/parts/case-ir-window.png?v=0821b834" width="64" alt="ir window"></a><br>**[ir window](https://wiki.adom.inc/john/ghost-hand/files/case)**<br>printed | 1 | | clear SLA resin | IR window (clear resin) | USD 0.005 per unit at 1; USD 0.005 at 100 units, checked 2026-11-08 (note 6) | USD 0.005 / USD 0.005 | Quote required |
| <a href="https://wiki.adom.inc/john/ghost-hand/files/case"><img src="docs/parts/case-lightpipe-25.png?v=be6c834b" width="64" alt="lightpipe status"></a><br>**[lightpipe status](https://wiki.adom.inc/john/ghost-hand/files/case)**<br>printed | 1 | | clear SLA resin | STATUS light pipe, 1.5 mm dot (clear resin) | USD 0.001 per unit at 1; USD 0.001 at 100 units, checked 2026-11-08 (note 7) | USD 0.001 / USD 0.001 | Quote required |
| <a href="https://wiki.adom.inc/john/ghost-hand/files/case"><img src="docs/parts/case-lightpipe-25.png?v=be6c834b" width="64" alt="lightpipe 25"></a><br>**[lightpipe 25](https://wiki.adom.inc/john/ghost-hand/files/case)**<br>printed | 1 | | clear SLA resin | gauge light pipe 25 % | USD 0.001 per unit at 1; USD 0.001 at 100 units, checked 2026-11-08 (note 8) | USD 0.001 / USD 0.001 | Quote required |
| <a href="https://wiki.adom.inc/john/ghost-hand/files/case"><img src="docs/parts/case-lightpipe-25.png?v=be6c834b" width="64" alt="lightpipe 50"></a><br>**[lightpipe 50](https://wiki.adom.inc/john/ghost-hand/files/case)**<br>printed | 1 | | clear SLA resin | gauge light pipe 50 % | USD 0.001 per unit at 1; USD 0.001 at 100 units, checked 2026-11-08 (note 9) | USD 0.001 / USD 0.001 | Quote required |
| <a href="https://wiki.adom.inc/john/ghost-hand/files/case"><img src="docs/parts/case-lightpipe-25.png?v=be6c834b" width="64" alt="lightpipe 75"></a><br>**[lightpipe 75](https://wiki.adom.inc/john/ghost-hand/files/case)**<br>printed | 1 | | clear SLA resin | gauge light pipe 75 % | USD 0.001 per unit at 1; USD 0.001 at 100 units, checked 2026-11-08 (note 10) | USD 0.001 / USD 0.001 | Quote required |
| <a href="https://wiki.adom.inc/john/ghost-hand/files/case"><img src="docs/parts/case-lightpipe-25.png?v=be6c834b" width="64" alt="lightpipe 100"></a><br>**[lightpipe 100](https://wiki.adom.inc/john/ghost-hand/files/case)**<br>printed | 1 | | clear SLA resin | gauge light pipe 100 % | USD 0.001 per unit at 1; USD 0.001 at 100 units, checked 2026-11-08 (note 11) | USD 0.001 / USD 0.001 | Quote required |
| <a href="https://wiki.adom.inc/john/ghost-hand/files/case"><img src="docs/parts/case-screw-seals.png?v=85a8e747" width="64" alt="screw seals"></a><br>**[screw seals](https://wiki.adom.inc/john/ghost-hand/files/case)**<br>printed | 4 | | TPU 95A | screw seals (TPU 95A) | USD 0.001 per unit at 1; USD 0.001 at 100 units, checked 2026-11-08 (note 12) | USD 0.001 / USD 0.001 | Quote required |
| <a href="https://wiki.adom.inc/john/ghost-hand/files/case"></a><br>**[screws](https://wiki.adom.inc/john/ghost-hand/files/case)**<br>hardware | 4 | | M1.6 x 14 stainless, 0.35 pitch, pan head 3.2 mm diameter and 1.42 mm high | cover screws, from below | USD 0.800 per unit at 1; USD 0.800 at 100 units, checked 2026-11-08 (note 13) | USD 0.800 / USD 0.800 | Quote required |
| <a href="https://wiki.adom.inc/john/ghost-hand/files/case"></a><br>**[inserts](https://wiki.adom.inc/john/ghost-hand/files/case)**<br>hardware | 4 | | PSM MINI-TECH MTEC-B-M1.6, 2.5 mm length, 2.5 mm OD, 2.15 mm pilot | heat-set inserts in the cover | USD 0.600 per unit at 1; USD 0.600 at 100 units, checked 2026-11-08 (note 14) | USD 0.600 / USD 0.600 | Quote required |
| <a href="https://wiki.adom.inc/john/ghost-hand/files/case"></a><br>**[adhesive coating grease](https://wiki.adom.inc/john/ghost-hand/files/case)**<br>hardware | 1 | | | adhesive, conformal coating, grease | USD 0.250 per unit at 1; USD 0.250 at 100 units, checked 2026-11-08 (note 15) | USD 0.250 / USD 0.250 | Quote required |
| <a href="https://wiki.adom.inc/john/rc0402fr-075k1l"><img src="docs/parts/rc0402fr-075k1l.png?v=d854fe24" width="64" alt="RC0402FR-075K1L"></a><br>**[RC0402FR-075K1L](https://wiki.adom.inc/john/rc0402fr-075k1l)**<br>Yageo | 2 | R1 R2 | 5.1k | 5.1k (input) | USD 0.100 each at 1; USD 0.007 at 100 units (buy 100+), checked 2026-11-08 | USD 0.200 / USD 0.014 | [Mouser 603-RC0402FR-075K1L](https://www.mouser.com/en/ProductDetail/YAGEO/RC0402FR-075K1L?qs=YUgVZYePFqCSmQuaha43RA%3D%3D) |
| <a href="https://wiki.adom.inc/adom/cc0603krx5r7bb475"><img src="docs/parts/cc0603krx5r7bb475.png?v=3c30bab9" width="64" alt="CC0603KRX5R7BB475"></a><br>**[CC0603KRX5R7BB475](https://wiki.adom.inc/adom/cc0603krx5r7bb475)**<br>Yageo | 2 | C1 C2 | 4.7uF 16V | 4.7uF 16V (input) | USD 0.240 each at 1; USD 0.085 at 100 units (buy 100+), checked 2026-11-08 | USD 0.480 / USD 0.170 | [Mouser 603-CC603KRX5R7BB475](https://www.mouser.com/en/ProductDetail/YAGEO/CC0603KRX5R7BB475?qs=57cj7OiSijmnlq47szjeyw%3D%3D) |
| <a href="https://wiki.adom.inc/adom/rc0402fr-0713kl"></a><br>**[RC0402FR-0713KL](https://wiki.adom.inc/adom/rc0402fr-0713kl)**<br>Yageo | 1 | R3 | 13k | 13k (charger) | USD 0.100 each at 1; USD 0.007 at 100 units (buy 100+), checked 2026-11-08 | USD 0.100 / USD 0.007 | [Mouser 603-RC0402FR-0713KL](https://www.mouser.com/en/ProductDetail/YAGEO/RC0402FR-0713KL?qs=sxZXDnvRBEhPjc%252B9C6HVrA%3D%3D) |
| <a href="https://wiki.adom.inc/adom/rc0402fr-0768kl"><img src="docs/parts/rc0402fr-0768kl.png?v=d854fe24" width="64" alt="RC0402FR-0768KL"></a><br>**[RC0402FR-0768KL](https://wiki.adom.inc/adom/rc0402fr-0768kl)**<br>Yageo | 1 | R4 | 68k | 68k (charger) | USD 0.100 each at 1; USD 0.007 at 100 units (buy 100+), checked 2026-11-08 | USD 0.100 / USD 0.007 | [Mouser 603-RC0402FR-0768KL](https://www.mouser.com/en/ProductDetail/YAGEO/RC0402FR-0768KL?qs=Is6ZsIPfHkZqrkXGHvEfjA%3D%3D) |
| <a href="https://wiki.adom.inc/john/rc0402fr-07100kl"><img src="docs/parts/rc0402fr-07100kl.png?v=d854fe24" width="64" alt="RC0402FR-07100KL"></a><br>**[RC0402FR-07100KL](https://wiki.adom.inc/john/rc0402fr-07100kl)**<br>Yageo | 8 | R5 R6 R13 R16 R17 R21 R25 R26 | 100k | 100k (charger) | USD 0.100 each at 1; USD 0.007 at 100 units (buy 100+), checked 2026-11-08 | USD 0.800 / USD 0.056 | [Mouser 603-RC0402FR-07100KL](https://www.mouser.com/en/ProductDetail/YAGEO/RC0402FR-07100KL?qs=mnq%2FyloZIXzTlUn7JAHSWg%3D%3D) |
| <a href="https://wiki.adom.inc/adom/rc0402fr-07150kl"><img src="docs/parts/rc0402fr-07150kl.png?v=d854fe24" width="64" alt="RC0402FR-07150KL"></a><br>**[RC0402FR-07150KL](https://wiki.adom.inc/adom/rc0402fr-07150kl)**<br>Yageo | 2 | R7 R15 | 150k | 150k (charger) | USD 0.100 each at 1; USD 0.007 at 100 units (buy 100+), checked 2026-11-08 | USD 0.200 / USD 0.014 | [Mouser 603-RC0402FR-07150KL](https://www.mouser.com/en/ProductDetail/YAGEO/RC0402FR-07150KL?qs=UOUeRUa%252B8Wn3KcUL8sT7JA%3D%3D) |
| <a href="https://wiki.adom.inc/barrett-land/cl05a105ka5nqnc"><img src="docs/parts/cl05a105ka5nqnc.png?v=fec952b1" width="64" alt="CL05A105KA5NQNC"></a><br>**[CL05A105KA5NQNC](https://wiki.adom.inc/barrett-land/cl05a105ka5nqnc)**<br>Samsung Electro-Mechanics | 4 | C3 C4 C8 C11 | 1uF 25V | 1uF 25V (power) | USD 0.310 each at 1; USD 0.113 at 100 units (buy 100+), checked 2026-11-08 | USD 1.24 / USD 0.452 | [Mouser 187-CL05A105KA5NQNC](https://www.mouser.com/en/ProductDetail/Samsung-Electro-Mechanics/CL05A105KA5NQNC?qs=X6jEic%2FHinDIeFgZnm60Lw%3D%3D) |
| <a href="https://wiki.adom.inc/adom/c0603c106m8pactu"><img src="docs/parts/c0603c106m8pactu.png?v=3c30bab9" width="64" alt="C0603C106M8PACTU"></a><br>**[C0603C106M8PACTU](https://wiki.adom.inc/adom/c0603c106m8pactu)**<br>KEMET | 2 | C5 C21 | 10uF 10V | 10uF 10V (power) | USD 0.980 each at 1; USD 0.394 at 100 units (buy 100+), checked 2026-11-08 | USD 1.96 / USD 0.788 | [Mouser 80-C0603C106M8PACTU](https://www.mouser.com/en/ProductDetail/KEMET/C0603C106M8PACTU?qs=gt1LBUVyoHk6B7S%252BOYJa0A%3D%3D) |
| <a href="https://wiki.adom.inc/adom/rc0402fr-074m7l"><img src="docs/parts/rc0402fr-074m7l.png?v=d854fe24" width="64" alt="RC0402FR-074M7L"></a><br>**[RC0402FR-074M7L](https://wiki.adom.inc/adom/rc0402fr-074m7l)**<br>Yageo | 2 | R8 R9 | 4.7M | 4.7M (power) | USD 0.120 each at 1; USD 0.008 at 100 units (buy 100+), checked 2026-11-08 | USD 0.240 / USD 0.016 | [Mouser 603-RC0402FR-074M7L](https://www.mouser.com/en/ProductDetail/YAGEO/RC0402FR-074M7L?qs=UOUeRUa%252B8WlB6TmWxXROcg%3D%3D) |
| <a href="https://wiki.adom.inc/barrett-land/cl05b104ko5nnnc"><img src="docs/parts/cl05b104ko5nnnc.png?v=fec952b1" width="64" alt="CL05B104KO5NNNC"></a><br>**[CL05B104KO5NNNC](https://wiki.adom.inc/barrett-land/cl05b104ko5nnnc)**<br>Samsung Electro-Mechanics | 9 | C6 C7 C9 C14 C16 C17 C18 C19 C20 | 100nF | 100nF (power) | USD 0.100 each at 1; USD 0.008 at 100 units (buy 500+), checked 2026-11-08 | USD 0.900 / USD 0.072 | [Mouser 187-CL05B104KO5NNNC](https://www.mouser.com/en/ProductDetail/Samsung-Electro-Mechanics/CL05B104KO5NNNC?qs=hqM3L16%252BxlfT2SKOuAUq6Q%3D%3D) |
| <a href="https://wiki.adom.inc/adom/rc0402fr-074k7l"><img src="docs/parts/rc0402fr-074k7l.png?v=d854fe24" width="64" alt="RC0402FR-074K7L"></a><br>**[RC0402FR-074K7L](https://wiki.adom.inc/adom/rc0402fr-074k7l)**<br>Yageo | 2 | R11 R12 | 4.7k | 4.7k (mcu) | USD 0.100 each at 1; USD 0.007 at 100 units (buy 100+), checked 2026-11-08 | USD 0.200 / USD 0.014 | [Mouser 603-RC0402FR-074K7L](https://www.mouser.com/en/ProductDetail/YAGEO/RC0402FR-074K7L?qs=V1yeUXFNrkn%2FmCXC8N8TTA%3D%3D) |
| <a href="https://wiki.adom.inc/adom/rc0402fr-0710rl"><img src="docs/parts/rc0402fr-0710rl.png?v=d854fe24" width="64" alt="RC0402FR-0710RL"></a><br>**[RC0402FR-0710RL](https://wiki.adom.inc/adom/rc0402fr-0710rl)**<br>Yageo | 1 | R28 | 10R | 10R (receiver) | USD 0.190 each at 1; USD 0.011 at 100 units (buy 100+), checked 2026-11-08 | USD 0.190 / USD 0.011 | [Mouser 603-RC0402FR-0710RL](https://www.mouser.com/en/ProductDetail/YAGEO/RC0402FR-0710RL?qs=V1yeUXFNrkkzkWCUUWS9og%3D%3D) |
| <a href="https://wiki.adom.inc/john/rc0402fr-0710kl"><img src="docs/parts/rc0402fr-0710kl.png?v=d854fe24" width="64" alt="RC0402FR-0710KL"></a><br>**[RC0402FR-0710KL](https://wiki.adom.inc/john/rc0402fr-0710kl)**<br>Yageo | 2 | R14 R18 | 10k | 10k (receiver) | USD 0.100 each at 1; USD 0.007 at 100 units (buy 100+), checked 2026-11-08 | USD 0.200 / USD 0.014 | [Mouser 603-RC0402FR-0710KL](https://www.mouser.com/en/ProductDetail/YAGEO/RC0402FR-0710KL?qs=I1mnnYJTTsxUoNwrUsQExA%3D%3D) |
| <a href="https://wiki.adom.inc/adom/grm1555c1h4r7wa01d"><img src="docs/parts/grm1555c1h4r7wa01d.png?v=fec952b1" width="64" alt="GRM1555C1H4R7WA01D"></a><br>**[GRM1555C1H4R7WA01D](https://wiki.adom.inc/adom/grm1555c1h4r7wa01d)**<br>Murata Electronics | 1 | C12 | 4.7pF | 4.7pF (receiver) | USD 0.130 each at 1; USD 0.042 at 100 units (buy 100+), checked 2026-11-08 | USD 0.130 / USD 0.042 | [Mouser 81-GRM1555C1H4R7WA1D](https://www.mouser.com/en/ProductDetail/Murata-Electronics/GRM1555C1H4R7WA01D?qs=ouTquLLW2S5qwZJBh3x8FA%3D%3D) |
| <a href="https://wiki.adom.inc/part-request/cVJEFouFMqWLi9DTBUq9wLbW4NAleHWO"><img src="docs/parts/grm1555c1h102ja01d.png?v=fec952b1" width="64" alt="GRM1555C1H102JA01D"></a><br>**[GRM1555C1H102JA01D](https://wiki.adom.inc/part-request/cVJEFouFMqWLi9DTBUq9wLbW4NAleHWO)**<br>Murata Electronics<br>component page requested | 1 | C13 | 1nF | 1nF (receiver) | USD 0.110 each at 1; USD 0.020 at 100 units (buy 100+), checked 2026-11-08 | USD 0.110 / USD 0.020 | [Mouser 81-GRM1555C1H102JA1D](https://www.mouser.com/en/ProductDetail/Murata-Electronics/GRM1555C1H102JA01D?qs=%2FOTtAhf8R8ZL4biNptvoUQ%3D%3D) |
| <a href="https://wiki.adom.inc/john/rc0603fr-078r2l"></a><br>**[RC0603FR-078R2L](https://wiki.adom.inc/john/rc0603fr-078r2l)**<br>Yageo | 1 | R19 | 8.2R | 8.2R (emitter) | USD 0.100 each at 1; USD 0.016 at 100 units (buy 100+), checked 2026-11-08 | USD 0.100 / USD 0.016 | [Mouser 603-RC0603FR-078R2L](https://www.mouser.com/en/ProductDetail/YAGEO/RC0603FR-078R2L?qs=EiqXWrxQq61TNcRzjaXGOA%3D%3D) |
| <a href="https://wiki.adom.inc/glenn/rc0603fr-074r7l"></a><br>**[RC0603FR-074R7L](https://wiki.adom.inc/glenn/rc0603fr-074r7l)**<br>Yageo | 1 | R22 | 4.7R | 4.7R (emitter) | USD 0.100 each at 1; USD 0.012 at 100 units (buy 100+), checked 2026-11-08 | USD 0.100 / USD 0.012 | [Mouser 603-RC0603FR-074R7L](https://www.mouser.com/c/?q=RC0603FR-074R7L) |
| <a href="https://wiki.adom.inc/adom/rc0402fr-07100rl"><img src="docs/parts/rc0402fr-07100rl.png?v=d854fe24" width="64" alt="RC0402FR-07100RL"></a><br>**[RC0402FR-07100RL](https://wiki.adom.inc/adom/rc0402fr-07100rl)**<br>Yageo | 2 | R20 R24 | 100R | 100R (emitter) | USD 0.100 each at 1; USD 0.007 at 100 units (buy 100+), checked 2026-11-08 | USD 0.200 / USD 0.014 | [Mouser 603-RC0402FR-07100RL](https://www.mouser.com/en/ProductDetail/YAGEO/RC0402FR-07100RL?qs=V1yeUXFNrknwaJOOZ4yDtg%3D%3D) |
| <a href="https://wiki.adom.inc/adom/jmk316bj107ml-t"><img src="docs/parts/jmk316bj107ml-t.png?v=41b087be" width="64" alt="JMK316BJ107ML-T"></a><br>**[JMK316BJ107ML-T](https://wiki.adom.inc/adom/jmk316bj107ml-t)**<br>Taiyo Yuden | 1 | C15 | 100uF 6.3V | emitter pulse reservoir | USD 1.07 each at 1; USD 0.488 at 100 units (buy 100+), checked 2026-11-08 | USD 1.07 / USD 0.488 | [Mouser 963-JMK316BJ107ML-T](https://www.mouser.com/en/ProductDetail/TAIYO-YUDEN/JMK316BJ107ML-T?qs=I6KAKw0tg2ze5%252Bz37ec%2FZg%3D%3D) |
| <a href="https://wiki.adom.inc/adom/rc0402fr-0733rl"><img src="docs/parts/rc0402fr-0733rl.png?v=d854fe24" width="64" alt="RC0402FR-0733RL"></a><br>**[RC0402FR-0733RL](https://wiki.adom.inc/adom/rc0402fr-0733rl)**<br>Yageo | 1 | R27 | 33R | 33R (lights) | USD 0.100 each at 1; USD 0.007 at 100 units (buy 100+), checked 2026-11-08 | USD 0.100 / USD 0.007 | [Mouser 603-RC0402FR-0733RL](https://www.mouser.com/en/ProductDetail/YAGEO/RC0402FR-0733RL?qs=V1yeUXFNrkk7PcMc%252BKdghg%3D%3D) |
**Per unit: USD 29.09 building 1, USD 18.11 each building 100** (electronics and battery USD 27.18 / 16.19).
Line cost is the quantity one unit consumes times the price break that the build quantity (1 or 100 units) reaches. Buying for one unit still means whole packs, spools and bottles; those minimum outlays are larger than the consumed cost. Excluded: bare PCB (quote from the 3rd party fab); case shipping, tax, machine time, labour, resin wash and cure consumables; assembly labour, PCB assembly fees, tax and shipping.
1. **base:** 3.4904 g of PETG with a 15 % print allowance at USD 0.02999/g; planning budget; see [case/mech_costs_sources.md](case/mech_costs_sources.md)
2. **cover:** 3.5388 g of PETG with a 15 % print allowance at USD 0.02999/g; planning budget; see [case/mech_costs_sources.md](case/mech_costs_sources.md)
3. **gasket:** 0.0929 g of TPU 95A with a 15 % print allowance at USD 0.06998/g; planning budget; see [case/mech_costs_sources.md](case/mech_costs_sources.md)
4. **foot:** 0.2562 g of TPU 95A with a 15 % print allowance at USD 0.06998/g; planning budget; see [case/mech_costs_sources.md](case/mech_costs_sources.md)
5. **usb plug:** 0.2786 g of TPU 95A with a 15 % print allowance at USD 0.06998/g; planning budget; see [case/mech_costs_sources.md](case/mech_costs_sources.md)
6. **ir window:** 0.0997 g of clear SLA resin with a 15 % print allowance at USD 0.05/g; planning budget; see [case/mech_costs_sources.md](case/mech_costs_sources.md)
7. **lightpipe status:** 0.0099 g of clear SLA resin with a 15 % print allowance at USD 0.05/g; planning budget; see [case/mech_costs_sources.md](case/mech_costs_sources.md)
8. **lightpipe 25:** 0.0115 g of clear SLA resin with a 15 % print allowance at USD 0.05/g; planning budget; see [case/mech_costs_sources.md](case/mech_costs_sources.md)
9. **lightpipe 50:** 0.0115 g of clear SLA resin with a 15 % print allowance at USD 0.05/g; planning budget; see [case/mech_costs_sources.md](case/mech_costs_sources.md)
10. **lightpipe 75:** 0.0115 g of clear SLA resin with a 15 % print allowance at USD 0.05/g; planning budget; see [case/mech_costs_sources.md](case/mech_costs_sources.md)
11. **lightpipe 100:** 0.0115 g of clear SLA resin with a 15 % print allowance at USD 0.05/g; planning budget; see [case/mech_costs_sources.md](case/mech_costs_sources.md)
12. **screw seals:** 0.0156 g of TPU 95A with a 15 % print allowance at USD 0.06998/g; planning budget; see [case/mech_costs_sources.md](case/mech_costs_sources.md)
13. **screws:** 4 x USD 0.2; Vital Parts TPH14583-M16-14-A2: GBP 0.13 ex VAT at 1-99; USD 0.20 conservative budget including FX variation
14. **inserts:** 4 x USD 0.15; RFQ required; comparable CNC Kitchen 100-pack is USD 11.50, different pilot/minimum wall
15. **adhesive coating grease:** planning allowance, compatible products require coupons
The sourcing BOM with stock checks and every price column is [docs/fab/ghost-hand-rev2-sourcing-bom.csv](docs/fab/ghost-hand-rev2-sourcing-bom.csv).
## Board
The rev 2 board is an Adom molecule designed with Adom AI Flow in KiCad, from a new run: schematic,
placement, routing, copper pours, current and heat analysis, silkscreen and 3D, on a 3rd party fab's
2-layer rules. It is 30 x 22 mm (rev 1: 44 x 28), with its four corner machine pins on a 24 x 16 mm span (the molecule grid wants multiples of 8 mm):
the same pins that seat it in an Adom workcell, and in the case they press into printed sockets that
hold it. The IR parts look forward off the front edge, USB-C is on the right edge, the battery lies under
the board and its lead turns up into J2 at the back.
The silkscreen is new: every reference at 0.6 mm and every value at 0.3 mm, grouped by function; every
light named for what it shows (STATUS, 25%, 50%, 75%, 100%), every IR part for what it is (IR 850 TX,
IR 940 TX, PD RX), test points with their nets, J2 with + and -, and the power inputs with their voltage.
The back carries the name, rev 2, the date and this page's address.
The board's own page, written by AI Flow, is in [board/](board/README.md).
### The finished board
| | |
|---|---|
| Parts | 66 fitted, 35 BOM lines, every placement rotation checked |
| Routing | 830 mm of track in 1326 segments, 77 vias, 0 DRC errors, 0 unconnected |
| Programming | UPDI on machine contacts MC4 (UPDI), MC3 (3V3), MC1 (GND) |
| Battery connector | J2 pin 1 = VBAT (+, red), pin 2 = GND (-, black), + and - in the silkscreen |
## Why an ATtiny1616 and not an STM32C0
**Keep the ATtiny1616.** It is the only part compared here that runs the whole echo in hardware: a comparator with a learnable DAC threshold, the event system and two single-shot timers, all while the CPU sleeps. It also sleeps at 0.1 uA, which gave rev 1 about 10 years on the counter between charges (about 3 years on rev 2's smaller pack).
- **STM32C011:** about $0.38 cheaper at 1000 units. But it has no comparator: an ADC analog-watchdog workaround can trigger TIM1, but only while the chip is awake. Its Stop mode draws 80 uA, so the design would have to use Standby, with a reset on every wake. That cuts idle life from 10 years to 4, and it needs a firmware rewrite and a new layout.
- **Next-revision candidate:** TI MSPM0L1306, if its two on-chip op-amps can replace the TLV9062. The MCU plus op-amp would drop from $1.77 to $0.97 at 1000 units, keeping a hardware echo path and 1 uA standby. That needs a bench test first. Rev B would change:
- U1 becomes an MSPM0L1306 (VQFN-24).
- The TLV9062 goes, if the bench test passes.
- Programming moves from UPDI to SWD (SWDIO, SWCLK and NRST on machine contacts).
- The AC0 and DAC0 threshold becomes COMP with its 8-bit DAC.
- The two TCB single-shots become event-triggered timer one-shots.
- The firmware is ported.
Rev 2 keeps the ATtiny1616.
| Chip | at 1 | at 100 | at 1000 | Sleep current | Echo in hardware, CPU asleep | Programming | Idle years on one charge | Fits the board? |
|---|---|---|---|---|---|---|---|---|
| [ATtiny1616-MNR](https://www.mouser.com/en/ProductDetail/Microchip-Technology/ATTINY1616-MNR?qs=HXFqYaX1Q2yKNpuKQU9qww%3D%3D)<br>VQFN-20 3x3, 16 KB / 2 KB | $0.900 | $0.873 | $0.873 (25+ break) | 0.1 uA power-down; 0.71 uA standby with RTC (DS40002204A t.36-5, 3 V 25 C) | Yes: AC0 with DAC0 threshold -> event system -> TCB0/TCB1 single-shot, runs in standby | UPDI, 1 wire + GND (serialUPDI on any USB-serial adapter, pymcuprog/avrdude, avr-gcc; or PICkit 5) | 10.3 | rev A: fits as built (13.1 KB flash, 368 B RAM used) |
| [ATtiny1606-MNR](https://www.mouser.com/en/ProductDetail/Microchip-Technology/ATTINY1606-MNR?qs=u16ybLDytRanDU%2F7volyWw%3D%3D)<br>VQFN-20 3x3, same pinout, 16 KB / 1 KB | $0.820 | $0.796 | $0.796 (25+ break) | same family figures as the 1616 | Partly: AC0 has only fixed references (no DAC0), so the learnt receiver threshold is lost | UPDI, same tools | 10.3 (no DAC) | does not fit: no DAC0 for the learnt threshold |
| [STM32C011F4U6TR](https://www.mouser.com/en/ProductDetail/STMicroelectronics/STM32C011F4U6TR?qs=IPgv5n7u5Qao9K%252BX0pScKA%3D%3D)<br>UFQFPN-20 3x3, 16 KB / 6 KB | $1.49 | $0.653 | $0.497 | Stop 80 uA typ; Standby 7.45 uA (RAM lost, wake = reset); Shutdown about 20 nA (DS13866 t.31; ST C0 training) | No comparator. Workaround: ADC at 1 Msps with analog watchdog -> TIM1 one-pulse, Run/Sleep only (about 0.5 mA: 0.32 mA Sleep at 16 MHz + 0.19 mA ADC) | SWD, 2 wires + NRST + GND (ST-LINK V3 or any CMSIS-DAP; STM32CubeIDE / OpenOCD) | 4.0 in Standby, 0.6 in Stop | fits with a firmware rewrite and Standby-based sleep |
| [STM32C031K4U6](https://www.mouser.com/en/ProductDetail/STMicroelectronics/STM32C031K4U6?qs=IPgv5n7u5QZ%252B8xUaeF0a2w%3D%3D)<br>UFQFPN-32 5x5, 16 KB / 12 KB | $1.06 | $0.638 | $0.628 (250+ break) | same C0 family figures (Stop about 80 uA, Standby about 7.5 uA) | No comparator; same ADC-watchdog workaround | SWD, same tools | about 4 in Standby | fits with a rewrite; larger package |
| [MSPM0L1306SRGER](https://www.mouser.com/en/ProductDetail/Texas-Instruments/MSPM0L1306SRGER?qs=ulEaXIWI0c8A7hoirNenxw%3D%3D)<br>VQFN-24 4x4, 64 KB / 4 KB | $1.85 | $1.10 | $0.968 | STANDBY 1.0 uA with RAM kept; SHUTDOWN 61 nA (ti.com product page) | Yes: COMP with 8-bit DAC (32 ns) -> event fabric -> timer one-shot; also 2 chopper op-amps (could replace the TLV9062: bandwidth not yet checked) | SWD, same tools (TI XDS110 or CMSIS-DAP; Code Composer / GCC) | 8.7 | fits analog best; rewrite and re-layout; worth a bench test |
| [MSPM0C1104SDDFR](https://www.mouser.com/en/ProductDetail/Texas-Instruments/MSPM0C1104SDDFR?qs=dbcCsuKDzFV0JvqjQIWgGw%3D%3D)<br>SOT-23-8 / small, 16 KB / 1 KB | $0.720 | $0.399 | $0.355 (500+ break) | STANDBY 5 uA; SHUTDOWN 200 nA (ti.com) | No comparator, no event fabric listed: no hardware echo path | SWD | 5.1 | does not fit the echo path |
Prices: Mouser, live 2026-11-07. Idle years: rev 1's 425 mAh usable (rev 2: 128 mAh, about 0.3 of these), the rest of the board sleeping at 4.6 uA. Sleep figures:
- ATtiny1616: DS40002204A, table 36-5.
- STM32C011: DS13866, table 31, and ST's STM32C0 training.
- MSPM0: ti.com product pages.
ATtiny806, 416 and the other 8 KB and 4 KB parts are too small for the 13.1 KB firmware.

## The AI Flow run
Each board went from the prompt to fab files in one measured [Adom AI Flow](https://wiki.adom.inc/adom/adom-aiflow) run: intake, requirements, sourcing, test plan, schematic, placement, routing, vias, copper pours, current, thermal, Adom Fields, silkscreen, 3D, finish and export. Rev 2 is a new run; every step left its proof, screenshots and clips in the page repo. The runs, step by step: [board-claude-opus-5-5-20261106-1434](docs/runs/board-claude-opus-5-5-20261106-1434/README.md), [board-claude-opus-5-5-20261108-1620](docs/runs/board-claude-opus-5-5-20261108-1620/README.md), [ghost-hand-claude-opus-5-5-20261106-1434](docs/runs/ghost-hand-claude-opus-5-5-20261106-1434/README.md), [ghost-hand-claude-opus-5-5-20261108-1620](docs/runs/ghost-hand-claude-opus-5-5-20261108-1620/README.md). Build clips: [docs/clips.md](docs/clips.md).
When a tool got in the way, the board thread fixed it at the source instead of working around it quietly. These went back to AI Flow from the rev 1 build:
- [Issue #165](https://wiki.adom.inc/adom/adom-aiflow/issues/165): the router ignored trackWidth and scalar wideNets, so a 0.25 mm default track made the 0.4 mm pitch QFN unroutable
- [Issue #166](https://wiki.adom.inc/adom/adom-aiflow/issues/166): flat test-pad 3D models were flagged as upside down
- [Issue #167](https://wiki.adom.inc/adom/adom-aiflow/issues/167): nets past --rip-global were dropped without a word
- [PR #73](https://wiki.adom.inc/adom/adom-aiflow/prs/73): adds a UPDI programming interface to the molecule flow, so the finished board can be flashed on its machine contacts
## How it was built: three AI threads in Hydrogen
Rev 1 was built in one day, and rev 2 the same way, by three AI threads working side by side in Adom Hydrogen, each owning
its own folder and handing work to the others through files, never by editing each other's work:
| Thread | Owned | Delivered |
|---|---|---|
| Board (Claude) | the design, AI Flow and KiCad | parts, schematic, the molecule board driven live in KiCad through Adom Bridge, Fields analysis, fab files |
| Case (Codex) | the case | the parametric case, STEP and STL, light pipes, gasket and seals, the laser engraving, a 528-pair interference check |
| Studio (Claude) | this page and the dashboard | Ghost Hand Studio, the 3D model of the whole gadget, firmware notes, battery life, this page |
The board thread published the board's STEP and GLB at each milestone (placed, routed and poured, final).
The case thread read the board envelope and the pin positions from it and fitted the sockets and the
battery around it. The studio thread rebuilt the assembled 3D model each time either one landed, and
checked that the board's outline sits exactly on the case's board envelope. Hydrogen kept all three on one
screen: the chat on the left, the AI Flow dashboard, the Studio and this page in webview tabs on the right.
## Case
The 3D view at the top of this page is the assembled rev 2 gadget on a bathroom counter, 330 mm from the sensor window of a Moen 8551 sensor faucet with a hand washing under the stream, all at true size: open its Layers panel to hide the sink and faucet, the hand, the case shell, the light pipes or the battery, zoom in on Ghost Hand, and press Replay to watch it assemble.
The hand is cut from the MakeHuman base mesh (CC0); the faucet is modelled from Moen's spec sheet. How the scene was made: [docs/3d/size-hand](docs/3d/size-hand/README.md).








A compact sage pebble with a crowned roof, rounded edges and five tiny clear indicator dots. The front window separates IR transmit and receive paths. The screws enter from underneath, with a continuous perimeter seal and a recessed non-slip foot. There is no logo and no recess on the roof to collect water.

*The top in the 3D model above: the UV laser engraving (STATUS, 25, 50, 75, 100 and GHOST HAND) is built straight from the engraving file and mapped onto the crowned roof, each name next to its own light pipe. Toggle it in Layers, 'Laser engraving'.*
It is 38 x 32 x 17 mm overall, about half of rev 1's footprint. The board sits 5 degrees nose up, which puts the IR axis 13.6 mm above the counter; the aim above uses that height. Four cross-slotted collets squeeze the board's machine pins, the same pins that seat it in an Adom workcell, with open bottoms so the pin tips never bottom out. The Adafruit 1317 lies in its own floor pocket under the board, its leads coiled in a service loop that returns into J2 from the back. A TPU gasket seals the seam at 25 % compression, four M1.6 screws enter from below through TPU washers into heat-set inserts, a tethered TPU stopper with two sealing ribs closes the USB-C port, and a recessed TPU foot keeps it from sliding. Five 1.5 mm clear-resin pipes carry the lights to the roof, and a UV fiber laser engraves their names. A 513-pair interference check found no unexpected contact.
Design notes, print settings and assembly: [case/README.md](case/README.md); engraving guide: [case/laser_engrave.md](case/laser_engrave.md); parametric source: [case/ghost_hand_case.py](case/ghost_hand_case.py).
## Firmware
Plain C for the ATtiny1616, updated for rev 2 (the STATUS dot takes the logo's job at about half the drive, a 30 mA light cap for the small cell, the 77 mA charge), updated for rev 2 (the STATUS dot takes the logo's job at about half the drive, a 30 mA light cap for the small cell, the 77 mA charge), updated for rev 2 (the STATUS dot takes the logo's job at about half the drive, a 30 mA light cap for the small cell, the 77 mA charge), updated for rev 2 (the STATUS dot takes the logo's job at about half the drive, a 30 mA light cap for the small cell, the 77 mA charge), updated for rev 2 (the STATUS dot takes the logo's job at about half the drive, a 30 mA light cap for the small cell, the 77 mA charge), updated for rev 2 (the STATUS dot takes the logo's job at about half the drive, a 30 mA light cap for the small cell, the 77 mA charge), updated for rev 2 (the STATUS dot takes the logo's job at about half the drive, a 30 mA light cap for the small cell, the 77 mA charge), updated for rev 2 (the STATUS dot takes the logo's job at about half the drive, a 30 mA light cap for the small cell, the 77 mA charge), updated for rev 2 (the STATUS dot takes the logo's job at about half the drive, a 30 mA light cap for the small cell, the 77 mA charge), updated for rev 2 (the STATUS dot takes the logo's job at about half the drive, a 30 mA light cap for the small cell, the 77 mA charge), updated for rev 2 (the STATUS dot takes the logo's job at about half the drive, a 30 mA light cap for the small cell, the 77 mA charge), updated for rev 2 (the STATUS dot takes the logo's job at about half the drive, a 30 mA light cap for the small cell, the 77 mA charge), updated for rev 2 (the STATUS dot takes the logo's job at about half the drive, a 30 mA light cap for the small cell, the 77 mA charge), updated for rev 2 (the STATUS dot takes the logo's job at about half the drive, a 30 mA light cap for the small cell, the 77 mA charge), updated for rev 2 (the STATUS dot takes the logo's job at about half the drive, a 30 mA light cap for the small cell, the 77 mA charge), updated for rev 2 (the STATUS dot takes the logo's job at about half the drive, a 30 mA light cap for the small cell, the 77 mA charge), updated for rev 2 (the STATUS dot takes the logo's job at about half the drive, a 30 mA light cap for the small cell, the 77 mA charge), updated for rev 2 (the STATUS dot takes the logo's job at about half the drive, a 30 mA light cap for the small cell, the 77 mA charge), updated for rev 2 (the STATUS dot takes the logo's job at about half the drive, a 30 mA light cap for the small cell, the 77 mA charge), updated for rev 2 (the STATUS dot takes the logo's job at about half the drive, a 30 mA light cap for the small cell, the 77 mA charge), updated for rev 2 (the STATUS dot takes the logo's job at about half the drive, a 30 mA light cap for the small cell, the 77 mA charge), updated for rev 2 (the STATUS dot takes the logo's job at about half the drive, a 30 mA light cap for the small cell, the 77 mA charge) (avr-gcc, about 13.1 KB of the 16 KB flash). The echo path is pure hardware:
AC0, the event system and TCB0/TCB1 single-shots. The CPU runs the state machine, the learner, the
lights and the safety checks, and a 1 s watchdog guards the main loop. Full source is in
[firmware/](firmware/README.md), with a host test that runs the learner against simulated faucets
(`make test`, 36 checks). Flash over UPDI on machine contacts MC4 (UPDI), MC3 (3V3) and MC1 (GND).
| File | What |
|---|---|
| [firmware/src/main.c](firmware/src/main.c) | state machine and safety checks |
| [firmware/src/echo.c](firmware/src/echo.c) | AC0 + event system + TCB transponder |
| [firmware/src/learn.c](firmware/src/learn.c) | faucet timeout and blip learner |
| [firmware/src/accel.c](firmware/src/accel.c) | LIS2DW12 set-down, pick-up and tilt |
| [firmware/src/leds.c](firmware/src/leds.c) | WS2812B-2020 driver and light patterns |
| [firmware/src/power.c](firmware/src/power.c) | clocks, sleep, battery, ADC, watchdog, EEPROM |
| [firmware/build/ghost-hand.hex](firmware/build/ghost-hand.hex) | ready-to-flash image |
## Ghost Hand Studio
The build dashboard: an Adom app that shows the architecture, the faucet and its beam, the aim, the learning state
machine, the lights, charging, battery life and the 3D models, live as the board and case come together.

## Revisions
| | Rev 1 (0.1.0) | Rev 2 (0.2.0) |
|---|---|---|
| Case on the counter | 54 x 44 mm, 27 mm tall | 38 x 32 mm, 17 mm tall, much lower |
| Board | 44 x 28 mm, 2 layers | 30 x 22 mm, 2 layers, parts on both sides |
| Battery | Adafruit 1578, 500 mAh, 196 mA charge in 3.2 h | Adafruit 1317, 150 mAh, 77 mA charge in 2.4 h |
| Battery life | about a year at one session a day | 40 days at six sessions a day, 170 at one: charge about once a month |
| Lights | Adom logo light pipe and four gauge pills | 1.5 mm dots: STATUS and a four-dot gauge, half the drive |
| Tilt | 12 degrees, a guess | 5 degrees, from a scale drawing of the faucet |
| IR emitters | one 850 nm and two 940 nm, all at 12 ohm | one 850 nm at 8.2 ohm and one 940 nm at 4.7 ohm, for the off-axis counter spots in a smaller board |
| Silkscreen | references only | every reference 0.6 mm and value 0.3 mm, every light and IR part named, J2 + and -, test point nets |
Rev 1's complete design (board KiCad files, Gerbers, BOM, CPL, case STEP and STL, firmware) is the
[0.1.0 "Rev 1" release](https://wiki.adom.inc/download/john/ghost-hand/0.1.0/ghost-hand-rev1-design.zip) ([Gerbers](https://wiki.adom.inc/download/john/ghost-hand/0.1.0/ghost-hand-rev1-gerbers.zip)).
## Downloads
| | |
|---|---|
| **Rev 2 release (0.2.0)** | [design zip](https://wiki.adom.inc/download/john/ghost-hand/0.2.0/ghost-hand-rev2-design.zip) (board KiCad files, Gerbers, BOM, CPL, case STEP/STL/SVG, firmware hex), [Gerbers](https://wiki.adom.inc/download/john/ghost-hand/0.2.0/ghost-hand-rev2-gerbers.zip) |
| Case STEP | [base.step](case/step/base.step), [battery_jst_plug.step](case/step/battery_jst_plug.step), [battery_lead_black.step](case/step/battery_lead_black.step), [battery_lead_red.step](case/step/battery_lead_red.step), [battery_pouch.step](case/step/battery_pouch.step), [battery_tape.step](case/step/battery_tape.step), [cover.step](case/step/cover.step), [final_board.step](case/step/final_board.step), [foot.step](case/step/foot.step), [gasket.step](case/step/gasket.step), [ghost-hand-assembly.step](case/step/ghost-hand-assembly.step), [ghost-hand-exploded.step](case/step/ghost-hand-exploded.step), [inserts.step](case/step/inserts.step), [ir_window.step](case/step/ir_window.step), [lightpipe_100.step](case/step/lightpipe_100.step), [lightpipe_25.step](case/step/lightpipe_25.step), [lightpipe_50.step](case/step/lightpipe_50.step), [lightpipe_75.step](case/step/lightpipe_75.step), [lightpipe_status.step](case/step/lightpipe_status.step), [screw_seals.step](case/step/screw_seals.step), [screws.step](case/step/screws.step), [usb_plug.step](case/step/usb_plug.step) |
| Case STL (print) | [base.stl](case/stl/base.stl), [cover.stl](case/stl/cover.stl), [foot.stl](case/stl/foot.stl), [gasket.stl](case/stl/gasket.stl), [inserts.stl](case/stl/inserts.stl), [ir_window.stl](case/stl/ir_window.stl), [lightpipe_100.stl](case/stl/lightpipe_100.stl), [lightpipe_25.stl](case/stl/lightpipe_25.stl), [lightpipe_50.stl](case/stl/lightpipe_50.stl), [lightpipe_75.stl](case/stl/lightpipe_75.stl), [lightpipe_status.stl](case/stl/lightpipe_status.stl), [screw_seals.stl](case/stl/screw_seals.stl), [screws.stl](case/stl/screws.stl), [usb_plug.stl](case/stl/usb_plug.stl) |
| Laser engraving SVG | [laser_engrave.svg](case/laser_engrave.svg) |
| Board fab files (Gerbers and drill, BOM, CPL, 3D) | [ghost-hand-rev2-gerbers.zip](docs/fab/ghost-hand-rev2-gerbers.zip), [ghost-hand-rev2-bom.csv](docs/fab/ghost-hand-rev2-bom.csv), [ghost-hand-rev2-cpl.csv](docs/fab/ghost-hand-rev2-cpl.csv), [ghost-hand-rev2-board.glb](docs/fab/ghost-hand-rev2-board.glb) |
| Sourcing BOM | [ghost-hand-rev2-sourcing-bom.csv](docs/fab/ghost-hand-rev2-sourcing-bom.csv) |
| Aim drawings and numbers | [side-view.svg](docs/aim/side-view.svg), [top-view.svg](docs/aim/top-view.svg), [aim.json](docs/aim/aim.json) |
| Firmware | [ghost-hand.hex](firmware/build/ghost-hand.hex), [source](firmware/README.md) |
| Rev 1 | [design zip](https://wiki.adom.inc/download/john/ghost-hand/0.1.0/ghost-hand-rev1-design.zip), [Gerbers](https://wiki.adom.inc/download/john/ghost-hand/0.1.0/ghost-hand-rev1-gerbers.zip) |
## License
MIT. Build it, change it, share it.
<!-- studio:end -->






































