by KnifeLemon
Android automation from code. Test your apps on real phones, script the tasks you repeat, run a shelf of phones, or let an AI agent use one, from Python, Node.js, the CLI, HTTP or Appium clients. No ADB, no USB cable, no root.
# Add to your Claude Code skills
git clone https://github.com/KnifeLemon/DroidlineSee how Droidline compares with popular alternatives.
Droidline is an open-source ai agents skill for AI coding assistants such as Claude Code, Codex CLI, and ChatGPT, built by KnifeLemon. Android automation from code. Test your apps on real phones, script the tasks you repeat, run a shelf of phones, or let an AI agent use one, from Python, Node.js, the CLI, HTTP or Appium clients. No ADB, no USB cable, no root. It has 63 GitHub stars.
Droidline's catalog security scan is still queued. You can run an instant dependency and prompt-injection check now with the "Scan for vulnerabilities" button above.
Clone the repository with "git clone https://github.com/KnifeLemon/Droidline" and add it to your Claude Code skills directory (see the Installation section above).
Droidline is primarily written in Go. It is open-source under KnifeLemon on GitHub, so you can review or fork the full source.
Yes. SkillsLLM lists many other AI Agents skills you can browse and compare side by side. Open the AI Agents category from the badge at the top of this page, or use the Related Skills and comparison links further down to weigh Droidline against similar tools.
No comments yet. Be the first to share your thoughts!
Available after the catalog security scan passes.
⚠️ Third-Party Software Notice
This skill is third-party open-source software developed and hosted independently on GitHub. SkillsLLM is an informational directory and does not control or maintain the underlying repository.
Any security checks, ratings, or warnings displayed by SkillsLLM are automated and limited in scope. They do not constitute a security certification or guarantee that the software is safe, error-free, or free from malicious code, vulnerabilities, compromised dependencies, or prompt-injection risks.
Review the source code, permissions, dependencies, and configuration before installing or running any third-party skill. Use is at your own risk. To the maximum extent permitted by applicable law, SkillsLLM is not liable for losses arising from third-party software.
The deep catalog scan for this skill is still queued. Run an instant dependency check now instead.
Droidline uses only permissions an ordinary app can get, so a few things are out of reach: see What it cannot do.
You need a PC (Windows, macOS or Linux) and an Android phone with Android 9 or later, on the same Wi-Fi for a first try. The installation guide walks through each step with screenshots.
Run the server on your PC. Download the droidline archive for your system from Releases, put droidline on your PATH, and start it. Leave it running.
droidline serve
Install the app on the phone. Download droidline-agent.apk from the same release page and open it. On the app's Setup tab, turn on the accessibility service, the Droidline keyboard, notifications and unrestricted battery use. On Android 13 and later, allow restricted settings for the app first; the app shows where.
Pair them. Run this on the PC and scan the QR code with the app's Pair tab:
droidline pair
No camera? Tap Pair on this Wi-Fi in the app and type the 6-digit code it shows: droidline pair 482913.
Send a command.
droidline launch com.android.settings
droidline touch text "Network & internet"
No phone at hand? droidline-fakephone, included in every release, simulates one with a small demo app. The first-script tutorial builds a complete login script against it.
Every interface talks to droidline serve on localhost:8780 and uses the same command names.
Python (pip install droidline, Python 3.9+)
from droidline import connect
d = connect() # the phone paired with this PC
d.launch("dev.droidline.demo")
if d.exists("text", "Close ad"): # conditions never wait and never fail
d.touch("text", "Close ad")
d.input("id", "email", "knife") # waits up to 10 s for the element
d.touch("text", "Log in")
print(d.get_text("id", "greeting"))
Node.js and TypeScript (npm install droidline, Node.js 18+)
import { connect } from "droidline";
const d = await connect();
await d.launch("dev.droidline.demo");
await d.input("id", "email", "knife");
await d.touch("text", "Log in", { timeout: 15 });
console.log(await d.getText("id", "greeting"));
C# and .NET (dotnet add package Droidline, .NET 8+ or .NET Framework 4.6.2+)
using Droidline;
await using var d = await DroidlineClient.ConnectAsync();
await d.LaunchAsync("dev.droidline.demo");
await d.InputAsync("id", "email", "knife");
await d.TouchAsync("text", "Log in", timeout: 15);
Console.WriteLine(await d.GetTextAsync("id", "greeting"));
Command line (comes with the server)
droidline touch text "Log in"
droidline which text="Log in" id=main_tab --timeout 15
droidline screenshot shot.png
HTTP (any language, any tool)
curl -s -X POST localhost:8780/devices/_/touch \
-H 'content-type: application/json' -d '{"by":"text","value":"Log in"}'
AI agents over MCP (Claude, Cursor, VS Code and others)
{ "mcpServers": { "droidline": { "command": "droidline", "args": ["mcp"] } } }
With Claude Code: claude mcp add droidline -- droidline mcp. In Claude Desktop you can instead open droidline.mcpb from Releases, which carries its own droidline; it is also listed in the MCP Registry as io.github.KnifeLemon/droidline. To give an agent fewer tools, add --tools dump,screenshot,touch or --read-only to the args; see Limit what an agent can use. Other languages can open a TCP socket and send one JSON line per command; see Other languages for Go, Java and PHP.
dump() returns the screen as a tree with text, id and desc for every element. Commands take the field and the value: touch("id", "login"). When an element refuses a click, Droidline taps its parent or the center of its bounds by itself.touch, input and wait wait for their element, 10 seconds by default. Conditions such as exists, checked and which answer at once and never throw for a missing element.NOT_FOUND: Could not find text 'Log in' within 10s. Current screen: com.example / .MainActivity.batch sent with cuts_network keeps running on the phone while it is offline, so airplane mode on, wait, off works as one call. intent opens the Settings page first; the recipes show it step by step.touch({"class": "android.widget.Switch", "row": {"text": "Wi-Fi"}}). find hands back elements you can click and search inside, and wait_idle waits until the screen stops changing.droidline inspect shows the screen and its elements, suggests selectors with code, and records a script while you use the phone. droidline webdriver lets Appium clients and scripts drive your phones. There is also a pytest plugin, leases for sharing phones between scripts, and picture and text matching for screens without elements.