KDE music player built around playlist files. https://music.strawly.app
  • Rust 57%
  • QML 35%
  • C++ 6.1%
  • CMake 1.3%
  • Shell 0.5%
Find a file
Repository files (latest commit first)
Filename Latest commit message Latest commit date
GrumpyStraw 91732a8dc3
All checks were successful
Build and release / Build the Flatpak (push) Successful in 8m21s
Build and release / Publish the release (push) Successful in 13s
Build and release / Announce the release on Zulip (push) Successful in 5s
Jump to a line of lyrics, add a new app icon and a tray icon choice, announce releases on Zulip, and prepare the 1.0.0 release (#22)
## Lyrics

- Clicking a line of lyrics with LRC timestamps seeks to where it starts. `Lyrics::start_of` gives the line's time, and `Player.seekToLyricsLine` seeks there and does nothing for lyrics without timestamps.
- In `LyricsView.qml`, a `TapHandler` on each line seeks, so a drag still scrolls, and a `HoverHandler` shows a pointing hand and brightens the line. Both are off for lyrics without timestamps. A click also ends the pause after a manual scroll, so the view follows the song again straight away.
- Works in the lyrics beside the player bar and in the Lyrics tab.

## App icon and tray icon

- `data/app.strawly.music.svg` is the note on its own, without the green square, and larger. The bore is written as filled outlines with the even-odd rule rather than a mask, so every SVG reader draws it.
- Two monochrome copies, `app.strawly.music-mono-light.svg` (`#fcfcfc`, for dark panels) and `-mono-dark.svg` (`#232629`, for light panels), are installed into the hicolor theme next to the app icon.
- Settings → Tray icon is a dropdown with Color, Monochrome light and Monochrome dark. `Tray.iconStyle` is saved under `tray/iconStyle`, and the tray's icon name follows it at once through ksni's `NewIcon` signal. Color is the default.

## Release announcements

- A new `announce` job in `build-and-release.yml` posts each release to the Music Alerts channel on chat.strawly.app, in a topic named "Strawly Music <version>", with the notes from `release-notes.sh`. Prereleases are not posted. It needs the `ZULIP_BOT_EMAIL` and `ZULIP_BOT_API_KEY` Actions secrets, described in `DEVELOPMENT.md`.

## 1.0.0 release prep

- Version 1.0.0 in `Cargo.toml`, `Cargo.lock` and `CMakeLists.txt`. The README's install command names no version.
- A 1.0.0 entry in `data/app.strawly.music.metainfo.xml`. The bug tracker link and a new contact link point to the Music Feedback channel on chat.strawly.app. `appstreamcli validate` passes.
- The changes are under `[1.0.0] - 2026-10-22` in `CHANGELOG.md`, with the compare links updated. `FEATURES.md` covers clicking a line of lyrics and the tray icon. `ROADMAP.md` drops the icon and the website, which are done.

## Checked

`check.sh` passes in `org.kde.Sdk//6.11`, with all 3 tests. A new test covers the start time of a lyrics line. `.forgejo/release-notes.sh 1.0.0` prints the notes. The Flatpak builds, installs and reports version 1.0.0. The tray publishes the right icon name for each of the three styles, checked over D-Bus on a test bus.

Tested by hand on Plasma 6 (Wayland) with the installed build.

Reviewed-on: #22
2026-10-22 20:09:36 +02:00
.forgejo Jump to a line of lyrics, add a new app icon and a tray icon choice, announce releases on Zulip, and prepare the 1.0.0 release (#22) 2026-10-22 20:09:36 +02:00
data Jump to a line of lyrics, add a new app icon and a tray icon choice, announce releases on Zulip, and prepare the 1.0.0 release (#22) 2026-10-22 20:09:36 +02:00
LICENSES Add Edit Details, lyrics beside the player bar and in a tab, and the sound server's volume, and prepare the 0.6.0 release (#21) 2026-10-21 19:35:06 +02:00
src Jump to a line of lyrics, add a new app icon and a tray icon choice, announce releases on Zulip, and prepare the 1.0.0 release (#22) 2026-10-22 20:09:36 +02:00
tests Add Edit Details, lyrics beside the player bar and in a tab, and the sound server's volume, and prepare the 0.6.0 release (#21) 2026-10-21 19:35:06 +02:00
.gitignore Move the app from C++ to Rust, and fix playlists and drops in the Flatpak (#12) 2026-10-11 20:45:12 +02:00
.qmlls.ini Move the app from C++ to Rust, and fix playlists and drops in the Flatpak (#12) 2026-10-11 20:45:12 +02:00
app.strawly.music.yml Add a playlist folder, several music folders and a Settings window, and prepare the 0.3.0 release (#18) 2026-10-14 19:47:38 +02:00
cargo-sources.json Move the app from C++ to Rust, and fix playlists and drops in the Flatpak (#12) 2026-10-11 20:45:12 +02:00
Cargo.lock Jump to a line of lyrics, add a new app icon and a tray icon choice, announce releases on Zulip, and prepare the 1.0.0 release (#22) 2026-10-22 20:09:36 +02:00
Cargo.toml Jump to a line of lyrics, add a new app icon and a tray icon choice, announce releases on Zulip, and prepare the 1.0.0 release (#22) 2026-10-22 20:09:36 +02:00
CHANGELOG.md Jump to a line of lyrics, add a new app icon and a tray icon choice, announce releases on Zulip, and prepare the 1.0.0 release (#22) 2026-10-22 20:09:36 +02:00
CMakeLists.txt Jump to a line of lyrics, add a new app icon and a tray icon choice, announce releases on Zulip, and prepare the 1.0.0 release (#22) 2026-10-22 20:09:36 +02:00
DEVELOPMENT.md Jump to a line of lyrics, add a new app icon and a tray icon choice, announce releases on Zulip, and prepare the 1.0.0 release (#22) 2026-10-22 20:09:36 +02:00
FEATURES.md Jump to a line of lyrics, add a new app icon and a tray icon choice, announce releases on Zulip, and prepare the 1.0.0 release (#22) 2026-10-22 20:09:36 +02:00
LICENSE.md Add media controls and covers, and update the license (#1) 2026-10-10 22:10:06 +02:00
README.md Jump to a line of lyrics, add a new app icon and a tray icon choice, announce releases on Zulip, and prepare the 1.0.0 release (#22) 2026-10-22 20:09:36 +02:00
ROADMAP.md Jump to a line of lyrics, add a new app icon and a tray icon choice, announce releases on Zulip, and prepare the 1.0.0 release (#22) 2026-10-22 20:09:36 +02:00

Strawly Music (Desktop)

A small KDE music player built around playlist files. It plays and shuffles a playlist or all your music, and edits playlists. It runs on Wayland only, such as a Plasma 6 session.

  • Playlists are plain files. Each playlist is an .m3u8 file in your playlist folder, with paths relative to the file. There is no library database, so a sync tool such as Nextcloud can share the same playlists with the Strawly Music Android app.
  • Only the basics. It plays, shuffles and repeats, edits playlists and shows the queue. No streaming, no online lookups, no store.
  • Fits the Plasma desktop. Built with Kirigami, it follows the Plasma theme, works with the media keys and the Media Player widget, and can close to the tray.
  • Reads only what you give it. The Flatpak has no file system or network access. It reads only the folders you pick, and changes a song only when you edit its details.

What the app does, screen by screen: FEATURES.md.

Install

Download strawly-music-<version>-x86_64.flatpak and SHA256SUMS from the releases page into a folder of their own, then run these in that folder:

sha256sum -c SHA256SUMS
flatpak remote-add --user --if-not-exists flathub https://dl.flathub.org/repo/flathub.flatpakrepo
flatpak install --user strawly-music-*-x86_64.flatpak

To update, install the newer bundle the same way with --reinstall. Your settings stay.

Build and test locally

1. Set up once

flatpak remote-add --user --if-not-exists flathub https://dl.flathub.org/repo/flathub.flatpakrepo
flatpak install --user flathub org.kde.Sdk//6.11 org.kde.Platform//6.11 \
    org.freedesktop.Sdk.Extension.rust-stable//25.08 org.flatpak.Builder

2. Build your checkout and run it

flatpak run --socket=session-bus org.flatpak.Builder --user --install --force-clean build-dir app.strawly.music.yml
flatpak run app.strawly.music

This replaces the installed Strawly Music with your build, and keeps your settings. To go back to a release, install its bundle with flatpak install --user --reinstall.

3. Run the checks

The same checks as the CI: formatting, clippy, the build, qmllint and the tests. Any warning fails.

flatpak run --share=network --filesystem="${PWD}:ro" --env=QT_QPA_PLATFORM=offscreen --command=sh org.kde.Sdk//6.11 -c \
    'sh "$1/.forgejo/check.sh" "$1"; status=$?; rm -rf /tmp/build; exit $status' sh "$PWD"

Clean up

rm -rf build-dir .flatpak-builder                            # the build files
flatpak uninstall --user --delete-data app.strawly.music     # the app and its settings

How the code is laid out, the CI and releases: DEVELOPMENT.md.

More

License

Source First License 1.1. See LICENSE.md. Free for non-commercial use.

The app uses these libraries from the KDE Flatpak runtime at run time. None of them is copied into this repository.

Library License Used for
Qt 6 LGPL-3.0-only Window, QML interface, playback, settings
Kirigami LGPL-2.0-or-later KDE interface components
qqc2-desktop-style LGPL-2.0-or-later, LGPL-3.0-only Native Plasma look
KColorScheme and KConfig LGPL-2.0-or-later Following a new color scheme while the app runs
FFmpeg LGPL-2.1-or-later Decoding the songs, through Qt Multimedia
libpulse LGPL-2.1-or-later The app's volume in the sound server
libwayland MIT Bringing the window to the front when the app is started again

The Rust crates built into the app are under the MIT or zlib License, the Unlicense, or the Unicode License V3. LICENSES/rust-crates.txt lists them. The code for the xdg-activation protocol, written from wayland-protocols while the app builds, is under the MIT License, in LICENSES/xdg-activation-v1.txt. All license texts are in LICENSES/.