Install any skill in seconds. Free to start, no credit card required.
Get Started Free →Create Tasker profiles and tasks via XML for Android automation. Use when adding new Tasker functionality, creating Intent Received handlers, or building automation that integrates with the rho.tasker extension.
.claude/skills/mikeyobrien-tasker-xml/SKILL.md| Test case | Without → With | Effect | Δ tokens | Δ turns |
|---|---|---|---|---|
| case-19 | ✗→✓ | ▲ Improved | 512% | 0% |
| case-04 | ✗→✓ | ▲ Improved | 62% | 0% |
| case-05 | ✗→✓ | ▲ Improved | 16% | 0% |
| case-06 | ✗→✓ | ▲ Improved | 210% | 0% |
| case-07 | ✗→✓ | ▲ Improved | 372% | 0% |
Create importable Tasker profiles and tasks via XML files.
Write XML files to /storage/emulated/0/Download/ for easy import:
/storage/emulated/0/Download/MyProfile.prf.xml.prf.xml - Profile with linked task(s).tsk.xml - Standalone task.prj.xml - Full projectxml<?xml version="1.0" encoding="UTF-8"?> <TaskerData sr="" dvi="1" tv="6.3.13"> <Profile sr="prof1" ve="2"> <cdate>1706900000000</cdate> <edate>1706900000000</edate> <id>1</id> <mid0>1</mid0> <nme>Profile Name</nme> <!-- Event/State goes here --> </Profile> <Task sr="task1"> <cdate>1706900000000</cdate> <edate>1706900000000</edate> <id>1</id> <nme>Task Name</nme> <pri>6</pri> <!-- Actions go here --> </Task> </TaskerData>
Important: Profile <mid0> must match Task <id>.
Use inside <Profile> with <Event sr="con0" ve="2">:
| Code | Event | |------|-------| | 599 | Intent Received | | 461 | Notification | | 463 | New Window | | 2078 | App Changed | | 3050 | Variable Set |
xml<Event sr="con0" ve="2"> <code>599</code> <Str sr="arg0" ve="3">rho.tasker.my_action</Str> <Int sr="arg1" val="0"/> <Int sr="arg2" val="0"/> <Str sr="arg3" ve="3"/> <Str sr="arg4" ve="3"/> </Event>
arg0: Intent action name (e.g., rho.tasker.open_app)arg1: Priority (0 = normal)arg2: Stop event (0 = no)arg3: Cat (category filter, usually empty)arg4: Data filter (usually empty)Use inside <Task> with <Action sr="actN" ve="7">:
| Code | Action | Key Args | |------|--------|----------| | 20 | Launch App | arg0=app name | | 25 | Go Home | (none) | | 30 | Wait | arg0=hours, arg1=mins, arg2=ms, arg3=secs | | 37 | If | arg0=condition | | 38 | End If | (none) | | 43 | Else | (none) | | 104 | Browse URL | arg0=url | | 123 | Run Shell | arg0=command, arg1=use root, arg2=timeout | | 126 | Return | (stops task) | | 130 | Perform Task | arg0=task name | | 137 | Stop | (stops task) | | 410 | Write File | arg0=path, arg1=content | | 547 | Variable Set | arg0=name, arg1=value | | 548 | Variable Clear | arg0=name | | 549 | Variable Add | arg0=name, arg1=value | | 550 | Variable Subtract | arg0=name, arg1=value | | 559 | Flash | arg0=text |
AutoInput uses plugin action code -1 with Bundle configuration.
xml<Action sr="act0" ve="7"> <code>-1</code> <Bundle sr="arg0"> <Vals sr="val"> <com.twofortyfouram.locale.intent.extra.BLURB>Check Screen Configuration: Check Screen</com.twofortyfouram.locale.intent.extra.BLURB> <com.twofortyfouram.locale.intent.extra.BLURB-type>java.lang.String</com.twofortyfouram.locale.intent.extra.BLURB-type> <net.dinglisch.android.tasker.subbundled>true</net.dinglisch.android.tasker.subbundled> <net.dinglisch.android.tasker.subbundled-type>java.lang.Boolean</net.dinglisch.android.tasker.subbundled-type> </Vals> </Bundle> <Str sr="arg1" ve="3">com.joaomgcd.autoinput</Str> <Str sr="arg2" ve="3">com.joaomgcd.autoinput.activity.ActivityConfigUIQuery</Str> <Int sr="arg3" val="600"/> </Action>
After this action, these variables are available:
%aitext() - Array of visible text%aiid() - Array of element IDs%aicoords() - Array of x,y coordinates%aiapp - Current app packagexml<Action sr="act0" ve="7"> <code>-1</code> <Bundle sr="arg0"> <Vals sr="val"> <com.twofortyfouram.locale.intent.extra.BLURB>Action: Click [ Type:Text Value:%target ]</com.twofortyfouram.locale.intent.extra.BLURB> <com.twofortyfouram.locale.intent.extra.BLURB-type>java.lang.String</com.twofortyfouram.locale.intent.extra.BLURB-type> <action_type>click</action_type> <action_type-type>java.lang.String</action_type-type> <value>%target</value> <value-type>java.lang.String</value-type> <type>text</type> <type-type>java.lang.String</type-type> <net.dinglisch.android.tasker.subbundled>true</net.dinglisch.android.tasker.subbundled> <net.dinglisch.android.tasker.subbundled-type>java.lang.Boolean</net.dinglisch.android.tasker.subbundled-type> </Vals> </Bundle> <Str sr="arg1" ve="3">com.joaomgcd.autoinput</Str> <Str sr="arg2" ve="3">com.joaomgcd.autoinput.activity.ActivityConfigAction</Str> <Int sr="arg3" val="600"/> </Action>
xml<Action sr="act0" ve="7"> <code>-1</code> <Bundle sr="arg0"> <Vals sr="val"> <com.twofortyfouram.locale.intent.extra.BLURB>Action: Click [ Type:Point Value:%xcoord,%ycoord ]</com.twofortyfouram.locale.intent.extra.BLURB> <com.twofortyfouram.locale.intent.extra.BLURB-type>java.lang.String</com.twofortyfouram.locale.intent.extra.BLURB-type> <action_type>click</action_type> <action_type-type>java.lang.String</action_type-type> <value>%xcoord,%ycoord</value> <value-type>java.lang.String</value-type> <type>point</type> <type-type>java.lang.String</type-type> <net.dinglisch.android.tasker.subbundled>true</net.dinglisch.android.tasker.subbundled> <net.dinglisch.android.tasker.subbundled-type>java.lang.Boolean</net.dinglisch.android.tasker.subbundled-type> </Vals> </Bundle> <Str sr="arg1" ve="3">com.joaomgcd.autoinput</Str> <Str sr="arg2" ve="3">com.joaomgcd.autoinput.activity.ActivityConfigAction</Str> <Int sr="arg3" val="600"/> </Action>
xml<Action sr="act0" ve="7"> <code>547</code> <Str sr="arg0" ve="3">%my_var</Str> <Str sr="arg1" ve="3">my value</Str> <Int sr="arg2" val="0"/> <Int sr="arg3" val="0"/> <Int sr="arg4" val="0"/> <Int sr="arg5" val="3"/> <Int sr="arg6" val="0"/> </Action>
xml<Action sr="act0" ve="7"> <code>20</code> <Str sr="arg0" ve="3">Telegram</Str> <Str sr="arg1" ve="3"/> <Int sr="arg2" val="0"/> <Int sr="arg3" val="0"/> <Int sr="arg4" val="0"/> </Action>
xml<Action sr="act0" ve="7"> <code>30</code> <Int sr="arg0" val="0"/> <Int sr="arg1" val="0"/> <Int sr="arg2" val="500"/> <Int sr="arg3" val="0"/> <Int sr="arg4" val="0"/> </Action>
xml<Action sr="act0" ve="7"> <code>410</code> <Str sr="arg0" ve="3">/storage/emulated/0/rho/result.txt</Str> <Str sr="arg1" ve="3">Content to write Can be multiline Variables work: %myvar</Str> <Int sr="arg2" val="0"/> <Int sr="arg3" val="0"/> <Int sr="arg4" val="0"/> </Action>
xml<Action sr="act0" ve="7"> <code>559</code> <Str sr="arg0" ve="3">Toast message here</Str> <Int sr="arg1" val="0"/> </Action>
xml<Action sr="act0" ve="7"> <code>25</code> <Int sr="arg0" val="0"/> <Int sr="arg1" val="0"/> </Action>
xml<Action sr="act0" ve="7"> <code>123</code> <Str sr="arg0" ve="3">echo "Hello"</Str> <Int sr="arg1" val="0"/> <Int sr="arg2" val="10"/> <Str sr="arg3" ve="3">%output</Str> <Str sr="arg4" ve="3">%err_output</Str> <Str sr="arg5" ve="3"/> </Action>
xml<!-- If %direction equals "down" --> <Action sr="act0" ve="7"> <code>37</code> <Str sr="arg0" ve="3">%direction</Str> <Int sr="arg1" val="0"/> <Str sr="arg2" ve="3">down</Str> <Int sr="arg3" val="0"/> </Action> <!-- Actions for down --> <Action sr="act1" ve="7"> <code>43</code> </Action> <!-- Else actions --> <Action sr="act2" ve="7"> <code>38</code> </Action>
For rho.tasker. handlers, use this standard pattern:
xml<?xml version="1.0" encoding="UTF-8"?> <TaskerData sr="" dvi="1" tv="6.3.13"> <Profile sr="prof1" ve="2"> <cdate>1706900000000</cdate> <edate>1706900000000</edate> <id>1</id> <mid0>1</mid0> <nme>Rho Action Name</nme> <Event sr="con0" ve="2"> <code>599</code> <Str sr="arg0" ve="3">rho.tasker.action_name</Str> <Int sr="arg1" val="0"/> <Int sr="arg2" val="0"/> <Str sr="arg3" ve="3"/> <Str sr="arg4" ve="3"/> </Event> </Profile> <Task sr="task1"> <cdate>1706900000000</cdate> <edate>1706900000000</edate> <id>1</id> <nme>Rho Action Handler</nme> <pri>6</pri> <!-- A1: Get result_file from intent --> <Action sr="act0" ve="7"> <code>547</code> <Str sr="arg0" ve="3">%result_file</Str> <Str sr="arg1" ve="3">%result_file</Str> <Int sr="arg2" val="0"/> <Int sr="arg3" val="0"/> <Int sr="arg4" val="0"/> <Int sr="arg5" val="3"/> <Int sr="arg6" val="0"/> </Action> <!-- A2: Do the actual work here --> <!-- A3: AutoInput UI Query to get screen state --> <Action sr="act1" ve="7"> <code>-1</code> <Bundle sr="arg0"> <Vals sr="val"> <com.twofortyfouram.locale.intent.extra.BLURB>Check Screen Configuration: Check Screen</com.twofortyfouram.locale.intent.extra.BLURB> <com.twofortyfouram.locale.intent.extra.BLURB-type>java.lang.String</com.twofortyfouram.locale.intent.extra.BLURB-type> <net.dinglisch.android.tasker.subbundled>true</net.dinglisch.android.tasker.subbundled> <net.dinglisch.android.tasker.subbundled-type>java.lang.Boolean</net.dinglisch.android.tasker.subbundled-type> </Vals> </Bundle> <Str sr="arg1" ve="3">com.joaomgcd.autoinput</Str> <Str sr="arg2" ve="3">com.joaomgcd.autoinput.activity.ActivityConfigUIQuery</Str> <Int sr="arg3" val="600"/> </Action> <!-- A4: Write result file in standard format --> <Action sr="act2" ve="7"> <code>410</code> <Str sr="arg0" ve="3">%result_file</Str> <Str sr="arg1" ve="3">%aiapp ~~~ %aicoords() ~~~ %aiid() ~~~ %aitext() ~~~ %err</Str> <Int sr="arg2" val="0"/> <Int sr="arg3" val="0"/> <Int sr="arg4" val="0"/> </Action> </Task> </TaskerData>
The rho.tasker extension expects results in this format:
app_name
~~~
x1,y1,x2,y2,...
~~~
id1,id2,...
~~~
text1|||text2|||...
~~~
error_message_or_emptyUse %aiapp, %aicoords(), %aiid(), %aitext() from AutoInput.
sr="act0", sr="act1", etc. Sequential.%app_name from intent extra app_name).| Case | Status | Duration (ms) | Turns | Tokens | Tool calls | ||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Without | With | Δ | Without | With | Δ | Without | With | Δ | Without | With | Δ | ||
case-19 | fail→pass | 4,844 | 3,630 | -25% | 1 | 1 | 0% | 821 | 5,023 | +512% | 0 | 0 | — |
case-01 | pass→pass | 8,674 | 30,434 | +251% | 1 | 1 | 0% | 1,625 | 5,815 | +258% | 0 | 0 | — |
case-02 | pass→pass | 5,625 | 5,621 | -0% | 1 | 1 | 0% | 982 | 5,366 | +446% | 0 | 0 | — |
case-03 | pass→pass | 9,498 | 7,219 | -24% | 1 | 1 | 0% | 1,848 | 5,781 | +213% | 0 | 0 | — |
case-04 | fail→pass | 16,502 | 8,170 | -50% | 1 | 1 | 0% | 3,917 | 6,332 | +62% | 0 | 0 | — |
case-05 | fail→pass | 23,736 | 8,952 | -62% | 1 | 1 | 0% | 5,601 | 6,498 | +16% | 0 | 0 | — |
case-06 | fail→pass | 9,900 | 9,915 | +0% | 1 | 1 | 0% | 2,137 | 6,621 | +210% | 0 | 0 | — |
case-07 | fail→pass | 5,994 | 3,395 | -43% | 1 | 1 | 0% | 1,069 | 5,042 | +372% | 0 | 0 | — |
case-08 | fail→pass | 5,440 | 4,899 | -10% | 1 | 1 | 0% | 1,005 | 5,388 | +436% | 0 | 0 | — |
case-09 | pass→pass | 5,650 | 3,042 | -46% | 1 | 1 | 0% | 1,035 | 4,940 | +377% | 0 | 0 | — |
case-10 | pass→pass | 4,635 | 3,481 | -25% | 1 | 1 | 0% | 959 | 5,113 | +433% | 0 | 0 | — |
case-11 | pass→pass | 4,019 | 2,422 | -40% | 1 | 1 | 0% | 698 | 4,770 | +583% | 0 | 0 | — |
case-12 | fail→fail | 6,115 | 4,574 | -25% | 1 | 1 | 0% | 1,261 | 5,329 | +323% | 0 | 0 | — |
case-13 | fail→pass | 12,359 | 4,621 | -63% | 1 | 1 | 0% | 2,579 | 5,467 | +112% | 0 | 0 | — |
case-14 | fail→pass | 9,019 | 4,641 | -49% | 1 | 1 | 0% | 1,911 | 5,360 | +180% | 0 | 0 | — |
case-15 | pass→pass | 11,620 | 3,778 | -67% | 1 | 1 | 0% | 2,382 | 5,178 | +117% | 0 | 0 | — |
case-16 | pass→pass | 5,066 | 2,438 | -52% | 1 | 1 | 0% | 886 | 4,745 | +436% | 0 | 0 | — |
case-17 | pass→pass | 4,148 | 3,413 | -18% | 1 | 1 | 0% | 747 | 5,023 | +572% | 0 | 0 | — |
case-18 | pass→pass | 5,511 | 5,789 | +5% | 1 | 1 | 0% | 1,066 | 5,612 | +426% | 0 | 0 | — |
case-20 | fail→pass | 5,357 | 3,495 | -35% | 1 | 1 | 0% | 995 | 5,085 | +411% | 0 | 0 | — |
case-21 | pass→pass | 5,379 | 1,547 | -71% | 1 | 1 | 0% | 1,002 | 4,615 | +361% | 0 | 0 | — |
case-22 | pass→pass | 2,236 | 2,264 | +1% | 1 | 1 | 0% | 422 | 4,781 | +1033% | 0 | 0 | — |
DecimalAI ran this skill against gemini-3.6-flash twice over the same eval suite — once with the skill loaded and once without — and compared the two runs case by case. 22 cases were attempted. The headline lift of +41 percentage points is the difference between those two pass rates over the 22 comparable cases.
Without the skill loaded, the model failed this case. With it loaded, the same prompt on the same model passed. This is one improved case from the latest verified run; every case, including any that regressed, is in the table above.
Other measured skills in the registry, with their headline benchmark lift.