Write automation scripts in plain English. Let AI handle the complexity.
Parsing natural language command...
→ Intent: navigate + toggle_setting
→ Target: "Settings" app
→ Action: enable "Dark mode"
✓ Workflow completed successfully
Traditional automation breaks when UI changes. DittoMation adapts.
Fallback Chain:
Everything you need for robust Android automation
Write automation in plain English. No need to learn complex APIs or element hierarchies.
Intelligent element finding with confidence scoring and multiple fallback strategies.
Record your actions once, replay them anywhere with smart element mapping.
Use variables, loops, and conditionals for complex automation workflows.
{
"steps": [
{"set_variable": {"name": "count", "value": 0}},
{"while": {
"condition": "count < 5",
"do": [{"tap": "next_button"}]
}}
]
}
Type commands and watch them execute on the simulated Android device
Enter a search query
Test with a real Android emulator in your browser
Multiple ways to use DittoMation
# Run a natural language command
ditto run "open settings and enable wifi"
# Record a workflow
ditto record --output my_workflow.json
# Replay a recorded workflow
ditto replay my_workflow.json
# Run with variables
ditto run workflow.json --var username=test@email.com
from dittomatic import DittoMation
# Initialize
ditto = DittoMation()
# Run natural language command
ditto.run("open Chrome and search for weather")
# Use smart locator
element = ditto.find_element(
text="Login",
fallback_strategies=["resource_id", "content_desc", "ocr"]
)
element.tap()
# Record and replay
ditto.start_recording()
# ... perform actions ...
workflow = ditto.stop_recording()
workflow.save("login_flow.json")
# Replay with variables
ditto.replay("login_flow.json", variables={
"username": "test@example.com",
"password": "secure123"
})
{
"name": "Login Workflow",
"variables": {
"username": "",
"password": ""
},
"steps": [
{
"action": "tap",
"locator": {
"text": "Login",
"resource_id": "btn_login",
"confidence_threshold": 0.8
}
},
{
"action": "input_text",
"locator": {"resource_id": "input_username"},
"value": "${username}"
},
{
"action": "input_text",
"locator": {"resource_id": "input_password"},
"value": "${password}"
},
{
"action": "tap",
"locator": {"text": "Submit"}
}
]
}
Feature comparison with traditional automation tools
| Feature | DittoMation | Traditional |
|---|---|---|
| {{ row.feature }} | ✓ ✕ {{ row.ditto }} | ✓ ✕ {{ row.traditional }} |
* Based on tests across multiple device types and UI variations
Get up and running in minutes
pip install dittomatic
# Enable USB debugging on your Android device
adb devices # Verify connection
ditto run "open settings"
from dittomatic import DittoMation
ditto = DittoMation()
ditto.run("tap the search icon and type hello world")
Help us improve DittoMation with your feedback
Your feedback has been received. We appreciate you taking the time to help us improve.
{{ item.message }}
Powered by Appetize.io - Interact directly with a real Android device
DittoMation connects to real Android devices via ADB for automation
Click buttons above to access real emulators
# Check connected devices
adb devices
# Install DittoMation
pip install dittomatic
# Run your first command
ditto run "open settings"
# Or use Python
python -c "from dittomatic import DittoMation; DittoMation().run('open settings')"
You can also use the Android Studio emulator, which connects via ADB automatically:
# List available emulators
emulator -list-avds
# Start an emulator
emulator -avd Pixel_4_API_30
# Verify connection
adb devices
For full DittoMation testing, connect a real device:
# Connect via USB
adb devices
# Or connect wirelessly
adb tcpip 5555
adb connect <device-ip>:5555
# Run DittoMation
ditto run "open settings"
The browser emulator is for exploration only. DittoMation commands execute on devices connected via ADB, not browser emulators.
Upload your APK to Appetize.io for a custom embedded emulator:
Go to Appetize.io