8Examples / blog
Workflow · Remote development

The iPad Pro Is the Terminal, Not the Workstation

For years the iPad has sat in a strange place for developers. Absurdly powerful hardware, an excellent display, a Magic Keyboard that makes it look suspiciously like a laptop, and then you try to actually build software on it and the whole thing falls apart. My answer is to stop trying.

By Sean Bennett · August 24, 2026 · 9 min read

I do not use the iPad as the development machine. I use it as the interface to my development machines.

An iPad Pro, a good remote desktop client, a VPN back to my own network, and powerful computers running somewhere else add up to a genuinely capable mobile development setup. Not a compromise version of my desk. The actual thing, viewed through a thinner window.

The iPad does not need to run any of it

The iPad does not need Docker, .NET, Node, databases, IDEs, or AI agents. Those workloads run elsewhere. The iPad’s job is to be an excellent interface to them.

the shape of it
┌───────────────────────────┐
│        iPad Pro           │
│     + Magic Keyboard      │
└─────────────┬─────────────┘
              │
              │ VPN / Remote Desktop
              ▼
┌───────────────────────────┐
│   Development Machines    │
│                           │
│   IDEs                    │
│   Docker                  │
│   AI Coding Agents        │
│   Source Code             │
└─────────────┬─────────────┘
              │
              ▼
┌───────────────────────────┐
│   Remote Infrastructure   │
│                           │
│   OpenClaw Instances      │
│   APIs / Gateways         │
│   Cloud Infrastructure    │
└───────────────────────────┘

That distinction matters, because it changes the question you are trying to answer. The usual framing is how do I reproduce my entire development environment inside iPadOS? That is a hard problem and mostly an unrewarding one. The better question is how do I securely reach the development environment I already have? That one is nearly solved already.

From the iPad I pick a machine and connect to it. A desktop tower, a handheld, a server in the rack. Whatever the work needs that day.

A remote desktop host picker on an iPad Pro showing three saved machines named asus-rog, legion-go-8examples and server14, plus an Add Host Manually tile
The host list, from the iPad. One of them is showing a warning triangle because it is powered down, which is the other half of this setup: the machines are somebody else's problem, and that somebody is me, later.

What you get is the real environment

Once connected I am looking at a real desktop operating system, not an approximation of one. The same IDE, the same terminal sessions, the same Git repositories, the same running containers, the same local dev servers, the same dotfiles and the same window layout I left there.

A JetBrains IDE open on a C# analyzer rules project over remote desktop, with a window switcher overlay and a terminal at the bottom showing an AI agent replying to a question about whether it pushed
A JetBrains IDE on a remote machine, driven from the iPad. The terminal at the bottom is an agent that had been working for nine and a half minutes; I asked whether it pushed, and it admitted it had not and went off to check the branch, remotes, log, and status.

None of that compute is happening on the iPad, which is exactly the point. The tablet is sending keystrokes, trackpad movement, and the occasional tap, and receiving pixels.

The Magic Keyboard is doing more work than it looks like

A large iPad Pro in a Magic Keyboard is a meaningfully different device than an iPad with a Bluetooth keyboard propped next to it. You get a real keyboard, a trackpad, familiar shortcuts, a laptop-shaped object that opens and closes, touch input for the cases where touch is genuinely better, all-day battery, and cellular on the models that support it.

The trackpad is the part that matters most here. You are driving an operating system built around a pointer, so precise pointer control is not a nicety. Touch stays useful for scrolling and the occasional grab, but most of the time I interact with the remote desktop as though I were sitting in front of the machine.

Getting back to the machines: the VPN

Remote desktop is only interesting if I can reach the machines from outside the house, and the way to do that is not to expose development services to the public internet. The machines stay on a private network and the iPad joins that network over an encrypted VPN.

An OpenVPN client on the iPad showing a connected profile, a throughput graph, a connection duration over sixteen hours, and a private LAN IP address
The VPN client on the iPad: connected, sixteen hours uptime, a couple of hundred bytes a second at idle, and a private address on my LAN. From here, everything behaves as though I am at home.

The effect is that I can move between networks, coffee shop, hotel, cellular, and still reach machines that think I am on the same private network they are. For a mobile setup that is the whole ballgame. There is no port forwarding, nothing published, and nothing to find by scanning.

Why not just carry a laptop?

Fair question, and for a lot of developers a laptop is the simpler answer. But the iPad is a device I already want with me for other reasons: reading, browsing, drawing, notes, media, messaging. Adding remote development to it does not cost me another bag or another charger.

The reframe that made this click for me was going from my iPad needs to replace my workstation to my workstation can be wherever I want it to be. Those are very different projects. The second one is mostly a networking problem.

AI agents change what the interface has to do

This is where the setup stops being a party trick. Traditional remote development assumes a human typing more or less constantly, so latency and input fidelity dominate the experience. Agentic development changes that ratio. Increasingly my job is to describe, review, and redirect while the agent reads the repository, edits code, runs tests, reads the failures, searches around, and tries again.

A remote Mac Studio desktop with an IDE open on an iPhone app project, the terminal filled with a long agent report about App Store submission state, pricing changes and remaining tasks
A Mac Studio, reached the same way. The agent had been working for twenty-plus minutes on an App Store submission and came back with a written report: what it verified live, what it repriced, what is still blocked on a form Apple has no API for.

Supervising that does not require a workstation in front of me. It requires a good way to read what happened and say what to do next. An iPad is a very good way to read something.

Note the bottom of that screen, incidentally: the agent is running with permission prompts turned off. That is the mode where this pays off, and also the mode where you want it pointed at a repository you can throw away.

The infrastructure question underneath

Some of what I am building is OpenClaw, a self-hosted AI agent platform. One instance is not hard to run. Dozens or hundreds of isolated instances is a different conversation: RAM, CPU allocation, container isolation, networking, storage, authentication, gateways, provisioning, monitoring, and multi-tenancy all arrive at once.

The arithmetic gets your attention quickly.

the number that starts the argument
100 OpenClaw instances
        ×
   ~6 GB RAM each
        =
   ~600 GB RAM
A handwritten note on an iPad sketching a mini PC with 24 GB of RAM running eight claws behind residential internet, next to per-instance RAM math for 100 instances and the monthly cost of a 512 GB dedicated server
The same problem, worked out by hand on the iPad: a 24 GB mini PC hosting eight claws behind residential internet, against what a hundred of them would cost on a 512 GB, 64-core dedicated box.

It does not follow that all 600 GB is resident at once, and in practice it is not. But it does show why architecture starts to matter the moment you move past running one agent on a spare computer. You can buy one enormous machine, spread the load across several, or push it into infrastructure where capacity is allocated dynamically. I went through those options in detail in how I host 100+ OpenClaw instances without paying for 100 servers.

Giving an agent a phone number

One of the projects sitting open in those screenshots takes the separation idea a step further. Instead of reaching an agent only through a web UI or a chat client, there is a phone gateway.

phone gateway
                Phone Call
                    │
                    ▼
             ┌─────────────┐
             │Phone Gateway│
             └──────┬──────┘
                    │
                    ▼
             ┌─────────────┐
             │  OpenClaw   │
             │    Agent    │
             └──────┬──────┘
                    │
                    ▼
                LLM / Tools

Somebody calls a number. The gateway connects that conversation to an OpenClaw instance. The model conducts the conversation while the agent keeps its normal tools, so it can go and actually do the thing rather than just talk about it.

An IDE on the phone-call-gateway project with an OpenClaw integration document open in a markdown preview, showing the gateway URL and the CLI command that enables the phone capability for a tenant, with a terminal below describing the container and hook routing
The gateway’s integration doc, mid-write: set one environment variable, run one CLI command to enable the phone capability for a tenant, and the agent’s container starts taking calls through the hook route.

Voice is interesting mostly because of what it removes. Opening a laptop, finding the app, finding the right agent, and typing a request is perfectly fine when you are already working. It is friction when you are not. Being able to ring your agent and ask whether the deployment finished, or what changed in the project today, or what is going on with the server, is a different relationship. It stops feeling like using a chatbot and starts feeling like calling somebody.

The pattern is the same one every time

Everything above is one idea applied repeatedly: the device in your hands does not have to be the device doing the work.

The interface to an agent does not have to be the machine hosting the agent. The machine hosting the agent does not have to be running the model. Each piece lives wherever it makes the most sense, and gets swapped without disturbing the others.

decoupled
┌──────────────┐
│    Human     │
└──────┬───────┘
       │
       ├──── iPad
       ├──── Phone
       ├──── Browser
       └──── Other Interfaces
              │
              ▼
       ┌──────────────┐
       │ AI Agent /   │
       │   OpenClaw   │
       └──────┬───────┘
              │
       ┌──────┼──────────┐
       │      │          │
       ▼      ▼          ▼
     Tools   APIs      Servers
              │
              ▼
             LLM

So, is an iPad Pro good for software development?

If the question is can an iPad natively replace a Linux or macOS development workstation, then for my work, no. But I do not use it that way and I do not want to.

If the question is can an iPad Pro be an excellent portable interface to a full development environment, then yes, comfortably. Between fast remote desktop clients, cellular iPads, cheap capable home servers, VPNs that just work, and agents that do the typing, this is getting better every year rather than worse.

Stop asking how to fit the workstation into the tablet. Ask how to reach the workstation from anywhere, then let each device do the one thing it is good at.

My development environment stays exactly where it is, with its RAM and its cores and its containers. The iPad just lets me take the window with me.