---
name: burner
description: Use when the user says "use my burner", "on my burner", "what's on my burner?" (screenshot its screen and send the image), or asks you to do something in a phone app (open an app, tap, type, scroll, check an order). burner gives you a real Android phone the user set aside for you, for apps with no API or website you can automate. This is the fast guide: every action prints the screen it ends on.
---
burner gives you, the AI assistant, a real Android phone the user set aside
for you: the burner phone. You drive it with the burner command. Call it by
its full path, ~/burner/bin/burner, because each of your commands runs in a
fresh shell. "Use my burner" means this phone.
Get this version: curl -fsSL https://raw.githubusercontent.com/useburner/burner/fast/docs/install.sh | BURNER_REF=fast bash,
then read ~/burner/SKILL-fast.md (this guide) instead of SKILL.md from now
on. burner version shows on branch fast when it worked. First-time setup
(pairing a phone) is in https://useburner.si/skill.md; do that first, then
run the line above.
Every step you take costs a round trip, so the fewer steps, the faster.
- One command per screen change. Its output is the screen.
tap,scroll,open,start,type,press,waitanddismisswait for the screen to settle and print it:screen: <app>, then one row per thing on screen, top to bottom, with(click)on rows you can tap and(on)or(off)on switches. Don't follow an action withdump,state, a screenshot or a sleep: you already have the result. - Screenshots only to see pictures (a photo, a map, a chart):
burner shot --out ., then send the file. For words, the rows are enough; a row cut short with … or a long page reads whole withburner text(in Chrome, the whole page, top to bottom;burner text --find preheatlists each place with the words, with the lines around it). - Never sleep, and don't wait for what is already there. Every action
prints the screen it ends on: when the words you need are on it, act on
them.
burner wait "Text" --timeout 30is for a page still loading, when the printed screen doesn't have them yet (or saysmay still be loading). - Links skip menus:
burner open "https://www.vinted.com/catalog?search_text=nike"opens inside the app when it is installed. Deep links too:burner open market://details?id=com.tinder com.android.vending. - Chain steps you are sure of:
burner do 'start com.tinder; wait "Likes"'runs them in one call and prints the last screen.burner recipeslists saved chains. A keypad (a calculator, a timer, a PIN) is one chain, not a command per key:burner do 'tap 1; tap 2; tap 3; tap multiply; tap 4; tap 5; tap equals'(each key is found by its label on the screen; symbol keys have word labels, whichburner stateshows: multiply, equals, delete). - Tap by the words on the row:
burner tap "Connected devices". Two matches: add--index 1. No words on it:burner snap, thenburner tap @e3. - Type into the focused field:
burner type "text"(--field "Search"finds that field by its label; when the label is on a button, such as a site's search icon, it taps the button and types into the box that opens). With nothing focused, the one text box on screen takes the text. For a search,--entersubmits it in the same command (never where Enter sends or posts something). It prints the screen, so check the text there before any Send, Post, Buy or Submit tap, and only tap it with the user's go-ahead. - A command that fails or hangs: run
burner ensureonce and try again. If it still fails, tell the user plainly what it printed (it says what is wrong). When the user asks why something was slow,burner log --last 20shows each command's time; paste it rather than guessing. - Say what is happening while it happens. Before anything that takes more
than a few seconds (an install,
burner ensure, a page slow to load), tell the user in one line what you are doing and about how long. Aburner waitwith--timeoutabove 30 comes back every 30 seconds with what the screen shows (still waiting for "Open": 30s so far, 570s left; the screen shows: Installing…, 43%): tell the user in one line, then run the same command again; it continues where it was. A pausedburner door recipe prints the command to go on with. Never leave the user looking at dots for minutes. - The phone's questions are the user's to answer. A permission prompt
("Allow Vinted to access this device's location?"), an install
confirmation, an "Open with" chooser or a "Turn on …?" dialog prints as an
asked:line with its options (asked: Allow Vinted to access this device's location? | options: Precise / Approximate / While using the app / Only this time / Don't allow); a wait or a chain stops on it. Don't choose: tell the user what the app asks for and the options as printed, wait for their answer, tap it (burner tap "Only this time"), then go on with the task (a paused chain prints the command). - An
opaque:line means the screen can't be read as rows: an app's own web page (a login page inside the app) hides its words from the screen reader. Don't wait for words that will never come: take a picture (burner shot --out ., in your own folder, and look at it), tap by--xy, andburner typegoes to the focused box. When the line says the window is shielded (a secure window: the picture is black as well, as with ESPN's sign-in), nothing on the phone can see or drive that part: tell the user to do it by hand on the phone, or do the same on the site in Chrome, which can be read.
| The user says | Do this |
|---|---|
| "What's on my burner?" / "Take a screenshot of my burner" | The screen right now: burner shot --out . and send the image. |
| "Use Tinder to…" (any app or service by name) | burner apps tinder finds its package, then burner start <package>: the launch prints the screen it opens on (--fresh for its first screen). If the app isn't installed or stops you at a sign-in wall, read the site in the phone's browser instead: burner open "https://…" com.android.chrome (read-only, and tell the user). |
| "Install Snapchat" (any free app) | PLAY_PACKAGE=com.snapchat.android burner recipe play-install with the package (a Play Store link ends in ?id=<package>). Name only: APP_QUERY=Vinted burner recipe play-search, pick the right result (burner tap "Vinted" --index 0), then burner recipe play-install-current. The recipes open the store themselves; a listing that says Open or Installed means it's already there. While the download runs the install recipe comes back every 30 seconds with what the screen shows: tell the user, then run the burner do line it prints. A newly installed app asks for permissions on its first start: the user decides (rule 10). Never buy an app. |
| "Turn on Bluetooth" / a phone setting, or a fact about the phone (storage, Android version) | burner settings bluetooth opens that page in one call (pages: wifi, bluetooth, display, sound, battery, storage, apps, notifications, location, about, app <package>...; burner settings alone opens the main page and lists them). Switch rows show (on) or (off); tap the row to flip it. |
| "Check my burner" / battery / "is it on?" | burner status. |
| "Check my notifications" / "anything new?" | burner notifications prints them and changes nothing. |
| "Check my Amazon order" | burner amazon-status. |
| "Check my messages" | burner apps messages, burner start <package>, read the rows; open a conversation only to read it. |
| "Read this article" / a recipe / a long page / a JSON answer | burner open "https://…" com.android.chrome, then burner text: the page's whole text, top to bottom (burner text --find bake lists each place with the words and the lines around it; --from N reads on from one). |
| "When is Target in Woodbury open?" / a place's hours, phone or address | burner open "https://www.google.com/search?q=Target+Woodbury+MN+hours" com.android.chrome, then burner text: the answer and the store pages, as words. The Maps app's result cards give the screen reader no names or hours, so they show only in a screenshot. |
| "Scroll down" / "scroll to the top" / a row further down | burner scroll down, burner scroll top: inside the open app, never HOME or an edge swipe. For a row whose words you know (an IP address on a network's page, a setting), burner scroll down --to "IP address" scrolls until it is on screen, in one command. In a feed of videos or posts (Shorts, Reels, TikTok), the next one is burner scroll down (the finger swipes up). |
| "Do this every time" / "save that" | Turn the steps that worked into a recipe with burner save <name> 'step' ... (labels, not coordinates; $VARIABLE for text that changes), test it once with burner recipe <name>. |
| "Update my burner" | burner update (it stays on this version), then re-read ~/burner/SKILL-fast.md. |
| "Uninstall burner" / "forget it" | burner uninstall lists the phone changes it undoes; --yes once the user agrees, then delete ~/burner and your notes about it. |
- Stop before submitting. Typing and submitting are two steps with their own go-ahead each. Never type and tap Send, Post, Buy or Submit in one unattended flow. Purchases need the user's yes for the exact item, price and payment method, every time.
- Never sign in, sign up or pick an account for the user. A sign-in screen, "Continue with Google" or an account picker: stop and ask.
- Verification codes come from email, never SMS (the phone has no SIM):
burner vcode --from 'from:sender@example.com'waits for the code box, fetches the code from the user's Gmail and types it; add--submit "Continue"only when the user OK'd submitting it. Codes are never stored. - Close pop-ups without agreeing:
burner dismisstaps Not now, Skip, Don't allow, Got it, Close. Refuse permissions and trials the task doesn't need, and say what you declined. - Only look at what the task needs. No
dumpsys, no rawadb, no account lists. burner's commands cover everything the phone needs. - Keep the user posted in one line per step on the phone. A command stops itself after 60 seconds (exit code 124).
- The phone stays on its charger (the screen only stays on while charging).
Run burner <command> --help for every option. Every action below prints the
screen it ends on unless you add --quiet.
Look
burner shot [--out PATH] screenshot (--out . to send it in chat)
burner state the app in front and the rows on screen (no action)
burner text [--find W] [--from N] the words uncut: in Chrome the whole page, top to bottom
burner dump [--all] [--fresh] every item on screen: text, type, position
burner snap numbered rows (@e1…) for exact taps
burner status is it up? battery, charging, screen, storage, apps
burner notifications read the phone's notifications (changes nothing)
burner apps [name] installed apps (--all includes system apps)
burner tabs Chrome's open tabs: a count, then each address and title
Act (each prints the screen it ends on)
burner tap "Text" tap by label (--index N, --fuzzy, "A || B", @e3 from snap)
burner tap --xy 0.5,0.8 tap a spot (0 to 1 across and down)
burner type "text" type into the focused field (--field "Hint", --clear, --enter)
burner press BACK|HOME|ENTER press a key (--repeat N; MEDIA_PAUSE, MEDIA_PLAY for a video or music)
burner scroll [down|up|left|right|top|bottom] scroll the open app (--times N, --to "Text")
burner wait "Text" wait for text (--timeout 30, "A || B" for either, --absent to wait for it to go, --exact for the whole label only;
above 30s it comes back every 30s with what the screen shows: tell the user, run it again)
burner start <package> open an app (--fresh: on its first screen)
burner settings [page] a Settings page by name: bluetooth, wifi, display, battery, apps, app <package>...
burner open <url> [package] open a link, in one app if a package is given
burner dismiss close pop-ups: Not now, Skip, Don't allow, Got it, Close
Flows
burner do 'step; step' several steps in one call; stops at the first failure
burner recipe <name> run a saved flow; burner recipes lists them
burner save <name> 'step' ... save a repeatable task as a recipe
burner amazon-status latest Amazon order status
Codes, health, upkeep
burner gcode --from 'from:x@y' newest code from Gmail (--mins 15)
burner vcode --from 'from:x@y' wait for the code box, fetch, type (--submit "Continue")
burner doctor full health check
burner ensure reconnect everything (5 seconds; up to a minute when it has to turn Wireless debugging back on)
burner update update burner (stays on this version)
burner version build, branch and skill rev
burner log the last commands run, how long each took, exit codes
burner uninstall [--yes] undo the phone changes setup made
Details that save a step:
burner taprefuses to guess: two matches for a label fails and lists them (--index Npicks one)."A || B"tries labels in order. A label behind a dialog is refused:burner dismissorburner press BACKfirst.- A video's controls hide a few seconds after they show.
burner press MEDIA_PAUSE(orMEDIA_PLAY) pauses and plays with them hidden. A control on the last screen burner printed that its app hid since is brought back by a touch where it was and tapped in the same command; the screen's note says so. burner typereplaces the field's content, so--clearis rarely needed. Apps that ignore it get the text as key presses instead, automatically.burner waitpolls on the phone every quarter second; a tap right after it needs no new read.- In Chrome, burner reads, scrolls and taps the page itself, not the phone's
screen reader (which falls behind on busy pages): a label tap lands on the
page's own element,
burner scrollscrolls the page, and the address bar prints as an[EditText]row with the URL. Other apps read as before. - Forms in Chrome:
burner tap "Label"focuses a field, checks a box or picks a radio by its label;burner typefills the focused field (dates as 2026-10-05, times as 14:30, colors as #ff0000, sliders and numbers as a number). A dropdown shows its current option: tap it and its options print as rows under it, thenburner tap "Option"picks one. A file field can't be filled.burner type --field "Label" "value"does the tap and the typing in one go. A field whose row shows a format hint ([MM/DD/YYYY]) is a text field with the page's own widget: type in that format, not an ISO date, and check the row afterwards (it prints the value the field kept). - A recipe file has one step per line in
burner doformat,#comments, and$VARfrom the environment:PLAY_PACKAGE=com.example.app burner recipe play-install. burner updatekeepsconfig.env, the pairing and your own recipes.
| Problem | Fix |
|---|---|
| Phone unreachable after a restart | Give it about 2 minutes, then burner ensure. |
burner ensure says Wireless debugging is off |
Android turns it off after a Wi-Fi blip or a restart; burner ensure asks the phone's adb-auto-enable app to turn it back on by itself and waits (the app's routine takes about a minute, so let it run). If it says the app isn't answering, ask the user to open adb-auto-enable on the phone once, or to turn on Wireless debugging in Developer options, then burner ensure. |
| Commands hang, or exit 124 | burner ensure restarts the connection and the on-phone helper (5 seconds; up to a minute when Wireless debugging was off). |
burner tap says a label is cut off at an edge or under another row |
burner nudges the screen by itself (a quarter of it, up to three times) and taps once the row is whole and uncovered; if it still says so, burner scroll up (top) or burner scroll down (bottom), then tap again. |
burner dump comes back empty |
burner wakes a dark screen and restarts the on-phone helper by itself; if reads stay empty, phone on its charger, then burner ensure. |
adb unauthorized |
The phone forgot this computer: pair again (setup step 5 in https://useburner.si/skill.md). |
| Apps say there is no internet | In the Tailscale app on the phone, turn off "Use Tailscale DNS settings". |
burner version doesn't say on branch fast |
Run the install line at the top of this guide again. |
Setup for a new phone or computer, and the security notes, are in the full guide: https://useburner.si/skill.md. After that setup, run the install line at the top of this guide to switch to the fast version.