AeroRadio is a premium, responsive Web-based Internet Radio client built with an Immersive Glassmorphism Dark Mode user interface. It connects to the open, public radio-browser.info API to allow users to search, browse, play, and save thousands of live radio streams from around the globe.
- Immersive Glassmorphism UI: High-fidelity frosted-glass panels, neon gradients (blue/purple/pink), smooth hover transitions, and fluid micro-animations.
- Dynamic Visuals & Tuning: Support for multiple rendering modes (Bar Graph, Pulsing Circular Ring, Oscilloscope Waveform) across four custom neon themes (Aero, Cyberpunk, Matrix, Sunset), with range tuning sliders to adjust visual response speed (smoothing) and height multiplier (sensitivity).
- 5-Band Graphic Equalizer (v1.1.0): Built on Web Audio API
BiquadFilterNodes, allowing users to adjust Bass, Low-Mid, Mid, High-Mid, and Treble frequencies (+/-12dB) with pre-configured presets (Bass Boost, Vocal Boost, Electronic, Acoustic). - Sleep Timer (v1.2.0): Fully offline Sleep timer with a digital countdown panel, fading volume down to zero smoothly over 3 seconds before pausing audio.
- Favorites Status Heartbeat (v1.2.0): Connection probe tool that checks the online/offline status of all saved stations in parallel (using
no-corsheaders and a 3.5s timeout) and displays glowing green or red status badges. - Favorites Editor (v1.3.0): Hover pencil edit buttons on saved library cards that open a glassmorphic form overlay to update custom titles, logo URLs, stream URLs, and genre tags.
- Persistent User Settings (v1.3.2): Automatically preserves and restores player volume, 5-band graphic equalizer preset/slider gains, visualizer mode/theme/sensitivity/smoothing, and search limits across session restarts.
- Search Result Limit (v1.3.2): User-customizable result count filter (10 to 100) integrated into the Search & Browse bar to optimize bandwidth and load times.
- Browse & Search: Deep directory integration allowing search by keyword and filters for genres (tags), countries, and languages.
- Persistent Favorites: Save preferred stations locally using browser
localStorageto access them on subsequent visits. - Playback History: Keeps a list of recently played stations to quickly jump back in.
- Custom Stream Adder: Input custom audio stream URLs (AAC/MP3/OGG/HLS) to pin them directly into your library.
- System Logs & Diagnostics: Centralized logging panel that records initialization, stream playback, CORS redirections, and API connection details. Includes features to inspect traces, clear logs, and download log exports.
- Responsive Layout: Adapts smoothly to mobile devices, shifting the sidebar navigation to an elegant bottom tab bar.
- Structure: Semantic HTML5 with inline SVG icons for resolution-independent rendering.
- Styling: Vanilla CSS3 custom properties (variables), grid/flexbox layouts, backdrop-filters, and custom scrollbars.
- Logic: Modular Vanilla JavaScript (ES6 Modules). No compilation, bundlers, or external framework dependencies required.
- Data Source: Free & public Radio Browser API with automatic failover node resolution.
C:\repos\inet_radio_agy\
βββ index.html # Main HTML entry point, navigation panels, and audio player UI
βββ styles.css # Design system, CSS variables, glassmorphic styles, and keyframe animations
βββ package.json # Node configuration, scripts, and Electron builder metadata
βββ main.js # Electron main process and custom protocol controller
βββ LICENSE # MIT License terms
βββ README.md # Project documentation
βββ build/
β βββ icon.png # Custom desktop and taskbar application icon
βββ js/
βββ api.js # API client wrapper handling server discovery and query searches
βββ player.js # Playback controller managing AudioContext, AnalyserNode, and CORS fallback
βββ visualizer.js # Canvas drawing loop for live audio analysis and fallback graphics
βββ logger.js # Centralized diagnostic logger utility
βββ app.js # App orchestrator tying events, LocalStorage, and rendering together
Since the web application uses ES6 modules, it must be run from an HTTP server rather than opening the HTML file directly.
Run the following command in the project directory:
python -m http.server 8080Then visit: http://localhost:8080
Alternatively, if you prefer Node:
npx http-server -p 8080Then visit: http://localhost:8080
Make sure you run npm install first to install the desktop dependencies.
Start the Electron frame for development:
npm startPackage the application into a standalone Windows installer:
npm run distThe compiled installer will be saved to dist/AeroRadio Setup 1.3.2.exe.
Many public internet radio streams do not send CORS (Cross-Origin Resource Sharing) headers. Setting crossOrigin = "anonymous" on an HTML audio element is required to read its bytes via the Web Audio API for visualizer analysis; however, if the stream server lacks CORS headers, the browser will refuse to play the audio.
To solve this, AeroRadio uses a dual-element playback graph in js/player.js:
- Visualized Element (
audioVisualized): Runs withcrossOrigin = "anonymous"and is connected to the Web Audio graph. - Direct Playback Element (
audioDirect): Runs withoutcrossOriginand bypasses the Web Audio graph entirely.
Playback flow:
- When a station is selected, the app attempts to play via
audioVisualized. - If a CORS error blocks loading, it seamlessly hands playback to
audioDirect, guaranteeing the music plays successfully. - If playback succeeds but the analyzer returns silent frequency data (due to CORS block on reading, even if playing), the visualizer dynamically swaps from live canvas rendering to a beautiful simulated equalizer wave in js/visualizer.js so the UI remains alive.
Since AeroRadio is entirely static (HTML, CSS, JS), it can be deployed to any production web server.
- Install Nginx:
sudo apt update sudo apt install nginx -y
- Copy the project files to the web root:
sudo mkdir -p /var/www/aeroradio sudo cp -r . /var/www/aeroradio/ sudo chown -R www-data:www-data /var/www/aeroradio - Configure Nginx: Create
/etc/nginx/sites-available/aeroradiowith this configuration:server { listen 80; server_name your_domain.com; # Or use default server block root /var/www/aeroradio; index index.html; location / { try_files $uri $uri/ =404; } # Enable caching for static assets location ~* \.(css|js|png|jpg|jpeg|gif|ico|svg)$ { expires 7d; add_header Cache-Control "public, no-transform"; } }
- Enable the site and restart Nginx:
sudo ln -s /etc/nginx/sites-available/aeroradio /etc/nginx/sites-enabled/ sudo nginx -t sudo systemctl restart nginx
- Install Caddy on your Linux host.
- Edit
/etc/caddy/Caddyfile:your_domain.com { root * /var/www/aeroradio file_server encode gzip }
- Restart Caddy:
sudo systemctl restart caddy.
- Enable IIS via Windows Features:
- Open Turn Windows features on or off.
- Check Internet Information Services -> World Wide Web Services -> Common HTTP Features -> Static Content.
- Open the IIS Manager (
inetmgr). - Add a new Website:
- Right-click Sites -> Add Website...
- Site name:
AeroRadio - Physical path: Choose the project path (e.g.,
C:\repos\inet_radio_agy). - Port: Change to
80(or8080to avoid conflicts).
- Configure MIME Types:
- Ensure
.jsfiles are served asapplication/javascript. (IIS usually handles this by default, but verify under the MIME Types feature if JavaScript files fail to load).
- Ensure
- Start the website. Access it at
http://localhost:<port>.
If you want to serve it using Node's http-server package persistently:
- Install PM2 globally:
npm install pm2 -g npm install pm2-windows-service -g
- Start the HTTP server under PM2 process manager:
pm2 start npx --name "aeroradio" -- http-server C:\repos\inet_radio_agy -p 8080
- Save the PM2 process list:
pm2 save.
You can containerize this application to run identically on any server with Docker installed:
- Create a
Dockerfilein the root directory:FROM nginx:alpine COPY . /usr/share/nginx/html/ EXPOSE 80
- Build the Docker image:
docker build -t aeroradio:latest . - Run the container:
docker run -d -p 8080:80 --name aeroradio_app aeroradio:latest
- Access the server at
http://<host-ip>:8080.
This project is open-source software licensed under the MIT License. Feel free to use, modify, and distribute it.