Skip to content
Document DB v12 - Improved Interceptors with Soft Delete Integration, AI protections, & Admin UI with Aspire Integration!How!?

BluetoothLE

GitHub GitHub stars for shinyorg/shiny
Downloads NuGet downloads for Shiny.BluetoothLE
Blazor NuGet downloads for Shiny.BluetoothLE.Blazor
Linux NuGet 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
Feature iOS macOS Android Windows Linux Blazor WASM
Package Shiny.BluetoothLE Shiny.BluetoothLE Shiny.BluetoothLE Shiny.BluetoothLE Shiny.BluetoothLE.Linux Shiny.BluetoothLE.Blazor
Scanning Full Full Full Full Full (BlueZ) Limited
Background scanning Allowed with entitlements N/A (desktop) Foreground service N/A N/A Not supported
Pairing Full Full Full Full Manual via BlueZ Not supported
L2CAP CoC Full Full API 29+ Full (BlueZ socket)
Browser How 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 Internet Open 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