{"id":18493647,"url":"https://github.com/mechazawa/minidrone-js","last_synced_at":"2026-05-30T04:01:22.178Z","repository":{"id":28743279,"uuid":"118938269","full_name":"Mechazawa/minidrone-js","owner":"Mechazawa","description":"🚁 Parrot Minidrone library","archived":false,"fork":false,"pushed_at":"2026-05-28T21:42:27.000Z","size":2102,"stargazers_count":31,"open_issues_count":23,"forks_count":6,"subscribers_count":4,"default_branch":"master","last_synced_at":"2026-05-28T23:20:55.494Z","etag":null,"topics":["ble","bluetooth","bluetooth-low-energy","drone","mambo","minidrone","parrot"],"latest_commit_sha":null,"homepage":"https://minidrone.js.org","language":"JavaScript","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/Mechazawa.png","metadata":{"files":{"readme":"README.md","changelog":null,"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":"2018-01-25T16:29:42.000Z","updated_at":"2024-12-13T09:32:38.000Z","dependencies_parsed_at":"2023-10-12T14:28:28.164Z","dependency_job_id":"5aa33d18-2ff1-48f7-83c1-f2091c5d750e","html_url":"https://github.com/Mechazawa/minidrone-js","commit_stats":null,"previous_names":[],"tags_count":20,"template":false,"template_full_name":null,"purl":"pkg:github/Mechazawa/minidrone-js","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Mechazawa%2Fminidrone-js","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Mechazawa%2Fminidrone-js/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Mechazawa%2Fminidrone-js/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Mechazawa%2Fminidrone-js/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/Mechazawa","download_url":"https://codeload.github.com/Mechazawa/minidrone-js/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Mechazawa%2Fminidrone-js/sbom","scorecard":{"id":92264,"data":{"date":"2025-08-11","repo":{"name":"github.com/Mechazawa/minidrone-js","commit":"fb65be306acd7117e59f230da1a5558bfdc37484"},"scorecard":{"version":"v5.2.1-40-gf6ed084d","commit":"f6ed084d17c9236477efd66e5b258b9d4cc7b389"},"score":2.9,"checks":[{"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":"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":"Token-Permissions","score":0,"reason":"detected GitHub workflow tokens with excessive permissions","details":["Warn: no topLevel permission defined: .github/workflows/node.js.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":"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":"Code-Review","score":0,"reason":"Found 0/19 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":0,"reason":"0 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 0","details":null,"documentation":{"short":"Determines if the project is \"actively maintained\".","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#maintained"}},{"name":"Pinned-Dependencies","score":2,"reason":"dependency not pinned by hash detected -- score normalized to 2","details":["Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/node.js.yml:14: update your workflow using https://app.stepsecurity.io/secureworkflow/Mechazawa/minidrone-js/node.js.yml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/node.js.yml:16: update your workflow using https://app.stepsecurity.io/secureworkflow/Mechazawa/minidrone-js/node.js.yml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/node.js.yml:21: update your workflow using https://app.stepsecurity.io/secureworkflow/Mechazawa/minidrone-js/node.js.yml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/node.js.yml:45: update your workflow using https://app.stepsecurity.io/secureworkflow/Mechazawa/minidrone-js/node.js.yml/master?enable=pin","Info:   0 out of   4 GitHub-owned GitHubAction dependencies pinned","Info:   1 out of   1 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":"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":"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":"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":"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 '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":"SAST","score":0,"reason":"SAST tool is not run on all commits -- score normalized to 0","details":["Warn: 0 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":3,"reason":"7 existing vulnerabilities detected","details":["Warn: Project is vulnerable to: GHSA-v6h2-p8h4-qcjw","Warn: Project is vulnerable to: GHSA-grv7-fg5c-xmjg","Warn: Project is vulnerable to: GHSA-3xgq-45jj-v275","Warn: Project is vulnerable to: GHSA-78xj-cgh5-2h22","Warn: Project is vulnerable to: GHSA-2p57-rm9w-gvfp","Warn: Project is vulnerable to: GHSA-952p-6rrq-rcjv","Warn: Project is vulnerable to: GHSA-f5x3-32g6-xq36"],"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-15T08:08:43.108Z","repository_id":28743279,"created_at":"2025-08-15T08:08:43.109Z","updated_at":"2025-08-15T08:08:43.109Z"},"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":33679306,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-26T15:22:16.424Z","status":"online","status_checked_at":"2026-05-30T02:00:06.278Z","response_time":92,"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":["ble","bluetooth","bluetooth-low-energy","drone","mambo","minidrone","parrot"],"created_at":"2024-11-06T13:15:37.259Z","updated_at":"2026-05-30T04:01:22.170Z","avatar_url":"https://github.com/Mechazawa.png","language":"JavaScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"Minidrone-js [![](https://badge.fury.io/js/minidrone-js.svg)](https://badge.fury.io/js/minidrone-js) [![](https://api.codeclimate.com/v1/badges/fc937ad532e4160ea2f0/maintainability)](https://codeclimate.com/github/Mechazawa/minidrone-js/maintainability) [![](https://travis-ci.org/Mechazawa/minidrone-js.svg?branch=master)](https://travis-ci.org/Mechazawa/minidrone-js)\n---------------\n\nMinidrone-js is an easy to use drone library for the Parrot \nMinidrones. In theory it supports many different Parrot drones \nbesides Minidrones but this is untested. \n\nThis library is loosely based on the work by [fetherston] for \n[npm-parrot-minidrone] and [amymcgovern] for [pymambo].\n\n[amymcgovern]: https://github.com/amymcgovern\n[pymambo]: https://github.com/amymcgovern/pymambo\n[fetherston]: https://github.com/fetherston\n[npm-parrot-minidrone]: https://github.com/fetherston/npm-parrot-minidrone\n\n## Functionality\nThis library is designed to support the two-way command communication \nprotocol used by Parrot drones. It supports receiving sensor updates \nand sending commands based on the [xml specification]. \n\n[xml specification]: https://github.com/Parrot-Developers/arsdk-xml/blob/master/xml/\n\n## Installation\n\n```bash\nnpm install minidrone-js --save\n```\n\n## TypeScript\n\nThe package ships TypeScript declarations (`.d.ts`), generated from the JSDoc, so\neditors and TypeScript projects get autocompletion and type-checking. No separate\n`@types` package is required.\n\n## Example\n\nThis example will make the drone take-off, do a flip and then land again.\n\n```js\nconst {DroneConnection, CommandParser, BLEConnector} = require('minidrone-js');\n\nconst parser = new CommandParser();\n\n// Pick a connector for your drone: BLEConnector() for Bluetooth or\n// WifiConnector() for Wifi drones. The DroneConnection wraps it.\nconst connector = new BLEConnector();\nconst drone = new DroneConnection(connector);\n\n\n/* \n * Commands are easily found by reading the xml specification\n * https://github.com/Parrot-Developers/arsdk-xml/blob/master/xml/\n */\nconst takeoff = parser.getCommand('minidrone', 'Piloting', 'TakeOff');\nconst landing = parser.getCommand('minidrone', 'Piloting', 'Landing');\nconst backFlip = parser.getCommand('minidrone', 'Animations', 'Flip', {direction: 'back'});\n\n/** Helper function */\nfunction sleep(ms) {\n  return new Promise(a =\u003e setTimeout(a, ms));\n}\n\nvoid async function() {\n  // connect() lives on the connector; the connection forwards its 'connected' event\n  await connector.connect();\n  await new Promise(resolve =\u003e drone.once('connected', resolve));\n\n  // Makes the code a bit clearer\n  const runCommand = x =\u003e drone.runCommand(x);\n\n  await runCommand(takeoff);\n\n  await sleep(2000);\n  await runCommand(backFlip);\n\n  await sleep(2000);\n  await runCommand(landing);\n\n  await sleep(5000);\n  process.exit();\n}();\n```\n\n## Connectors\n\nA `DroneConnection` wraps a *connector* that handles the transport. Two are provided:\n\n| Connector | Transport | `connect()` |\n| --- | --- | --- |\n| `BLEConnector` | Bluetooth LE (via `@abandonware/noble`) | `connect()` scans for and connects to a nearby drone |\n| `WifiConnector` | Wifi (UDP/TCP) | `connect()` auto-discovers over mDNS, or `connect(host, port)` connects directly |\n\n```js\nconst { DroneConnection, WifiConnector } = require('minidrone-js');\n\nconst drone = new DroneConnection(new WifiConnector());\n// drone.connector.connect();          // mDNS auto-discovery\n// drone.connector.connect('192.168.99.3', 44444); // or connect directly\n```\n\nmDNS auto-discovery relies on the optional native [`mdns`] dependency. It is an\n`optionalDependency`, so installs never fail when it can't be built (e.g. on Node\nversions where it has no prebuilt binary). Without it, BLE and the direct\n`connect(host, port)` path still work. Only no-argument Wifi discovery needs it,\nand it rejects with a clear error when it is unavailable. On Linux `mdns` needs\n`libavahi-compat-libdnssd-dev`.\n\n[`mdns`]: https://www.npmjs.com/package/mdns\n\nYou can also use a connector directly without `DroneConnection`:\n\n```js\nconst { WifiConnector, CommandParser } = require('minidrone-js');\n\nconst parser = new CommandParser();\nconst drone = new WifiConnector();\n\ndrone.on('connected', () =\u003e drone.sendCommand(parser.getCommand('minidrone', 'Piloting', 'TakeOff')));\ndrone.connect();\n```\n\n### Bluetooth on unsupported hardware, or a custom transport\n\n`BLEConnector` loads [`@abandonware/noble`] lazily, only when you construct one.\nSo `require('minidrone-js')` works without noble's native binding, and Wifi or a\ncustom connector run without it. If noble does not support your Bluetooth\nhardware, you have three options:\n\n- **Inject your own noble** (for example, one configured with a custom hci-socket\n  binding): `new BLEConnector(droneFilter, myNoble)`.\n- **Use Wifi instead.** `WifiConnector` needs no Bluetooth at all.\n- **Bring your own transport.** Extend `BaseConnector`, implement `connect()` and\n  `sendCommand(command)`, and emit `connected`, `incoming` (a parsed\n  `DroneCommand`), and `disconnected`. Pass it to `DroneConnection` like any other\n  connector.\n\n[`@abandonware/noble`]: https://www.npmjs.com/package/@abandonware/noble\n\n### Events\n\n`DroneConnection` (and the connectors) are `EventEmitter`s:\n\n| Event | Fired when |\n| --- | --- |\n| `connected` | the drone is connected and ready for commands |\n| `disconnected` | the connection to the drone was lost |\n| `error` | the underlying transport raised an error |\n| `sensor:\u003ctoken\u003e` | a sensor reading arrived (e.g. `sensor:minidrone-UsbAccessoryState-GunState`) |\n| `sensor:*` | any sensor reading arrived |\n\n```js\ndrone.on('sensor:minidrone-UsbAccessoryState-GunState', (sensor) =\u003e {\n  if (sensor.state.value === sensor.state.enum.READY) {\n    console.log('The gun is ready to fire!');\n  }\n});\n```\n\n\u003e **Error handling.** Like any Node `EventEmitter`, an `'error'` event with no\n\u003e listener is thrown. Attach an `'error'` handler if you want to recover from\n\u003e transport errors instead of crashing.\n\n## Migrating from 0.6.x\n\n`DroneConnection` now takes a connector:\n\n```js\n// 0.6.x\nconst drone = new DroneConnection();\n\n// 0.7.0+\nconst drone = new DroneConnection(new BLEConnector()); // or new WifiConnector()\n```\n\n`connect()` lives on the connector, and `BLEConnector`/`WifiConnector` are\nexported from the package. Everything else (`runCommand`, `getSensor`,\n`sensor:*` events, `CommandParser`) is unchanged.\n\n## Troubleshooting\n\n#### MacOS won't connect to the drone\n - First turn off Bluetooth\n - Run the following code in your shell\n\n```sh\nrm -v ~/Library/Preferences/ByHost/com.apple.Bluetooth.*.plist\nsudo rm /Library/Preferences/com.apple.Bluetooth.plist\n```\n\n - Turn Bluetooth back on\n\n Or alternativly using [blueutil]:\n \n ```sh\nblueutil off\nrm -v ~/Library/Preferences/ByHost/com.apple.Bluetooth.*.plist\nsudo rm /Library/Preferences/com.apple.Bluetooth.plist\nblueutil on\n ```\n \n [blueutil]: http://www.frederikseiffert.de/blueutil/\n\n## License\n\nMIT License\n\nCopyright 2018-2026 Mechazawa \u003cmega@ioexception.at\u003e\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fmechazawa%2Fminidrone-js","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fmechazawa%2Fminidrone-js","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fmechazawa%2Fminidrone-js/lists"}