A wearable Bluetooth “badge” that vibrates for urgent notifications and lets the wearer acknowledge with a single tap.
- BLE circuit + build notes:
01-BLE-circuit - Sample iOS integration:
02-Chat-code/NewToothManager.swift - 3D printed case/button walkthrough:
03-3d-printed-case
Creation of a wearable Bluetooth badge to receive urgent notifications, then respond immediately via a button press.
During prototype testing in the lobby, we rolled out a feature enabling Customer Service Agents (CSAs) to access tools via their iPads. We noticed that, especially during interactions with passengers, their devices would accumulate lots of notifications.
So we designed and built a Bluetooth badge that buzzes for the notifications that matter (e.g., a passenger needing assistance). With a single press, CSAs can acknowledge and signal, “Yes — I’m on it!”
![]() Parts |
![]() Soldering |
![]() Case blueprint |
![]() Circuit diagram |
![]() PCB layout |
![]() ESP32-C3 pin map |
![]() Build + assembly |
||
🎥 Short build/demo clip: screenshots/02-09-video.mp4
- The iOS app connects to the badge over BLE (see
NewToothManager.swift). - When the app needs the wearer’s attention, it sends a message to the badge → the badge vibrates.
- When the wearer taps the button, the iOS app receives a callback via
NotificationCenter.
We used the chat code from our previous open source project SWAChat as the baseline.
Add this key/value:
<key>NSBluetoothAlwaysUsageDescription</key>
<string>This app requires Bluetooth to connect to the SWABadge device.</string>Copy NewToothManager.swift into your project.
Notes:
- This implementation assumes only one badge is connected at a time.
- The prototype exposes two basic behaviors: buzz and button press.
// BLE message sent to SWABadge device (if connected)
NewToothManager.shared.sendBuzz(msg: "notify user")
⚠️ If you’re using the ChatDemo: a simple place to call this is insidereloadCurrentChatMessagesinChatViewController-Messages.swift(within theif channel == currentChatRoomblock).
NotificationCenter.default.addObserver(
self,
selector: #selector(self.swaBadgeTapped(_:)),
name: Notification.Name.swaBadgeTapped,
object: nil
)
@objc func swaBadgeTapped(_ notification: Notification) {
// do something when the badge button is tapped
}
⚠️ If you’re using the ChatDemo: add the observer insetupForm()inChatViewController-Form.swift, paste theswaBadgeTappedmethod into the file, and replace the TODO with something likesendMessage(self, message: "On it! (sent via SWABadge)").
- Circuit parts + build notes:
01-BLE-circuit - Case/button process:
03-3d-printed-case
- Add a speaker/microphone: play a short prompt (e.g., “Help needed at gate C15”), then respond by voice.
- Multi-badge environments: support multiple wearables, distance/RSSI filtering, and per-user pairing.
- Better “notification semantics”: vibration patterns for urgency/type, LED colors, haptic “OK” confirmation.
- A tiny enclosure revision for faster assembly and easier charging/battery swap.
The following members of Technology Innovation contributed to this project:
|
Jeffrey Berthiaume X · LinkedIn · Stack Overflow |
E. Brady Trexler, PhD |
Reference to cite if needed:
@software {
title = {SWA Badge},
author = {Technology Innovation},
affiliation = {Southwest Airlines},
url = {https://github.com/SouthwestAir/SWABadge},
month = {09},
year = {2023},
license = {BSD-3-Clause},
version = {1.0}
}






