Milker
Milker works the subject over.
You do not set a rhythm and hold it. The track does that, and the track does not get tired, does not get bored, and does not go easy on anyone at the four minute mark because they asked nicely.
Source on git.somnus.engineering
The machine keeps its own time
The host does not send motion. It sends numbers: how far, how fast, how lopsided the stroke is. The firmware builds the waveform out of those and keeps building it whether or not anything is listening.
That is deliberate. A host that stutters, garbage-collects, or gets scheduled out for fifty milliseconds does not put a hitch in the stroke. It only ever changes what the machine is already doing.
One shape, skewable. Long draw and a hard shove back, or the other way round, anywhere on the dial between them. Nothing snaps between settings. Every parameter slews toward its new value, so a change lands as a change and not as a lurch.
Off is not the safe state here
This is where it stops looking like Outlet.
Outlet is safe when it stops driving the pin. Cut its power, hang its processor, throw it out a window. The relay opens and the load dies. Doing nothing is the correct answer.
A stroking machine is the other way round. The actuator is fed a stream of frames, and a frame carries a force command. Firmware that locks up while still pushing the last frame it built is worse than firmware that dies, because the last frame is a held force. The dangerous state is not crashed. It is still running, still sending, and saying something ten seconds stale.
So the thing that talks to the actuator is not the thing that decides what to say. A separate timer sends a frame five hundred times a second, checks how old the instructions are, and if they are more than ten milliseconds stale it sends zero force instead. The part that can wedge is not the part holding the wheel.
Stop talking and it stops
The host says keep going every 50ms. Half a second of silence and motion ends.
Ten missed messages of slack, same ratio Outlet uses, half the window. Half a second of a socket staying live is an annoyance. Half a second of unattended motion is not.
Only "keep going" counts. Changing a setting does not reset the clock, and neither does anything malformed. The countdown measures time since the host last said keep moving, not time since it last said anything at all.
The dial outranks you, the host, and the show
Press the encoder dial and motion stops. Not queued, not requested, not considered. Stopped, right then, and a host hammering the keepalive at 20Hz cannot argue with it.
Getting going again takes a deliberate two second hold, and the press that stopped it does not count toward that hold. You cannot fumble your way out of a stop you just made.
And clearing the latch does not start it again. That is the whole point. The machine sits there, says it needs arming, and waits for someone to say so on purpose. A stop made by a hand is not undone by that hand coming off the dial.
One honest warning, because it is better said than hidden. Arming is available to the timeline as a cue, and a session written with one in it can arm a machine a person stopped. Do not put arm in a show.
It never jumps
Every path from stopped to moving does the same three things: read where the carriage actually is, start the waveform at the point that matches it, and bring force up from nothing over about a quarter of a second.
The vendor's own demo warns that its resume will snap to wherever the pendant happens to be pointing. That is a bad surprise on a bench and a considerably worse one attached to somebody.
What it can actually do
Measured, not read off a datasheet:
- 1Hz with 689 units of travel, tracking within 45 units, drawing 441 of the 600 units of force on offer. That is a full-length stroke at a pace nobody is going to call gentle.
- Force is the limit, not speed. An early ceiling of 400 units/s came out of runs made at force 250 and was then treated as a fact about the hardware. It was not. Given force, the same machine runs 2199 units/s clean.
- Skew multiplies speed. Squeeze half a stroke into a tenth of the cycle and peak velocity goes up tenfold while every individual number stays legal. The firmware works out the real carriage speed and quietly slows the rate to keep it in bounds. It will tell you it is doing it.
Travel is calibrated per machine and per mounting, not assumed. This unit does not report position properly below about 20 units, a vendor defect in actuators built before 2023, so anything that depends on believing the sensor is suppressed in that band rather than left to guess wrong. A stroke that reads as a stall because the sensor is pinned is not a stall, and treating it as one is how you end up chasing a fault that does not exist.
Nothing is listening
Wi-Fi and Bluetooth are compiled out, and a build step goes through the finished binary to confirm they really are gone. No pairing, no app, no cloud, no anything sitting there waiting to be talked to. One USB cable in, and the machine at the end of it does what that cable says and nothing else.
Wired into the show
Somnus drives it as a plugin, and the cue forms build themselves out of what the machine says it can do.
Because it is a deadman, a cue is not a write and walk away. Somnus holds the machine by talking to it continuously. Kill Somnus in the middle of a session and the motion is over in half a second, whether or not anything got the chance to shut down politely.