Skip to content

Releases: m5stack-lab/Liner

v1.5.0 — Hamburger nav for the web portal

Choose a tag to compare

@ry-ops ry-ops released this 29 Aug 21:38

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

Choose a tag to compare

@ry-ops ry-ops released this 29 Aug 21:26

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

Choose a tag to compare

@ry-ops ry-ops released this 29 Aug 21:00

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

Choose a tag to compare

@ry-ops ry-ops released this 29 Aug 19:40

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

Choose a tag to compare

@ry-ops ry-ops released this 29 Aug 18:54

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

Choose a tag to compare

@ry-ops ry-ops released this 29 Aug 13:35

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.