[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"project-2061":3},{"id":4,"name":5,"fullName":6,"owner":7,"repo":5,"description":8,"homepage":9,"htmlUrl":10,"language":11,"languages":10,"totalLinesOfCode":10,"stars":12,"forks":13,"watchers":14,"openIssues":15,"contributorsCount":16,"subscribersCount":16,"size":16,"stars1d":17,"stars7d":18,"stars30d":19,"stars90d":16,"forks30d":16,"starsTrendScore":20,"compositeScore":21,"rankGlobal":10,"rankLanguage":10,"license":22,"archived":23,"fork":23,"defaultBranch":24,"hasWiki":25,"hasPages":23,"topics":26,"createdAt":10,"pushedAt":10,"updatedAt":38,"readmeContent":39,"aiSummary":40,"trendingCount":16,"starSnapshotCount":16,"syncStatus":41,"lastSyncTime":42,"discoverSource":43},2061,"pear-desktop","pear-devs\u002Fpear-desktop","pear-devs","Pear 🍐 is extension for music player","",null,"TypeScript",31905,1825,164,590,0,6,53,254,23,44.78,"MIT License",false,"master",true,[27,28,29,30,31,32,33,34,35,36,37],"desktop-app","electron","linux","mac","macosx","music","music-player","music-player-application","music-player-extension","node","windows","2026-06-12 02:00:36","\u003Cdiv align=\"center\" markdown=\"1\">\n   \u003Csup>Special thanks to:\u003C\u002Fsup>\n   \u003Cbr>\n   \u003Cbr>\n   \u003Ca href=\"https:\u002F\u002Fgo.warp.dev\u002Fpear-desktop\">\n      \u003Cimg alt=\"Warp sponsorship\" width=\"400\" src=\"https:\u002F\u002Fgithub.com\u002Fuser-attachments\u002Fassets\u002F8307ea56-e872-494a-8a9c-de0e296a06ed\" \u002F>\n   \u003C\u002Fa>\n\n### [Warp, built for coding with multiple AI agents](https:\u002F\u002Fgo.warp.dev\u002Fpear-desktop)\n[Available for macOS, Linux, & Windows](https:\u002F\u002Fgo.warp.dev\u002Fpear-desktop)\u003Cbr>\n\n\u003C\u002Fdiv>\n\u003Chr>\n\n\u003Cdiv align=\"center\">\n\n# :pear: Pear Desktop\n\n[![GitHub release](https:\u002F\u002Fimg.shields.io\u002Fgithub\u002Frelease\u002Fpear-devs\u002Fpear-desktop.svg?style=for-the-badge)](https:\u002F\u002Fgithub.com\u002Fpear-devs\u002Fpear-desktop\u002Freleases\u002F)\n[![GitHub license](https:\u002F\u002Fimg.shields.io\u002Fgithub\u002Flicense\u002Fpear-devs\u002Fpear-desktop.svg?style=for-the-badge)](https:\u002F\u002Fgithub.com\u002Fpear-devs\u002Fpear-desktop\u002Fblob\u002Fmaster\u002Flicense)\n[![eslint code style](https:\u002F\u002Fimg.shields.io\u002Fbadge\u002Fcode_style-eslint-5ed9c7.svg?style=for-the-badge)](https:\u002F\u002Fgithub.com\u002Fpear-devs\u002Fpear-desktop\u002Fblob\u002Fmaster\u002Feslint.config.mjs)\n[![Build status](https:\u002F\u002Fimg.shields.io\u002Fgithub\u002Factions\u002Fworkflow\u002Fstatus\u002Fpear-devs\u002Fpear-desktop\u002Fbuild.yml?branch=master&style=for-the-badge)](https:\u002F\u002FGitHub.com\u002Fpear-devs\u002Fpear-desktop\u002Freleases\u002F)\n[![GitHub All Releases](https:\u002F\u002Fimg.shields.io\u002Fgithub\u002Fdownloads\u002Fpear-devs\u002Fpear-desktop\u002Ftotal?style=for-the-badge)](https:\u002F\u002FGitHub.com\u002Fpear-devs\u002Fpear-desktop\u002Freleases\u002F)\n\u003C!--[![AUR](https:\u002F\u002Fimg.shields.io\u002Faur\u002Fversion\u002Fpear-desktop-bin?color=blueviolet&style=for-the-badge)](https:\u002F\u002Faur.archlinux.org\u002Fpackages\u002Fpear-desktop-bin)-->\n[![Known Vulnerabilities](https:\u002F\u002Fsnyk.io\u002Ftest\u002Fgithub\u002Fpear-devs\u002Fpear-desktop\u002Fbadge.svg)](https:\u002F\u002Fsnyk.io\u002Ftest\u002Fgithub\u002Fpear-devs\u002Fpear-desktop)\n\n\u003C\u002Fdiv>\n\n\u003C!--![Screenshot](web\u002Fscreenshot.png \"Screenshot\")-->\n\n- Native look & feel extension\n\n> [!IMPORTANT]\n> ⚠️ Disclaimer\n>\n> **No Affiliation**\n>\n> 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.**\n>\n> **Trademarks**\n>\n> 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.\n>\n> **Limitation of Liability**\n>\n> 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.\n\n## Content\n\n- [Features](#features)\n- [Translation](#translation)\n- [Download](#download)\n  - [Arch Linux](#arch-linux)\n  - [Solus](#solus)\n  - [MacOS](#macos)\n  - [Windows](#windows)\n    - [How to install without a network connection? (in Windows)](#how-to-install-without-a-network-connection-in-windows)\n- [Themes](#themes)\n- [Dev](#dev)\n- [Build your own plugins](#build-your-own-plugins)\n  - [Creating a plugin](#creating-a-plugin)\n  - [Common use cases](#common-use-cases)\n- [Build](#build)\n- [Production Preview](#production-preview)\n- [Tests](#tests)\n- [License](#license)\n- [FAQ](#faq)\n\n## Translation\n\nYou can help with translation on [Hosted Weblate](https:\u002F\u002Fbit.ly\u002F48n5YF7).\n\n\u003Ca href=\"https:\u002F\u002Fbit.ly\u002F48n5YF7\">\n  \u003Cimg src=\"https:\u002F\u002Fbit.ly\u002F4q83L6S\" alt=\"translation status\" \u002F>\n  \u003Cimg src=\"https:\u002F\u002Fbit.ly\u002F4h3zBxo\" alt=\"translation status 2\" \u002F>\n\u003C\u002Fa>\n\n## Download\n\nYou can check out the [latest release](https:\u002F\u002Fgithub.com\u002Fpear-devs\u002Fpear-desktop\u002Freleases\u002Flatest) to quickly find the\nlatest version.\n\n### Arch Linux\n\nInstall the [`pear-desktop`](https:\u002F\u002Faur.archlinux.org\u002Fpackages\u002Fpear-desktop) package from the AUR. For AUR installation instructions, take a look at\nthis [wiki page](https:\u002F\u002Fwiki.archlinux.org\u002Findex.php\u002FArch_User_Repository#Installing_packages).\n\n### [Solus](https:\u002F\u002Fgetsol.us\u002F)\n\n```bash\nsudo eopkg install pear-desktop\n```\n\n### macOS\n\nYou can install the app using Homebrew (see the [cask definition](https:\u002F\u002Fgithub.com\u002Fpear-devs\u002Fhomebrew-pear)):\n\n```bash\nbrew install pear-devs\u002Fpear\u002Fpear-desktop\n```\n\nIf 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:\n\n```bash\n\u002Fusr\u002Fbin\u002Fxattr -cr \u002FApplications\u002FPear\\ Desktop.app\n```\n\n### Windows\n\nYou can use the [Scoop package manager](https:\u002F\u002Fscoop.sh) to install the `pear-desktop` package from\nthe [`extras` bucket](https:\u002F\u002Fgithub.com\u002FScoopInstaller\u002FExtras).\n\n```bash\nscoop bucket add extras\nscoop install extras\u002Fpear-desktop\n```\n\nAlternately you can use [Winget](https:\u002F\u002Flearn.microsoft.com\u002Fen-us\u002Fwindows\u002Fpackage-manager\u002Fwinget\u002F), Windows 11s\nofficial CLI package manager to install the `pear-devs.pear-desktop` package.\n\n*Note: Microsoft Defender SmartScreen might block the installation since it is from an \"unknown publisher\". This is also\ntrue for the manual installation when trying to run the executable(.exe) after a manual download here on github (same\nfile).*\n\n```bash\nwinget install pear-devs.pear-desktop\n```\n\n#### How to install without a network connection? (in Windows)\n\n- Download the `*.nsis.7z` file for _your device architecture_ in [release page](https:\u002F\u002Fgithub.com\u002Fpear-devs\u002Fpear-desktop\u002Freleases\u002Flatest).\n  - `x64` for 64-bit Windows\n  - `ia32` for 32-bit Windows\n  - `arm64` for ARM64 Windows\n- Download installer in release page. (`*-Setup.exe`)\n- Place them in the **same directory**.\n- Run the installer.\n\n## Themes\n\nYou can load CSS files to change the look of the application (Options > Visual Tweaks > Themes).\n\nSome predefined themes are available in https:\u002F\u002Fgithub.com\u002Fkerichdev\u002Fthemes-for-ytmdesktop-player.\n\n## Dev\n\n```bash\ngit clone https:\u002F\u002Fgithub.com\u002Fpear-devs\u002Fpear-desktop\ncd pear-desktop\npnpm install --frozen-lockfile\npnpm dev\n```\n\nInstead of installing pnpm on your system, you can also use [devcontainers](https:\u002F\u002Fcontainers.dev\u002F). 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.\n\nNote that this has it's own limitations (for example, GUI doesn't work on, at least some, Linux hosts).\n\n## Build your own plugins\n\nUsing plugins, you can:\n\n- manipulate the app - the `BrowserWindow` from electron is passed to the plugin handler\n- change the front by manipulating the HTML\u002FCSS\n\n### Creating a plugin\n\nCreate a folder in `src\u002Fplugins\u002FYOUR-PLUGIN-NAME`:\n\n- `index.ts`: the main file of the plugin\n```typescript\nimport style from '.\u002Fstyle.css?inline'; \u002F\u002F import style as inline\n\nimport { createPlugin } from '@\u002Futils';\n\nexport default createPlugin({\n  name: 'Plugin Label',\n  restartNeeded: true, \u002F\u002F if value is true, ytmusic show restart dialog\n  config: {\n    enabled: false,\n  }, \u002F\u002F your custom config\n  stylesheets: [style], \u002F\u002F your custom style,\n  menu: async ({ getConfig, setConfig }) => {\n    \u002F\u002F All *Config methods are wrapped Promise\u003CT>\n    const config = await getConfig();\n    return [\n      {\n        label: 'menu',\n        submenu: [1, 2, 3].map((value) => ({\n          label: `value ${value}`,\n          type: 'radio',\n          checked: config.value === value,\n          click() {\n            setConfig({ value });\n          },\n        })),\n      },\n    ];\n  },\n  backend: {\n    start({ window, ipc }) {\n      window.maximize();\n\n      \u002F\u002F you can communicate with renderer plugin\n      ipc.handle('some-event', () => {\n        return 'hello';\n      });\n    },\n    \u002F\u002F it fired when config changed\n    onConfigChange(newConfig) { \u002F* ... *\u002F },\n    \u002F\u002F it fired when plugin disabled\n    stop(context) { \u002F* ... *\u002F },\n  },\n  renderer: {\n    async start(context) {\n      console.log(await context.ipc.invoke('some-event'));\n    },\n    \u002F\u002F Only renderer available hook\n    onPlayerApiReady(api, context) {\n      \u002F\u002F set plugin config easily\n      context.setConfig({ myConfig: api.getVolume() });\n    },\n    onConfigChange(newConfig) { \u002F* ... *\u002F },\n    stop(_context) { \u002F* ... *\u002F },\n  },\n  preload: {\n    async start({ getConfig }) {\n      const config = await getConfig();\n    },\n    onConfigChange(newConfig) {},\n    stop(_context) {},\n  },\n});\n```\n\n### Common use cases\n\n- injecting custom CSS: create a `style.css` file in the same folder then:\n\n```typescript\n\u002F\u002F index.ts\nimport style from '.\u002Fstyle.css?inline'; \u002F\u002F import style as inline\n\nimport { createPlugin } from '@\u002Futils';\n\nexport default createPlugin({\n  name: 'Plugin Label',\n  restartNeeded: true, \u002F\u002F if value is true, pear-desktop will show a restart dialog\n  config: {\n    enabled: false,\n  }, \u002F\u002F your custom config\n  stylesheets: [style], \u002F\u002F your custom style\n  renderer() {} \u002F\u002F define renderer hook\n});\n```\n\n- If you want to change the HTML:\n\n```typescript\nimport { createPlugin } from '@\u002Futils';\n\nexport default createPlugin({\n  name: 'Plugin Label',\n  restartNeeded: true, \u002F\u002F if value is true, ytmusic will show the restart dialog\n  config: {\n    enabled: false,\n  }, \u002F\u002F your custom config\n  renderer() {\n    console.log('hello from renderer');\n  } \u002F\u002F define renderer hook\n});\n```\n\n- communicating between the front and back: can be done using the ipcMain module from electron. See `index.ts` file and\n  example in `sponsorblock` plugin.\n\n## Build\n\n1. Clone the repo\n2. Follow [this guide](https:\u002F\u002Fpnpm.io\u002Finstallation) to install `pnpm`\n3. Run `pnpm install --frozen-lockfile` to install dependencies\n4. Run `pnpm build:OS`\n\n- `pnpm dist:win` - Windows\n- `pnpm dist:linux` - Linux (amd64)\n- `pnpm dist:linux:deb-arm64` - Linux (arm64 for Debian)\n- `pnpm dist:linux:rpm-arm64` - Linux (arm64 for Fedora)\n- `pnpm dist:mac` - macOS (amd64)\n- `pnpm dist:mac:arm64` - macOS (arm64)\n\nBuilds the app for macOS, Linux, and Windows,\nusing [electron-builder](https:\u002F\u002Fgithub.com\u002Felectron-userland\u002Felectron-builder).\n\n### Building in devcontainer\n\n1. Clone the repo;\n2. Open the folder in VS Code;\n3. Reopen in container when prompted;\n4. Run `pnpm build` as above (choosing the desired target);\n5. Collect the built files from the `dist` folder.\n\nSince devcontainer uses a mount for the workspace, the built files will be available on the host system as well.\n\n## Production Preview\n\n```bash\npnpm start\n```\n\n## Tests\n\n```bash\npnpm test\n```\n\nUses [Playwright](https:\u002F\u002Fplaywright.dev\u002F) to test the app.\n\n## License\n\nMIT © [pear-devs](https:\u002F\u002Fgithub.com\u002Fpear-devs\u002Fpear-desktop)\n\n## FAQ\n\n### Why apps menu isn't showing up?\n\nIf `Hide Menu` option is on - you can show the menu with the \u003Ckbd>alt\u003C\u002Fkbd> key (or \u003Ckbd>\\`\u003C\u002Fkbd> [backtick] if using\nthe in-app-menu plugin)\n","Pear Desktop 是一个音乐播放器的扩展应用，旨在为用户提供更佳的桌面体验。它基于 Electron 框架开发，使用 TypeScript 语言编写，确保了跨平台兼容性（支持 Windows、macOS 和 Linux）。核心功能包括原生外观与感觉的设计，让应用程序在不同操作系统上都能无缝融合。此外，Pear Desktop 还注重代码质量和安全性，采用了 ESLint 等工具来保证项目质量。适合那些希望在桌面环境下获得更流畅、更美观音乐播放体验的用户使用。",2,"2026-06-11 02:47:50","top_all"]