README.md
Available for macOS, Linux, & Windows
</div> <hr> <div align="center">[!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.
You can help with translation on Hosted Weblate.
<a href="https://bit.ly/48n5YF7"> </a>You can check out the latest release to quickly find the latest version.
Install the pear-desktop package from the AUR. For AUR installation instructions, take a look at
this wiki page.
sudo eopkg install pear-desktop
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
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
*.nsis.7z file for your device architecture in release page.
x64 for 64-bit Windowsia32 for 32-bit Windowsarm64 for ARM64 Windows*-Setup.exe)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.
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).
Using plugins, you can:
BrowserWindow from electron is passed to the plugin handlerCreate a folder in src/plugins/YOUR-PLUGIN-NAME:
index.ts: the main file of the pluginimport 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) {},
},
});
style.css file 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
});
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
});
index.ts file and
example in sponsorblock plugin.pnpmpnpm install --frozen-lockfile to install dependenciespnpm build:OSpnpm 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.
pnpm build as above (choosing the desired target);dist folder.Since devcontainer uses a mount for the workspace, the built files will be available on the host system as well.
pnpm start
pnpm test
Uses Playwright to test the app.
MIT © pear-devs
If Hide Menu option is on - you can show the menu with the <kbd>alt</kbd> key (or <kbd>`</kbd> [backtick] if using
the in-app-menu plugin)