I thought desktop copilots would win, then I tried building agents on Android A developer argues that Android, not the desktop, is the natural home for AI agents, because phones already have the authenticated sessions and background execution primitives that real workflows need. Using Android's WorkManager, agents can run scheduled, constrained, and retry-safe tasks without the battery and throttling issues of naive polling. I used to assume the obvious home for AI agents was the desktop. Chrome extension. Sidebar copilot. Local app with a command bar. Maybe a browser automation loop glued to Playwright and an LLM. That still makes for a great demo. But after digging into Android automation patterns and reading a few OpenClaw discussions, I think a lot of people are aiming at the wrong device. The surprise is not that Android can run agents. The surprise is that phones already have most of the primitives real workflows need: If your workflow lives in Gmail, Slack, HubSpot, Google Drive, WhatsApp, Stripe, field apps, receipts, photos, and managed work-profile apps, the phone is not the weak link. It is the actual environment. A lot of desktop agent demos focus on whether the agent can do things: That is the wrong first question. The better question is: Is the agent already logged in where the work happens? That is where Android gets interesting fast. Chrome extensions are still basically a desktop story. If your plan depends on extension injection, mobile is awkward. But if your workflow depends on authenticated sessions in Gmail, Salesforce mobile, Chrome, internal company apps, or a field-service app that employees already use all day, Android starts looking less like a compromise and more like the native home. That changes how you design the agent. You stop trying to build a tiny desktop copilot. You start building a narrow operator that lives inside mobile context. If you have not looked at Android background execution in a while, the mental model is probably outdated. Serious Android automation is not: while true { pollServer Thread.sleep 5000 } That is how you get battery complaints, OS throttling, and a broken app. The real primitive is WorkManager . WorkManager gives you: A minimal one-time job looks like this: val request = OneTimeWorkRequestBuilder