Control SteamVR Lighthouse base stations (V1 & V2) via Bluetooth LE from the command line.
lighthouse-manager is a Rust CLI tool that lets you discover, power on/off, and identify SteamVR Lighthouse base stations wirelessly via Bluetooth Low Energy. It scans for nearby devices using BLE advertising data, stores them in a local JSON database, and communicates with both Lighthouse V1 (HTC BS-*) and V2 (LHB-*) stations.
- π Discover β Scan the air for nearby Lighthouse base stations via BLE
- β‘ Power On/Off β Turn all managed lighthouses on or off in parallel
- π‘ Identify (blink) β Make a V2 Lighthouse flash its LED by index
- πΎ Persistent storage β Database backed by a local JSON file (via XDG dirs)
- β Cross-platform β Linux, macOS, and Windows (requires BLE adapter)
- π Autostart (SteamVR) β Auto-power lighthouses on SteamVR launch, off on exit
cargo install lighthouse-managerThen run lighthouse-manager --help to verify the installation.
Download the latest release binary for your platform from GitHub Releases.
git clone https://github.com/atomicflag/lighthouse-manager.git
cd lighthouse-manager
cargo build --release
./target/release/lighthouse-manager --helpAll commands require a working Bluetooth adapter. Run with -v / -vv for debug/trace logs, or set the RUST_LOG environment variable directly.
Scans for BLE-advertising Lighthouse base stations and saves them to the local database (newly discovered units are marked unmanaged by default):
# Default 10-second scan
lighthouse-manager discover
# Custom scan duration
lighthouse-manager discover -d 20# Show all lighthouses in the database
lighthouse-manager list
# Show only managed lighthouses
lighthouse-manager list --managed
# Output as pretty JSON
lighthouse-manager list --jsonMark one or all lighthouses as managed or unmanaged. Only managed lighthouses are affected by power-on / power-off.
# Mark a specific lighthouse as managed
lighthouse-manager set-managed 0 true
# Mark a specific lighthouse as unmanaged (ignored by power commands)
lighthouse-manager set-managed 1 false
# Mark all lighthouses in the database as managed
lighthouse-manager set-managed all true# Power on all managed lighthouses simultaneously
lighthouse-manager power-on
# Sleep (power off) all managed lighthouses
lighthouse-manager power-offCauses a V2 base station to flash its LED so you can locate it physically:
# Flash the lighthouse at index 0 in the database
lighthouse-manager identify 0
# Alias: same as above
lighthouse-manager blink 0Automatically turn your lighthouses on when SteamVR starts and power them off when it shuts down. Configure once so you never have to think about base stations again.
# Enable β lighthouses turn on when SteamVR launches, off when it exits
lighthouse-manager autostart on
# Disable β reverts to manual control only
lighthouse-manager autostart offControl verbosity globally with -v / -vv, or use RUST_LOG:
# Equivalent to -v
RUST_LOG=lighthouse_manager=debug lighthouse-manager list
# Trace-level logging for debugging BLE issues
RUST_LOG=lighthouse_manager=trace lighthouse-manager discoversrc/
βββ lib.rs # Library crate (re-exports modules)
βββ cli/ # CLI binary entry point (clap Parser + subcommand dispatch)
β βββ main.rs
βββ ovr/ # Companion SteamVR binary (auto-launch target)
β βββ main.rs
βββ bluetooth.rs # Bluetooth adapter management via btleplug
βββ lighthouse.rs # Lighthouse device model & version detection
βββ protocol.rs # BLE GATT communication protocol layer
βββ storage.rs # Local JSON database (XDG-compliant paths)
βββ commands/
βββ autostart.rs # Auto-on/off lighthouses when SteamVR starts/stops
βββ discover.rs # BLE scan β save discovered units
βββ list.rs # Database listing with filtering
βββ set_managed.rs # Set managed/unmanaged status by index or "all"
βββ power.rs # Parallel power on/off via GATT writes
βββ identify.rs # V2 LED flash via GATT characteristic
- Rust 1.85+ (
rustuprecommended) - A Bluetooth 4.0+ adapter (Linux:
bluez; macOS / Windows: native BLE stack)
# Development build (fast iteration)
cargo build
# Release build (optimized, smaller binary)
cargo build --releaseRun the full test suite:
cargo testContributions are welcome! Please feel free to submit a Pull Request.
- Fork the repository
- Create your feature branch (
git checkout -b feature/amazing-feature) - Commit your changes (
git commit -m 'Add amazing feature') - Push to the branch (
git push origin feature/amazing-feature) - Open a Pull Request