The clock is part of the model
A decoder can only be as honest as the timeline it learned from. Why synchronization belongs in the system design, not the cleanup script.
We build the unglamorous middle of a brain-computer interface: recording that stays aligned, decoding that runs on the window which just closed, and a command reaching real hardware fast enough that it feels like moving your own arm.
A live illustration: six channels of neural activity scroll past a decode window and are converted into joint commands, shown numerically below.
Reads from
Field notes
A decoder can only be as honest as the timeline it learned from. Why synchronization belongs in the system design, not the cleanup script.
Why a candidate decoder should meet yesterday's run before it meets a person, a robot, or a new piece of hardware.
Policies change. Limits should remain legible, enforceable, and close to the machine that receives the command.
Daily
A small change to the event record that makes tomorrow's timeline easier to trust.
The value of a replay that makes its differences easy to name.
Essays
A case for making systems legible before making them impressive.
The physical system is not an implementation detail. It is where an idea earns its shape.
Four stages. The whole trick is that they share one clock — stitch them from four different stacks, as most of us have, and the loop quietly falls apart between them.
Spikes, LFP, EMG, IMU, force, video. Every stream stamped against one hardware clock, so nobody has to re-align anything at 2am.
Filter, sort, run a decoder on the window that just closed. Start from a pretrained cortical model, or drop in your own checkpoint.
Intent becomes joint targets, shaped and clamped to limits you declare once. A violation stops the arm, not your session.
Every window, command and outcome is logged byte-exact, so you can replay the whole run against a new decoder before it touches hardware.
and 04 feeds back into 01 — your logs are the next training set
Four devices, four oscillators, and the events that happened together stop looking like they happened together. Every decoder you train on that data learns the skew along with the signal.
Same session, same five events. Speall stamps at the amplifier, so the column stays a column.
They ship as one runtime and share one data model, so a session recorded on the bench is the same object your training job reads. Take one piece or all six.
Multi-modal capture with hardware timestamping and honest drop accounting. Alignment stops being a script you rewrite for every rig.
Seven public neuroscience archives indexed as one catalog. Query by modality, species and task, then pull only what you train on.
Pretrained kinematic and speech decoders, fine-tuning on your subject, and an export path to ONNX or TensorRT for the on-rig loop.
Learned dynamics from your own recordings, so a policy can be scored against your room before it ever runs in your room.
Telemetry, health and staged rollout across the rigs you run. Ship a decoder to one bench, watch it, then ship it to the rest.
Position, velocity and force limits declared as data. The runtime enforces them underneath your policy, on the same tick.
Everything is a stream of closed windows. If you can write a for loop you can drive a rig, and the same objects work offline against a run you recorded last month.
python · rust · c abi
from speall import Rig, Decoder, Arm
rig = Rig.connect("blackrock://neuroport-0", rate="30khz")
arm = Arm.connect("ros2://franka/joint_trajectory")
decoder = Decoder.load("speall/cortical-kinematics-v3")
# Blocks until the rig has a full 20 ms window, then returns
# aligned spikes, LFP and any synced camera frames.
for window in rig.stream(window="20ms"):
intent = decoder(window.spikes, lfp=window.lfp)
# Limits are declarative: violations stop the arm, not your run.
arm.move(intent.joints, within=arm.limits.safe_envelope)
rig.log(window, intent, arm.state) # versioned, replayable
Read an array, decode intent, drive the arm — one process, one clock.
Past roughly 100 ms, people stop feeling like they are moving the thing and start feeling like they are asking it to move. So every stage gets a budget, and the SDK tells you which one you blew.
The budget Speall is built to hold on a single-rig deployment. Your hardware sets the real number; the SDK reports it per stage every run.
Acquire · 4.5 ms. Amplifier buffer, timestamping, drop detection.
| Stage | Budget | Share |
|---|---|---|
| Acquire | 4.5 ms | 24% |
| Decode | 7.0 ms | 37% |
| Transport | 2.5 ms | 13% |
| Actuate | 5.0 ms | 26% |
Acquisition and actuation are plugins, so adding a device is a driver, not a fork. If yours is missing, send us the spec sheet and we will tell you how long it takes.
If yours is not here, ask it directly — hello@speall.com. A person answers.
No. ROS 2 is one of several actuation backends, and plenty of teams run Speall with no ROS at all — straight to EtherCAT or a vendor SDK. The part we own is the clock, the decode path and the log format.
No. Intracortical arrays are the hardest case, so we build for them, but EMG, EEG, eye tracking and force sensing all come through the same interface. Several early users have no implant anywhere in the loop.
Bring it. If it can be called from Python or exported to ONNX, it runs. If it can't, we'll tell you honestly whether wrapping it is a day of work or a month.
Speall is research software. It is not a medical device and nothing in it is cleared or approved for clinical use. If you're heading toward a trial, talk to us early about what would have to change.
Nothing during early access. We're a small team bringing rigs up by hand, and we'd rather learn from your setup than invoice you for it. We'll talk about pricing well before we ever charge you.
The recording, decode and actuation path is real and running on our benches and a handful of others. World models and fleet rollout are the newest, and the ones most likely to change shape based on what you need.
A note about early access
We started Speall after rebuilding the same three days of glue code for the fourth time — clock alignment, spike sorting, a socket to the arm — and realising that the interesting part of the work kept getting postponed by the boring part.
Early access is not a signup form. It is us sitting with your setup until the loop closes: your amplifier, your arm, your subject, your latency number. We take on a few teams at a time because that is genuinely how many we can do well.
If that is what you need, write to us. If it is not, tell us what is missing — that is useful too.
— the Speall team
Tell us what you record and what you drive. A paragraph is plenty to start.