Controlling music with hand gestures
Condukt
A macOS menu bar app that watches your webcam and turns hand gestures into media controls, built in Python on Google's MediaPipe. The first thing I have taken end to end on my own, from the idea to something I use every day.
The idea
Change the track without touching anything.
I built this end to end with Claude Code to find out first hand what building that way changes. Something small enough to finish, and all of it mine to decide: the idea, the recognition, the tuning, the packaging and the permissions.
Closed fist pauses. Open palm plays, and swiped sideways it skips. Thumbs up and down move the volume. Eleven mappings over seven hand shapes, because the same open palm means play when it is still and skip when it moves.
The real problem
The model changes its mind, and the app has to decide when to ignore it.
Recognition comes pre-packed with Google's MediaPipe model: it watches one hand, names the shape and scores how sure it is, thirty times a second. Hold your hand perfectly still and the answer still changes. A frame gets dropped. Your hand drifts out of view. Every one of those looks exactly like you changing your mind, so a naive build fires four times when you meant once. Almost all of the work went into deciding when to ignore the model. None of it is machine learning; it is interaction design on top of a sensor that is often wrong.
Hold
A shape has to hold for 0.7 seconds before anything happens. Act on single frames and the app fires at everything your hands do.
Grace
If the model loses the shape for under 150 milliseconds the timer keeps counting. A dropped frame is not a change of mind.
Cooldown
Once an action fires it cannot fire again for 1.5 seconds. Volume is the exception at 0.5, because there repeating is the point.
Floor
Under 50% sure and the frame counts as nothing. That is the model's own score for the gesture it picked, not a probability that it is right.
What I learned
Tuning the four numbers against an eval set instead of by feel.
Those numbers started as guesses, and every time I changed one I was back to waving at a laptop and forming an opinion. So I recorded myself using it and marked what I had meant at each moment, which is an eval set, then wrote a harness that replays those recordings, tries different numbers and keeps a change only when the score goes up. It works because the part that decides touches no camera and no music app, so it can run offline thousands of times.
Design for a machine that is unsure
The model hands you a guess and a number. Everything good here is in how it treats that guess being wrong, not in the recognition.
Turn taste into a measurement where you can
Four numbers I had been arguing about with myself became a score over a recorded session. Most product questions cannot be handled that way. This one could.
The only way to review it is to use it
Nothing can tell you whether a thing feels right, so reading the code back tells you almost nothing. Most of what I changed came from running it every day.
I will not write "make it feel responsive" into a spec again without knowing that here it meant four numbers and a harness built to find them.
About
Most of the seven years was spent alongside the CEO, the head of design, engineering, business analysts, subject matter experts and growth.
What I want next is AI-native product work, and a place where I can keep building great products myself.
Education
-
MS, Cognitive Science
Indian Institute of Technology Gandhinagar2015 to 2017
Thesis on the cognitive system of musical improvisation, read through phenomenology.
-
BS, Life Science and Biochemistry
St. Xavier's College, Mumbai2012 to 2015
- sunat.archit6@gmail.com
- +91 99136 42634
