Modern web application dashboard for viewing connected repeaters, active users, and system statistics for NXDNReflector.
Version 2.0.1 Official
- Modern UI - Beautiful glass-morphism design with Tailwind CSS
- Fully Responsive - Works seamlessly on desktop, tablet, and mobile devices. App ready!
- Real-time Monitoring - View connected repeaters, last heard list, and system stats
- Improved TX Detection - Faster more responsive TX update logic
- Easy Setup - Initial setup wizard for first-time configuration
- Branding - Customize dashboard name, tagline, and logo
- System Monitoring - CPU load, temperature, disk usage, and uptime
- Privacy Options - GDPR-compliant callsign anonymization
- QRZ Integration - Optional links to QRZ.com for callsigns
Dashboard showing real-time connection with P25Reflector, including connected repeaters, system information, and last heard list
- PHP >= 7.4 - 8.3
- Node.js >= 16.x (for building CSS)
- Web server (Apache, Nginx, or lighttpd)
- NXDNReflector installed and running
This dashboard has been tested and confirmed to work with:
- PHP Versions: 7.4, 8.0, 8.1, 8.2, 8.3
- NXDNReflector: G4KLX NXDNReflector (C++ implementation)
cd /var/www/html
git clone https://github.com/ShaYmez/NXDNReflector-Dashboard2.git
cd NXDNReflector-Dashboard2npm install
npm run build:css# Give write permissions for config directory
sudo chown -R www-data:www-data /var/www/html/NXDNReflector-Dashboard2
sudo chmod -R 755 /var/www/html/NXDNReflector-Dashboard2Create a virtual host configuration:
<VirtualHost *:80>
ServerName your-domain.com
DocumentRoot /var/www/html/NXDNReflector-Dashboard2
<Directory /var/www/html/NXDNReflector-Dashboard2>
Options Indexes FollowSymLinks
AllowOverride All
Require all granted
</Directory>
ErrorLog ${APACHE_LOG_DIR}/nxdn-dashboard-error.log
CustomLog ${APACHE_LOG_DIR}/nxdn-dashboard-access.log combined
</VirtualHost>Enable the site and restart Apache:
sudo a2ensite nxdn-dashboard
sudo systemctl restart apache2Add to your Nginx configuration:
server {
listen 80;
server_name your-domain.com;
root /var/www/html/NXDNReflector-Dashboard2;
index index.php index.html;
location / {
try_files $uri $uri/ =404;
}
location ~ \.php$ {
include snippets/fastcgi-php.conf;
fastcgi_pass unix:/var/run/php/php7.4-fpm.sock;
}
location ~ /\.ht {
deny all;
}
}Restart Nginx:
sudo systemctl restart nginx- Open your browser and navigate to
http://your-domain.com/setup.php - Fill in the configuration form:
- Dashboard Branding: Name, tagline, and logo URL
- NXDNReflector Configuration: Paths to log files, ini file, and executable
- Global Settings: Timezone, refresh interval, and display options
- Click "Save Configuration"
- Important: Delete
setup.phpfor security:
sudo rm /var/www/html/NXDNReflector-Dashboard2/setup.php- Access your dashboard at
http://your-domain.com/index.php
Ensure your NXDNReflector is configured to write logs:
[Log]
FilePath=/var/log/NXDNReflector/
FileRoot=NXDNReflectorAfter initial setup, you can manually edit config/config.php:
// Example configuration
define("NXDNREFLECTORLOGPATH", "/var/log/NXDNReflector/");
define("NXDNREFLECTORLOGPREFIX", "NXDNReflector");
define("NXDNREFLECTORINIPATH", "/etc/");
define("NXDNREFLECTORINIFILENAME", "NXDNReflector.ini");
define("TIMEZONE", "America/New_York");
define("REFRESHAFTER", "15"); // No longer used - dashboard updates via JavaScript
define("DASHBOARD_NAME", "My NXDN Reflector");
define("LOGO", "https://example.com/logo.png"); // URL or local pathNote: The REFRESHAFTER setting is now deprecated as the dashboard uses JavaScript for live updates and no longer requires page refreshes.
The dashboard supports multiple ways to add a logo:
Option 1: Local Image File (Recommended)
- Place your logo file in the
img/directory with the filenamelogo.png,logo.jpg, or any supported format - Supported formats: PNG, JPEG, JPG, BMP, WebP, GIF, SVG
- The dashboard will automatically detect and display it
- No configuration needed!
Example:
# Copy your logo to the img directory
cp /path/to/your/logo.png /var/www/html/NXDNReflector-Dashboard2/img/logo.pngOption 2: External URL
Set the LOGO constant in config/config.php to a full URL:
define("LOGO", "https://example.com/your-logo.png");Option 3: Custom Local Path
Set the LOGO constant to a relative path:
define("LOGO", "assets/custom-logo.png");The logo will be automatically scaled to fit within the header while maintaining aspect ratio, and the responsive design ensures it looks great on all devices.
The dashboard provides a fully dynamic, real-time experience without page reloads:
- Live Dashboard Updates: JavaScript polls the dashboard API every 5 seconds for all data
- Real-Time TX Status: Instant transmission detection with dynamic show/hide of TX alert
- Live Last Heard List: Automatically updates as new transmissions are logged
- Live Repeater List: Real-time connected repeater updates
- 180-Second TX Timeout: Matches standard amateur radio transmission timeout for proper QSO handling
- Smart End Detection: Properly detects transmission end markers
- No Page Reloads: Smooth, uninterrupted experience with all data updating in the background
Edit src/styles.css to customize colors and styling, then rebuild:
npm run build:cssFor live CSS development with auto-reload:
npm run dev- Always delete
setup.phpafter initial configuration - Ensure proper file permissions (755 for directories, 644 for files)
- Keep PHP and dependencies up to date
- Use HTTPS in production environments
- Enable GDPR mode to anonymize callsigns if required
Contributions are welcome! Please feel free to submit a Pull Request.
This project is licensed under the GPL-3.0 License - see the LICENSE file for details.
- Designed by M0VUB Aka ShaYmez
- Based on YSFReflector-Dashboard2
- Built with Tailwind CSS
For issues, questions, or suggestions:
- Open an issue on GitHub
- Check existing documentation and issues first
To update the dashboard:
cd /var/www/html/NXDNReflector-Dashboard2
git pull origin main
npm install
npm run build:cssMade with β€οΈ for the Amateur Radio Community

