radico8 is a web radio that plays pico-8 music.
there was a youtube stream too, but it went down sometime around 2025-10-06 and i don't currently plan on bringing it back up. the youtube stream relies on ffmpeg, which has been straining my server the past few years (maybe a misconfiguration i dunno).
if you know some good pico-8 music, submit a pull request adding the lexaloffle cart-id and track to the playlist.txt file.
you can submit a github issues for issues with the stream, feature suggestions, and bugfixes.
giving credit to the actual artist of a song is a manual process. if a song is attributed to the wrong user please submit a pull request with the fix in the playlist.txt file.
- a headless instance of pico-8 is running inside a docker container.
- pico-8 listens on stdin to figure out which carts it should play next.
- a shell script listens on stdout of pico-8 to produce the youtube video image.
- ffmpeg listens to any audio produced in the docker container and forwards it to icecast and youtube.
- a cron job runs every hour to load playlist updates into the radio.
- carts are downloaded as p8.png images directly from lexaloffle.
- the pico-8 console is rebooted every monday and whenever i push code updates.
- a song will play until it stops or for about 10-15 seconds after it starts repeating.
- the max length a single song can play is about 7 minutes, before radico8 will end the song.
- radico8 shuffles the entire playlist then plays songs until every song has been played.
you can run the radio locally on a linux system. here are the steps:
# the radico8 p8/lua files should be in the cartridges directory.
> ls cartridges | grep radico8
radico8.lua
radico8.p8
# perform a 1 time download of the carts listed in the playlist file.
# running this script multiple times will skip carts that are already downloaded.
# this populates the cartridges directory with ".p8" and ".txt" files and removes comments/formatting from the playlist.txt file.
> ./scripts/install_carts ./playlist.txt cartridges
Saved size: 212 212 3665
# and finally, run the radio!
# this opens up pico8 and loads carts/songs on demand.
# also listens to changes in the playlist.txt file (good for a 24/7 radio).
> ./scripts/local-radio /opt/pico8/pico8 cartridges playlist.txt
hotfoot-2:0:0:34:repeat:
seinsim-0:18:0:16:repeat:
...
radico8 is currently hosted on a tiny arch-linux linode instance along with some other things. there are 4 parts to the server setup:
- the local-radio (pico8 running within a bash script)
- the cart install script (timer that downloads cart data when playlist.txt updates)
- the youtube stream (ffmpeg forwarding audio+picture into youtube stream) (currently disabled)
- the webradio stream (ffmpeg forwarding audio to existing icecast installation
radico8 could be setup on any linux machine, but it is a bit of a manual process. here are the general steps:
1. ensure you have the docker daemon installed & running
2. if you want to host a webradio:
- ensure you have icecast installed: https://icecast.org/
- make sure you have a file at: /etc/radico8/icecast.env
- the file content would be:
PASS=<icecast-stream-token>
3. if you want to host a youtube stream:
- setup a youtube stream, use these scripts to help:
- ./get_oauth_refresh_token
- ./update_youtube_broadcast
- make sure you have a file at: /etc/radico8/youtube.env
- the file content would be:
PASS=<youtube-stream-token>
4. run this script: install_to_server
- it may require some tweaking since it's designed for a specific setup
- systemd services: radico8 radico8-icecast radico8-youtube radico8-youtube-backup
- systemd timers: radico8-install-carts radico8-reboot
5. use systemd to manage the radico8 server:
- initial install of carts: systemctl restart radico8-install-carts
- restart radico8: systemctl restart radico8
- learn about pico-8: https://www.lexaloffle.com/pico-8.php
- pico-8 font for youtube stream: https://www.lexaloffle.com/bbs/?tid=3760
- inspired by the krelez's chiptune radio: https://www.youtube.com/c/Krelez
- splore api: https://www.ebartsoft.com/pico8
please don't sue me. i'm not that rich anyways, so it's probably not worth it. if you're the author of a song and you'd like it removed from the radio, just submit a pull request to remove that song.
this repo is licensed under CC4-BY-NC-SA because most pico-8 games use that license too.