{"id":41500963,"url":"https://github.com/sebbo2002/pyatv-mqtt-bridge","last_synced_at":"2026-03-11T08:14:12.478Z","repository":{"id":37931134,"uuid":"166275094","full_name":"sebbo2002/pyatv-mqtt-bridge","owner":"sebbo2002","description":"Bridge which allows you to control your Apple TV via MQTT","archived":false,"fork":false,"pushed_at":"2026-03-03T10:14:16.000Z","size":6313,"stargazers_count":49,"open_issues_count":1,"forks_count":7,"subscribers_count":2,"default_branch":"develop","last_synced_at":"2026-03-03T13:52:08.501Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":null,"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/sebbo2002.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-01-17T18:26:37.000Z","updated_at":"2026-03-03T10:11:41.000Z","dependencies_parsed_at":"2026-01-01T13:10:59.768Z","dependency_job_id":null,"html_url":"https://github.com/sebbo2002/pyatv-mqtt-bridge","commit_stats":{"total_commits":472,"total_committers":9,"mean_commits":52.44444444444444,"dds":0.6440677966101696,"last_synced_commit":"cd69080ddf712e92910eaa796341edb7164c0491"},"previous_names":[],"tags_count":272,"template":false,"template_full_name":null,"purl":"pkg:github/sebbo2002/pyatv-mqtt-bridge","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/sebbo2002%2Fpyatv-mqtt-bridge","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/sebbo2002%2Fpyatv-mqtt-bridge/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/sebbo2002%2Fpyatv-mqtt-bridge/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/sebbo2002%2Fpyatv-mqtt-bridge/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/sebbo2002","download_url":"https://codeload.github.com/sebbo2002/pyatv-mqtt-bridge/tar.gz/refs/heads/develop","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/sebbo2002%2Fpyatv-mqtt-bridge/sbom","scorecard":{"id":722761,"data":{"date":"2025-08-11","repo":{"name":"github.com/sebbo2002/pyatv-mqtt-bridge","commit":"76e6418378b3390aed235fbc237b8669ed14c08e"},"scorecard":{"version":"v5.2.1-40-gf6ed084d","commit":"f6ed084d17c9236477efd66e5b258b9d4cc7b389"},"score":4.4,"checks":[{"name":"Maintained","score":10,"reason":"30 commit(s) and 0 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":"Code-Review","score":0,"reason":"Found 0/10 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":"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":"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":"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":"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":"Token-Permissions","score":0,"reason":"detected GitHub workflow tokens with excessive permissions","details":["Warn: topLevel 'contents' permission set to 'write': .github/workflows/dependabot-auto-merge.yml:5","Warn: no topLevel permission defined: .github/workflows/is-semantic-pr.yml:1","Info: found token with 'none' permissions: .github/workflows/lock-issues.yml:1","Warn: no topLevel permission defined: .github/workflows/release-bot.yml:1","Warn: no topLevel permission defined: .github/workflows/stale-issues.yml:1","Warn: no topLevel permission defined: .github/workflows/template-updater.yml:1","Warn: no topLevel permission defined: .github/workflows/test-release.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":"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":"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":3,"reason":"dependency not pinned by hash detected -- score normalized to 3","details":["Warn: third-party GitHubAction not pinned by hash: .github/workflows/dependabot-auto-merge.yml:15: update your workflow using https://app.stepsecurity.io/secureworkflow/sebbo2002/pyatv-mqtt-bridge/dependabot-auto-merge.yml/develop?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/is-semantic-pr.yml:11: update your workflow using https://app.stepsecurity.io/secureworkflow/sebbo2002/pyatv-mqtt-bridge/is-semantic-pr.yml/develop?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/lock-issues.yml:20: update your workflow using https://app.stepsecurity.io/secureworkflow/sebbo2002/pyatv-mqtt-bridge/lock-issues.yml/develop?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/release-bot.yml:16: update your workflow using https://app.stepsecurity.io/secureworkflow/sebbo2002/pyatv-mqtt-bridge/release-bot.yml/develop?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/release-bot.yml:18: update your workflow using https://app.stepsecurity.io/secureworkflow/sebbo2002/pyatv-mqtt-bridge/release-bot.yml/develop?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/release-bot.yml:23: update your workflow using https://app.stepsecurity.io/secureworkflow/sebbo2002/pyatv-mqtt-bridge/release-bot.yml/develop?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/stale-issues.yml:14: update your workflow using https://app.stepsecurity.io/secureworkflow/sebbo2002/pyatv-mqtt-bridge/stale-issues.yml/develop?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/template-updater.yml:13: update your workflow using https://app.stepsecurity.io/secureworkflow/sebbo2002/pyatv-mqtt-bridge/template-updater.yml/develop?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/test-release.yml:18: update your workflow using https://app.stepsecurity.io/secureworkflow/sebbo2002/pyatv-mqtt-bridge/test-release.yml/develop?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/test-release.yml:20: update your workflow using https://app.stepsecurity.io/secureworkflow/sebbo2002/pyatv-mqtt-bridge/test-release.yml/develop?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/test-release.yml:35: update your workflow using https://app.stepsecurity.io/secureworkflow/sebbo2002/pyatv-mqtt-bridge/test-release.yml/develop?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/test-release.yml:37: update your workflow using https://app.stepsecurity.io/secureworkflow/sebbo2002/pyatv-mqtt-bridge/test-release.yml/develop?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/test-release.yml:40: update your workflow using https://app.stepsecurity.io/secureworkflow/sebbo2002/pyatv-mqtt-bridge/test-release.yml/develop?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/test-release.yml:42: update your workflow using https://app.stepsecurity.io/secureworkflow/sebbo2002/pyatv-mqtt-bridge/test-release.yml/develop?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/test-release.yml:48: update your workflow using https://app.stepsecurity.io/secureworkflow/sebbo2002/pyatv-mqtt-bridge/test-release.yml/develop?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/test-release.yml:57: update your workflow using https://app.stepsecurity.io/secureworkflow/sebbo2002/pyatv-mqtt-bridge/test-release.yml/develop?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/test-release.yml:65: update your workflow using https://app.stepsecurity.io/secureworkflow/sebbo2002/pyatv-mqtt-bridge/test-release.yml/develop?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/test-release.yml:88: update your workflow using https://app.stepsecurity.io/secureworkflow/sebbo2002/pyatv-mqtt-bridge/test-release.yml/develop?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/test-release.yml:113: update your workflow using https://app.stepsecurity.io/secureworkflow/sebbo2002/pyatv-mqtt-bridge/test-release.yml/develop?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/test-release.yml:156: update your workflow using https://app.stepsecurity.io/secureworkflow/sebbo2002/pyatv-mqtt-bridge/test-release.yml/develop?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/test-release.yml:197: update your workflow using https://app.stepsecurity.io/secureworkflow/sebbo2002/pyatv-mqtt-bridge/test-release.yml/develop?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/test-release.yml:199: update your workflow using https://app.stepsecurity.io/secureworkflow/sebbo2002/pyatv-mqtt-bridge/test-release.yml/develop?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/test-release.yml:214: update your workflow using https://app.stepsecurity.io/secureworkflow/sebbo2002/pyatv-mqtt-bridge/test-release.yml/develop?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/test-release.yml:220: update your workflow using https://app.stepsecurity.io/secureworkflow/sebbo2002/pyatv-mqtt-bridge/test-release.yml/develop?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/test-release.yml:236: update your workflow using https://app.stepsecurity.io/secureworkflow/sebbo2002/pyatv-mqtt-bridge/test-release.yml/develop?enable=pin","Warn: containerImage not pinned by hash: Dockerfile:14: pin your Docker image by updating ghcr.io/postlund/pyatv:latest to ghcr.io/postlund/pyatv:latest@sha256:1d6cbd53bb0fbb1fb0b66ef8b6bfa6d9a8eee4a671c8a1f7c3b8ac773475667b","Info:   0 out of  10 GitHub-owned GitHubAction dependencies pinned","Info:   0 out of  15 third-party GitHubAction dependencies pinned","Info:   1 out of   2 containerImage dependencies pinned","Info:   6 out of   6 npmCommand 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":"Signed-Releases","score":-1,"reason":"no releases found","details":null,"documentation":{"short":"Determines if the project cryptographically signs release artifacts.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#signed-releases"}},{"name":"Branch-Protection","score":0,"reason":"branch protection not enabled on development/release branches","details":["Warn: branch protection not enabled for branch 'develop'","Warn: branch protection not enabled for branch 'main'"],"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":"Packaging","score":10,"reason":"packaging workflow detected","details":["Info: Project packages its releases by way of GitHub Actions.: .github/workflows/test-release.yml:28"],"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":"SAST","score":0,"reason":"SAST tool is not run on all commits -- score normalized to 0","details":["Warn: 0 commits out of 27 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":5,"reason":"5 existing vulnerabilities detected","details":["Warn: Project is vulnerable to: GHSA-v6h2-p8h4-qcjw","Warn: Project is vulnerable to: GHSA-43f8-2h32-f4cj","Warn: Project is vulnerable to: GHSA-952p-6rrq-rcjv","Warn: Project is vulnerable to: GHSA-hj48-42vr-x3v9","Warn: Project is vulnerable to: GHSA-c2qf-rxjj-qqgw"],"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-22T11:52:04.149Z","repository_id":37931134,"created_at":"2025-08-22T11:52:04.150Z","updated_at":"2025-08-22T11:52:04.150Z"},"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":30375863,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-03-11T06:09:32.197Z","status":"ssl_error","status_checked_at":"2026-03-11T06:09:17.086Z","response_time":84,"last_error":"SSL_read: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"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":[],"created_at":"2026-01-23T19:06:41.982Z","updated_at":"2026-03-11T08:14:12.441Z","avatar_url":"https://github.com/sebbo2002.png","language":"TypeScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"# pyatv-mqtt-bridge\n\n[![License](https://img.shields.io/badge/license-MIT-blue.svg?style=flat-square)](LICENSE)\n![Dependencies](https://img.shields.io/depfu/sebbo2002/pyatv-mqtt-bridge?style=flat-square)\n\nMQTT Bridge allows you to remote control your Apple TV using the MQTT protocol. For many home automation systems, for\nexample, this protocol is supported, so Apple TV can be integrated into your existing automation system. In addition to\nsimulating key presses, you can also query the current state of Apple TV.\n\n## ☁ Installation\n\nBefore you use this module you need to install `pyatv`. See FAQ section for installation tips.\n\nTo install the javascript module via npm run:\n\n    npm install -g @sebbo2002/pyatv-mqtt-bridge\n\nYou can also use the provided Docker container to run `pyatv-mqtt-bridge` within docker:\n\n    docker pull sebbo2002/pyatv-mqtt-bridge\n\n## ⚒ Quick Start\n\n1. Use pyatv to connect to your Apple TV and authenticate [[?](https://pyatv.dev/documentation/getting-started/)]\n\n2. Create a new pyatv-mqtt-bridge configuration file. Your can use the\n   [`config.example.json`](https://github.com/sebbo2002/pyatv-mqtt-bridge/blob/develop/config.example.json) to start\n   with.\n\n```json\n{\n    \"broker\": \"mqtt://192.168.1.1\",\n    \"devices\": [\n        {\n            \"name\": \"Any Name\",\n            \"topic\": \"home/livingroom/appletv\",\n            \"host\": \"192.168.1.2\",\n            \"id\": \"AAAAAAAA-BBBB-CCCC-DDDD-EEEEEEEEEEEE\",\n            \"airplayCredentials\": \"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA:BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB:CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC:DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD\"\n        }\n    ]\n}\n```\n\n3. Start pyatv\n\n- By command line :\n\n```bash\npyatv-mqtt-bridge /home/eve/pyatv-mqtt-bridge.json\n```\n\n- or use the Docker container :\n\n```bash\ndocker run -d --restart=always --name=pyatv-mqtt-bridge \\\n    -v $(pwd)/config.json:/app/config.json:ro \\\n    sebbo2002/pyatv-mqtt-bridge\n```\n\n- or just run the Docker container from the [`docker-compose.yml`](docker-compose.yml) file with :\n\n```bash\ndocker-compose up -d\n```\n\n## 🤨 FAQ\n\n#### How to install pyatv\n\n```bash\npip3 install pyatv\n```\n\n#### How can I enable debugging mode ?\n\nYou just need to add the `--debug` option.\n\n- In command line :\n\n```bash\npyatv-mqtt-bridge --debug /home/eve/pyatv-mqtt-bridge.json\n```\n\n- or while using the Docker container :\n\n```bash\ndocker run -d --restart=always --name=pyatv-mqtt-bridge \\\n    -v $(pwd)/config.json:/app/config.json:ro \\\n    sebbo2002/pyatv-mqtt-bridge \\\n    pyatv-mqtt-bridge --debug /app/config.json\n```\n\n- or while using the [`docker-compose.yml`](docker-compose.yml) file :\n\n```yaml\ncommand: pyatv-mqtt-bridge --debug /app/config.json\n```\n\n\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;then restart the container with :\n\n```bash\n   docker-compose up\n```\n\n#### How can I send commands to the Apple TV?\n\nTo execute a command send any message to the topic `$device/$command`. `$device` is the configured topic of the device\nand `$command` is a command from [this list](https://github.com/sebbo2002/node-pyatv/blob/develop/src/lib/types.ts#L49).\nExample: `/home/living/appletv/menu`. To launch an app, send it's unique id (e.g. `com.google.ios.youtube`) to the topic\n`$device/launch`\n\n#### How to check the current Apple TV power state and other status information ?\n\nYou can listen to several subtopics from the root MQTT topic you've set on your `config.json` file\n(i.e. : `/home/living/appletv`), such as `/powerState` (on, off) and `/deviceState` (iddle, playing, etc...).\n\n#### When the Apple TV is off, the turnOff command turns it on instead, how to fix this ?\n\nSay you send an MQTT message to turn off your Apple TV each time you're leaving home,\nwith the following MQTT topic : `/home/living/appletv/turnOff`.  \n... but when you are back home, sometimes your Apple TV is on ! 🤔\n\nActually, if you press the power button in the right upper corner of your Apple TV remote iOS app, while your Apple TV\nis already off, it will switch it on as well, and this project only provides bridging between MQTT\nand PyATV / Apple TV APIs, with no additional data persistence.\n\n\u003e (You could use the `/suspend` command instead of `/turnOff` to avoid this, but the `suspend` and `wakeup`\n\u003e commands are deprecated and may lead to unexpected behaviors).\n\nSo you just need to implement a listener for the powerState MQTT topic (i.e. : `/home/living/appletv/powerState`)\nin your own app, and store the payload value somewhere (DB, local file, Redis...).\n\nThen your app logic with some \"standby apple TV\" feature should trigger an MQTT `/turnOff` command ONLY when your\npowerState stored value is 'on'.\n\n## Copyright and license\n\nCopyright (c) Sebastian Pekarek under the [MIT license](LICENSE).\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fsebbo2002%2Fpyatv-mqtt-bridge","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fsebbo2002%2Fpyatv-mqtt-bridge","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fsebbo2002%2Fpyatv-mqtt-bridge/lists"}