macOS 手动安装若提示已损坏,需执行 xattr -cr 清除隔离属性;Windows 安装可能被 SmartScreen 以未知发布者拦截;从源码构建需先安装 pnpm 并执行 pnpm install --frozen-lockfile
brew install pear-devs/pear/pear-desktop
winget install pear-devs.pear-desktopREADME 未说明硬件要求
把 YouTube Music 网页版封装成带原生外观的桌面客户端,并支持插件扩展
基于 Electron 的跨平台桌面音乐播放器,为 YouTube Music 等流媒体服务提供增强扩展,支持 Windows、macOS 和 Linux。
核心能力
- 基于 Electron 封装音乐播放器网页为桌面应用
- 通过插件修改 BrowserWindow 与 HTML/CSS 前端
- 插件支持 backend、renderer、preload 三类钩子
- 可加载 CSS 主题文件自定义界面外观
- 提供 IPC 机制实现前后端通信
容易踩的坑
- v3.12.03.12.0最新正式版2026-06-28 · 2026-06-28 15:43 UTC
See changelog for the list of updates and the full diff.
Thanks to all contributors! 🏅
(Note for Windows:
...-Desktop-Web-Setup-3.12.0.exeis an installer, and...-Desktop-3.12.0.exeis a portable version)(Note for macOS: see https://github.com/pear-devs/pear-desktop#macos)
What's Changed
- Add automated build workflow for pull requests from repository members by @ArjixWasTaken with @Copilot in https://github.com/pear-devs/pear-desktop/pull/3981
- Fix workflow skipping build jobs due to incorrect output reference by @ArjixWasTaken with @Copilot in https://github.com/pear-devs/pear-desktop/pull/3982
- Fix
isEnabledfor platform-dependent plugins by @dima-dencep in https://github.com/pear-devs/pear-desktop/pull/3883 - fix(downloader): set player id to 0004e42 by @ArjixWasTaken in https://github.com/pear-devs/pear-desktop/pull/3973
- Add Material UI 3 component library by @ArjixWasTaken in https://github.com/pear-devs/pear-desktop/pull/3606
- Fix GPU performance issue on macOS 26 by updating Electron version by @BigicecreamTaken in https://github.com/pear-devs/pear-desktop/pull/4019
- Fix downloader plugin by @trevin-j in https://github.com/pear-devs/pear-desktop/pull/4069
- fix(album-color-theme): improve theming consistency across UI elements by @Sunkist18 in https://github.com/pear-devs/pear-desktop/pull/4109
- feat(api-server): Add HTTPS support and custom certificate configuration by @mohanad-80 in https://github.com/pear-devs/pear-desktop/pull/3874
- Fixes 2 sync and UI bugs in music-together plugin by @HasselAssel in https://github.com/pear-devs/pear-desktop/pull/4071
- "feat(api-server): add /api/v1/queue/next endpoint by @amontariol in https://github.com/pear-devs/pear-desktop/pull/4117
- chore: extend startingPages with Mixed for you entry by @zknx in https://github.com/pear-devs/pear-desktop/pull/3994
- feat: new icon set by @Su-Yong in https://github.com/pear-devs/pear-desktop/pull/4215
- Fix weblate link by @SuperSandro2000 in https://github.com/pear-devs/pear-desktop/pull/4204
- feat(synced-lyrics): Improve LRC parsing by @ArjixWasTaken in https://github.com/pear-devs/pear-desktop/pull/4269
- fix(discord): Fixed memory leak by repeated RPC failures by @its-iris in https://github.com/pear-devs/pear-desktop/pull/4197
- chore: Updated electron-vite to 5.0.0 by @its-iris in https://github.com/pear-devs/pear-desktop/pull/4203
- refactor(visualizer): Removed restart requirement and refactored impls by @its-iris in https://github.com/pear-devs/pear-desktop/pull/4200
- Update Homebrew installation command by @Over1185 in https://github.com/pear-devs/pear-desktop/pull/4228
- feat: Add toggle to swap the order of like/dislike buttons by @J0w03L in https://github.com/pear-devs/pear-desktop/pull/4221
- Add devcontainer setup by @makisukurisu in https://github.com/pear-devs/pear-desktop/pull/4143
- dep: update libuuid for rpm builds by @Yumeo0 in https://github.com/pear-devs/pear-desktop/pull/4139
- plugin: clock widget by @WyattBreitner in https://github.com/pear-devs/pear-desktop/pull/4161
- Fix: discord activity sanitizer by @Tx-ID in https://github.com/pear-devs/pear-desktop/pull/4119
- refactor(music-together): Removed delay dependency by @its-iris in https://github.com/pear-devs/pear-desktop/pull/4201
- Added Hindi & Bengali romanization support for lyrics by @PranjolDevy in https://github.com/pear-devs/pear-desktop/pull/3933
- feat(synced-lyrics): Add Simplified/Traditional Chinese converter and improve Romanization to display tone by @heinthanth in https://github.com/pear-devs/pear-desktop/pull/4111
- doc: installation instructions for Solus by @Jaredy899 in https://github.com/pear-devs/pear-desktop/pull/4352
- fix(api-server): add required 'alg' option to JWT middleware by @AmriteshKhare in https://github.com/pear-devs/pear-desktop/pull/4368
- fix(synced-lyrics) correct milliseconds pa
- v3.11.02025-09-07 · 2025-09-07 09:01 UTC
查看更新说明
New plugin
transparent-player
- Thanks to @frostybiscuit!
Custom Output Device
- Thanks to @Benjas333!
Enhancement
Synced lyrics with preferred provider / thai romanization
- Thanks to @ArjixWasTaken, @hax0r31337!
API Server
Add websocket endpoint
- Thanks to @Johannes7k75, @cxntered!
Discord RPC
- add song & artist URLs to rich presence (@foxfirecodes)
- add option to display artist/title in status (@pynappo)
Downloader
- Add context menu button for playlists and albums (@lolsuffocate)
Bug fixes
- fix(audio-compressor): real-time behavior and duplicated audio bug (@Benjas333)
- Fixed missing videochange dataupdated event when using shuffle (@rewhex)
- fix(exponential-volume): volume desync bug (@Benjas333)
- Fix https://github.com/th-ch/youtube-music/issues/3621 (@Daksh777)
- chore(docs): update copyright footer year (@RealCyGuy)
Breaking Changes
Lyrics Geniusis deprecated and removed. Please useSynced Lyricsinstead.
Other changes
- See changelog for the list of updates and the full diff.
Thanks to all contributors! 🏅
(Note for macOS: see https://github.com/pear-devs/pear-desktop#macos)
(Note for Ubuntu >=24.04: see #2007)
- v3.10.02025-07-13 · 2025-07-13 08:26 UTC
查看更新说明
New plugin
auth-proxy-adapter
- Thanks to @qiye45!
Enhancement
Synced lyrics with virtual scrolling, and Musixmatch
- Thanks to @ArjixWasTaken!
API Server
Add optional parameter for search
- Thanks to @franz-dc!
Add a note in swagger
- Thanks to @johan456789!
Bug fixes
- fix duplicated scrollbar (@h-banii)
- use gtk 3 switch as workaround (@franz-dc)
- fix(precise-volume): replace constructor check for volume slider (@franz-dc)
Breaking Changes
Lyrics Geniusis deprecated and removed. Please useSynced Lyricsinstead.
Other changes
- Migrate from raw HTML to JSX (TSX / SolidJS)
- Code splitting for performance
- Apply rolldown for project
- Enable the ESM
- See changelog for the list of updates and the full diff.
Thanks to all contributors! 🏅
(Note for macOS: see https://github.com/th-ch/youtube-music#macos)
(Note for Ubuntu 24.04: see #2007)
(Note for Windows:
YouTube-Music-Web-Setup-3.10.0.exeis an installer, andYouTube-Music-3.10.0.exeis a portable version) - v3.9.02025-04-26 · 2025-04-26 19:43 UTC
查看更新说明
New plugin
Performance Improvement
- Special thanks to CY Fung!
Unobtrusive player
- Thanks to @franz-dc
Enhancement
Synced lyrics with romanization
- Thanks to @ArjixWasTaken, @kimjammer, @JellyBrick!
tuna-obs
- added alternativeTitle and tags to tuna (Thanks to @AARP41298)
See changelog for the list of updates and the full diff.
Thanks to all contributors! 🏅
(Note for macOS: see https://github.com/th-ch/youtube-music#macos)
(Note for Ubuntu 24.04: see #2007)
(Note for Windows:
YouTube-Music-Web-Setup-3.9.0.exeis an installer, andYouTube-Music-3.9.0.exeis a portable version) - v3.8.12025-04-25 · 2025-04-25 14:30 UTC
查看更新说明
New plugin
Unobtrusive player
- Thanks to @franz-dc
Enhancement
Synced lyrics with romanization
- Thanks to @ArjixWasTaken, @kimjammer, @JellyBrick!
Bug fix
- Thanks to @Yumeo0, @Paciupa, @LelouchFR, @Tx-ID!
See changelog for the list of updates and the full diff.
Thanks to all contributors! 🏅
(Note for Ubuntu 24.04: see #2007)
(Note for Windows:
YouTube-Music-Web-Setup-3.8.1.exeis an installer, andYouTube-Music-3.8.1.exeis a portable version)
用户点评
登录用户的真实使用记录,可按版本和硬件筛选还没有人点评。第一个说出真实体验的人最有价值。
:pear: Pear Desktop
- Native look & feel extension
[!IMPORTANT] ⚠️ Disclaimer
No Affiliation
This project, and its contributors, are not affiliated with, authorized by, endorsed by, or in any way officially connected with Google LLC, YouTube, or any of their subsidiaries or affiliates. This is an independent, non-profit, and unofficial extension developed by a team of volunteers with the goal of providing a desktop experience.
Trademarks
The names "Google" and "YouTube Music", as well as related names, marks, emblems, and images, are registered trademarks of their respective owners. Any use of these trademarks is for identification and reference purposes only and does not imply any association with the trademark holder. We have no intention of infringing upon these trademarks or causing harm to the trademark holders.
Limitation of Liability
This application (extension) is provided "AS IS", and you use it at your own risk. In no event shall the developers or contributors be liable for any claim, damages, or other liability, including any legal consequences, arising from, out of, or in connection with the software or the use or other dealings in the software. The responsibility for any and all outcomes of using this software rests entirely with the user.
Content
- Features
- Translation
- Download
- Themes
- Dev
- Build your own plugins
- Build
- Production Preview
- Tests
- License
- FAQ
Translation
You can help with translation on Hosted Weblate.
Download
You can check out the latest release to quickly find the latest version.
Arch Linux
Install the pear-desktop package from the AUR. For AUR installation instructions, take a look at
this wiki page.
Solus
sudo eopkg install pear-desktop
macOS
You can install the app using Homebrew (see the cask definition):
brew install pear-devs/pear/pear-desktop
If you install the app manually and get an error "is damaged and can’t be opened." when launching the app, run the following in the Terminal:
/usr/bin/xattr -cr /Applications/Pear\ Desktop.app
Windows
You can use the Scoop package manager to install the pear-desktop package from
the extras bucket.
scoop bucket add extras
scoop install extras/pear-desktop
Alternately you can use Winget, Windows 11s
official CLI package manager to install the pear-devs.pear-desktop package.
Note: Microsoft Defender SmartScreen might block the installation since it is from an "unknown publisher". This is also true for the manual installation when trying to run the executable(.exe) after a manual download here on github (same file).
winget install pear-devs.pear-desktop
How to install without a network connection? (in Windows)
- Download the
*.nsis.7zfile for your device architecture in release page.x64for 64-bit Windowsia32for 32-bit Windowsarm64for ARM64 Windows
- Download installer in release page. (
*-Setup.exe) - Place them in the same directory.
- Run the installer.
Themes
You can load CSS files to change the look of the application (Options > Visual Tweaks > Themes).
Some predefined themes are available in https://github.com/kerichdev/themes-for-ytmdesktop-player.
Dev
git clone https://github.com/pear-devs/pear-desktop
cd pear-desktop
pnpm install --frozen-lockfile
pnpm dev
Instead of installing pnpm on your system, you can also use devcontainers. You can use devcontainers either as a development environment in VS Code, or as a way to easily build the project without installing dependencies on your host system.
Note that this has it's own limitations (for example, GUI doesn't work on, at least some, Linux hosts).
Build your own plugins
Using plugins, you can:
- manipulate the app - the
BrowserWindowfrom electron is passed to the plugin handler - change the front by manipulating the HTML/CSS
Creating a plugin
Create a folder in src/plugins/YOUR-PLUGIN-NAME:
index.ts: the main file of the plugin
import style from './style.css?inline'; // import style as inline
import { createPlugin } from '@/utils';
export default createPlugin({
name: 'Plugin Label',
restartNeeded: true, // if value is true, ytmusic show restart dialog
config: {
enabled: false,
}, // your custom config
stylesheets: [style], // your custom style,
menu: async ({ getConfig, setConfig }) => {
// All *Config methods are wrapped Promise<T>
const config = await getConfig();
return [
{
label: 'menu',
submenu: [1, 2, 3].map((value) => ({
label: `value ${value}`,
type: 'radio',
checked: config.value === value,
click() {
setConfig({ value });
},
})),
},
];
},
backend: {
start({ window, ipc }) {
window.maximize();
// you can communicate with renderer plugin
ipc.handle('some-event', () => {
return 'hello';
});
},
// it fired when config changed
onConfigChange(newConfig) { /* ... */ },
// it fired when plugin disabled
stop(context) { /* ... */ },
},
renderer: {
async start(context) {
console.log(await context.ipc.invoke('some-event'));
},
// Only renderer available hook
onPlayerApiReady(api, context) {
// set plugin config easily
context.setConfig({ myConfig: api.getVolume() });
},
onConfigChange(newConfig) { /* ... */ },
stop(_context) { /* ... */ },
},
preload: {
async start({ getConfig }) {
const config = await getConfig();
},
onConfigChange(newConfig) {},
stop(_context) {},
},
});
Common use cases
- injecting custom CSS: create a
style.cssfile in the same folder then:
// index.ts
import style from './style.css?inline'; // import style as inline
import { createPlugin } from '@/utils';
export default createPlugin({
name: 'Plugin Label',
restartNeeded: true, // if value is true, pear-desktop will show a restart dialog
config: {
enabled: false,
}, // your custom config
stylesheets: [style], // your custom style
renderer() {} // define renderer hook
});
- If you want to change the HTML:
import { createPlugin } from '@/utils';
export default createPlugin({
name: 'Plugin Label',
restartNeeded: true, // if value is true, ytmusic will show the restart dialog
config: {
enabled: false,
}, // your custom config
renderer() {
console.log('hello from renderer');
} // define renderer hook
});
- communicating between the front and back: can be done using the ipcMain module from electron. See
index.tsfile and example insponsorblockplugin.
Build
- Clone the repo
- Follow this guide to install
pnpm - Run
pnpm install --frozen-lockfileto install dependencies - Run
pnpm build:OS
pnpm dist:win- Windowspnpm dist:linux- Linux (amd64)pnpm dist:linux:deb-arm64- Linux (arm64 for Debian)pnpm dist:linux:rpm-arm64- Linux (arm64 for Fedora)pnpm dist:mac- macOS (amd64)pnpm dist:mac:arm64- macOS (arm64)
Builds the app for macOS, Linux, and Windows, using electron-builder.
Building in devcontainer
- Clone the repo;
- Open the folder in VS Code;
- Reopen in container when prompted;
- Run
pnpm buildas above (choosing the desired target); - Collect the built files from the
distfolder.
Since devcontainer uses a mount for the workspace, the built files will be available on the host system as well.
Production Preview
pnpm start
Tests
pnpm test
Uses Playwright to test the app.
License
MIT © pear-devs
FAQ
Why apps menu isn't showing up?
If Hide Menu option is on - you can show the menu with the alt key (or ` [backtick] if using
the in-app-menu plugin)