Welcome! This tutorial will guide you through setting up your development environment and running your first SDR application. By the end, you'll have rad.io running locally and understand the basic project structure.
Time to complete: 15-20 minutes
Prerequisites: Basic command line knowledge
What you'll learn: Project setup, development workflow, basic architecture
You'll set up a complete rad.io development environment and:
- Install dependencies
- Run the development server
- Open the application in your browser
- Explore the basic features
- Make a small code change to see hot reloading in action
Before starting, make sure you have:
- Node.js 16+ and npm 8+ installed (Download Node.js)
- A modern web browser (Chrome 61+, Edge 79+, or Opera 48+)
- A code editor (we recommend VS Code)
- Git installed (Download Git)
Open your terminal and clone the rad.io repository:
git clone https://github.com/alexthemitchell/rad.io.git
cd rad.ioWhat's happening? You're downloading the complete rad.io codebase to your local machine.
Install all required packages:
npm installWhat's happening? npm reads package.json and installs:
- React 19 for UI
- TypeScript for type safety
- Webpack for bundling
- Jest for testing
- ESLint and Prettier for code quality
This might take a few minutes on first run. ☕
Before starting development, verify everything works:
npm run lint
npm run type-check
npm testExpected output:
- ✅ Lint: No errors
- ✅ Type check: No type errors
- ✅ Tests: All tests passing
If you see errors: Make sure you're using Node.js 16+ and have a clean clone of the repository.
Start the development server with hot reloading:
npm startWhat's happening? Webpack is:
- Compiling TypeScript to JavaScript
- Bundling all modules
- Starting an HTTPS server on port 8080
- Watching for file changes
Expected output:
webpack 5.x.x compiled successfully in X ms
Server running at https://localhost:8080
Important: The server uses HTTPS because WebUSB requires a secure context.
Open your browser and navigate to:
https://localhost:8080/#/
Note: rad.io uses hash-based routing (the #/ in the URL). As you navigate the app, you'll see URLs like https://localhost:8080/#/spectrum or https://localhost:8080/#/settings. The hash routing helps the app manage navigation and page state within the single-page application.
You'll see a security warning because we're using a self-signed certificate. This is normal for local development:
- Chrome/Edge: Click "Advanced" → "Proceed to localhost (unsafe)"
- Opera: Click "Help me understand" → "Continue anyway"
What you should see:
- The rad.io interface
- "Connect Device" button
- Visualization panels (IQ Constellation, Spectrogram, Waterfall, Waveform)
- Device control panel (frequency, gain settings)
Try these interactions (no hardware required):
- Look at the visualizations - They're ready but showing no data
- Try the preset buttons - Notice they're disabled until a device connects
- Hover over controls - Tooltips explain each feature
- Use keyboard navigation - Press Tab to move between controls
If you want to see visualizations without hardware:
- Open the browser console (F12)
- The app runs in demo mode when no device is connected
- Some features will work with simulated data
Let's verify hot reloading works. We'll change the welcome message.
In your code editor, open:
src/App.tsx
Look for this line (around line 50-60):
<h1>rad.io - SDR Visualizer</h1>Modify it to:
<h1>rad.io - My First SDR App! 🎉</h1>- Save the file (Ctrl+S / Cmd+S)
- Look at your terminal - you'll see Webpack recompiling
- Look at your browser - the page refreshes automatically
- See your new title!
Congratulations! You just made your first change to rad.io. 🎉
Let's understand what's in the repository:
rad.io/
├── src/ # Application source code
│ ├── components/ # React components
│ ├── models/ # Device models (HackRF, RTL-SDR, etc.)
│ ├── utils/ # DSP utilities, helpers
│ ├── hooks/ # React hooks
│ └── App.tsx # Main application component
├── docs/ # Documentation (you are here!)
├── e2e/ # End-to-end tests
├── assembly/ # WebAssembly DSP code
├── dist/ # Build output (generated)
└── package.json # Dependencies and scripts
src/App.tsx- Main application entry pointsrc/models/HackRFOne.ts- HackRF device driversrc/utils/dsp.ts- DSP functions (FFT, waveforms)src/components/Spectrogram.tsx- Spectrum visualizationwebpack.config.ts- Build configuration
When you're done, stop the development server:
- Go to your terminal
- Press
Ctrl+C - Type
yif prompted
✅ How to set up rad.io for development
✅ How to run the development server
✅ How hot reloading works
✅ Basic project structure
✅ How to navigate the interface
If you see "Port 8080 is already in use":
# Find and kill the process (macOS/Linux)
lsof -ti:8080 | xargs kill -9
# Or use a different port
PORT=3000 npm startThis is normal for local HTTPS. Modern browsers require HTTPS for WebUSB, so we use a self-signed certificate in development.
If you see TypeScript or build errors:
# Clean and reinstall
npm run clean
npm install
npm startNow that you have rad.io running, you're ready to:
- Tutorial 2: Your First Visualization - Create a custom spectrum display
- Tutorial 3: Building an FM Radio - Complete FM receiver implementation
- Explore the Reference Documentation to learn about the APIs
- Read the Architecture Overview to understand the design
- Check the How-To Guides for specific problems
- Read the FAQ
- Ask in GitHub Discussions