Fullstack TypeScript web SDR receiver. Bun backend manages rtl_tcp and does the
DSP (FFT spectrum + demodulation); React/Tailwind/shadcn frontend renders the
spectrum/waterfall and plays demodulated audio.
- Bun ≥ 1.3
librtlsdr(providesrtl_tcp):brew install librtlsdr- An RTL-SDR Blog V3 dongle plugged in (
rtl_test -tshould list it)
Optional (features disable themselves when missing):
-
rtl_433for ISM-band sensor decode:brew install rtl_433 -
whisper.cpp for live speech-to-text of the tuned station:
brew install whisper-cpp, then download a ggml model into~/.cache/whisper.cpp(ormodels/), e.g.curl -L -o ~/.cache/whisper.cpp/ggml-small.en.bin \ https://huggingface.co/ggerganov/whisper.cpp/resolve/main/ggml-small.en.binPick between downloaded models in the transcript panel (the largest is the default;
WHISPER_MODEL=/path/to.binoverrides,WHISPER_LANG=autofor non-English stations). Dropping a Silero VAD model (ggml-silero-*.bin) alongside it makes whisper skip music instead of hallucinating lyrics over it.
bun install
bun run dev # starts server (:8787) and web (:5173) togetherOpen http://localhost:5173.
packages/shared— WS protocol types, modes, constants, rtl_tcp command codespackages/server— Bun: rtl_tcp manager + TCP client, DSP pipeline, WebSocket serverpackages/web— Vite + React + Tailwind + shadcn UI
See packages/server/README.md for the DSP pipeline and the rtl_tcp protocol notes.