Repository navigation
Releases: m5stack-lab/Liner
Release list
v1.5.0 — Hamburger nav for the web portal
The settings page has grown a Now Playing card, a Wi-Fi/Volumio form, toggles, and a troubleshooting accordion — enough that it needed real navigation.
What's new
A hamburger icon in the top bar opens a slide-out drawer linking to Now Playing, Settings, and Troubleshooting. Pure CSS (the checkbox-hack pattern) — no JS framework, just the same lightweight inline-handler approach already used elsewhere on the page (closing the drawer on link click).
Verified live over OTA: drawer opens/closes correctly with a dimmed backdrop, and section links jump to the right place.
Known limitations
- Only verified against Tidal playback; other services may have their own quirks.
- The settings/OTA portal remains unauthenticated — fine on a trusted home LAN.
v1.4.0 — Now Playing in the web portal
The settings page now doubles as a Now Playing display — check what's playing from any browser on your network, not just by looking at the device.
What's new
A Now Playing card appears at the top of the settings page (below the status card), showing album art, title, artist, album, and the platform/format/bitrate line — the same data the e-paper display uses. It's built from state cached on every Volumio poll rather than making a separate request, so loading the page adds no extra load on Volumio. Shows "Nothing playing" when idle.
Bug fix
Found via live testing: track/album names containing non-ASCII characters (curly apostrophes, accented letters, etc.) rendered as mojibake — Kindness’t Common Sense instead of Kindness Isn't Common Sense — because the page never declared a character encoding. Added <meta charset="UTF-8"> and matching Content-Type headers.
Known limitations
- Only verified against Tidal playback; other services may have their own quirks.
- The settings/OTA portal remains unauthenticated — fine on a trusted home LAN.
v1.3.0 — Platform, format & bitrate display
For the audio nerds: the now-playing card now shows a bold line under the album name with the streaming platform, audio format/quality, and bitrate.
What's new
A new line appears below the album name whenever Volumio provides the data, e.g.:
TIDAL 44.1kHz/16bit · 1411 kbps
Built from Volumio's service, trackType, samplerate, bitdepth, and bitrate fields (buildMetaLine() in src/main.cpp). It degrades gracefully — only shown when there's actually something to show, since not every Volumio service/plugin populates all of these.
Bug fix
Found via real playback: Volumio's trackType field for Tidal streams reports the service name itself ("Tidal") rather than an audio codec, which duplicated the platform segment shown right next to it (Tidal · TIDAL 44.1kHz/16bit). Fixed — the platform segment is now skipped whenever trackType already matches it.
Known limitations
- Only verified against Tidal; other services may leave some or all of these fields empty, or have their own quirks like the one just fixed.
- Same as prior releases: only the Tidal album art path is fully verified, and the settings/OTA portal remains unauthenticated (fine on a trusted LAN).
v1.2.0 — Persistent settings page, OTA/screensaver toggles
The Wi-Fi/Volumio setup page is no longer a one-time-only first-boot flow — it's now an always-reachable settings page, redesigned mobile-first with toggles and troubleshooting help.
What's new
Persistent settings page
Previously the web form only existed during first-time setup mode (broadcasting Liner-Setup). Now the same server runs for the device's entire lifetime — reachable at http://liner.local/ (or the device's LAN IP) once connected normally, not just while joined to the device's own AP. Change settings without disconnecting from your real network.
Mobile-first redesign
- Status card up top: firmware version, current network, IP, Volumio host
- Toggle switches for OTA updates and the idle screensaver
- A troubleshooting accordion covering refresh timing, missing album art, Wi-Fi recovery via the top button, the OTA command, and where to file issues
- Saving now only forces a reconnect if the network/password actually changed — toggling a setting or changing just the Volumio host applies immediately without disrupting playback
Bug fix
Hit a real regression while building this: starting the web server before Wi-Fi had any network interface up caused a silent full boot hang — no crash, no error logged, just the e-paper stuck mid-refresh indefinitely and the device completely unreachable. Fixed by starting the web server after connectWiFi() instead of before.
Known limitations
- Only the Tidal album art path is verified; local/Spotify/other-service art handling remains untested.
- The settings page and OTA are both unauthenticated — fine on a trusted home LAN, not hardened against a hostile network. Turning the OTA toggle off means updates need USB until it's turned back on via the same page.
- USB flashing/booting still needs manual button presses; OTA updates don't have this problem.
v1.1.0 — On-device Wi-Fi setup, OTA updates, idle screensaver
Wi-Fi credentials and the Volumio host are no longer baked into the firmware at compile time — this release moves them into a captive-style setup portal, and adds OTA updates and an idle screensaver.
What's new
On-device Wi-Fi setup (no more baked-in credentials)
Wi-Fi/Volumio config now lives in NVS, set through a web form the device serves from its own access point (Liner-Setup). This means the prebuilt binary below actually works for anyone — no source build with your own config.h required.
The portal opens automatically on first boot, on a failed connection, or any time you press the top button (which now also disconnects Wi-Fi first if already connected, so it doubles as an on-demand "switch networks" trigger, not just a failure-recovery path).
OTA updates
Once connected, the device is reachable at liner.local for firmware pushes:
pio run -t upload --upload-port liner.local
No password (matches the setup portal's own local-network trust model). The first flash still needs USB; every update after that can go over the air. Fixed two bugs surfaced while building this: a blocking album-art-fetch loop could starve OTA's servicing mid-transfer and stall an update, and ArduinoOTA had no logging callbacks registered so it reported nothing either way.
Idle screensaver
After 5 minutes of nothing playing, the idle screen cycles through generative abstract patterns in the Spectra 6 palette every 10 minutes, instead of sitting on static text indefinitely.
Breaking change
include/config.h.example is gone — Wi-Fi networks are no longer configured at compile time at all. config.h is back to a plain tracked file with just generic defaults (Volumio port, poll interval, setup AP name); no secrets, no gitignore split needed anymore.
Known limitations
- Only the Tidal album art path is verified; local/Spotify/other-service art handling remains untested.
- The setup portal and OTA are both unauthenticated — fine on a trusted home LAN, not hardened against a hostile network.
- USB flashing/booting still needs manual button presses (unchanged from v1.0.0); OTA updates don't have this problem.
v1.0.0 — First working release
The first fully working release of Liner — verified end-to-end on real M5Stack PaperColor hardware against a live Volumio instance.
Features
- Connects to Wi-Fi and polls Volumio's local REST API for playback state
- Now-playing card: album art + title/artist/album, rendered to the 400×600 Spectra 6 e-paper panel
- Idle screen when nothing is playing
- Event-driven refresh — only redraws on track change, since a full e-paper refresh takes 15–30s
- Up/down buttons skip to next/previous track
- Top button cycles through a configurable list of known Wi-Fi networks
- Service-aware album art resolution, with Tidal verified working and local/Spotify paths stubbed in for future testing
Key fix: album art
Tidal (and many CDNs) serve album art as progressive JPEG, which M5GFX's embedded decoder can't handle — drawJpg() was silently failing on every image. Fixed by routing external art URLs through the wsrv.nl image proxy, which re-encodes as baseline JPEG and pre-scales to the display's art box in the same request (also shrinking the download significantly).
Key fix: button responsiveness
The main loop used to block on a 5-second delay() between Volumio polls. Button edge-detection only runs inside M5.update(), so a quick tap that started and ended within that blocked window was never observed. Polling is now non-blocking and time-gated instead, so buttons stay responsive.
Known limitations
- Only the Tidal album art path is verified; local file (
mpd) and Spotify (spop/volspotconnect2) branches exist as stubs, untested - Network switching is a compile-time list, not an interactive on-screen picker (deliberate, given e-paper's refresh time)
- Flashing and booting the board both currently require manual button presses — see the README's Setup section
⚠️ Before flashing this prebuilt binary
Liner-v1.0.0-merged.bin is a single flashable image built with the maintainer's own Wi-Fi network and Volumio host baked in (from a personal config.h, not committed to the repo). It will not connect to your network as-is.
For your own setup, build from source instead: copy include/config.h.example to include/config.h, fill in your own Wi-Fi/Volumio details, then build and flash per the README. This prebuilt binary is provided mainly as a working reference/checksum for M5Burner-style distribution, not a drop-in flash-and-go image.
Flash at offset 0x0 — this is a merged image (bootloader + partition table + app), not just the app partition.