July 2, 2026
Description
Keep your "active" status green. Let the machine handle it.
A small 3D-printed desk arm built around an ESP32 and a micro servo. It presses a key on a fixed interval so apps like Teams or Slack keep reading you as active — and if you reposition it over your Caps Lock key instead, it doubles as a passive-aggressive assistant for those emails.
⏱️ Build time: under an hour once printed — minimal supports, no soldering, 3 wires, 2 code uploads, and a 15-minute calibration pass to match it to your own laptop.
Two ways to use it, same firmware both times:
Nothing in the code changes between the two modes — it's the same loop either way, just aimed at a different key. Worth knowing: presses happen on a steady, predictable interval, not randomly, so if you're using passive-aggressive mode expect a metronomic toggle rather than occasional surprise chaos.
A quick honesty note: this works by physically pressing a key, not by touching Teams/Slack or your OS, so it won't trip anything network-side. That said, presence status is meant to signal real availability — worth being upfront with your team if you're relying on this daily.
Electronics
Hardware
Printed Parts
Tools
1. Print the parts (not counted in build time) Minimal supports needed. Standard PLA, 0.2mm layers works fine.
2. Snap the frame together Base, upright arm, and rack all snap-fit. Test the rack-and-pinion motion by hand before you glue anything — it should slide smoothly.
3. Mount the servo Seat it in the arm housing, secure with the 3 servo screws. Only add a dab of super glue if a joint feels loose — never glue the gear teeth themselves, they need to move freely.
4. Wire it up (3 connections)
| Servo Wire | ESP32 Pin |
|---|---|
| Signal (orange/yellow) | GPIO 18 |
| Power (red) | 5V or VIN |
| Ground (brown/black) | GND |
That's the whole circuit — no breadboard, no soldering.
Every laptop is a slightly different height and keyboard depth, so this step tunes the arm to your setup. Do this once, and you're done.
Flash the Calibration Code (included below) first — not the main program yet.
In the Arduino IDE: Tools → Serial Monitor. Set the baud rate dropdown (bottom-right) to 115200 — it has to match Serial.begin(115200) in the code, or you'll see garbled text instead of readable output.
Put the printed unit where it'll actually sit day-to-day, arm roughly over the key you plan to press.
Type a number from 0–180 into the Serial Monitor input box and hit Enter. The servo jumps to that angle immediately and echoes back:
Servo moved to: 80 degrees
Sweep through values — try 30, then 90, then narrow in — until you've found:
Write both numbers down. A typical pair might be 60 (release) and 85 (press) — yours will differ based on keyboard height.
Open the main sketch and drop your two calibrated values into these three spots:
void setup() { fingerServo.attach(servoPin, 500, 2400); fingerServo.write(30); // ← your RELEASE angle (starting position) delay(5000); // 5 sec pause to position your laptop } void loop() { fingerServo.write(80); // ← your PRESS angle delay(500); fingerServo.write(60); // ← your RELEASE angle (same value as above) delay(1000); }
Use the same release angle in both the setup() line and the loop() — that keeps the arm returning to one consistent resting spot instead of drifting between runs.
Flash the updated main code, then unplug from your computer and switch to a USB power bank or wall adapter. It'll run standalone from there.
Calibration Code turns your Serial Monitor into a live remote for the servo — type an angle, it moves there and reports back. It exists purely so you can find your two numbers against your real hardware; it's not what runs day-to-day.
Main Code is what actually runs once flashed:
That's roughly one keypress every 1.5 seconds, nonstop, until it's unplugged. Same code whether it's sitting over Shift for status, or over Caps Lock for chaos — the only thing that changes is where you physically place the arm.
Questions or found an issue with the fit? Drop a comment and I'll help troubleshoot.
License:
Standard Digital File License - Community Use