Dashboard

<%= onlineUsers %>

Online users

<%= memoryUsage %> (<%= memoryHeap %> heap)

Memory usage

<%= processUptime %>

Uptime

Current users

<% if (connectedUsers.length > 0) { %> <% connectedUsers.forEach(user => { %> <% }); %> <% } else { %> <% } %>
IP Address Location Online since
<%= user.ip.replace('::ffff:', '') %> <%= user.location %> <%= user.time %> Kick
No users online

Quick settings

<%- include('_components', {component: 'checkbox', cssClass: '', label: 'Unlocked Tuner', id: 'publicTuner'}) %> <%- include('_components', {component: 'checkbox', cssClass: '', label: 'Admin lock', id: 'lockToAdmin'}) %>
<%- include('_components', {component: 'text', cssClass: 'w-150 br-15', placeholder: '', label: 'Tune password', id: 'password-tunePass', password: true}) %> <%- include('_components', {component: 'text', cssClass: 'w-150 br-15', placeholder: '', label: 'Admin password', id: 'password-adminPass', password: true}) %>

Console

<% if (consoleOutput && consoleOutput.length > 0) { %>
<% consoleOutput.forEach(function(log) { %>
<%= log %>
<% }); %>
<% } else { %>

No console output available.

<% } %>

Audio settings

Device

Your audio device port.
This is where your tuner is plugged in.

<%- include('_components', { component: 'dropdown', id: 'audioList', inputId: 'audio-audioDevice', label: 'Audio device', cssClass: '', placeholder: 'Choose your audio device', options: [ ...videoDevices.map(device => ({ value: device.name, label: `${device.name}` })), ...audioDevices.map(device => ({ value: device.name, label: `${device.name}` })) ] }) %>

Channels

Audio channel count.
Choose between Mono / Stereo.

<%- include('_components', { component: 'dropdown', id: 'audio-channels-dropdown', inputId: 'audio-audioChannels', label: 'Audio channels', cssClass: '', placeholder: 'Stereo', options: [ { value: '2', label: 'Stereo' }, { value: '1', label: 'Mono' } ] }) %>

Bitrate

The bitrate of the mp3 audio.
Minimum: 64 Kbps • Maximum: 320 Kbps

<%- include('_components', { component: 'dropdown', id: 'audio-quality-dropdown', inputId: 'audio-audioBitrate', label: 'Audio quality', cssClass: '', placeholder: '128kbps (standard)', options: [ { value: '64k', label: '64kbps (lowest quality)' }, { value: '96k', label: '96kbps (low quality)' }, { value: '128k', label: '128kbps (standard)' }, { value: '192k', label: '192kbps (high quality)' }, { value: '256k', label: '256kbps (very high quality)' }, { value: '320k', label: '320kbps (ultra quality)' } ] }) %>

Audio boost

This option will boost the audio volume. Use if the output is too quiet.

<%- include('_components', {component: 'checkbox', cssClass: '', label: 'Audio Boost', id: 'audio-audioBoost'}) %>

Experimental

If you use a USB audio card on Linux, enabling this option might fix your audio issues.

<%- include('_components', {component: 'checkbox', cssClass: '', label: 'ALSA Software mode', id: 'audio-softwareMode'}) %>

FFmpeg

Legacy option for Linux / macOS that could resolve audio issues, but will consume additional CPU and RAM usage.

<%- include('_components', {component: 'checkbox', cssClass: '', label: 'Additional FFmpeg', id: 'audio-ffmpeg'}) %>

Sample rate offset

Using a negative value could eliminate audio buffering issues during long periods of listening.
However, a value that’s too low might increase the buffer over time.

Webserver settings

Connection

Leave the IP at 0.0.0.0 unless you explicitly know you have to change it.
Don't enter your public IP here.

<%- include('_components', {component: 'text', cssClass: 'w-150 br-15', placeholder: '0.0.0.0', label: 'Webserver IP', id: 'webserver-webserverIp'}) %> <%- include('_components', {component: 'text', cssClass: 'w-100 br-15', placeholder: '8080', label: 'Webserver port', id: 'webserver-webserverPort'}) %>

Design

Background image

<%- include('_components', {component: 'text', cssClass: 'br-15', placeholder: 'Direct image link', label: 'Image link', id: 'webserver-bgImage'}) %>

Themes

<%- include('_components', { component: 'dropdown', id: 'server-theme-selector', inputId: 'webserver-defaultTheme', label: 'Default server theme', cssClass: '', placeholder: 'Default', options: [ { value: 'theme1', label: 'Mint' }, { value: 'theme2', label: 'Cappuccino' }, { value: 'theme3', label: 'Nature' }, { value: 'theme4', label: 'Ocean' }, { value: 'theme5', label: 'Terminal' }, { value: 'theme6', label: 'Nightlife' }, { value: 'theme7', label: 'Blurple' }, { value: 'theme8', label: 'Construction' }, { value: 'theme9', label: 'Amoled' }, ] }) %>

Antennas

<%- include('_components', {component: 'checkbox', cssClass: 'bottom-20', label: 'Antenna switch', id: 'antennas-enabled'}) %>
<%- include('_components', {component: 'checkbox', cssClass: '', label: 'Antenna 1', id: 'antennas-ant1-enabled'}) %> <%- include('_components', {component: 'text', cssClass: 'w-100 br-15', placeholder: 'Ant A', label: 'Antenna 1 name', id: 'antennas-ant1-name'}) %>
<%- include('_components', {component: 'checkbox', cssClass: 'top-25', label: 'Antenna 2', id: 'antennas-ant2-enabled'}) %> <%- include('_components', {component: 'text', cssClass: 'w-100 br-15', placeholder: 'Ant B', label: 'Antenna 2 name', id: 'antennas-ant2-name'}) %>
<%- include('_components', {component: 'checkbox', cssClass: '', label: 'Antenna 3', id: 'antennas-ant3-enabled'}) %> <%- include('_components', {component: 'text', cssClass: 'w-100 br-15', placeholder: 'Ant C', label: 'Antenna 3 name', id: 'antennas-ant3-name'}) %>
<%- include('_components', {component: 'checkbox', cssClass: '', label: 'Antenna 4', id: 'antennas-ant4-enabled'}) %> <%- include('_components', {component: 'text', cssClass: 'w-100 br-15', placeholder: 'Ant D', label: 'Antenna 4 name', id: 'antennas-ant4-name'}) %>

Tuning options

If you want to limit which frequencies the users can tune to,
you can set the lower and upper limit here.
Enter frequencies in MHz.

<%- include('_components', {component: 'checkbox', cssClass: '', label: 'Limit tuning', id: 'webserver-tuningLimit'}) %>
<%- include('_components', {component: 'text', cssClass: 'w-100 br-15', placeholder: '0', label: 'Lower limit', id: 'webserver-tuningLowerLimit'}) %> <%- include('_components', {component: 'text', cssClass: 'w-100 br-15', placeholder: '108', label: 'Upper limit', id: 'webserver-tuningUpperLimit'}) %>

Presets

You can set up to 4 presets.
These presets are accessible with the F1-F4 buttons.
Enter frequencies in MHz.

<%- include('_components', {component: 'text', cssClass: 'w-100 br-15', placeholder: '87.5', label: 'Preset 1', id: 'webserver-presets-1'}) %> <%- include('_components', {component: 'text', cssClass: 'w-100 br-15', placeholder: '87.5', label: 'Preset 2', id: 'webserver-presets-2'}) %>
<%- include('_components', {component: 'text', cssClass: 'w-100 br-15', placeholder: '87.5', label: 'Preset 3', id: 'webserver-presets-3'}) %> <%- include('_components', {component: 'text', cssClass: 'w-100 br-15', placeholder: '87.5', label: 'Preset 4', id: 'webserver-presets-4'}) %>

RDS Mode

You can switch between American (RBDS) / Global (RDS) mode here.

<%- include('_components', {component: 'checkbox', cssClass: 'bottom-20', iconClass: '', label: 'American RDS mode (RBDS)', id: 'webserver-rdsMode'}) %>

RDS Timeout

If no data is received, RDS will be automatically cleared after a timeout.
Enter timeout in seconds or 0 to disable.

<%- include('_components', {component: 'text', cssClass: 'w-100', placeholder: '0', label: 'RDS Timeout', id: 'webserver-rdsTimeout'}) %>

Transmitter Search Algorithm

Different modes may help with more accurate transmitter identification depending on your region.

<%- include('_components', { component: 'dropdown', id: 'server-tx-id-algo', inputId: 'webserver-txIdAlgorithm', label: 'Transmitter ID Algorithm', cssClass: '', placeholder: 'Algorithm 1', options: [ { value: '0', label: 'Algorithm 1' }, { value: '1', label: 'Algorithm 2' }, { value: '2', label: 'Algorithm 3' }, ] }) %>

Tuner settings

Device type

<%- include('_components', { component: 'dropdown', id: 'device-selector', inputId: 'device', label: 'Device', cssClass: '', placeholder: 'TEF668x / TEA685x', options: tunerProfiles.map(profile => ({ value: profile.id, label: profile.label })) }) %>

Connection type

If you want to choose the serial port directly, choose "Direct".
If you use xdrd or your receiver is connected via Wi-Fi, choose TCP/IP.

Choose your desired serial port
 

<%- include('_components', { component: 'dropdown', id: 'deviceList', inputId: 'xdrd-comPort', label: 'Serial port', cssClass: '', placeholder: 'Choose your serial port', options: serialPorts.map(serialPort => ({ value: serialPort.path, label: `${serialPort.path} - ${serialPort.friendlyName}` })) }) %>

If you are connecting your tuner wirelessly, enter the tuner IP.
If you use xdrd, use 127.0.0.1 as your IP.

<%- include('_components', {component: 'text', cssClass: 'w-150 br-15', label: 'xdrd IP address', id: 'xdrd-xdrdIp'}) %> <%- include('_components', {component: 'text', cssClass: 'w-100 br-15', label: 'xdrd port', id: 'xdrd-xdrdPort'}) %> <%- include('_components', {component: 'text', cssClass: 'w-150 br-15', label: 'xdrd password', id: 'xdrd-xdrdPassword', password: true}) %>

Startup

Startup volume


Default frequency

<%- include('_components', {component: 'checkbox', cssClass: '', label: 'Default frequency for first client', id: 'enableDefaultFreq'}) %>
<%- include('_components', {component: 'text', cssClass: 'w-100', placeholder: '87.5', label: 'Default frequency', id: 'defaultFreq'}) %>

Miscellaneous

Bandwidth switch

Bandwidth switch allows the user to set the bandwidth manually.

<%- include('_components', {component: 'checkbox', cssClass: '', label: 'Bandwidth switch', id: 'bwSwitch'}) %>

Automatic shutdown

Toggling this option will put the tuner to sleep when no clients are connected.

<%- include('_components', {component: 'checkbox', cssClass: '', label: 'Auto-shutdown', id: 'autoShutdown'}) %>

SI47XX AGC control

Allow users to change SI47XX AGC mode from the main UI.

<%- include('_components', {component: 'checkbox', cssClass: '', label: 'Enable AGC control', id: 'si47xx-agcControl'}) %>

Plugins

Plugin list

Any compatible .js plugin, which is in the "plugins" folder, will be listed here.
Click on the individual plugins to enable/disable them.



Download new plugins here!

Plugin settings

No plugin settings are available.

Identification & Map

Basic info

Set your tuner name and description here.
This info will be visible to anyone who tunes in.


Online map

If your location information is filled,
you can add your tuner to a public list.

<%- include('_components', {component: 'checkbox', cssClass: '', label: 'Broadcast to map', id: 'identification-broadcastTuner'}) %>
<%- include('_components', {component: 'text', cssClass: 'br-15', placeholder: 'Your e-mail or Discord...', label: 'Owner contact', id: 'identification-contact'}) %> <%- include('_components', {component: 'text', cssClass: 'br-15', label: 'Proxy address', id: 'identification-proxyIp'}) %>

Check your tuner at servers.fmdx.org.

By activating the Broadcast to map option,
you agree to the Terms of Service.

Location

Location info is useful for automatic identification of stations using RDS.

<%- include('_components', {component: 'text', cssClass: 'w-150 br-15', placeholder: '', label: 'Latitude', id: 'identification-lat'}) %> <%- include('_components', {component: 'text', cssClass: 'w-150 br-15', placeholder: '', label: 'Longitude', id: 'identification-lon'}) %>

User management

Chat options

<%- include('_components', {component: 'checkbox', cssClass: '', label: 'Chat', id: 'webserver-chatEnabled'}) %>

Banlist

If you have users that don't behave on your server, you can choose to ban them by their IP address.
You can see their IP address by hovering over their nickname. One IP per row.

<% if (banlist.length > 0) { %> <% banlist.forEach(bannedUser => { %> <% if (Array.isArray(bannedUser)) { %> <% } else { %> <% } %> <% }); %> <% } else { %> <% } %>
IP Address Location Ban date Reason
<%- include('_components', {component: 'text', cssClass: 'w-100 br-15', placeholder: 'IP address', label: '', id: 'banlist-add-ip'}) %> <%- include('_components', {component: 'text', cssClass: 'w-150 br-15', placeholder: 'Ban reason (note)', label: '', id: 'banlist-add-reason'}) %>
<%= bannedUser[0] %> <%= bannedUser[1] %> <%= new Date(parseInt(bannedUser[2])).toLocaleString() %> <%= bannedUser[3] %> <%= bannedUser %> Unknown Unknown Unknown
The banlist is empty.

Startup settings

On startup

These settings will be applied after a server launch or restart.

<% if (device === 'tef') { %> <%- include('_components', { component: 'dropdown', id: 'ceqStartup-dropdown', inputId: 'ceqStartup', label: 'cEQ', cssClass: '', placeholder: 'Disabled', options: [ { value: '0', label: 'Disabled' }, { value: '1', label: 'Enabled' }, ] }) %>
<%- include('_components', { component: 'dropdown', id: 'imsStartup-dropdown', inputId: 'imsStartup', label: 'iMS', cssClass: '', placeholder: 'Disabled', options: [ { value: '0', label: 'Disabled' }, { value: '1', label: 'Enabled' }, ] }) %>
<% } else if (device === 'xdr') { %> <%- include('_components', { component: 'dropdown', id: 'rfStartup-dropdown', inputId: 'ceqStartup', label: 'RF+', cssClass: '', placeholder: 'Disabled', options: [ { value: '0', label: 'Disabled' }, { value: '1', label: 'Enabled' }, ] }) %>
<%- include('_components', { component: 'dropdown', id: 'ifStartup-dropdown', inputId: 'imsStartup', label: 'IF+', cssClass: '', placeholder: 'Disabled', options: [ { value: '0', label: 'Disabled' }, { value: '1', label: 'Enabled' }, ] }) %>
<% } %> <%- include('_components', { component: 'dropdown', id: 'stereoStartup-dropdown', inputId: 'stereoStartup', label: 'Stereo Mode', cssClass: '', placeholder: 'Stereo (Default)', options: [ { value: '0', label: 'Stereo (Default)' }, { value: '1', label: 'Mono' }, ] }) %>
<%- include('_components', { component: 'dropdown', id: 'antennaStartup-dropdown', inputId: 'antennaStartup', label: 'Antenna', cssClass: '', placeholder: 'Antenna 0 (Default)', options: [ { value: '0', label: 'Antenna 0 (Default)' }, { value: '1', label: 'Antenna 1' }, { value: '2', label: 'Antenna 2' }, { value: '3', label: 'Antenna 3' }, ] }) %>

Empty server defaults

These settings will apply once the last user disconnects from the server, so the server can be ready for a new user with default settings.

<%- include('_components', { component: 'dropdown', id: 'bwAutoNoUsers-dropdown', inputId: 'bwAutoNoUsers', label: 'Auto BW', cssClass: '', placeholder: 'Unchanged', options: [ { value: '0', label: 'Unchanged' }, { value: '1', label: 'Enabled' }, ] }) %>
<% if (device === 'tef') { %> <%- include('_components', { component: 'dropdown', id: 'ceqNoUsers-dropdown', inputId: 'ceqNoUsers', label: 'cEQ', cssClass: '', placeholder: 'Unchanged', options: [ { value: '0', label: 'Unchanged' }, { value: '1', label: 'Disabled' }, { value: '2', label: 'Enabled' }, ] }) %>
<%- include('_components', { component: 'dropdown', id: 'imsNoUsers-dropdown', inputId: 'imsNoUsers', label: 'iMS', cssClass: '', placeholder: 'Unchanged', options: [ { value: '0', label: 'Unchanged' }, { value: '1', label: 'Disabled' }, { value: '2', label: 'Enabled' }, ] }) %>
<% } else if (device === 'xdr') { %> <%- include('_components', { component: 'dropdown', id: 'rfNoUsers-dropdown', inputId: 'ceqNoUsers', label: 'RF+', cssClass: '', placeholder: 'Unchanged', options: [ { value: '0', label: 'Unchanged' }, { value: '1', label: 'Disabled' }, { value: '2', label: 'Enabled' }, ] }) %>
<%- include('_components', { component: 'dropdown', id: 'ifNoUsers-dropdown', inputId: 'imsNoUsers', label: 'IF+', cssClass: '', placeholder: 'Unchanged', options: [ { value: '0', label: 'Unchanged' }, { value: '1', label: 'Disabled' }, { value: '2', label: 'Enabled' }, ] }) %>
<% } %> <%- include('_components', { component: 'dropdown', id: 'stereoNoUsers-dropdown', inputId: 'stereoNoUsers', label: 'Stereo Mode', cssClass: '', placeholder: 'Unchanged', options: [ { value: '0', label: 'Unchanged' }, { value: '1', label: 'Stereo' }, { value: '2', label: 'Mono' }, ] }) %>
<%- include('_components', {component: 'checkbox', cssClass: '', label: 'Delayed Antenna Change', id: 'antennaNoUsersDelay'}) %>
<%- include('_components', { component: 'dropdown', id: 'antennaNoUsers-dropdown', inputId: 'antennaNoUsers', label: 'Antenna', cssClass: '', placeholder: 'Unchanged', options: [ { value: '0', label: 'Unchanged' }, { value: '1', label: 'Antenna 0' }, { value: '2', label: 'Antenna 1' }, { value: '3', label: 'Antenna 2' }, { value: '4', label: 'Antenna 3' }, ] }) %>

Extras

FMLIST Integration

FMLIST integration allows you to get potential DXes logged on the FMLIST Visual Logbook.
Your server also needs to have a valid UUID, which is obtained by registering on maps in the Identification & Map tab.

<%- include('_components', {component: 'checkbox', cssClass: 'm-right-10', label: 'FMLIST integration', id: 'extras-fmlistIntegration'}) %>

If you don't feel comfortable with the general public logging on your server, you can make this feature available only for people with a password

<%- include('_components', {component: 'checkbox', cssClass: 'm-right-10', label: 'Admin-only logging', id: 'extras-fmlistAdminOnly'}) %>

You can also fill in your OMID from FMLIST.org, if you want the logs to be saved to your account.

<%- include('_components', {component: 'text', cssClass: 'w-100 br-15', placeholder: '', label: 'OMID', id: 'extras-fmlistOmid'}) %>

Tunnel

When you become an FMDX.org supporter, you can host your webserver without the need of a public IP address & port forwarding.
When you become a supporter, you can message the Founders on Discord for your login details.


You can also get an tunnel from kuba201 discord, one of the contributors of this version of the application.

Main tunnel settings

<%- include('_components', {component: 'checkbox', cssClass: 'm-right-10', label: 'Enable tunnel', id: 'tunnel-enabled'}) %>
<%- include('_components', { component: 'dropdown', id: 'tunnel-regionSelect', inputId: 'tunnel-region', label: 'Official server region', cssClass: '', placeholder: 'Europe', options: [ { value: 'eu', label: 'Europe' }, { value: 'us', label: 'Americas' }, { value: 'sg', label: 'Asia & Oceania' }, { value: 'pldx', label: 'Poland (k201)' }, ] }) %> <%- include('_components', {component: 'text', cssClass: 'w-150 br-15', placeholder: '', label: 'Username', id: 'tunnel-username'}) %> <%- include('_components', {component: 'text', cssClass: 'w-250 br-15', password: true, placeholder: '', label: 'Token', id: 'tunnel-token'}) %> <%- include('_components', {component: 'text', cssClass: 'w-150 br-15', placeholder: '', label: 'Subdomain name', id: 'tunnel-subdomain'}) %>
<%- include('_components', {component: 'checkbox', cssClass: 'm-right-10', label: 'Low latency mode', id: 'tunnel-lowLatencyMode'}) %>

Enabling low latency mode may provide better experience, however it will also use more bandwidth.

Community tunnel settings

You can also self-host or ask other people to provide you a token. In this case, the server owner is responsible for any potential security issues.

<%- include('_components', {component: 'checkbox', cssClass: 'm-right-10', label: 'Use a community tunnel', id: 'tunnel-community-enabled'}) %>
<%- include('_components', {component: 'text', cssClass: 'w-250 br-15', placeholder: '', label: 'Community Tunnel host (IP or hostname)', id: 'tunnel-community-host'}) %>
<% enabledPlugins?.forEach(function(plugin) { %> <% }); %>