Open-source project
AppiumTestDistribution/appium-device-farm avatar
AppiumTestDistribution/appium-device-farm

appium-device-farm turns a pile of devices into an Appium grid

This is an Appium 2.0 plugin designed to manage and create driver sessions on available devices.

654 stars182 forksTypeScriptApache-2.0

At a glance

What is it?
The plugin manages and creates Appium driver sessions on connected Android, iOS and tvOS devices, emulators and simulators, and adds a dashboard, logs, video recording and session pooling on top. Version 12 removed manual device control entirely, and version 10 rewrote authentication and the database schema, so the upgrade path is part of the product.
Who is it for?
Adopt appium-device-farm when your team has a shared pool of real devices or cloud device providers and wants one Appium endpoint that allocates them, with a dashboard and session recording behind it.
Can I use it commercially?
Yes. Apache-2.0 is a permissive licence: you can use, modify and sell software built on it, as long as you keep its copyright and licence notices.
Is it still maintained?
Yes. The repository last received commits 7 days ago.
What is it written in?
Mainly TypeScript, according to GitHub's language statistics.

Answers come from the project's GitHub data, last synced on October 23, 2026, and from our analysis. They are not legal advice.

Editorial analysis

A plugin that allocates devices instead of devices per developer

Appium Device-farm is described as a plugin designed specifically to manage and simplify the creation of driver sessions for connected devices, including Android, iOS and tvOS real devices, emulators and simulators. It extends the capabilities of Appium, and the repository description calls it an Appium 2.0 plugin designed to manage and create driver sessions on available devices.

The problem it addresses is the one every mobile test team hits. A developer who wants to run a test on a physical iPhone needs a physical iPhone, and the usual answer is a device lab, a shelf in the office, or a cloud provider. The plugin sits in the middle: it registers the devices, it decides which one a session gets, and it hands the session to Appium as if the device were local.

The README lists what a team can do with it. Remotely manage sessions for physical devices, emulators and simulators without manual device handling. Automate test execution across multiple devices simultaneously. Scale to a broad array of device and operating system combinations. Integrate with CI/CD pipelines so tests run as part of continuous integration. Monitor and manage sessions through a dashboard with real-time visibility and detailed logs for debugging. And record and replay test runs so a failure can be reviewed and reproduced.

That last item, record and replay, is the feature that changes the economics of remote testing. A team that can watch a recorded run does not need the person who wrote the test to be awake to explain what happened.

Version 12 took out manual device control on purpose

The first breaking change notice in the README is the most important thing to read before adopting this plugin, because it removes a feature rather than changing its shape.

Manual device control, meaning remote control and live device streaming, has been removed as of version 12.0.0. The README gives the reason in unusually candid terms. The manual control experience was built on top of WebDriverAgent for iOS streaming, and in practice that turned out to be a poor foundation: WDA-driven screenshot streaming is slow, it competes with the automation session for the same WDA instance, and it was the root cause of a long tail of issues around lag, dropped frames, stalled sessions and flaky device state. Keeping it working across new iOS versions needed more time than the maintainers could give it, so rather than ship something that degrades the rest of the grid, they took it out.

The consequences are spelled out. The device streaming and manual interaction view is no longer part of the dashboard. Automation, meaning session creation, device allocation, hub and node, dashboard, logs and video recording, is unaffected. And if you depend on manual control, the advice is to stay on the `11.x` line until an alternative lands.

The project is explicit that this is not a rejection of the idea. The README invites help to build a better manual control implementation, for example a `scrcpy`-style pipeline for Android and a non-WDA-blocking approach for iOS, through an issue or a pull request, and says a sponsor could fund the work through Open Collective.

That is a useful signal about the project. The maintainers removed a feature that was degrading the rest of the system, and said so plainly, and they left the door open with a concrete technical sketch of what would replace it.

A dropped dependency cleared an SSRF advisory

The second security note in the README is short and concrete. The unmaintained `ip` package has been dropped in favour of Node's built-in `os.networkInterfaces()`, and this clears the SSRF advisory, CVE-2024-29415, that had no upstream patch.

That is worth pausing on, because of how the vulnerability is described. The `ip` package is the kind of small convenience library that gets pulled in to read a machine's network interfaces, and it had an issue that let a caller be tricked into making requests it should not have. The problem was that there was no upstream patch to wait for, since the package was unmaintained. In that situation a client library cannot upgrade and move on, so the only fix is to stop depending on the package and use the standard library instead.

For anyone auditing the dependency tree of their Appium setup, this is the sort of change to look for. It also tells you something about how the project handles its supply chain, since the fix was made in the plugin rather than waiting for a release that was never going to come.

The other breaking change notice covers version 10.0.0 and above, and lists four items: an added authentication module with user and team management, enhanced automation runs with access key authentication, improved device and server management capabilities, and database schema changes that may result in loss of existing data.

That last item deserves emphasis. A schema change that loses data is not a routine upgrade, so anyone moving from an earlier line needs to plan the migration rather than pull the new version and hope.

The repository is a server, a dashboard and a set of configs

The top level listing shows how much is bundled here, and it is more than a plugin.

There is `src/` for the plugin itself, `dashboard-frontend/` for the web interface, `prisma/` for the database schema, `templates/` for what the dashboard and the session pages render, `docker/` for container packaging, `typings/` and `test/` for the code and the suites. `azure-pipelines.yml` is the CI definition, `renovate.json` the dependency update configuration, and `.releaserc` the release configuration, which together with `CHANGELOG.md` describe a conventional release flow.

The configuration layer is visible too, and it is a set of separate files rather than one: `node-config.json`, `remote-config.json`, `sample-config.json`, `server-config.json` and a `serverConfig/` directory. There is also `install.sh` for installation, `buildAndCopyWeb.sh` for the dashboard build, `move-stream.sh`, `tester.js` as a manual client, `log-filter.json`, `schema.ref.txt` as a schema reference, and an `admin-portal-implementation-plan.md` that suggests work in progress on the administration side. A `device-farm.apk` at the root and a `mkdocs.yml` with `typedoc.json` complete the picture, the latter two covering documentation and API reference generation.

So the deployment is not a single npm package dropped into an Appium hub. It is a server with a database, a dashboard, a device node side and a configuration surface, which is what makes the device farm possible and also what makes it an operational commitment.

The test scripts show how the plugin is driven

The package manifest is the best available description of the testing strategy, because the scripts are named after what they exercise.

The default test run is a mocha invocation over the unit specs with ts-node, run with `--plugin-device-farm-platform=both` and a 20 second timeout. There is a separate remote suite, `test-remote`, that runs the end to end remote spec with a 60 second timeout, a jest run for the Android device manager spec, and a set of parallel suites that differ by platform and by cloud provider: `test-parallel-android`, `test-parallel-ios`, `test-parallel-bs` for BrowserStack, `test-parallel-pcloudy`, `test-parallel-sauce`, `test-parallel-lt` for LambdaTest, and `test-parallel-ios-bs`.

One of those scripts contains a detail that tells you how the plugin is expected to be used locally. The Sauce Labs suite waits for a local endpoint before it starts:

code
    "test-parallel-sauce": "wait-on http://localhost:31337/device-farm/ && mocha --require ts-node/register -p ./test/e2e/android/cloud/sauce.spec.js --exit --timeout 260000",

So a device farm instance runs as a local service on a port, the tests wait for it to come up, and then the parallel suite drives it. The cloud provider suites are structured the same way, which is a good sign that the plugin's interface to a provider is consistent.

Documentation is built with `appium-docs`, with a `build:docs` script that does not emit a reference section and a `publish:docs` script that deploys it. The parallel suites carry a 260 second timeout against the default suite's 20 seconds, which reflects the difference between starting a session and driving one.

The version line, and what upgrading costs

The release tags are v12.0.2 from 2026-09-24, v12.0.1 from 2026-07-25 and v12.0.0 from 2026-07-25, and the repository is not archived with the last push on 2026-10-16. The package version in the manifest is 12.0.2, and the licence is Apache 2.0 with the terms in the `LICENSE` file. The homepage is devicefarm.org, and the primary language is TypeScript.

The upgrade arithmetic is where the cost sits, and the README gives you two separate breakpoints. The first is 12.0.0, where manual device control disappears, so anyone relying on that view has a decision to make between upgrading and staying on `11.x`. The second is 10.0.0, where authentication, access keys, device and server management and the database schema all changed, with the explicit warning that the schema changes may result in loss of existing data.

The pattern of the versions also tells you something. Two of the three most recent tags are a 12.0.0 and its two patches within about two months, which is the shape of a release that changed something structural and then followed it with fixes. That is normal for a plugin that sits between a test framework and a fleet of physical devices, where the surface area is large.

For an adopter, the practical question is not whether the project is alive but which line you are on and why. Staying on `11.x` keeps the manual control view and keeps you on the pre-removal API, and it also means you are outside the current release line.

When a device farm is the wrong answer

The obvious case is a single developer or a small team that already has a device. Running a hub, a node, a database with a Prisma schema, a dashboard and a configuration set of five files is a lot of surface for one phone on one desk.

The second case is manual interaction. If your workflow depends on watching the device while the test runs, or poking at it, the capability that provided that was removed in 12.0.0 and the replacement is an open invitation rather than a shipped feature. The README's own advice is to stay on `11.x` until an alternative lands, which is a reasonable thing to do and also an admission that the modern line does not serve that need.

The third case is the dependency on cloud device providers. The test scripts name Sauce Labs, LambdaTest, pCloudy and BrowserStack, and running against them means credentials, a network path from your CI runner to the provider, and a billing relationship. If your goal is to run a suite on five device models, that may be a lot of moving parts compared with running the same Appium test against a local device.

The alternative approach is to skip the farm and point Appium directly at a device or at a provider's own cloud service. What you lose is the dashboard, the session recording, the logs and the allocation layer. What you keep is a much smaller system, and the ability to debug a failing test by attaching to the device yourself, which is exactly the capability version 12 removed from the dashboard.

Editorial conclusion

Adopt appium-device-farm when your team has a shared pool of real devices or cloud device providers and wants one Appium endpoint that allocates them, with a dashboard and session recording behind it. Do not adopt it if you need to watch or drive a device manually, because that capability was removed in 12.0.0, and be careful upgrading from earlier release lines, because version 10.0.0 brought an authentication module and database schema changes that the README says may result in loss of existing data. Verify first that the plugin version you deploy matches the Appium 2 API you use, that your device nodes are reachable by the hub, and that the credentials for your cloud provider are configured, since the test suite shows the plugin being driven against Sauce, LambdaTest, pCloudy and BrowserStack.

Frequently asked questions

What does the appium-device-farm plugin do?

It is an Appium 2.0 plugin that manages and creates driver sessions on available devices, covering Android, iOS and tvOS real devices, emulators and simulators. It adds device allocation, a dashboard with live session visibility and detailed logs, video recording and replay, and CI integration.

What changed in appium-device-farm 12.0.0?

Manual device control, meaning remote control and live device streaming, was removed. The README explains that the WebDriverAgent based streaming competed with the automation session for the same instance and caused lag, dropped frames and stalled sessions. Automation, dashboard, logs and video recording are unaffected, and users who need manual control are advised to stay on the 11.x line.

Which cloud device providers does appium-device-farm support?

The test scripts in the package manifest include parallel suites for BrowserStack, pCloudy, Sauce Labs and LambdaTest, as well as local Android and iOS runs. The Sauce suite waits for a local device farm instance on http://localhost:31337/device-farm/ before running.

What security advisory was addressed in the appium-device-farm changelog?

The unmaintained `ip` package was dropped in favour of Node's built-in `os.networkInterfaces()`, which clears the SSRF advisory CVE-2024-29415 that had no upstream patch. Separately, version 10.0.0 introduced an authentication module and database schema changes that the README warns may result in loss of existing data.

Official sources

  1. AppiumTestDistribution/appium-device-farm on GitHub
  2. License: Apache-2.0
  3. Project website
  4. README
  5. Releases
Add this badge to your README

If you maintain this project, the badge below links readers to this analysis and shows its maintenance status from the daily GitHub snapshot. Paste the markdown into your README; add ?metric=license or ?metric=stars to the image URL for a different field.

Add this badge to your README

markdown
[![Hysen Labs](https://hysenlabs.com/badge/appiumtestdistribution-appium-device-farm.svg)](https://hysenlabs.com/projects/appiumtestdistribution-appium-device-farm)

Was this useful?