BotWave
Home AutomationA Raspberry Pi‑based tool for broadcasting audio over FM radio, supporting single devices and multi‑Pi networks with remote control and live streaming
Features
- Standalone client for single‑Pi FM broadcasting without a server
- Server‑client architecture to manage multiple Raspberry Pi clients centrally
- Broadcast audio files (MP3, WAV, FLAC, AAC, etc.) with automatic format conversion
- Remote management: start, stop, and control broadcasts from the server
Recent releases
View all 23 releases →- Update using `bw-update --to v1.1.5-erycibe`
- dlogger dependency bumped to version 1.0.5 (no operational impact required)
- `BWCUSTOM_PATH` removed – use `BACKEND_PATH` instead.
- New env vars `LOG_TIME`, `LOG_TIME_FORMAT`, and `LOG_FILE` for timestamped log output to a file
- `broadcast`/`live` command now correctly parses RT and PI arguments with spaces
- `exit` over WebSocket properly closes the connection
Full changelog
What Changed
- Log timestamps & file output: New
LOG_TIME,LOG_TIME_FORMAT, andLOG_FILEenv vars let you add timestamps to logs and save them to a file. BWCUSTOM_PATHremoved: The deprecatedBWCUSTOM_PATHvariable has been fully dropped. UseBACKEND_PATH.broadcast/livecommand fix: RT and PI arguments are now parsed correctly. Previously, RT values with spaces would break the PI code.exitover WebSocket: Typingexitin a remote session now properly closes the connection instead of being blocked.- WebSocket disconnect handling: Unexpected client disconnections no longer throw an error.
- Miscellaneous:
dloggerdependency bump to1.0.5.
Breaking Changes
[!CAUTION]
BWCUSTOM_PATHhas been removed. Please migrate toBACKEND_PATH.
Updating to this version
To update to this version, run the following command:
bw-update --to v1.1.5-erycibe
Commit history
- =--- v1.1.5-erycibe ---= (
c5b3d67) - docs: added Awesome Selfhosted to Botwave mentions (
c00eeec) - Merge pull request #65 from dpipstudio/logger-update (
fb4f949) - shared,logger.py: added environment variables to customize dlogger settings (
05f1e52) - assets,installation.json: bumped dlogger version to 1.0.5 (
9ae0d4d) - shared,ws_cmd.py: cleaner output when client leave the server (
642f1a3) - shared,ws_cmd.py: handling 'exit' command to close the websocket connection server-side (
46a171b) - local: fixed odd parsing for the "live" command (
0a0b58f) - local: fixed odd parsing for the "start" command (
2ea5605) - .github: updated the version field of the bug report template (
cd5c541) - shared,syscheck.py: removed the usage of BWCUSTOM_PATH (
f19fd30) - shared,bw_custom.py: removed the usage of BWCUSTOM_PATH (
733ac47) - Update installation.json for release v1.1.4-chione (
50e6598)
- `BWCUSTOM_PATH` is deprecated; setting it will emit a warning. Use `BACKEND_PATH` instead.
- `BWCUSTOM_PATH` is deprecated and will be removed in a future release; migrate to `BACKEND_PATH`.
- All three components now accept `--config <file>` flag to load configuration at startup.
- Added `BACKEND_MIN_FREQ` and `BACKEND_MAX_FREQ` env vars to configure backend frequency range.
- `BACKEND_BYPASS_CACHE` flag added to skip cached backend path and force a fresh search.
Full changelog
What Changed
--configflag: All three components now accept--config <path>to load a config file into the environment at startup. See the wiki.BACKEND_PATH:BWCUSTOM_PATHis deprecated in favor ofBACKEND_PATH. A warning will be shown if the old variable is still set.- Frequency range:
BACKEND_MIN_FREQandBACKEND_MAX_FREQlet you configure your backend's allowed frequency range. BACKEND_BYPASS_CACHE: Skips the cached backend path and forces a fresh search.DOWNLOAD_UA: Overrides the user agent used when downloading files (was already there onbw-client, added it tobw-local).- Miscellaneous: Internal env file parser cleanup and a piwave dependency bump.
Breaking Changes
[!WARNING]
BWCUSTOM_PATHis deprecated and will be removed in a future release. Please migrate toBACKEND_PATH.
Updating to this version
To update to this version, run the following command:
bw-update --to v1.1.4-chione
Commit history
- =--- v1.1.4-chione ---= (
6f81bc7) - Merge pull request #64 from dpipstudio/piwave-2.1.13 (
926a281) - docs: updated readme and other specific documentations (
3c334bc) - client: added --config flag (
5e53f02) - local: added --config flag (
fb0eeed) - server: added --config flag (
7f07ca0) - shared,env.py: fixed some bugs (
4562848) - client: supporting correctly custom backends (
bdda819) - local: supporting correctly custom backends (
7feb0a8) - shared,syscheck.py: deprecated bwcustom_path and using backend_bypass_cache (
7465c49) - shared,bw_custom.py: removed support for bwcustom_path in self.name (
56d15a6) - updated piwave to 2.1.13 (
0d90708) - client: using piwave's 2.1.13 new force_search and unsafe constructor parameters (
8c8e0ee) - local: using piwave's 2.1.13 new force_search and unsafe constructor parameters (
0bb8f68) - shared,bw_custom.py: deprecated BWCUSTOM_PATH to introduce a new BACKEND_PATH, additionally dynamically updates the backend name based on the same var. (
ba6c7f4) - shared,bw_custom.py: added BWCUSTOM_MIN_FREQ and BWCUSTOM_MAX_FREQ env vars usage (
4694e33) - local: using the "DOWNLOAD_UA" env variable (
bc2f28e) - Update installation.json for release v1.1.3-aria (
4eb3715)
- Update with `bw-update --to v1.1.3-aria`.
- ALSA device string can be individually controlled using env vars `ALSA_INTERFACE`, `ALSA_CARD`, and `ALSA_DEVICE`.
- New `status` command shows broadcast state on local client and allows server queries (`status all` or specific target).
- Protocol version bumped to 2.1.2, adding the STATUS command.
- Custom command wildcards: `#!/*/ ` in `.cmd` files now target both server and local client.
Full changelog
What Changed
statuscommand: Shows broadcast state (file, frequency, uptime) on the local client. On the server, you can query clients withstatus allor a specific target.- Flexible ALSA config:
ALSA_INTERFACE,ALSA_CARD, andALSA_DEVICEenv vars now individually control the ALSA device string. - Custom command wildcards: Use
#!/*/<command>in.cmdfiles to target both server and local client with one script. - Protocol version: Bumped to
2.1.2by adding theSTATUScommand.
Updating to this version
To update to this version, run the following command:
bw-update --to v1.1.3-aria
Commit history
- =--- v1.1.3-aria ---= (
0c2f5f9) - docs: updated server and local docs (
d325cfb) - server: added a newline (
8d19ba7) - server: added the 'status' command (
ea7362c) - local: updated display (
485d193) - client: fixed f-string (
f8080ee) - client: handling the STATUS command (
12fb836) - shared,protocol.py: Protocol 2.1.2, adds the STATUS command (
7ab9d9d) - local: fixed f-string error on status command (
4dbd01c) - local: added status command (
d6c7470) - updated readme cloud pages (
10f3919) - Merge pull request #60 from dpipstudio/alsa-customization (
d1a89df) - server,local: Updated alsa logs (
7ade7e0) - shared,alsa.py: added ALSA_INTERFACE and ALSA_DEVICE env vars (
c64de8a) - Merge pull request #59 from dpipstudio/ccmd-fix (
236e9bd) - shared,custom_cmds.py: Allowing the use of wildcards (*) instead of 'local' or 'server' (
cee260e) - nobody saw that (tm) (
5e59aa3)
- Define custom commands from .cmd files in the handlers directory; they appear in `help` and execute like built‑ins.
- New handler events `l_onwsjoin` and `l_onwsleave` fire on WebSocket client connect/disconnect.
- Handler scripts receive `BW_ARGV{n}` environment variables for each argument of the last executed command.
Full changelog
What Changed
- Custom commands: You can now define your own commands directly from the handlers directory. Any
.cmdfile with the right shebang will show up inhelpand run like a built-in command. Wiki page - WebSocket join/leave handlers: New
l_onwsjoinandl_onwsleavehandler events fire when a remote client connects or disconnects from the local client's WebSocket. - Command arguments in handlers: Handler scripts now receive
BW_ARGV{n}environment variables containing each argument of the last executed command. - Custom shell interpreter: A new
CMD_INTERPRETERenvironment variable lets you specify which shell to use when running shell and pipe commands (<and|). - IP redaction fix: The IP address redaction is softer to catch edge cases (like the clients IDs).
Updating to this version
To update to this version, run the following command:
bw-update --to v1.1.2-stellata
Commit history
- =--- v1.1.2-stellata ---= (
4a50ab9) - Merge pull request #58 from dpipstudio/cmd-interpreter (
4175cbc) - local: supporting the CMD_INTERPRETER env key for '<' and '|' commands (
016e1e5) - local: fixed pipe command execution (
363ea0c) - server: small fix (
d082ecc) - server: better shell output managment (
c0a5cc8) - server: supporting the CMD_INTERPRETER env key for '<' and '|' commands (
b6de4da) - readme: added nightrunners in the mentions section (
4848196) - Merge pull request #57 from dpipstudio/custom-cmd (
33ccd80) - local: implemented custom commands (
30e49b5) - shared,custom_cmds.py: stop parsing help after the last # (
85a329a) - server: implemented custom commands (
71c3b0b) - shared,custom_cmds.py: supporting help indentation now (
56bf13c) - shared,custom_cmds.py: basic implementation of custom commands (
d58aac3) - Merge pull request #56 from dpipstudio/env_hdl_args (
ec3accc) - docs: updated handlers.md (
9530b2b) - local: added missing onwsjoin/leave handlers (
c0eaee0) - server: bw_argv -> BW_ARGV (
9d0c9ad) - server: added BW_ARGV{n} environment key to handlers execution (
0655784) - local: added BW_ARGV{n} environment key to handlers execution (
31a1ec3) - .github,bug-report.yaml: updated the os examples (
dd4c62a) - .github,other-issue.md: removed the "Other issue" form, just fill a blank issue (
eb01d36) - .github,feature-request.yml: switched to a yaml form for features requests (
a084c62) - .github,bug-report.yaml: switched to a yaml form for bug reports (
5c46925) - hopefully fixed #55 (
66a1d65) - shared,logger.py: be more flexible on ipv4 redacting (
fe7e32a) - Update installation.json for release v1.1.1-malosma (
fa4523b)
Weekly OSS security release digest.
The CVE patches and breaking changes that affected production tools this week. One email, every Sunday.
No spam, unsubscribe anytime.