Status: early alpha — under active development, not validated for experiments or data collection.
vstimd is a visual stimulus server for neuroscience and psychophysics. It runs on a dedicated Linux device, renders with Vulkan straight onto KMS/DRM (no X11, no Wayland, no compositor), and takes commands over the network from any language that speaks ZMQ + protobuf.
It is trigger-driven: you set up a scene ahead of time — stimuli plus small on-device animations — and the device then produces frame-accurate stimulation the moment a Virtual Trigger Line fires, fed by a hardware DAQ. The timing-critical path never leaves the box.
vstimd combines ideas from Michael Stephan's StimServer and Andreas Kreiter's VStim.
- Why vstimd? — what a dedicated timing device buys you
- Installation — packages, apt archive, source
- Raspberry Pi 5 image — flash a card, get a rig
- Tutorials · Python client · Developer guide
Run a rig. Every release ships
.debs (amd64/arm64), .rpms (x86_64/aarch64), and a ready-to-flash Raspberry Pi
5 image. Packages are also served from the
braemons apt archive, so rigs upgrade in
place.
Build and run it locally.
cargo run --release # fullscreen (auto-detects DRM or desktop)
cargo run --release -- --windowed 1280x720
cargo run --release -- --null # ZMQ only, no displayPress D for demo stimuli, F1–F7 for overlay panels, Esc to exit. Build dependencies and the packaging targets are in Installation and Building & packaging.
Drive it from Python.
cd client/python && uv sync
uv run examples/flash_rects.pyfrom vstimd import Connection
from vstimd.stimuli import Color, RectParams, ShapeAppearance, Vec2
with Connection("tcp://vstimd-a1b2c3.local:5555") as conn:
h = conn.stimuli.shapes.create_rect(
position_px=Vec2(0, 0),
params=RectParams(width_px=300, height_px=200,
appearance=ShapeAppearance(fill_color=Color(1.0, 0.0, 0.0))),
)
conn.stimuli.set_enabled(h, True)Or open http://<rig>:8080 for the built-in web control UI, and use
vstimd-client discover to find rigs on the network.
Design notes and roadmaps live in dev/ — start with
dev/PLAN.md. Build, test and packaging workflows are in
CLAUDE.md and the
developer guide.
GNU AGPLv3, except the Python client in client/python, which
is GNU LGPLv3 so that importing it does not place your experiment's own code
under copyleft. Copyright © 2026 Joscha Schmiedt, University of Bremen.