Linux daemon for ROLI Blocks devices โ keeps them alive, controls LEDs, manages topology
Project description
๐ blocksd
Linux Daemon for ROLI Blocks Devices
โฆ Topology ยท Keepalive ยท LED Control ยท Touch Events โฆ
Features โข Install โข Usage โข External API โข Architecture โข Devices โข Development โข Vision
ROLI Blocks devices need an active host-side handshake over MIDI SysEx to enter "API mode." Without it, they show a searching animation and eventually power off. There's no official Linux support.
blocksd implements the full ROLI Blocks protocol: device discovery, topology management, API mode keepalive, LED control, touch events, and device configuration. Your Blocks stay alive and useful on Linux.
โฆ Features
| Capability | Description |
|---|---|
| ๐ API Mode Keepalive | Periodic pings prevent the 5-second device timeout that kills API mode |
| ๐๏ธ Topology Management | Auto-discovers devices over USB, tracks DNA-connected blocks through master |
| ๐ญ Full State Machine | Serial โ topology โ API activation โ ping loop, matching the C++ reference |
| ๐ก LED Control | Lightpad / Lightpad M RGB565 bitmap grid, CLI patterns (solid, gradient, rainbow, checkerboard) |
| ๐ Touch & Button Events | Normalized touch data (x/y/z/velocity) and button callbacks |
| โ๏ธ Device Config | Read/write device settings (sensitivity, MIDI channel, scale, etc.) |
| ๐ DAW Friendly | ALSA multi-client, blocksd and your DAW share MIDI without conflict |
| ๐ก๏ธ systemd Integration | Type=notify service, watchdog heartbeat, udev rules for plug-and-play |
๐ฆ Install
Quick Install
curl -fsSL https://raw.githubusercontent.com/hyperb1iss/blocksd/main/install.sh | bash
Installs blocksd, udev rules, and a systemd user service in one shot.
From PyPI
uv tool install blocksd
blocksd install # sets up systemd service + udev rules
Arch Linux (AUR)
yay -S blocksd # stable release
yay -S blocksd-git # latest from main
From Source
git clone https://github.com/hyperb1iss/blocksd.git
cd blocksd
uv sync
uv run blocksd install
The install command sets up:
- udev rules: proper permissions for ROLI USB devices (requires sudo)
- systemd user service: auto-starts on login with watchdog monitoring
- Security hardening: sandboxed with
ProtectSystem=strict,NoNewPrivileges, etc.
โก Usage
Running the Daemon
# Foreground with verbose logging
blocksd run -v
# As a systemd service (after install)
systemctl --user start blocksd
systemctl --user status blocksd
journalctl --user -u blocksd -f
When running, you'll see devices connect:
INFO blocksd ready, scanning for ROLI devices
INFO Master serial: LKBC9PZSOH978HOE
INFO Topology: 2 devices, 1 connections
INFO โจ Device connected: lumi_keys_block (LKBC9PZSOH978HOE), battery 31%
INFO โจ Device connected: lightpad_block_m (LPMJW6SWHSPD8H92), battery 31%
Device Status
# Quick scan, shows detected MIDI ports
blocksd status
# Full probe, connects to devices, shows type/serial/battery/version
blocksd status --probe
LED Control
Control the 15ร15 LED grid on Lightpad Block and Lightpad Block M:
blocksd led solid '#ff00ff' # solid color
blocksd led rainbow # animated rainbow
blocksd led gradient ff0000 0000ff # horizontal gradient
blocksd led gradient ff0000 0000ff --vertical # vertical gradient
blocksd led checkerboard ff0000 00ff00 # 2ร2 checkerboard
blocksd led checkerboard ff0000 00ff00 --size 3 # 3ร3 checkerboard
blocksd led off # lights off
Device Configuration
Read and write device settings like velocity sensitivity, MIDI channel, scale mode, and more:
blocksd config list # show all known config IDs
blocksd config get 10 # read velocity sensitivity
blocksd config set 10 50 # write velocity sensitivity
Web Dashboard
blocksd ui # launch web UI on http://localhost:9010
blocksd ui --port 8080 # custom port
Opens a real-time dashboard showing connected devices, topology, battery status, and LED state. Uses WebSocket for live updates.
Service Management
blocksd install # install systemd service + udev rules
blocksd install --no-udev # skip udev rules
blocksd install --no-enable # install but don't auto-start
blocksd uninstall # remove everything
๐ External API
blocksd exposes two APIs for external integration:
Unix Socket: low-latency IPC for local clients (e.g. Hypercolor)
- Socket path:
$XDG_RUNTIME_DIR/blocksd/blocksd.sock - Fallback path:
/tmp/blocksd/blocksd.sock - One socket supports both control messages and high-rate LED frame writes
WebSocket: browser and network clients (used by blocksd ui)
- Default:
ws://localhost:9010/ws - Binary LED frame writes + JSON device events
The quick rules:
- Use
discoverfirst to get the deviceuid - Only stream frames to devices advertising nonzero
grid_widthandgrid_heightin discovery - Use the fixed-size binary frame protocol for animation and streaming
- Treat
frame_ack.accepted=falseor binary ack0x00as a rejected write: this usually means the device is not ready yet, theuidis gone, or the payload was malformed - Once a device is live, frame writes are coalesced daemon-side to the latest target state instead of surfacing host-visible โbusyโ backpressure
- Prefer a separate subscription socket if you also want events; outbound NDJSON events and 1-byte binary frame acks share the same connection
See docs/API.md for the full protocol reference, examples, and Hypercolor-oriented integration notes.
๐๏ธ Architecture
blocksd
โโโ daemon.py asyncio main loop, sd_notify, signal handling
โ โโโ TopologyManager polls MIDI ports every 1.5s
โ โโโ DeviceGroup per-USB lifecycle + touch/button/config events
โ โโโ MidiConnection python-rtmidi wrapper (SysEx I/O)
โโโ protocol/ pure protocol logic (no I/O, fully testable)
โ โโโ constants.py enums, headers, bit sizes
โ โโโ checksum.py SysEx checksum algorithm
โ โโโ packing.py 7-bit pack/unpack (LSB-first)
โ โโโ builder.py host โ device packet construction
โ โโโ decoder.py device โ host packet parsing
โ โโโ serial.py serial number request/parse
โ โโโ data_change.py SharedDataChange diff encoder
โ โโโ remote_heap.py ACK-tracked heap manager for live updates
โโโ device/
โ โโโ models.py BlockType, DeviceInfo, TouchEvent, ButtonEvent
โ โโโ config_ids.py known configuration item IDs
โ โโโ registry.py serial prefix โ device type mapping
โ โโโ connection.py rtmidi โ asyncio bridge
โโโ led/
โ โโโ bitmap.py RGB565 LED grid (15ร15 Lightpad)
โ โโโ patterns.py solid, gradient, rainbow, checkerboard
โโโ littlefoot/
โ โโโ opcodes.py LittleFoot VM opcode definitions
โ โโโ assembler.py bytecode assembler with label support
โ โโโ programs.py BitmapLEDProgram (94-byte repaint)
โโโ topology/
โ โโโ detector.py MIDI port scanning
โ โโโ device_group.py connection lifecycle (the big one)
โ โโโ manager.py orchestrates DeviceGroups
โโโ api/
โ โโโ server.py Unix socket + WebSocket servers
โ โโโ protocol.py NDJSON + binary frame wire protocol
โ โโโ events.py event broadcaster (device/touch/button/config)
โ โโโ websocket.py RFC 6455 frame codec
โ โโโ http.py HTTP parser + static file serving
โโโ web/ web dashboard (Vite build output)
โโโ config/
โ โโโ schema.py DaemonConfig (Pydantic)
โ โโโ loader.py TOML config file parsing
โโโ sdnotify.py lightweight systemd notification (no deps)
โโโ cli/
โโโ app.py Typer commands (run, status --probe)
โโโ led.py LED pattern commands (solid, rainbow, etc.)
โโโ config.py device config get/set/list
โโโ install.py systemd/udev setup
Protocol Pipeline
Host Device
โ โ
โ โโ Serial Dump Request โโโโโโโโโโโโโโโโโโโบ โ
โ โโโโโโโโโโโโโโโโโโโโ Serial Response โโโโ โ
โ โโ Request Topology โโโโโโโโโโโโโโโโโโโโโโบ โ
โ โโโโโโโโโโโโโโโโโโโโโโ Topology โโโโโโโโโ โ
โ โโ endAPIMode + beginAPIMode โโโโโโโโโโโโโบ โ
โ โโโโโโโโโโโโโโโโโโโโโ Packet ACK โโโโโโโโ โ
โ โ
โ โโ Ping (400ms master / 1666ms DNA) โโโโโโบ โ โ keepalive loop
โ โโโโโโโโโโโโโโโโโโโโโ Packet ACK โโโโโโโโ โ
โ โ
โ โโ SharedDataChange (LED data) โโโโโโโโโโโบ โ โ heap writes
โ โโโโโโโโโโโโโโโโโโโโโ Packet ACK โโโโโโโโ โ
Supported Devices
| Device | USB PID | Serial Prefix | Status |
|---|---|---|---|
| Lightpad Block / M | 0x0900 |
LPB / LPM |
โ Tested |
| LUMI Keys Block | 0x0E00 |
LKB |
โ Tested |
| Seaboard Block | 0x0700 |
SBB |
๐ฒ Untested |
| Live Block | โ | LIC |
๐ฒ Untested |
| Loop Block | โ | LOC |
๐ฒ Untested |
| Developer Control Block | โ | DCB |
๐ฒ Untested |
| Touch Block | โ | TCB |
๐ฒ Untested |
| Seaboard RISE 25/49 | 0x0200 / 0x0210 |
โ | ๐ฒ Untested |
Bitmap LED streaming is currently exposed for Lightpad Block / Lightpad Block M only. Other devices are still discoverable and supported by the topology/API state machine, but they do not advertise a bitmap frame surface.
๐งช Development
See CONTRIBUTING.md for the full development guide.
uv sync # install all dependencies
uv run pytest # run tests
uv run ruff check . # lint
uv run ruff format --check . # format check
uv run ty check # type check
๐บ๏ธ Roadmap
See VISION.md for the full vision, use cases, and ideas beyond music.
- Protocol Core: 7-bit packing, checksum, SysEx builder/decoder
- Device Discovery: MIDI port scanning, serial number parsing
- Topology Management: multi-device tracking, DNA connections
- API Mode Keepalive: full state machine with correct ping timing
- Remote Heap Manager: ACK tracking, retransmission, heap state sync
- LittleFoot Programs: bytecode assembler, BitmapLEDProgram upload
- CLI LED Commands:
blocksd led solid #ff00ff,blocksd led rainbow - Touch/Button Events: normalized callbacks with full velocity data
- Config Commands: read/write device settings via CLI
- sd_notify Integration: Type=notify service with watchdog heartbeat
- CI/CD: GitHub Actions, PyPI publishing, automated releases
- D-Bus Interface: IPC for external applications
- Hypercolor Integration: ROLI Blocks as an RGB device backend
โ๏ธ License
If blocksd keeps your Blocks alive, give us a โญ or support the project
โฆ Built with obsession by Hyperbliss Technologies โฆ
Project details
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file blocksd-0.4.0.tar.gz.
File metadata
- Download URL: blocksd-0.4.0.tar.gz
- Upload date:
- Size: 167.6 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
5413d8d592881682a4dc8f616ddf98b25b21ddc87c278ee8571d41e215a15ce0
|
|
| MD5 |
c39ca9d60d6f2d33b491e28be6b63d84
|
|
| BLAKE2b-256 |
77f85808ade4420fe5b2091c9d3ceab09fc9c2164a6f5a2da74e60c80397e57d
|
Provenance
The following attestation bundles were made for blocksd-0.4.0.tar.gz:
Publisher:
publish.yml on hyperb1iss/blocksd
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
blocksd-0.4.0.tar.gz -
Subject digest:
5413d8d592881682a4dc8f616ddf98b25b21ddc87c278ee8571d41e215a15ce0 - Sigstore transparency entry: 1239352010
- Sigstore integration time:
-
Permalink:
hyperb1iss/blocksd@e366ff8909243283ef502f840a18c081e3830ea3 -
Branch / Tag:
refs/tags/v0.4.0 - Owner: https://github.com/hyperb1iss
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish.yml@e366ff8909243283ef502f840a18c081e3830ea3 -
Trigger Event:
workflow_dispatch
-
Statement type:
File details
Details for the file blocksd-0.4.0-py3-none-any.whl.
File metadata
- Download URL: blocksd-0.4.0-py3-none-any.whl
- Upload date:
- Size: 71.9 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
47da76d95dfec896b8c1b9b94bea3f546dbc938e636a69c3e0336058ff02beab
|
|
| MD5 |
ec30cc7045a0243d99906e8713bdb718
|
|
| BLAKE2b-256 |
d69bb94d9adb712118856ca0040075ace386d1caf8278a5e4f7a894b8b3d5645
|
Provenance
The following attestation bundles were made for blocksd-0.4.0-py3-none-any.whl:
Publisher:
publish.yml on hyperb1iss/blocksd
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
blocksd-0.4.0-py3-none-any.whl -
Subject digest:
47da76d95dfec896b8c1b9b94bea3f546dbc938e636a69c3e0336058ff02beab - Sigstore transparency entry: 1239352012
- Sigstore integration time:
-
Permalink:
hyperb1iss/blocksd@e366ff8909243283ef502f840a18c081e3830ea3 -
Branch / Tag:
refs/tags/v0.4.0 - Owner: https://github.com/hyperb1iss
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish.yml@e366ff8909243283ef502f840a18c081e3830ea3 -
Trigger Event:
workflow_dispatch
-
Statement type: