The idea
Watt is a palm-sized dial that sits by my keyboard and changes with whatever I'm doing. Turn it and the volume follows. Lay it flat and it's a trackpad. Pick it up and it's a pointer. Open my dev server and it tunes the design. When nothing needs it, a pair of eyes lives on its screen.
I built it over a few days, after getting hooked on Jhey Tompkins' little sandbox experiments, the kind that make you want to go and make something you can hold.
As a design problem, it came down to three questions. What are my contexts at the desk? What kind of help makes sense in each one? And what does a small round thing next to the keyboard actually let you do?
What the board gave me
Watt runs on a Waveshare ESP32-S3 board in an aluminum case: a round 466 by 466 AMOLED screen, a touch panel, a motion sensor, a speaker, a mic and one button. That's the whole kit. There's no knob, no keys and no haptic motor, and most of the interactions came straight out of what was missing.
With no knob, the whole puck became the knob. The motion sensor reads how far it has turned, so you hold the rim and twist the entire device, the way you'd turn a volume knob.
With a round screen, the face can stay upright while the puck spins underneath it. And since a circle doesn't really have a top, you hold the rim for a moment to tell it which way is up.
One puck, many contexts
Each context got the gesture that felt most natural for something you can hold in one hand:
- Listening. Turn for volume, tap to pause whatever is playing.
- Focusing. The side button switches faces: a focus timer, a spinner, and dice for the decisions I'd rather not make.
- Pointing. Flat on the desk, the glass is a trackpad. Lift it and it becomes a pointer: aim at the screen, tap to click.
- Working with Claude. Tap, talk, tap to send. My voice becomes text on the Mac, and only the text goes to Claude. When Claude Code wants to run a command, the command shows up on the puck: turn to choose Allow or Deny, hold to confirm.
- Away from the Mac. With nothing connected, it plays circular Pong.
Faking the feel
Most of the craft went into how a turn feels. For volume, a little under one full turn, about 285 degrees, takes you from 0 to 100.
There's no haptic motor, so the tiny speaker fakes the detents: every step of the dial makes a click. The clicks thin out as you spin faster, so a quick spin sounds like a quick spin rather than a rattle, and their pitch rises a little with the volume, so you can hear roughly where you are without looking.
Then there's the lag. The puck talks to the Mac over Bluetooth, which is never quite instant, so a tap changes the face on the puck straight away and the Mac catches up after. Your hand never waits for the radio.
The Mac side
A companion Mac app tells the puck what I'm doing and acts on what the puck sends back. It lives in the notch, so it only appears when there's something to show and otherwise stays out of the way of the work.
Pairing got the same treatment. There's no code to type: the notch shows three numbers and you dial each one in on the puck. Underneath, the two agree on a key, and every later connection has to prove it, so only your puck can drive your Mac.
Tuning this site with it
DialKit, by Josh Puckett, puts live controls on a design in the browser. I use it to tune this site: the headline, the doodles and the music in the footer all got their values from it. So I built dialkit-watt, an npm library that hands those controls to the puck. One line in a dev build, then pick a control and turn to tune it, while the notch shows which control it is and its value. You keep looking at the design instead of at the sliders.
Build one
You can build one too. It's a $40 board with nothing to solder, and a free Mac app that finds the board when you plug it in, installs everything with one click, and pairs with a few turns. The steps are at watt.sourabhdaroji.com, the code is on GitHub, and dialkit-watt is on npm for anyone tuning with DialKit.
