Skip to content
Client v5: BLE, BLE Hosting, HTTP, Jobs - Linux, MacOS, & Blazor Support! Full AOT, RX on BLE only & MANY other features! Power up!

BluetoothLE

GitHubGitHub stars for shinyorg/shiny
DownloadsNuGet downloads for Shiny.BluetoothLE
BlazorNuGet downloads for Shiny.BluetoothLE.Blazor
LinuxNuGet downloads for Shiny.BluetoothLE.Linux
Frameworks
.NET
.NET MAUI
Blazor
Operating Systems
Android
iOS
macOS
Windows
Linux

Shiny BluetoothLE provides a unified cross-platform API for Bluetooth Low Energy operations in the BLE central role (scanning, connecting, and talking to peripherals). It wraps the native BLE APIs on each platform, giving you a consistent reactive and async experience.

  • Unified central-role API across iOS, macOS, Android, Windows, Linux, and Blazor WebAssembly
  • Reactive (IObservable) and async/await patterns
  • Managed scanner with observable collection
  • Automatic GATT Error 133 handling on Android
  • Background scanning and peripheral state monitoring (mobile platforms)
  • Connection lifecycle management
  • MTU negotiation, pairing, and reliable write transactions
FeatureiOSmacOSAndroidWindowsLinuxBlazor WASM
PackageShiny.BluetoothLEShiny.BluetoothLEShiny.BluetoothLEShiny.BluetoothLEShiny.BluetoothLE.LinuxShiny.BluetoothLE.Blazor
ScanningFullFullFullFullFull (BlueZ)Limited
Background scanningAllowed with entitlementsN/A (desktop)Foreground serviceN/AN/ANot supported
PairingFullFullFullFullManual via BlueZNot supported
L2CAP CoCFullFullAPI 29+Full (BlueZ socket)
BrowserHow to enable
Chrome / Edge / Brave / Opera (desktop)Enabled by default on Windows, macOS, Linux, and ChromeOS. If scanning fails, check chrome://flags/#enable-web-bluetooth (or edge://flags, brave://flags, opera://flags) and set Web Bluetooth to Enabled, then restart. Linux also needs experimental-web-platform-features enabled and BlueZ 5.43+.
Chrome / Edge (Android)Supported on Android 6.0+. No flag needed on recent versions; on older builds enable chrome://flags/#enable-experimental-web-platform-features. OS-level location services must be on for the native chooser prompt to appear.
Samsung InternetOpen internet://flags, enable Web Bluetooth, then restart.
Safari (macOS / iOS / iPadOS)Apple does not ship Web Bluetooth in Safari. On iOS/iPadOS use a third-party browser that implements Web Bluetooth on top of WKWebView, such as Bluefy or WebBLE. There is no supported option in stock Safari on macOS.
Firefox (all platforms)Not supported — Mozilla has not implemented Web Bluetooth and there is no flag to turn it on. Use a Chromium-based browser instead.
Changed files
  • MyApp/
Platforms/Android/AndroidManifest.xml
AndroidManifest.xml
1<?xml version="1.0" encoding="utf-8"?>2<manifest xmlns:android="http://schemas.android.com/apk/res/android">3	<application android:allowBackup="true" android:icon="@mipmap/appicon" android:roundIcon="@mipmap/appicon_round" android:supportsRtl="true">4	</application>5	<uses-feature android:name="android.hardware.bluetooth_le" android:required="false" />6	<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED"/>7	<uses-permission android:name="android.permission.BATTERY_STATS" />8	<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />9	<uses-permission android:name="android.permission.INTERNET" />10    <uses-permission android:name="android.permission.BLUETOOTH_ADMIN" android:maxSdkVersion="30" />11    <uses-permission android:name="android.permission.BLUETOOTH" android:maxSdkVersion="30" />12	<uses-permission android:name="android.permission.BLUETOOTH_CONNECT" />13	<uses-permission android:name="android.permission.BLUETOOTH_SCAN" android:usesPermissionFlags="neverForLocation" />14	<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />15	<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />16</manifest>
claude plugin marketplace add shinyorg/skills
claude plugin install shiny-client@shiny
copilot plugin marketplace add https://github.com/shinyorg/skills
copilot plugin install shiny-client@shiny
View shiny-client Plugin