{"id":28564139,"url":"https://github.com/appium/node-simctl","last_synced_at":"2026-04-25T23:01:15.065Z","repository":{"id":24166871,"uuid":"27557105","full_name":"appium/node-simctl","owner":"appium","description":"Node wrapper around Apple's simctl binary","archived":false,"fork":false,"pushed_at":"2026-04-10T11:25:20.000Z","size":558,"stargazers_count":68,"open_issues_count":2,"forks_count":31,"subscribers_count":13,"default_branch":"master","last_synced_at":"2026-04-10T12:34:31.770Z","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":"apache-2.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/appium.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},"funding":{"open_collective":"appium"}},"created_at":"2014-12-04T19:48:33.000Z","updated_at":"2026-04-10T11:25:22.000Z","dependencies_parsed_at":"2023-11-23T20:02:12.860Z","dependency_job_id":"a8994e51-a252-47d7-876b-3142f79bccaf","html_url":"https://github.com/appium/node-simctl","commit_stats":{"total_commits":351,"total_committers":26,"mean_commits":13.5,"dds":0.8005698005698005,"last_synced_commit":"b5bc4032b5b76bea7364c2da9d09200b961441c4"},"previous_names":[],"tags_count":165,"template":false,"template_full_name":null,"purl":"pkg:github/appium/node-simctl","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/appium%2Fnode-simctl","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/appium%2Fnode-simctl/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/appium%2Fnode-simctl/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/appium%2Fnode-simctl/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/appium","download_url":"https://codeload.github.com/appium/node-simctl/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/appium%2Fnode-simctl/sbom","scorecard":{"id":203637,"data":{"date":"2025-08-11","repo":{"name":"github.com/appium/node-simctl","commit":"4d65300224f684930ffdeba462df700a69d2d924"},"scorecard":{"version":"v5.2.1-40-gf6ed084d","commit":"f6ed084d17c9236477efd66e5b258b9d4cc7b389"},"score":5.4,"checks":[{"name":"Maintained","score":6,"reason":"8 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 6","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":"Code-Review","score":0,"reason":"Found 2/21 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":"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":"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":"Vulnerabilities","score":10,"reason":"0 existing vulnerabilities detected","details":null,"documentation":{"short":"Determines if the project has open, known unfixed vulnerabilities.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#vulnerabilities"}},{"name":"License","score":10,"reason":"license file detected","details":["Info: project has a license file: LICENSE:0","Info: FSF or OSI recognized license: Apache License 2.0: 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":"Branch-Protection","score":-1,"reason":"internal error: error during branchesHandler.setup: internal error: githubv4.Query: Resource not accessible by integration","details":null,"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":"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/functional-test.yml:31: update your workflow using https://app.stepsecurity.io/secureworkflow/appium/node-simctl/functional-test.yml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/functional-test.yml:32: update your workflow using https://app.stepsecurity.io/secureworkflow/appium/node-simctl/functional-test.yml/master?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/functional-test.yml:36: update your workflow using https://app.stepsecurity.io/secureworkflow/appium/node-simctl/functional-test.yml/master?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/pr-title.yml:12: update your workflow using https://app.stepsecurity.io/secureworkflow/appium/node-simctl/pr-title.yml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/publish.js.yml:17: update your workflow using https://app.stepsecurity.io/secureworkflow/appium/node-simctl/publish.js.yml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/publish.js.yml:18: update your workflow using https://app.stepsecurity.io/secureworkflow/appium/node-simctl/publish.js.yml/master?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/unit-test.yml:14: update your workflow using https://app.stepsecurity.io/secureworkflow/appium/node-simctl/unit-test.yml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/unit-test.yml:24: update your workflow using https://app.stepsecurity.io/secureworkflow/appium/node-simctl/unit-test.yml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/unit-test.yml:25: update your workflow using https://app.stepsecurity.io/secureworkflow/appium/node-simctl/unit-test.yml/master?enable=pin","Warn: npmCommand not pinned by hash: .github/workflows/functional-test.yml:42","Warn: npmCommand not pinned by hash: .github/workflows/publish.js.yml:23","Warn: npmCommand not pinned by hash: .github/workflows/unit-test.yml:29","Info:   0 out of   6 GitHub-owned GitHubAction dependencies pinned","Info:   0 out of   3 third-party GitHubAction dependencies pinned","Info:   0 out of   3 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":"Token-Permissions","score":0,"reason":"detected GitHub workflow tokens with excessive permissions","details":["Warn: no topLevel permission defined: .github/workflows/functional-test.yml:1","Warn: no topLevel permission defined: .github/workflows/pr-title.yml:1","Warn: topLevel 'contents' permission set to 'write': .github/workflows/publish.js.yml:9","Warn: no topLevel permission defined: .github/workflows/unit-test.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":"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":"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":"Packaging","score":10,"reason":"packaging workflow detected","details":["Info: Project packages its releases by way of GitHub Actions.: .github/workflows/publish.js.yml:14"],"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":"Security-Policy","score":9,"reason":"security policy file detected","details":["Info: security policy file detected: github.com/appium/.github/SECURITY.md:1","Info: Found linked content: github.com/appium/.github/SECURITY.md:1","Warn: One or no descriptive hints of disclosure, vulnerability, and/or timelines in security policy","Info: Found text in security policy: github.com/appium/.github/SECURITY.md:1"],"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":"SAST","score":0,"reason":"SAST tool is not run on all commits -- score normalized to 0","details":["Warn: 0 commits out of 13 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"}}]},"last_synced_at":"2025-08-16T23:15:30.291Z","repository_id":24166871,"created_at":"2025-08-16T23:15:30.291Z","updated_at":"2025-08-16T23:15:30.291Z"},"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":32279660,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-04-25T18:29:39.964Z","status":"ssl_error","status_checked_at":"2026-04-25T18:29:32.149Z","response_time":59,"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":"2025-06-10T13:09:38.722Z","updated_at":"2026-04-25T23:01:15.033Z","avatar_url":"https://github.com/appium.png","language":"TypeScript","funding_links":["https://opencollective.com/appium"],"categories":[],"sub_categories":[],"readme":"## node-simctl\n\n[![NPM version](http://img.shields.io/npm/v/node-simctl.svg)](https://npmjs.org/package/node-simctl)\n[![Downloads](http://img.shields.io/npm/dm/node-simctl.svg)](https://npmjs.org/package/node-simctl)\n\n[![Release](https://github.com/appium/node-simctl/actions/workflows/publish.js.yml/badge.svg?branch=master)](https://github.com/appium/node-simctl/actions/workflows/publish.js.yml)\n\nES6/7 Node wrapper around Apple's `simctl` binary, the \"Command line utility to control the iOS Simulator\". `simctl` is run as a sub-command of [xcrun](https://developer.apple.com/library/mac/documentation/Darwin/Reference/ManPages/man1/xcrun.1.html)\n\n### Installation\n\nInstall through [npm](https://www.npmjs.com/package/node-simctl).\n\n```\nnpm install node-simctl\n```\n\n### API\n\nThe module exports single class `Simctl`. This class contains methods\nwhich wrap the following simctl subcommands:\n\n#### create (Create a new device)\n - createDevice `*`\n\n#### clone (Clone an existing device)\n_None_\n\n#### upgrade (Upgrade a device to a newer runtime)\n_None_\n\n#### delete (Delete specified devices, unavailable devices, or all devices)\n - deleteDevice\n\n#### pair (Create a new watch and phone pair)\n_None_\n\n#### unpair (Unpair a watch and phone pair)\n_None_\n\n#### pair_activate (Set a given pair as active)\n_None_\n\n#### erase (Erase a device's contents and settings)\n - eraseDevice\n\n#### boot (Boot a device)\n - bootDevice\n\n#### shutdown (Shutdown a device)\n - shutdownDevice\n\n#### rename (Rename a device)\n_None_\n\n#### getenv (Print an environment variable from a running device)\n- getEnv\n\n#### openurl (Open a URL in a device)\n - openUrl\n\n#### addmedia (Add photos, live photos, videos, or contacts to the library of a device)\n - addMedia\n\n#### install (Install an app on a device)\n - installApp\n\n#### uninstall (Uninstall an app from a device)\n - uninstallApp\n\n#### get_app_container (Print the path of the installed app's container)\n - getAppContainer\n\n#### launch (Launch an application by identifier on a device)\n - launchApp\n\n#### terminate (Terminate an application by identifier on a device)\n - terminateApp\n\n#### spawn (Spawn a process by executing a given executable on a device)\n - spawnProcess\n - spawnSubProcess\n\n#### list (List available devices, device types, runtimes, or device pairs)\n - getDevicesByParsing `*`\n - getDevices `*`\n - getRuntimeForPlatformVersionViaJson `*`\n - getRuntimeForPlatformVersion `*`\n - getDeviceTypes `*`\n - list `*`\n\n#### icloud_sync (Trigger iCloud sync on a device)\n_None_\n\n#### pbsync (Sync the pasteboard content from one pasteboard to another)\n_None_\n\n#### pbcopy (Copy standard input onto the device pasteboard)\n - setPasteboard\n\n#### pbpaste (Print the contents of the device's pasteboard to standard output)\n - getPasteboard\n\n#### help (Prints the usage for a given subcommand)\n_None_\n\n#### io (Set up a device IO operation)\n - getScreeenshot\n\n#### diagnose (Collect diagnostic information and logs)\n_None_\n\n#### logverbose (enable or disable verbose logging for a device)\n_None_\n\n#### status_bar (Set or clear status bar overrides)\n_None_\n\n#### ui (Get or Set UI options)\n - getAppearance\n - setAppearance\n\n#### push (Send a simulated push notification)\n - pushNotification\n\n#### privacy (Grant, revoke, or reset privacy and permissions)\n - grantPermission\n - revokePermission\n - resetPermission\n\n#### keychain (Manipulate a device's keychain)\n - addRootCertificate\n - addCertificate\n - resetKeychain\n\n#### appinfo (Undocumented)\n - appInfo\n\n#### bootstatus (Undocumented)\n - startBootMonitor\n\nMethods marked with the star (`*`) character *do not* require the `udid` property to be set\non the `Simctl` instance upon their invocation. All other methods will *throw an error* if the `udid`\nproperty is unset while they are being invoked.\n\nAll public methods are supplied with docstrings that describe their arguments and returned values.\n\nThe `Simctl` class constructor supports the following options:\n\n- `xcrun` (Object): The xcrun properties. Currently only one property\nis supported, which is `path` and it by default contains `null`, which enforces\nthe instance to automatically detect the full path to `xcrun` tool and to throw\nan exception if it cannot be detected. If the path is set upon instance creation\nthen it is going to be used by `exec` and no autodetection will happen.\n- `execTimeout` (number[600000]): The maximum number of milliseconds\nto wait for a single synchronous xcrun command.\n- `logErrors` (boolean[true]): Whether to write xcrun error messages\ninto the debug log before throwing them as errors.\n- `udid` (string[null]): The unique identifier of the current device, which is\ngoing to be implicitly passed to all methods, which require it (see above). It can either be set\nupon instance creation if it is already known or later when/if needed via the corresponding\nsetter.\n- `devicesSetPath` (string[null]): Full path to the set of devices that you want to manage.\nBy default this path usually equals to ~/Library/Developer/CoreSimulator/Devices. This option\nhas a getter and a setter which allows to switch between multiple device sets during the Simctl\ninstance life cycle.\n\n\n### Advanced Usage\n\nAny simctl subcommand could be called via `exec` method, which accepts the subcommand itself\nas the first argument and the set of options, which may contain additional command args,\nenvironment variables, encoding, etc. For example:\n\n```js\nimport Simctl from 'node-simctl';\n\nconst simctl = new Simctl();\nconst name = 'My Device Name';\nsimctl.udid = await simctl.createDevice(name, 'iPhone X', '13.3');\nawait simctl.bootDevice();\nawait simctl.startBootMonitor({timeout: 120000});\nawait simctl.exec('pbsync');\nconsole.log(`Pasteboard content: ${await simctl.getPasteboard()}`);\nconst {stdout} = await simctl.exec('status_bar', {\n  args: [simctl.udid, 'list']\n});\nconsole.log(output);\nsimctl.udid = void(await simctl.deleteDevice());\n```\n\nSee [specs](test/simctl-specs.js) for examples of usage.\n\n\n### Running Multiple Simulator SDKs On a Single Computer\n\nIt is possible to run multiple simulators using different Xcode SDKs on a single machine.\nSimply set a proper value to `DEVELOPER_DIR` environment variable for each process.\n\nRead this [MacOps article](https://macops.ca/developer-binaries-on-os-x-xcode-select-and-xcrun/) for more details.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fappium%2Fnode-simctl","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fappium%2Fnode-simctl","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fappium%2Fnode-simctl/lists"}