VortexApp is an open-source BLE ecosystem for controlling addressable LED strips from an Android device. It is made up of two components:
- VortexApp – Android application (API 29+) for discovering, connecting, and controlling compatible devices over Bluetooth Low Energy.
- VortexCore – Firmware for nRF52840-based microcontrollers that receives commands and drives the LED strip.
- Flash VortexCore onto a supported nRF52840 board.
- Install VortexApp on your Android device.
- Open the app, scan for nearby devices, and connect.
- Pick a static color or choose an effect from the built-in library.
- The app encodes your selection into a compact binary frame and sends it over BLE; VortexCore decodes it and updates the strip in real time.
| Component | Supported |
|---|---|
| Android | API 29 and above (Android 10+) |
| Microcontroller | Seeed XIAO nRF52840 / nRF52840 Sense |
| LED strips | Any NeoPixel-compatible strip (WS2812B, SK6812, etc.) |
The latest release APK is available on the Releases page — no build step required.
To build from source:
- Clone the repository.
- Open the
VortexApp/directory in Android Studio. - Connect an Android device (or use an emulator with BLE support).
- Build and install:
./gradlew installDebug
Or use the Run button in Android Studio.
The firmware uses PlatformIO. You can install it as a VS Code extension or via the CLI.
- Open the
VortexCore/directory in VS Code (with the PlatformIO extension) or in the PlatformIO IDE. - Connect your nRF52840 board via USB.
- Flash the release build:
pio run -e seeed-release --target upload
To enable serial debug output:
pio run -e seeed-debug --target upload
To run the native unit tests (no hardware required):
pio test -e native
VortexApp ships with the following built-in effects:
| Effect | Description |
|---|---|
| Static Color | Solid user-selected color |
| Rainbow | Classic full-spectrum cycle |
| Moving Rainbow | Rainbow that flows along the strip |
| Nebula Surge | Pulsing color surge effect |
| Beat Blue | Blue-toned beat pulse |
| Beat Light Blue | Lighter beat pulse variant |
| Blur Phase Beat | Soft blurred beat phasing |
| Raw Noise | Organic noise-based randomness |
| Run Rainbow (Temp) | Travelling rainbow segment |
| Saw Tooth | Sharp sawtooth brightness wave |
| Transition With Break | Smooth color transition with pause |
| Twinkle | Random twinkling points |
| Wave | Smooth sine wave brightness |
New effects can be added to the firmware by implementing IEffect and registering them in the app's LedEffectRegistry.
VortexApp/
├── VortexApp/ Android application (Gradle, Java)
│ └── app/src/
│ ├── ble/ BLE service, session repository, protocol
│ ├── core/ DI, preferences, permissions, utilities
│ ├── domain/ Effect registry and models
│ └── ui/ Activities, adapters, dialogs, coach system
└── VortexCore/ Firmware (PlatformIO, C++)
└── src/
├── ble/ BLE GATT service and protocol
└── led/ Effect engine, LED strip abstraction, effects
Pull requests are welcome. For significant changes, please open an issue first to discuss the approach.
See CHANGELOG.md for the full version history.