📻 BrowSDR
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.
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.
- WebUSB — Communicates directly with your HackRF device from Google Chrome or Edge.
- WebAssembly — Signal processing (FFT, filtering, decimation, mixer, demodulation) is handled by RustFFT and highly optimized Rust code compiled to WASM.
- Web Workers — Multi-threaded DSP via Comlink keeps the event loop entirely free of blocking tasks.
- WebGL — Hardware-accelerated FFT rendering.
- Vue 3 — A sleek, reactive UI powering complex per-VFO controls.
- Cloudflare Workers — Fast edge-deployed static assets and API proxy.
(Note: WebUSB requires a secure context — HTTPS or localhost)
| 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 |
| 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) | — |
# 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 devThen open http://localhost:5173 in Google Chrome or any WebUSB-supported browser.
| 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 |
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, sonpm run deployworks seamlessly even without Rust installed on the CI/deployment machine.
- Connect your HackRF to a USB port.
- Open the application and click Connect Device.
- Select your HackRF from the browser's USB device prompt.
- Set your desired Center Frequency and hit Play.
- Click anywhere on the spectrum or waterfall to instantly tune a new VFO, or manually add as many VFOs as you want!
- Customize the demodulation mode (WFM, NFM, AM, USB, etc.) and DSP settings for each VFO.
- Adjust gains (LNA, VGA, AMP) for optimal signal reception.
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:
- A dedicated wideband ISM capture path in the DSP worker, separate from the normal audio path.
- Browser-native ports of the key
rtl_433primitives:bitbufferpulse_datapulse_analyzer
- 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.
- UI affordances for the decoder panel, including summary mode, a taller panel layout, and the ability to inspect stable detections.
What we learned:
- The browser-native approach can decode real traffic and works for some common 433 MHz patterns.
- Matching
rtl_433feature-for-feature is much more than a small port. The upstream project has a large decoder ecosystem and a lot of accumulated heuristics. - A direct worker/WASM integration with
rtl_433would likely be the faster route to full parity, but we stopped short of that here.
Where it was left:
- The experimental work lives on the
ism-decoder-rtl433-passbranch history and has been merged intomainfor reference. - The last meaningful state before stopping was a browser-side pulse analyzer and decoder stack that was useful but still incomplete for broad
rtl_433coverage. - 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.
- a WASM worker around
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.
# TypeScript / Worker tests
npm run test
# Rust / WASM tests
cd hackrf-web
cargo make testLicensed under the AGPL-3.0 — see LICENSE for details.