Type-safe, high-performance RPC
over Bluetooth Low Energy using Protocol Buffers.

Protocol Buffers

Define your BLE communication with .proto files. Get type-safe, language-agnostic serialization with zero ambiguity.

High Performance

Achieves near-maximum BLE throughput (~30 KB/s) with MTU-aware fragmentation and zero-copy optimizations.

Multi-Platform

Run on iOS, Android, macOS, Linux, and embedded devices (nRF54, EFR32) with consistent APIs.

How It Works

bleRPC provides a two-layer protocol stack on top of BLE GATT:

  1. Command Layer — Wraps Protocol Buffers payloads with command metadata (name, type, data length).
  2. Container Layer — Fragments command payloads into MTU-sized containers for BLE transmission, with reassembly on the receiving side.

All communication uses a single GATT Characteristic: the Central writes requests via Write Without Response and receives responses via Notify.

sequenceDiagram
    participant C as Central<br/>(iOS / Android / Python)
    participant P as Peripheral<br/>(Zephyr / Python)
    Note over C: Protobuf encode + Command wrap
    Note over C: Split into MTU containers
    C->>+P: Write Without Response (containers)
    Note over P: Reassemble containers
    Note over P: Decode command + Protobuf
    Note over P: Execute handler
    Note over P: Encode response + Split into containers
    P->>-C: Notify (containers)
    Note over C: Reassemble + decode response
      

Supported Platforms

Central (Client)

PlatformLanguageBLE StackStatus
iOSSwiftCoreBluetoothStable
AndroidKotlinAndroid BLEStable
macOS / LinuxPythonbleakStable
Zephyr (nRF54L15)CZephyr BLEStable

Peripheral (Server)

PlatformLanguageBLE StackStatus
Zephyr (nRF54L15)CZephyr BLEStable
Zephyr (EFR32xG22E)CZephyr BLE + SiLabs HCIStable
macOSPythonblessStable

Protocol Libraries

LanguagePackageDependencies
Swiftblerpc-protocol-swiftFoundation only
Kotlinblerpc-protocol-ktProtobuf JavaLite
Pythonblerpc-protocolNone
Cblerpc-protocol/cNone