{"id":31228074,"url":"https://github.com/ytmd-devs/ytmd","last_synced_at":"2025-09-22T05:03:27.550Z","repository":{"id":37174249,"uuid":"182306991","full_name":"ytmd-devs/ytmd","owner":"ytmd-devs","description":"YouTube Music Desktop App bundled with custom plugins","archived":false,"fork":false,"pushed_at":"2025-09-21T08:02:12.000Z","size":19587,"stargazers_count":28117,"open_issues_count":491,"forks_count":1578,"subscribers_count":148,"default_branch":"master","last_synced_at":"2025-09-21T10:05:15.464Z","etag":null,"topics":["adblocker","desktop-app","electron","linux","mac","macosx","music","music-player","music-player-application","node","windows","youtube","youtube-music","youtube-music-player","youtube-player","youtube-playlist"],"latest_commit_sha":null,"homepage":"","language":"TypeScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/ytmd-devs.png","metadata":{"files":{"readme":"README.md","changelog":"changelog.md","contributing":null,"funding":null,"license":"license","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2019-04-19T18:14:40.000Z","updated_at":"2025-09-21T08:37:32.000Z","dependencies_parsed_at":"2023-10-16T02:21:09.476Z","dependency_job_id":"bbcea946-7b22-4fb4-9725-9e8925bb092e","html_url":"https://github.com/ytmd-devs/ytmd","commit_stats":{"total_commits":2879,"total_committers":219,"mean_commits":"13.146118721461187","dds":0.7711010767627648,"last_synced_commit":"8d49c67fcba84cd48f3c436508da93bc61f43b1c"},"previous_names":["ytmd-devs/ytmd"],"tags_count":93,"template":false,"template_full_name":null,"purl":"pkg:github/ytmd-devs/ytmd","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ytmd-devs%2Fytmd","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ytmd-devs%2Fytmd/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ytmd-devs%2Fytmd/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ytmd-devs%2Fytmd/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/ytmd-devs","download_url":"https://codeload.github.com/ytmd-devs/ytmd/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ytmd-devs%2Fytmd/sbom","scorecard":{"id":670630,"data":{"date":"2025-08-11","repo":{"name":"github.com/th-ch/youtube-music","commit":"2a81a4e887cb5cc3c91a672302db6da3c15544e8"},"scorecard":{"version":"v5.2.1-40-gf6ed084d","commit":"f6ed084d17c9236477efd66e5b258b9d4cc7b389"},"score":4.4,"checks":[{"name":"Code-Review","score":0,"reason":"Found 1/20 approved changesets -- score normalized to 0","details":null,"documentation":{"short":"Determines if the project requires human code review before pull requests (aka merge requests) are merged.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#code-review"}},{"name":"Maintained","score":10,"reason":"30 commit(s) and 2 issue activity found in the last 90 days -- score normalized to 10","details":null,"documentation":{"short":"Determines if the project is \"actively maintained\".","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#maintained"}},{"name":"Dangerous-Workflow","score":10,"reason":"no dangerous workflow patterns detected","details":null,"documentation":{"short":"Determines if the project's GitHub Action workflows avoid dangerous patterns.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#dangerous-workflow"}},{"name":"Packaging","score":-1,"reason":"packaging workflow not detected","details":["Warn: no GitHub/GitLab publishing workflow detected."],"documentation":{"short":"Determines if the project is published as a package that others can easily download, install, easily update, and uninstall.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#packaging"}},{"name":"CII-Best-Practices","score":0,"reason":"no effort to earn an OpenSSF best practices badge detected","details":null,"documentation":{"short":"Determines if the project has an OpenSSF (formerly CII) Best Practices Badge.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#cii-best-practices"}},{"name":"Token-Permissions","score":0,"reason":"detected GitHub workflow tokens with excessive permissions","details":["Warn: no topLevel permission defined: .github/workflows/build.yml:1","Info: topLevel 'contents' permission set to 'read': .github/workflows/dependency-review.yml:11","Warn: no topLevel permission defined: .github/workflows/winget-cla.yml:1","Warn: no topLevel permission defined: .github/workflows/winget-submission.yml:1","Info: no jobLevel write permissions found"],"documentation":{"short":"Determines if the project's workflows follow the principle of least privilege.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#token-permissions"}},{"name":"Binary-Artifacts","score":10,"reason":"no binaries found in the repo","details":null,"documentation":{"short":"Determines if the project has generated executable (binary) artifacts in the source repository.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#binary-artifacts"}},{"name":"Security-Policy","score":0,"reason":"security policy file not detected","details":["Warn: no security policy file detected","Warn: no security file to analyze","Warn: no security file to analyze","Warn: no security file to analyze"],"documentation":{"short":"Determines if the project has published a security policy.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#security-policy"}},{"name":"License","score":10,"reason":"license file detected","details":["Info: project has a license file: license:0","Info: FSF or OSI recognized license: MIT License: license:0"],"documentation":{"short":"Determines if the project has defined a license.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#license"}},{"name":"Pinned-Dependencies","score":0,"reason":"dependency not pinned by hash detected -- score normalized to 0","details":["Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/build.yml:21: update your workflow using https://app.stepsecurity.io/secureworkflow/th-ch/youtube-music/build.yml/master?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/build.yml:24: update your workflow using https://app.stepsecurity.io/secureworkflow/th-ch/youtube-music/build.yml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/build.yml:31: update your workflow using https://app.stepsecurity.io/secureworkflow/th-ch/youtube-music/build.yml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/build.yml:38: update your workflow using https://app.stepsecurity.io/secureworkflow/th-ch/youtube-music/build.yml/master?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/build.yml:81: update your workflow using https://app.stepsecurity.io/secureworkflow/th-ch/youtube-music/build.yml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/build.yml:94: update your workflow using https://app.stepsecurity.io/secureworkflow/th-ch/youtube-music/build.yml/master?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/build.yml:99: update your workflow using https://app.stepsecurity.io/secureworkflow/th-ch/youtube-music/build.yml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/build.yml:106: update your workflow using https://app.stepsecurity.io/secureworkflow/th-ch/youtube-music/build.yml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/build.yml:113: update your workflow using https://app.stepsecurity.io/secureworkflow/th-ch/youtube-music/build.yml/master?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/build.yml:131: update your workflow using https://app.stepsecurity.io/secureworkflow/th-ch/youtube-music/build.yml/master?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/build.yml:142: update your workflow using https://app.stepsecurity.io/secureworkflow/th-ch/youtube-music/build.yml/master?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/build.yml:165: update your workflow using https://app.stepsecurity.io/secureworkflow/th-ch/youtube-music/build.yml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/dependency-review.yml:18: update your workflow using https://app.stepsecurity.io/secureworkflow/th-ch/youtube-music/dependency-review.yml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/dependency-review.yml:20: update your workflow using https://app.stepsecurity.io/secureworkflow/th-ch/youtube-music/dependency-review.yml/master?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/winget-submission.yml:23: update your workflow using https://app.stepsecurity.io/secureworkflow/th-ch/youtube-music/winget-submission.yml/master?enable=pin","Info:   0 out of   8 GitHub-owned GitHubAction dependencies pinned","Info:   0 out of   7 third-party GitHubAction dependencies pinned"],"documentation":{"short":"Determines if the project has declared and pinned the dependencies of its build process.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#pinned-dependencies"}},{"name":"Fuzzing","score":0,"reason":"project is not fuzzed","details":["Warn: no fuzzer integrations found"],"documentation":{"short":"Determines if the project uses fuzzing.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#fuzzing"}},{"name":"Branch-Protection","score":0,"reason":"branch protection not enabled on development/release branches","details":["Warn: branch protection not enabled for branch 'master'"],"documentation":{"short":"Determines if the default and release branches are protected with GitHub's branch protection settings.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#branch-protection"}},{"name":"Signed-Releases","score":0,"reason":"Project has not signed or included provenance with any releases.","details":["Warn: release artifact v3.10.0 not signed: https://api.github.com/repos/th-ch/youtube-music/releases/232039744","Warn: release artifact v3.9.0 not signed: https://api.github.com/repos/th-ch/youtube-music/releases/214969822","Warn: release artifact v3.8.1 not signed: https://api.github.com/repos/th-ch/youtube-music/releases/214804772","Warn: release artifact v3.8.0 not signed: https://api.github.com/repos/th-ch/youtube-music/releases/208374887","Warn: release artifact v3.7.5 not signed: https://api.github.com/repos/th-ch/youtube-music/releases/203048551","Warn: release artifact v3.10.0 does not have provenance: https://api.github.com/repos/th-ch/youtube-music/releases/232039744","Warn: release artifact v3.9.0 does not have provenance: https://api.github.com/repos/th-ch/youtube-music/releases/214969822","Warn: release artifact v3.8.1 does not have provenance: https://api.github.com/repos/th-ch/youtube-music/releases/214804772","Warn: release artifact v3.8.0 does not have provenance: https://api.github.com/repos/th-ch/youtube-music/releases/208374887","Warn: release artifact v3.7.5 does not have provenance: https://api.github.com/repos/th-ch/youtube-music/releases/203048551"],"documentation":{"short":"Determines if the project cryptographically signs release artifacts.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#signed-releases"}},{"name":"SAST","score":9,"reason":"SAST tool is not run on all commits -- score normalized to 9","details":["Warn: 10 commits out of 11 are checked with a SAST tool"],"documentation":{"short":"Determines if the project uses static code analysis.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#sast"}},{"name":"Vulnerabilities","score":9,"reason":"1 existing vulnerabilities detected","details":["Warn: Project is vulnerable to: GHSA-76c9-3jph-rj3q"],"documentation":{"short":"Determines if the project has open, known unfixed vulnerabilities.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#vulnerabilities"}}]},"last_synced_at":"2025-08-21T19:54:12.559Z","repository_id":37174249,"created_at":"2025-08-21T19:54:12.559Z","updated_at":"2025-08-21T19:54:12.559Z"},"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":276348330,"owners_count":25626605,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","status":"online","status_checked_at":"2025-09-22T02:00:08.972Z","response_time":79,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["adblocker","desktop-app","electron","linux","mac","macosx","music","music-player","music-player-application","node","windows","youtube","youtube-music","youtube-music-player","youtube-player","youtube-playlist"],"created_at":"2025-09-22T05:01:54.090Z","updated_at":"2025-09-22T05:03:27.530Z","avatar_url":"https://github.com/ytmd-devs.png","language":"TypeScript","readme":"\u003cdiv align=\"center\"\u003e\n\n# YTMD\n\n[![GitHub release](https://img.shields.io/github/release/th-ch/youtube-music.svg?style=for-the-badge\u0026logo=youtube-music)](https://github.com/th-ch/youtube-music/releases/)\n[![GitHub license](https://img.shields.io/github/license/th-ch/youtube-music.svg?style=for-the-badge)](https://github.com/th-ch/youtube-music/blob/master/license)\n[![eslint code style](https://img.shields.io/badge/code_style-eslint-5ed9c7.svg?style=for-the-badge)](https://github.com/th-ch/youtube-music/blob/master/eslint.config.mjs)\n[![Build status](https://img.shields.io/github/actions/workflow/status/th-ch/youtube-music/build.yml?branch=master\u0026style=for-the-badge\u0026logo=youtube-music)](https://GitHub.com/th-ch/youtube-music/releases/)\n[![GitHub All Releases](https://img.shields.io/github/downloads/th-ch/youtube-music/total?style=for-the-badge\u0026logo=youtube-music)](https://GitHub.com/th-ch/youtube-music/releases/)\n[![AUR](https://img.shields.io/aur/version/youtube-music-bin?color=blueviolet\u0026style=for-the-badge\u0026logo=youtube-music)](https://aur.archlinux.org/packages/youtube-music-bin)\n[![Known Vulnerabilities](https://snyk.io/test/github/th-ch/youtube-music/badge.svg)](https://snyk.io/test/github/th-ch/youtube-music)\n\n\u003c/div\u003e\n\n![Screenshot](web/screenshot.png \"Screenshot\")\n\n- Native look \u0026 feel extension, aims at keeping the original interface\n  one click\n\n## Content\n\n- [Features](#features)\n- [Translation](#translation)\n- [Download](#download)\n  - [Arch Linux](#arch-linux)\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://hosted.weblate.org/projects/youtube-music/).\n\n\u003ca href=\"https://hosted.weblate.org/engage/youtube-music/\"\u003e\n  \u003cimg src=\"https://hosted.weblate.org/widget/youtube-music/i18n/multi-auto.svg\" alt=\"translation status\" /\u003e\n  \u003cimg src=\"https://hosted.weblate.org/widget/youtube-music/i18n/287x66-black.png\" alt=\"translation status 2\" /\u003e\n\u003c/a\u003e\n\n## Download\n\nYou can check out the [latest release](https://github.com/th-ch/youtube-music/releases/latest) to quickly find the\nlatest version.\n\n### Arch Linux\n\nInstall the [`youtube-music-bin`](https://aur.archlinux.org/packages/youtube-music-bin) package from the AUR. For AUR installation instructions, take a look at\nthis [wiki page](https://wiki.archlinux.org/index.php/Arch_User_Repository#Installing_packages).\n\n### macOS\n\nYou can install the app using Homebrew (see the [cask definition](https://github.com/th-ch/homebrew-youtube-music)):\n\n```bash\nbrew install th-ch/youtube-music/youtube-music\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/usr/bin/xattr -cr /Applications/YouTube\\ Music.app\n```\n\n### Windows\n\nYou can use the [Scoop package manager](https://scoop.sh) to install the `youtube-music` package from\nthe [`extras` bucket](https://github.com/ScoopInstaller/Extras).\n\n```bash\nscoop bucket add extras\nscoop install extras/youtube-music\n```\n\nAlternately you can use [Winget](https://learn.microsoft.com/en-us/windows/package-manager/winget/), Windows 11s\nofficial CLI package manager to install the `th-ch.YouTubeMusic` 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 th-ch.YouTubeMusic\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://github.com/th-ch/youtube-music/releases/latest).\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 \u003e Visual Tweaks \u003e Themes).\n\nSome predefined themes are available in https://github.com/kerichdev/themes-for-ytmdesktop-player.\n\n## Dev\n\n```bash\ngit clone https://github.com/th-ch/youtube-music\ncd youtube-music\npnpm install --frozen-lockfile\npnpm dev\n```\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/CSS\n\n### Creating a plugin\n\nCreate a folder in `src/plugins/YOUR-PLUGIN-NAME`:\n\n- `index.ts`: the main file of the plugin\n```typescript\nimport style from './style.css?inline'; // import style as inline\n\nimport { createPlugin } from '@/utils';\n\nexport default createPlugin({\n  name: 'Plugin Label',\n  restartNeeded: true, // if value is true, ytmusic show restart dialog\n  config: {\n    enabled: false,\n  }, // your custom config\n  stylesheets: [style], // your custom style,\n  menu: async ({ getConfig, setConfig }) =\u003e {\n    // All *Config methods are wrapped Promise\u003cT\u003e\n    const config = await getConfig();\n    return [\n      {\n        label: 'menu',\n        submenu: [1, 2, 3].map((value) =\u003e ({\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      // you can communicate with renderer plugin\n      ipc.handle('some-event', () =\u003e {\n        return 'hello';\n      });\n    },\n    // it fired when config changed\n    onConfigChange(newConfig) { /* ... */ },\n    // it fired when plugin disabled\n    stop(context) { /* ... */ },\n  },\n  renderer: {\n    async start(context) {\n      console.log(await context.ipc.invoke('some-event'));\n    },\n    // Only renderer available hook\n    onPlayerApiReady(api: YoutubePlayer, context: RendererContext) {\n      // set plugin config easily\n      context.setConfig({ myConfig: api.getVolume() });\n    },\n    onConfigChange(newConfig) { /* ... */ },\n    stop(_context) { /* ... */ },\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// index.ts\nimport style from './style.css?inline'; // import style as inline\n\nimport { createPlugin } from '@/utils';\n\nexport default createPlugin({\n  name: 'Plugin Label',\n  restartNeeded: true, // if value is true, ytmusic will show a restart dialog\n  config: {\n    enabled: false,\n  }, // your custom config\n  stylesheets: [style], // your custom style\n  renderer() {} // define renderer hook\n});\n```\n\n- If you want to change the HTML:\n\n```typescript\nimport { createPlugin } from '@/utils';\n\nexport default createPlugin({\n  name: 'Plugin Label',\n  restartNeeded: true, // if value is true, ytmusic will show the restart dialog\n  config: {\n    enabled: false,\n  }, // your custom config\n  renderer() {\n    console.log('hello from renderer');\n  } // 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://pnpm.io/installation) 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://github.com/electron-userland/electron-builder).\n\n## Production Preview\n\n```bash\npnpm start\n```\n\n## Tests\n\n```bash\npnpm test\n```\n\nUses [Playwright](https://playwright.dev/) to test the app.\n\n## License\n\nMIT © [th-ch](https://github.com/th-ch/youtube-music)\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\u003ealt\u003c/kbd\u003e key (or \u003ckbd\u003e\\`\u003c/kbd\u003e [backtick] if using\nthe in-app-menu plugin)\n","funding_links":[],"categories":["TypeScript","Audio and Video Tools","HarmonyOS"],"sub_categories":["Windows Manager"],"project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fytmd-devs%2Fytmd","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fytmd-devs%2Fytmd","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fytmd-devs%2Fytmd/lists"}