BotWave - Your Raspberry Pi FM Network
142
stars
1,187
commits
Python
primary language
Sep 8, 2026
updated
BotWave lets you broadcast audio over FM radio using Raspberry Pi devices. It supports both single-device setups and multi-Pi networks, with features like remote control, live streaming, automated actions, and more, making it great for learning, experimentation, and creative projects.
All requirements can be installed automatically via the installer, see below.
[!NOTE] For a more detailed setup guide, check
/wiki/Setup
[!WARNING]
- BotWave broadcasts FM signals, which may be regulated in your area.
- Check local laws before use. Unauthorized broadcasts may incur fines.
- Use a band-pass filter to minimize interference with other services.
- The authors are not responsible for legal issues or hardware damage.
- See FAQ for more information:
/wiki/FAQ
For Linux systems (Raspberry Pi OS, Ubuntu, Fedora, Arch, etc.), we provide an install script:
curl -sSL https://botwave.dpip.lol/install | sudo bash
If you'd like to review the script before running it:
curl -sSL https://botwave.dpip.lol/install -o bw_install.sh
cat bw_install.sh
sudo bash bw_install.sh
sudois required for system-wide installation. BotWave installs to/opt/BotWavewith binary symlinks in/usr/local/bin.
Or, alternatively, you can install BotWave manually following our guide at Advanced/Installing BotWave manually.
During installation, you'll be asked a few questions:
--alsa.Installer optionsUsage: curl -sSL https://botwave.dpip.lol/install | sudo bash [-s -- [MODE] [OPTIONS]]
Modes:
client Install client components
server Install server components
both Install both client and server components
Options:
-l, --latest Install from the latest commit (even if unreleased)
-t, --to <version> Install a specific release version
-b, --branch <name> Install from a specific branch (default: main)
--[no-]alsa Setup ALSA loopback card
-h, --help Show this help message
Adding -s -- <server, client or both> --alsa at the end of the command skips the interactive menu and goes straight to installation.
Note that all this is optional and not needed for basic installation.
[!TIP] Not sure which mode to pick?
- One Raspberry Pi: use the Local Client (no server needed). Jump to Using The Local Client.
- Multiple Raspberry Pis: use the Client-Server setup. Jump to Using The Client-Server.
The local client runs entirely on one Raspberry Pi. So no server or second machine required. This is the recommended starting point if you're new to BotWave.
sudo bw-local
Local client optionsusage: bw-local [-h] [--upload-dir UPLOAD_DIR] [--handlers-dir HANDLERS_DIR]
[--skip-checks | --no-skip-checks] [--daemon | --no-daemon]
[--rc RC] [--pk PK] [--talk | --no-talk] [--config CONFIG]
[-v]
BotWave Local Client
options:
-h, --help show this help message and exit
--upload-dir UPLOAD_DIR
Directory to store uploaded files
--handlers-dir HANDLERS_DIR
Directory to retrieve l_ handlers from
--skip-checks, --no-skip-checks
Skip system requirements checks
--daemon, --no-daemon
Run in daemon mode (non-interactive)
--rc RC Remote CLI port for remote management
--pk PK Optional passkey for remote management authentication
--talk, --no-talk Show debug logs
--config CONFIG Path to a config file to load into environment
-v, --version Display version information
Hardware setupTo broadcast, connect a wire or antenna to GPIO 4 (pin 7) on your Raspberry Pi. Even a short bare wire improves range significantly over nothing.
The local client has a CLI to manage it. Type help for a list of all available commands.
BotWave supports most common audio formats (MP3, WAV, FLAC, AAC, OGG, and more). Files are converted to WAV automatically when needed.
You have two options to get files onto your Pi:
Option A: Download a file from a URL:
botwave> dl https://cdn.douxx.tech/files/ss.wav
Option B: Upload a file already on the Pi's filesystem:
[!NOTE] If you need to transfer a file from your personal computer to the Pi first, use
scpfrom your computer:scp mysong.mp3 pi@<pi-ip-address>:/home/pi/Then inside BotWave:
botwave> upload /home/pi/mysong.mp3 # a single file
botwave> upload /home/pi/music/ # every supported file in a folder
botwave> start ss.wav 88 # broadcasts ss.wav at 88 MHz
botwave> stop
botwave> exit # cleans up and exits
This setup lets you manage a network of Raspberry Pis from a central server. It assumes you have one machine with the server component installed and at least one Raspberry Pi with the client component installed, both on the same network.
Start the server on your server machine:
bw-server
Server optionsusage: bw-server [-h] [--host HOST] [--port PORT] [--fport FPORT] [--pk PK]
[--handlers-dir HANDLERS_DIR]
[--start-asap | --no-start-asap]
[--skip-checks | --no-skip-checks] [--rc RC]
[--talk | --no-talk] [--config CONFIG]
[--daemon | --no-daemon] [-v]
BotWave Server
options:
-h, --help show this help message and exit
--host HOST Server host
--port PORT Server port
--fport FPORT File transfer (HTTP) port
--pk PK Passkey for authentication
--handlers-dir HANDLERS_DIR
Directory to retrieve s_ handlers from
--start-asap, --no-start-asap
Start broadcasts immediately (may cause client desync)
--skip-checks, --no-skip-checks
Skip system requirements checks
--rc RC Remote CLI port for remote management
--talk, --no-talk Show debug logs
--config CONFIG Path to a config file to load into environment
--daemon, --no-daemon
Run in non-interactive daemon mode
-v, --version Display version information
Then, on the Raspberry Pi, connect it to the server:
If you don't know your server's IP address, run
< hostname -Iin the BotWave shell.
sudo bw-client 192.168.1.10 # replace with your server's IP
sudois required to access Raspberry Pi hardware.
Client optionsusage: bw-client [-h] [--port PORT] [--fhost FHOST] [--fport FPORT]
[--upload-dir UPLOAD_DIR] [--pk PK]
[--skip-checks | --no-skip-checks] [--talk | --no-talk]
[--config CONFIG] [-v]
[server_host]
BotWave Client
positional arguments:
server_host Server hostname/IP
options:
-h, --help show this help message and exit
--port PORT Server port
--fhost FHOST File transfer server hostname/IP (defaults to
server_host)
--fport FPORT File transfer (HTTP) port
--upload-dir UPLOAD_DIR
Uploads directory
--pk PK Passkey for authentication
--skip-checks, --no-skip-checks
Skip update and requirements checks
--talk, --no-talk Show debug logs
--config CONFIG Path to a config file to load into environment
-v, --version Display version information
Hardware setupTo broadcast, connect a wire or antenna to GPIO 4 (pin 7) on your Raspberry Pi. Even a short bare wire improves range significantly over nothing.
If the connection succeeds, you'll see a message confirming that <pi-hostname>_<pi-ip> has connected.
The server has a CLI to manage it. Type help for a list of all available commands.
When targeting clients, you can use:
raspberry_192.168.1.11raspberryraspberry,raspberry2allBotWave supports most common audio formats (MP3, WAV, FLAC, AAC, OGG, and more). Files are converted automatically when needed.
Option A: Upload a file stored on the server machine:
botwave> upload all /home/server/Downloads/ss.wav # a single file
botwave> upload all /home/server/Downloads/bw_files/ # every supported file in a folder
Option B: Have the client download from a URL directly:
botwave> dl all https://cdn.douxx.tech/files/ss.wav
botwave> start all ss.wav 88 # broadcasts ss.wav at 88 MHz to all clients
botwave> stop all
botwave> exit # kicks all clients and shuts down the server cleanly
BotWave lets you manage your server or local client remotely via WebSocket. We recommend using BWSC for this.
npm i -g bwsc
Add the --rc flag when starting BotWave. A passkey is strongly recommended if exposed to the internet:
bw-server --rc 9939 --pk MyPass # for the server component
bw-local --rc 9939 --pk MyPass # for the local client component
If you add a passkey to the server, also pass it to connecting clients:
sudo bw-client <server-ip> --pk <passkey>
bwsc 192.168.1.10:9939 MyPass # replace with your server IP and passkey
You'll now have access to the full server or local client CLI remotely.
Note that the <, |, and exit commands are not available via remote shell.
botwave> help
For more detailed documentation, check the following resources:
/wiki/server/server.md/client/client.md/local/local.md/autorun/autorun.mdMain/Automate Your SetupMain/Connecting remotelysudo bw-update
Updater optionsUsage: bw-update [OPTIONS]
Options:
-l, --latest Update to the latest commit (even if unreleased)
-t, --to <version> Update to a specific release version
-b, --branch <name> Install from a specific branch (default: main)
-h, --help Show this help message
Examples:
bash # Update to latest release
bash --latest # Update to latest commit
bash --to v1.0.0-oak
curl -sSL https://botwave.dpip.lol/uninstall | sudo bash
[!WARNING] This will delete
/opt/BotWave/. Back up any important files (handlers, uploads) before uninstalling.
You can try the BotWave server directly on cloud platforms:
Got a question or an issue?
BotWave mentions: Here are some posts/websites that talk about BotWave. Thanks to their creators!
BotWave is supported by donations from the following people and projects. Your contributions help with development, hosting, and hardware costs 🙏
BotWave is licensed under GPLv3.0.
Python
82.7%
Shell
17.3%
BotWave - Your Raspberry Pi FM Network
142
stars
1,187
commits
Python
primary language
Sep 8, 2026
updated
BotWave lets you broadcast audio over FM radio using Raspberry Pi devices. It supports both single-device setups and multi-Pi networks, with features like remote control, live streaming, automated actions, and more, making it great for learning, experimentation, and creative projects.
All requirements can be installed automatically via the installer, see below.
[!NOTE] For a more detailed setup guide, check
/wiki/Setup
[!WARNING]
- BotWave broadcasts FM signals, which may be regulated in your area.
- Check local laws before use. Unauthorized broadcasts may incur fines.
- Use a band-pass filter to minimize interference with other services.
- The authors are not responsible for legal issues or hardware damage.
- See FAQ for more information:
/wiki/FAQ
For Linux systems (Raspberry Pi OS, Ubuntu, Fedora, Arch, etc.), we provide an install script:
curl -sSL https://botwave.dpip.lol/install | sudo bash
If you'd like to review the script before running it:
curl -sSL https://botwave.dpip.lol/install -o bw_install.sh
cat bw_install.sh
sudo bash bw_install.sh
sudois required for system-wide installation. BotWave installs to/opt/BotWavewith binary symlinks in/usr/local/bin.
Or, alternatively, you can install BotWave manually following our guide at Advanced/Installing BotWave manually.
During installation, you'll be asked a few questions:
--alsa.Installer optionsUsage: curl -sSL https://botwave.dpip.lol/install | sudo bash [-s -- [MODE] [OPTIONS]]
Modes:
client Install client components
server Install server components
both Install both client and server components
Options:
-l, --latest Install from the latest commit (even if unreleased)
-t, --to <version> Install a specific release version
-b, --branch <name> Install from a specific branch (default: main)
--[no-]alsa Setup ALSA loopback card
-h, --help Show this help message
Adding -s -- <server, client or both> --alsa at the end of the command skips the interactive menu and goes straight to installation.
Note that all this is optional and not needed for basic installation.
[!TIP] Not sure which mode to pick?
- One Raspberry Pi: use the Local Client (no server needed). Jump to Using The Local Client.
- Multiple Raspberry Pis: use the Client-Server setup. Jump to Using The Client-Server.
The local client runs entirely on one Raspberry Pi. So no server or second machine required. This is the recommended starting point if you're new to BotWave.
sudo bw-local
Local client optionsusage: bw-local [-h] [--upload-dir UPLOAD_DIR] [--handlers-dir HANDLERS_DIR]
[--skip-checks | --no-skip-checks] [--daemon | --no-daemon]
[--rc RC] [--pk PK] [--talk | --no-talk] [--config CONFIG]
[-v]
BotWave Local Client
options:
-h, --help show this help message and exit
--upload-dir UPLOAD_DIR
Directory to store uploaded files
--handlers-dir HANDLERS_DIR
Directory to retrieve l_ handlers from
--skip-checks, --no-skip-checks
Skip system requirements checks
--daemon, --no-daemon
Run in daemon mode (non-interactive)
--rc RC Remote CLI port for remote management
--pk PK Optional passkey for remote management authentication
--talk, --no-talk Show debug logs
--config CONFIG Path to a config file to load into environment
-v, --version Display version information
Hardware setupTo broadcast, connect a wire or antenna to GPIO 4 (pin 7) on your Raspberry Pi. Even a short bare wire improves range significantly over nothing.
The local client has a CLI to manage it. Type help for a list of all available commands.
BotWave supports most common audio formats (MP3, WAV, FLAC, AAC, OGG, and more). Files are converted to WAV automatically when needed.
You have two options to get files onto your Pi:
Option A: Download a file from a URL:
botwave> dl https://cdn.douxx.tech/files/ss.wav
Option B: Upload a file already on the Pi's filesystem:
[!NOTE] If you need to transfer a file from your personal computer to the Pi first, use
scpfrom your computer:scp mysong.mp3 pi@<pi-ip-address>:/home/pi/Then inside BotWave:
botwave> upload /home/pi/mysong.mp3 # a single file
botwave> upload /home/pi/music/ # every supported file in a folder
botwave> start ss.wav 88 # broadcasts ss.wav at 88 MHz
botwave> stop
botwave> exit # cleans up and exits
This setup lets you manage a network of Raspberry Pis from a central server. It assumes you have one machine with the server component installed and at least one Raspberry Pi with the client component installed, both on the same network.
Start the server on your server machine:
bw-server
Server optionsusage: bw-server [-h] [--host HOST] [--port PORT] [--fport FPORT] [--pk PK]
[--handlers-dir HANDLERS_DIR]
[--start-asap | --no-start-asap]
[--skip-checks | --no-skip-checks] [--rc RC]
[--talk | --no-talk] [--config CONFIG]
[--daemon | --no-daemon] [-v]
BotWave Server
options:
-h, --help show this help message and exit
--host HOST Server host
--port PORT Server port
--fport FPORT File transfer (HTTP) port
--pk PK Passkey for authentication
--handlers-dir HANDLERS_DIR
Directory to retrieve s_ handlers from
--start-asap, --no-start-asap
Start broadcasts immediately (may cause client desync)
--skip-checks, --no-skip-checks
Skip system requirements checks
--rc RC Remote CLI port for remote management
--talk, --no-talk Show debug logs
--config CONFIG Path to a config file to load into environment
--daemon, --no-daemon
Run in non-interactive daemon mode
-v, --version Display version information
Then, on the Raspberry Pi, connect it to the server:
If you don't know your server's IP address, run
< hostname -Iin the BotWave shell.
sudo bw-client 192.168.1.10 # replace with your server's IP
sudois required to access Raspberry Pi hardware.
Client optionsusage: bw-client [-h] [--port PORT] [--fhost FHOST] [--fport FPORT]
[--upload-dir UPLOAD_DIR] [--pk PK]
[--skip-checks | --no-skip-checks] [--talk | --no-talk]
[--config CONFIG] [-v]
[server_host]
BotWave Client
positional arguments:
server_host Server hostname/IP
options:
-h, --help show this help message and exit
--port PORT Server port
--fhost FHOST File transfer server hostname/IP (defaults to
server_host)
--fport FPORT File transfer (HTTP) port
--upload-dir UPLOAD_DIR
Uploads directory
--pk PK Passkey for authentication
--skip-checks, --no-skip-checks
Skip update and requirements checks
--talk, --no-talk Show debug logs
--config CONFIG Path to a config file to load into environment
-v, --version Display version information
Hardware setupTo broadcast, connect a wire or antenna to GPIO 4 (pin 7) on your Raspberry Pi. Even a short bare wire improves range significantly over nothing.
If the connection succeeds, you'll see a message confirming that <pi-hostname>_<pi-ip> has connected.
The server has a CLI to manage it. Type help for a list of all available commands.
When targeting clients, you can use:
raspberry_192.168.1.11raspberryraspberry,raspberry2allBotWave supports most common audio formats (MP3, WAV, FLAC, AAC, OGG, and more). Files are converted automatically when needed.
Option A: Upload a file stored on the server machine:
botwave> upload all /home/server/Downloads/ss.wav # a single file
botwave> upload all /home/server/Downloads/bw_files/ # every supported file in a folder
Option B: Have the client download from a URL directly:
botwave> dl all https://cdn.douxx.tech/files/ss.wav
botwave> start all ss.wav 88 # broadcasts ss.wav at 88 MHz to all clients
botwave> stop all
botwave> exit # kicks all clients and shuts down the server cleanly
BotWave lets you manage your server or local client remotely via WebSocket. We recommend using BWSC for this.
npm i -g bwsc
Add the --rc flag when starting BotWave. A passkey is strongly recommended if exposed to the internet:
bw-server --rc 9939 --pk MyPass # for the server component
bw-local --rc 9939 --pk MyPass # for the local client component
If you add a passkey to the server, also pass it to connecting clients:
sudo bw-client <server-ip> --pk <passkey>
bwsc 192.168.1.10:9939 MyPass # replace with your server IP and passkey
You'll now have access to the full server or local client CLI remotely.
Note that the <, |, and exit commands are not available via remote shell.
botwave> help
For more detailed documentation, check the following resources:
/wiki/server/server.md/client/client.md/local/local.md/autorun/autorun.mdMain/Automate Your SetupMain/Connecting remotelysudo bw-update
Updater optionsUsage: bw-update [OPTIONS]
Options:
-l, --latest Update to the latest commit (even if unreleased)
-t, --to <version> Update to a specific release version
-b, --branch <name> Install from a specific branch (default: main)
-h, --help Show this help message
Examples:
bash # Update to latest release
bash --latest # Update to latest commit
bash --to v1.0.0-oak
curl -sSL https://botwave.dpip.lol/uninstall | sudo bash
[!WARNING] This will delete
/opt/BotWave/. Back up any important files (handlers, uploads) before uninstalling.
You can try the BotWave server directly on cloud platforms:
Got a question or an issue?
BotWave mentions: Here are some posts/websites that talk about BotWave. Thanks to their creators!
BotWave is supported by donations from the following people and projects. Your contributions help with development, hosting, and hardware costs 🙏
BotWave is licensed under GPLv3.0.
Python
82.7%
Shell
17.3%