Skip to content

coriumalpha/BrowSDR

 
 

Repository files navigation

📻 BrowSDR

BrowSDR Live Rust WebAssembly

A blazing fast, next-generation browser-based Software Defined Radio (SDR) receiver for HackRF. Connect a HackRF device directly to your browser via WebUSB and tune into FM, AM, SSB, CW, and more — no drivers, no native software, no hassle.


✨ Features

Enjoy the power of a desktop SDR platform fully within your web browser.

  • 🎯 Multi-VFO Mastery Tune into multiple frequencies simultaneously! Create an unlimited number of Virtual Frequency Oscillators (VFOs), each with independent demodulation, volume, squelch, and DSP settings. Listen to multiple broadcasts without dropping a single packet.
  • ⚡ High-Speed Rust & WASM Architecture Built for raw performance. FFT and DSP pipelines are written in Rust and compiled to WebAssembly (WASM). Running inside Web Workers off the main thread ensures a crystal-clear, smooth UI and buttery 60 FPS performance, even with multiple active VFOs.
  • 🎙️ Live Transcribe Built-in AI-powered live transcription of demodulated audio right in your browser.
  • 📟 POCSAG Decoder Instantly decode paging networks straight from the UI.
  • 📊 Frequency Activity Visually spot active signals and quickly jump to transmissions using the dynamic frequency activity scanner and interactive waterfall display.
  • 🔖 Advanced Bookmarking System Save, organize, and quickly recall your favorite frequencies. Group your bookmarks into custom categories to effortlessly manage airbands, ham frequencies, repeaters, or emergency services.
  • 🌊 Real-time WebGL Waterfall & Spectrum Monitor the entire RF band visually with an ultra-responsive, GPU-accelerated waterfall and spectrum analyzer.
  • 📻 Wide Demodulation Support Supports WFM, NFM, AM, USB, LSB, DSB, CW, and raw IQ modes.
  • 📡 RDS Decoding on the Fly Instantly decode station name, programme type, and radiotext on WFM signals.
  • 🎛️ Full DSP Toolset Control squelch, noise reduction, de-emphasis, and stereo output per VFO.
  • 🌐 Remote Access Share your SDR with others via WebRTC using PeerJS.

🚀 How It Works

  1. WebUSB — Communicates directly with your HackRF device from Google Chrome or Edge.
  2. WebAssembly — Signal processing (FFT, filtering, decimation, mixer, demodulation) is handled by RustFFT and highly optimized Rust code compiled to WASM.
  3. Web Workers — Multi-threaded DSP via Comlink keeps the event loop entirely free of blocking tasks.
  4. WebGL — Hardware-accelerated FFT rendering.
  5. Vue 3 — A sleek, reactive UI powering complex per-VFO controls.
  6. Cloudflare Workers — Fast edge-deployed static assets and API proxy.

(Note: WebUSB requires a secure context — HTTPS or localhost)


🧰 Tech Stack

Layer Technology
Frontend TypeScript, Vue 3 (Options API), Vite
DSP Rust, RustFFT, WebAssembly, Web Workers
Deployment Cloudflare Workers (Wrangler)
Testing Vitest, wasm-bindgen-test, cargo test

🛠️ Prerequisites

Tool Purpose Install
Node.js Build & dev server Download from website
Rust Compile WASM module curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh
wasm32-unknown-unknown target Rust → WASM rustup target add wasm32-unknown-unknown
wasm-pack Build & package WASM cargo install wasm-pack
cargo-make Task runner for Rust builds cargo install --force cargo-make
A WebUSB-capable browser Run the app (e.g., Google Chrome)

⚙️ Quick Start

# 1. Install dependencies
npm install

# 2. Build the WASM module (first time or after Rust changes)
cd hackrf-web && cargo make build && cd ..

# 3. Start the local dev server
npm run dev

Then open http://localhost:5173 in Google Chrome or any WebUSB-supported browser.


💻 Build Commands

Command Description
npm run dev Start Vite dev server (http://localhost:5173)
npm run build Build client assets into dist/
npm run deploy Build and deploy to Cloudflare Workers
npm run typecheck Run TypeScript type checking
npm run test Run tests with Vitest

Building the WASM Module

The Rust/WASM module must be built separately (requires Rust toolchain):

cd hackrf-web
cargo make build       # Build for web (output: hackrf-web/pkg/)

Note: The WASM build outputs in hackrf-web/pkg/ are committed to the repo, so npm run deploy works seamlessly even without Rust installed on the CI/deployment machine.


🎧 Running the App

  1. Connect your HackRF to a USB port.
  2. Open the application and click Connect Device.
  3. Select your HackRF from the browser's USB device prompt.
  4. Set your desired Center Frequency and hit Play.
  5. Click anywhere on the spectrum or waterfall to instantly tune a new VFO, or manually add as many VFOs as you want!
  6. Customize the demodulation mode (WFM, NFM, AM, USB, etc.) and DSP settings for each VFO.
  7. Adjust gains (LNA, VGA, AMP) for optimal signal reception.

ISM / 433 Decoder Notes

BrowSDR now includes an experimental browser-side ISM decoder path that was built to approximate the behavior of rtl_433 as closely as possible inside the web app.

The work covered:

  1. A dedicated wideband ISM capture path in the DSP worker, separate from the normal audio path.
  2. Browser-native ports of the key rtl_433 primitives:
    • bitbuffer
    • pulse_data
    • pulse_analyzer
  3. A growing set of decoders for common 433 MHz OOK/ASK families, including PWM, PPM, Manchester, EV1527-style, PT2262-style, X10, Waveman, Visonic Powercode, and a few related variants.
  4. UI affordances for the decoder panel, including summary mode, a taller panel layout, and the ability to inspect stable detections.

What we learned:

  1. The browser-native approach can decode real traffic and works for some common 433 MHz patterns.
  2. Matching rtl_433 feature-for-feature is much more than a small port. The upstream project has a large decoder ecosystem and a lot of accumulated heuristics.
  3. A direct worker/WASM integration with rtl_433 would likely be the faster route to full parity, but we stopped short of that here.

Where it was left:

  1. The experimental work lives on the ism-decoder-rtl433-pass branch history and has been merged into main for reference.
  2. The last meaningful state before stopping was a browser-side pulse analyzer and decoder stack that was useful but still incomplete for broad rtl_433 coverage.
  3. The next sensible step, if someone wants to continue, is either:
    • a WASM worker around rtl_433, or
    • more direct ports of specific upstream decoders into the current worker pipeline.

For a more detailed summary of the attempt, current state, and next-step options, see docs/rtl433-experiment.md. For a short closing note, see docs/rtl433-experiment-status.md.


🧪 Testing

# TypeScript / Worker tests
npm run test

# Rust / WASM tests
cd hackrf-web
cargo make test

📜 License

Licensed under the AGPL-3.0 — see LICENSE for details.

About

Web-Based SDR Receiver

Resources

License

Stars

Watchers

Forks

Packages

 
 
 

Contributors

Languages

  • TypeScript 62.6%
  • Rust 14.0%
  • HTML 10.1%
  • CSS 7.0%
  • JavaScript 6.3%