# lx-music-desktop: the source you pick decides what plays, and the license adds a 24 hour clearing duty

> An Electron and Vue desktop music app for Linux, macOS, and Windows whose audio comes from whichever custom source you select, licensed under Apache 2.0 plus added terms that require clearing cached copyright data within 24 hours and bar commercial use.

**lyswhut/lx-music-desktop** — 一个基于 Electron 的音乐软件

- Repository: https://github.com/lyswhut/lx-music-desktop
- Website: https://lyswhut.github.io/lx-music-doc/
- Stars: 54,073 · Forks: 7,045
- Language: TypeScript
- License: Apache-2.0
- Published: 2026-08-17 · Updated: 2026-08-18 · Language: en
- Canonical page: https://hysenlabs.com/projects/lyswhut-lx-music-desktop

## New feature work has been routed to a different project by the same author

The project carries a prominent note that a newer project, Any Listen, has already implemented most of LX Music's functionality in both its desktop and web builds, and adds WebDAV song playback, WebDAV data sync, and standalone playlists on top. The note says future development effort will concentrate on the new project, and that features people ask for here may be considered there instead. It points to issue 1912 for the reasoning and invites daily users to try migrating, with issues welcome when the migration goes wrong. What this repository cannot do is absorb those WebDAV and playlist features, because the note sends them elsewhere, so a feature request filed against LX Music is aimed at a codebase that is no longer where new work happens. A mobile counterpart lives at lyswhut/lx-music-mobile, a separate project address rather than a build of this one.

## The chosen source returns the link and the app never checks whether it is the right song

Clause 1.2 of the added license terms is the most consequential paragraph in the repository, and it reads as a limitation rather than a feature. The project has no ability to obtain audio data on its own. When you ask it to play a track, it passes the song name and artist to whichever source you selected in the custom source setting, and if that source returns a link, the link is treated as the track's audio. The terms state plainly that the accuracy cannot be verified, so the audio you hear may not correspond to the track you asked for, or may refuse to play. Data for the built-in official platforms is pulled from their public servers, the same as the official app returns in a logged out state, then filtered and merged, and no responsibility is claimed for its legality or accuracy. Lists you build yourself come from your own machine or your sync service, also unchecked. The practical consequence: when a track plays wrong, the fault sits in the source you configured, and the app has no way to point at it.

## Apache 2.0 with supplementary terms that override it, including a 24 hour clearing rule

The repository ships Apache License 2.0, and the README states that a set of supplementary terms is layered over it, taking precedence in case of conflict. Those additions are not boilerplate. Copyright data produced while you use the app remains owned by others, and you are required to clear it within 24 hours to avoid infringement. The project is declared free and open sourced on GitHub for technical learning and exchange, makes no guarantee about whether its technology may run against local law, and states that it exists to explore technical feasibility. It accepts no commercial cooperation, advertising included, and no donations. What this means for a reader is a licensing answer rather than a feature list. An organisation that assumes an open source license covers commercial deployment still has to clear the non-commercial clause, and anyone caching cover art or audio locally inherits a 24 hour clock that the software does not enforce on your behalf.

## Default settings are tuned to raise the barrier, not to be friendly on first launch

The README says directly that the built-in default settings and the UI interactions are not aimed at being beginner friendly, and that this is deliberate, to raise the usage threshold. Before using the app you are advised to browse through the settings and adjust them to your own preferences, and to read two documents: the one describing how the music playlist mechanism works, and the one listing the available mouse and keyboard shortcuts. That is the entire onboarding path offered. The consequence is that a first session is a reading task. The two behaviours that trip up newcomers most often, how lists are organised and what the keyboard can drive, are both documented outside the application, and nothing in the repository restates them. Adjusting settings first also pays off later, because the open API is switched on in settings rather than running from startup.

## A folder named portable relocates your whole data directory on Windows

Data lives in a per platform location:

```
$XDG_CONFIG_HOME/lx-music-desktop
~/.config/lx-music-desktop
~/Library/Application Support/lx-music-desktop
%APPDATA%/lx-music-desktop
```

One documented exception overrides all of that on Windows. If a folder named portable exists inside the program folder, the app uses that folder as its data storage location instead, and the behaviour arrived with v1.17.0. The consequence is a data directory that follows the install location rather than the user profile, which suits running from a removable drive, and also means the same build placed on two Windows machines can end up holding two separate sets of settings, sources, and lists with nothing shared between them. That exception is described for Windows only. The Linux and macOS paths above have no portable counterpart described anywhere in the repository.

## Three integration doors, each opening at a different version

Scheme URL support arrived in v1.17.0 and lets something outside the app, a browser for instance, call LX Music; a matching userscript was published on Greasy Fork, and a documentation page covers invoking it yourself. A separate data sync service was released alongside v2.2.0 as its own repository, meant to be deployed on a server you control to get private multi device sync. Open API support came in v2.7.0: enable it and a local HTTP service starts, exposing player related interfaces for third party software to call. Three doors, three version floors, three different dependencies, since one needs a userscript, one needs a server you administer, and one needs a settings toggle. What none of the three descriptions tell you is how that local HTTP service identifies callers. The README defers to the open API documentation, so check it there before pointing other software at the port.

## GitHub Releases is the only original download address and the build matrix lives in npm scripts

Downloads point at GitHub Releases, and the README states that this is the project's only original release address, with every other channel being a third party re-publication that has nothing to do with the project. Provenance is therefore easy to check, because a build from anywhere else did not come from the author. The release history is short and recent: v2.12.4 on 2026-09-12, v2.12.5 on 2026-09-13, and v2.12.6 on 2026-09-19, and package.json carries the same 2.12.6 with its entry point at ./dist/main.js. The build matrix is spelled out as npm scripts where each target is a platform, an architecture, and a packaging style:

```
node build-config/build-pack.js target=win arch=x86_64 type=portable
node build-config/build-pack.js target=win arch=x64 type=green
node build-config/build-pack.js target=win arch=x64 type=win7_setup
```

The aggregate Windows run chains them all, x64, x86, arm64 and x86_64 setups followed by a 7z build, while separate win7 targets carry the legacy installer styles. The supported platforms are Linux, macOS, and Windows 7 or above, on Electron 30+ and Vue 3.

## Pull requests target the dev branch and feature PRs need an issue opened first

Contributing carries three stated conditions, and the first is a gate rather than a courtesy. For a PR that adds a feature, the guidance is to open an issue before submitting so that whether the feature is actually needed can be confirmed. Bug fix PRs are asked to include a description of the situation before and after, plus reproduction steps, and other kinds of PR should carry an explanation of some kind. The order of work is fixed: set up the development environment as the source usage page describes, clone the repository and switch to the dev branch, then submit the PR to dev. The default branch is master, which is where releases are cut, so a PR aimed at the wrong branch will not land. The repository layout follows that workflow, with build-config/ holding the pack scripts, src/ and tsconfig.json on the TypeScript side, and .eslintrc.base.cjs and .eslintrc.cjs for lint configuration.

## Conclusion

LX Music fits someone who already understands its playlist model and hotkeys and wants a local player driven by a source they control. It does not fit a team that needs WebDAV sync or standalone playlists in this codebase, because the maintainer routes that work to a successor project, and it does not fit a commercial deployment, because the added terms forbid it. Before adopting, confirm the source you plan to use returns correct links, and take builds from GitHub Releases rather than a mirror.

## FAQ

### What is the best music app for desktop?

The repository does not rank desktop music apps or compare itself against them. It presents LX Music as a free music search assistant built on Electron 30+ and Vue 3 for Linux, macOS, and Windows 7 and above, and it notes that a newer project, Any Listen, already covers most of its functions.

### Can I download the YouTube Music desktop app?

That name appears nowhere in this repository, so nothing here either supports or blocks it. LX Music is a separate Electron and Vue application, and its README states that GitHub Releases is the only original release address while all other channels are third party re-publications unrelated to the project.

### Can I download YouTube music to your desktop?

The project states that it has no ability to obtain audio data itself. What plays is the link returned by the source you chose in the custom source setting, and the terms say the accuracy of that link cannot be verified, so the audio may not match the track you requested or may fail to play at all.

## Sources

- [Official documentation](https://lyswhut.github.io/lx-music-doc/)
- [Official README](https://github.com/lyswhut/lx-music-desktop#readme)
- [Project repository](https://github.com/lyswhut/lx-music-desktop)
- [Release notes](https://github.com/lyswhut/lx-music-desktop/releases)

---

Hysen Labs editorial analysis, written from the project's own repository and release notes. Cite the canonical page: https://hysenlabs.com/projects/lyswhut-lx-music-desktop
