Fatih Arslan

My thoughts about Programming, Coffee, Bags and various other stuff

Using the iPad Pro as my development machine

I bought an 11” iPad Pro to use it as my main development machine. Let me say it’s an attempt.

I’m a huge fan of Bret Victor and try to immerse myself with his ideas, papers, and videos. One of the things he talks about is how we should look into new mediums to unleash our creativity, to create “things” that were not possible before.

The iPad is a very different device. I know that many people (including me) are using it already for so many years. However, the iPad has improved a lot and has two new ways of interactions that are now a first-class citizen in the iPad ecosystem:

If you think about a second, with the touchscreen, you have three different ways of creating something new, and what to do is only left to our imagination.

The number one reason I bought the iPad Pro is, not just to have an excellent and powerful mobile device, I also wanted to explore new possibilities with all these new input devices, new ways of creating stuff. I think Apple is onto something here and I want to see if it holds up or not.

This is a very lengthy blog post. First I’ll share my experiences using it as a development machine, scripts I’m using and my whole workstation setup. Afterwards I’ll share and review the various bits of using an iPad Pro (photo and file management, keyboard, pencil, apps, accessories, etc.)

Grab a coffee ☕️ and let’s deep dive into it!


Development

I had a MacBook Pro 13.3”, it belongs now to my wife. This was a perfect excuse for me to try out the new iPad Pro and experiment with it. I wanted to see if I could test, write and deploy my day-to-day projects. Is that possible? Let’s see!

The first thing I started doing was to install Blink.sh and experimenting with it. Blink.sh is a Terminal Emulator and has sandboxed local terminal access, which you can use for basic stuff. It includes the following commands:

As you see there is tons of stuff you can start using, but it’s not a full featured OS, which means you’re very limited to what you can use. However, there are a couple of commands that are very useful (i.e: scp) and I’ll show later in the blog post how I’m using it in conjunction with other iOS apps.

After firing up Blink, it greets you with a blank terminal and a shell prompt. That’s it. There is no documentation, no obvious settings, etc.. Initially, even for me as an experienced terminal user, I didn’t know what to do. I started to explore the commands and found a config command, that would open the settings for Blink.sh. From there I started digging into the settings.

Before I go and show some of the important stuff, we need to first create a remote workstation which we can start using as our main development machine. Obviously, there is no way to develop on an iPad Pro. Even with the sandboxed emulator above, it’s not useful at all. There are projects like iSH, which is a x86 emulation and provides a full Linux shell (it’s doing it by doing syscall translations). However it’s still in prototype mode and I haven’t started to use it yet, but it’s something I want to check in the future again. There are also applications like Coda to let you edit and develop with HTML, CSS, etc… But I’m not a web developer and I need a real terminal with usable tools to get my job done.

Now let’s continue creating a workstation.

Workstation setup

There are several options to create your remote workstation. The easiest way is just to create a VM instance (say a droplet on DigitalOcean) and then start using it. Install a couple of packages, your favorite programming languages, tools, etc.. and you’re done!

However, the problem with this is, what if you somehow lose your machine or some of the data? Or you have decided to change your cloud provider? Maybe you have decided to start from scratch? Let me start with some history:

I started first creating a provisioning script and used Packer to create an image. This image would be then something I would use to start my instance. The problem with this approach was that the interaction and development cycle of the image was just too long.

Suppose I wanted to add a new package/tool to my final image, I had to change my script, create a new image, wait at least 30 minutes (depending on your network and script) and see the end result. Machine images are useful if you want to reuse them between thousands of instances at the same time, but for our needs, it was overkill.

Remote workstation (first iteration)

Remote workstation (first iteration)

So I ditched the image idea and started using Terraform by dynamically provisioning my droplet during (or after) the droplet creation. This would mean that I didn’t have to maintain and store an image, and it would create my droplet with all the packages I provisioned.

The issue with this approach is, as I figured out using it for a couple of weeks, at some point, I had to install new tools or change some of my configurations. Every time I did it, I had to make sure to also update the provisioning script I was using with Terraform. If not, that would mean if I had to create a new remote workstation from scratch, I had to reinstall all the tools again. So what’s the point of using a provisioning script then? I’m a very dedicated and focused person, but even I couldn’t keep up with syncing my host machine and my provisioning script (you were right qmx).

Finally, after talking with some of my friends who use remote workstations already for months (thanks Doug and Nan), I came to the conclusion of using a Docker container inside the instance.

Using a Docker container

Docker images, unlike machine images (i.e: AMI) can be created much more easily. One of the thing that makes a Docker image perfect for this kind of setup is, once built, the layers are cached. So if you arrange your image in a meaningful way, adding a new package to the image will be very quick (because it will reuse the cached layers).

Remote workstation runs inside a Docker Container

Remote workstation runs inside a Docker Container

Second, even if I have to install anything inside the Docker, nothing is stored permanently. This means, it forces me to actually always update the Dockerfile, because the next time I run it, everything will be lost again. My whole workstation setup is immutable. I can quickly destroy anything, create it again from scratch in minutes. I’m not saying it’s easy and I know it’s not for everyone, but once you get used to it, everything plays so nicely.

Of course, running inside a Docker container has a lot of disadvantages. Because it’s not a real host and you have to fight sometimes with the Docker abstraction. For example, to build Docker images inside a Docker container, you need to mount a socket and also make sure you’re part of a specific Docker group (if you’re running it as non-root).

So how did I setup my Docker image? It’s all open source and can be found here: github.com/fatih/dotfiles/workstation

Let me explain some of the ideas:

  1. First I’m using terraform to create my instance. This allows me to also setup other additional resources, such as a Firewall, that is automatically configured based on the droplet. You don’t need to use terraform of course, but it’s nice to have.
  2. The terraform script has a bootstrap.sh script, that installs docker to the host and installs a systemd service file which runs my container. This is important because my CMD inside the Dockerfile is running a SSH server.
  3. If you now check my Dockerfile, you’ll see that my CMD is SSH server, so it’s blocking. I’m changing the port from 22 to 3222 so it doesn’t conflict with the host’s SSH port.
  4. From outside, I can now SSH directly to either the host ( via port 22, which is rarely needed, but it’s great to have) or into the container (via port 3222). If you check the systemd service file, you’ll see how I run the container and I make sure to run it in --net=host mode, which simplifies things dramatically. Of course, you can always opt out and expose a Port.

To create workstation, all you do is to run:

$ export DIGITALOCEAN_TOKEN="Put Your Token Here" 
$ terraform plan
$ terraform apply -auto-approve

This creates the droplet and installs the systemd service. My docker dev image is already pushed to Docker Hub. Nothing important is stored in the image, so it’s totally safe to share it publicly (more on this below in the Secrets section). Once the container is created, you’re now able to SSH into the droplet:

$ mosh --no-init --ssh="ssh -p 3222" root@<DROPLET_IP> -- tmux new-session -AD -s main

I’ll explain what the tmux command means in a bit. Note that you can also SSH into the container if you don’t want to use mosh:

ssh -p 3222 root@<DROPLET_IP>

So you might ask yourself, why don’t we SSH/Mosh into the host machine and run the container there, instead of SSH’ing directly to a container? One benefit of this approach is, you can directly connect via MOSH into the container, without any additional step.

Dockerfile

If you’re using Docker or Kubernetes you already know how to create Docker images. Some of the important bits in my Dockerfile are:

Tmux

I’m a huge fan of Tmux and it’s one of the things you definitely need to know/learn if you plan to use your iPad Pro with a remote workstation.

I had a small issue though. If you somehow attach to a tmux session, say from the iPad Pro, close the lid and then attach to your Container by using a different client (say my iMac), the screen size will be not resized to the big screen. This means I’m still seeing a 11” Tmux windows on my 27” iMac. Why? Because that’s the way how Tmux works and is used by many to share screens amongst multiple clients.

However, in my case, I didn’t care about this because there should be always one single client and that should be me. To fix the issue, I always had to detach from my iPad Pro first before I could attach from my iMac. However this was cumbersome, so welcome to the magic command:

tmux new-session -sAD -s main

This command is called every time I’m connecting to my Docker container. This is basically doing this: If there is no session available, create a new one, if there is already a session, detach all other clients and attach to it. To learn more about the individual flags, please check tmux man and jump to the new-session subcommand.

Another fix I’ve done in my setup is to detach from tmux if there is a single pane and window in Tmux. I’m always using exit to close a tmux pane, sometimes I’m using ctlr-d, but not very often. The problem with this habit is, when I’m on the last pane and I call exit, it exits tmux and quits it. But sometimes I still have something in my command line and the session should be alive. To fix it, I added the following script to my .zshrc:

exit() {
  if [[ -z $TMUX ]]; then
    builtin exit
    return
  fi

  panes=$(tmux list-panes | wc -l)
  wins=$(tmux list-windows | wc -l) 
  count=$(($panes + $wins - 1))
  if [ $count -eq 1 ]; then
    tmux detach
  else
    builtin exit
  fi
}

This script overrides the exit command with a custom one. If you follow it you quickly see that I’m getting the number of panes and windows, and do a detach if there is only one left, otherwise I always call exit.

Secrets

One of the most important parts of this remote workstation part is how to store your secrets? It’s not an easy task, unfortunately. If you check my Dockerfile you’ll see that nothing sensitive is in my final image. However, I install op, the command line tool from 1Password, that allows me to fetch and retrieve secrets from my 1Password account.

First, I’m mounting a /mnt/secrets folder from the host to my container. During the host provisioning, I also put a script called pull-secrets.sh in this folder. So when I SSH into my container, all I do is to run the following command:

cd ~/secrets && ./pull-secrets.sh

The pull-secrets.sh script has the following content:

#!/bin/bash

set -eu

echo "Authenticating with 1Password"
export OP_SESSION_my=$(op signin https://my.1password.com ftharsln@gmail.com --output=raw)

echo "Pulling secrets"
op get document 'github_rsa' > github_rsa
op get document 'zsh_private' > zsh_private
op get document 'zsh_history' > zsh_history

ln -s $(pwd)/github_rsa ~/.ssh/github_rsa
chmod 0600 ~/.ssh/github_rsa
ln -s $(pwd)/zsh_private ~/.zsh_private
ln -s $(pwd)/zsh_history ~/.zsh_history

echo "Done!"

This authenticates with my 1Password account by asking for the Secret key and my master password. After downloading some of my private keys and relevant files I want to keep sensitive, I symlink them to the appropriate locations.

Even if I exit the container, create a brand new image or I have to start from the beginning, these files will be always there (because it’s mounted from outside). This is not perfect of course, because this folder is not encrypted yet.

I’m not a security expert and I’m still looking for better ways of handling my secrets. The best solution I could find was this. My end goal is to have an encrypted folder that mounts whenever I SSH into my container, asks for a password and automatically decrypts the folder and symlinks to the relevant paths. Please let me know if you have any ideas :)

Mosh

As I said, I’m using Mosh instead of SSH. Blink.sh comes with Mosh support, this means it has the mosh client embedded and we’re able to connect to any server that has mosh-server installed.

I won’t go into details what Mosh is, but I really want to share this sentence from their landing page, which perfectly explains it:

Mosh is a replacement for interactive SSH terminals. It’s more robust and responsive, especially over Wi-Fi, cellular, and long-distance links.

I was always in the SSH camp, but after using Mosh for a couple of weeks, I can’t go back anymore using SSH. I was always skeptical of using Mosh because I didn’t have any needs for it. But with the iPad Pro and the awesome Cellular feature it has, it’s actually a very great fit. I couldn’t believe about the connectivity but this was the first time I felt like I was coding on my localhost. There is still latency, I don’t say there isn’t, but if you have a server near in your region, it’ll be really fast.

Another great feature is the “always-on” connectivity feature. To give an example of how insane it is let me share something I demoed to my friend:

  1. I setup a WiFi hotspot from my iPhone and connect my iPad Pro to it (I hadn’t any data plan yet for my iPad)
  2. I connect to my remote workstation via Blink and started running a couple of commands.
  3. After that, I closed the lid of my iPad Pro. At this point, the connection should be gone already
  4. I also turned off my iPhone completely
  5. I went and turned on my iPhone again, turned on my hotspot, connect with my iPad Pro again
  6. Voila! It’s still working, just like I left it!

Is this magic? I don’t know but it really feels like magic compared to SSH. And I don’t exaggerate. Just give it a try on what I mean, you’ll see what I mean.


As you see, the container approach, combined with the helper scripts and additional tools (such as Mosh and Tmux), makes this setup highly iterative to develop, secure and easily maintainable. Of course, we gain the additional complexity of dealing with the container abstractions. So far I hadn’t any big complaints about this approach. There are other problems of course, which I’m going to explain later in this blog post.

So far I explained how I set up my remote workstation for my iPad Pro, now let me share my experiences on using the iPad Pro in other contexts.

File management

Dealing with files on a local machine is much easier. But the problem arises if you’re working on a remote machine. How do you copy back and forth files? Especially in the era of iOS with the iPad Pro, where there is still not a perfect way of dealing with files? There are several options:

  1. Install Dropbox client. Dropbox has a great Linux client (works only with ext4 FS) and it’s easy to install as well. Once installed, you can easily move in/out files and can use the Dropbox App on your iPad. Everything works seamlessly and I really liked that approach. The only problem with this is to make it part of the docker container. I didn’t look into it yet, but I believe it’s doable if we mount the Dropbox directory from outside the container, so it doesn’t re-download all the data in case we stop/restart the container.
Files App on iPad Pro allows us to interact with Blink.sh

Files App on iPad Pro allows us to interact with Blink.sh

  1. Using scp from within Blink.sh app. Blink has local storage, that you can use to copy files from your host or retrieve them with scp. The Files app has a Blink folder that allows you to copy/past any files into. So this means once a file is inside the Files App, you can theoretically copy anything to your remote host. Once you put a file inside the Blink folder, all you do is to call the following command (hostname is the name you define in Blink.sh):
scp localfile hostname:remotefile

There is only one issue with the scp command, it’s not able to pick up the port from your config. You need to first ssh into the machine via the ssh2 command once, after that it’ll pick up the change (because ssh adds esdsa and scp doesn’t recognize it, whereas ssh2 adds the host to known hosts with rsa). There is an open issue: github.com/blinksh/blink/issues/564 Of course you can also copy from the remote machine to your local workstation as well.

Connectivity

As I said earlier, Mosh makes things so much easier and changes the way to use the iPad Pro. Even better is the constant connectivity when you opt-in to buy the iPad Pro with its cellular option. This means that the iPad Pro has a dedicated data plan and you can connect to the internet from anywhere.

This is the first time I’m buying an iPad with the Cellular option. I always wanted to try it out and so far I think I made an excellent choice. I know that I could use my iPhone to create a Personal WiFi hotspot, but it’s still not the same experience. I could now theoretically take iPad Pro everywhere in the country and have instant connectivity.

WIFI vs Cellular (xkcd 1865)

WIFI vs Cellular (xkcd 1865)

So far it’s just great. I even use in areas where the public WIFI really sucks or is not good enough (some cafes for example). Also in recent years, Cellular reception became better in quality, so I often switch to it.

I also have a private algo VPN on a $5 Droplet, which means I have a secure and fast connection whenever I need.

One benefit of having a remote workstation is also that your network connectivity on the remote instance is much faster than your local ISP. I know that you have to pay for the ingress/egress network data of your Cloud provider, but pulling and pushing docker images is way better than having to deal with it on my localhost. Pushing an image is around 30 minutes from my localhost, the same took 2-3 minutes from my remote workstation. It’s unbelievable and changes the perception of how you’re working.

Usage

Using the iPad Pro is very different. Sometimes I use it on a table writing a couple of lines but sometimes I lay down on my couch and use it on top of my legs or just hold it with my hands (watching some videos, reading books, etc..)

The 11-inch iPad Pro is not very comfortable in this mode, but it&rsquo;s doable

The 11-inch iPad Pro is not very comfortable in this mode, but it’s doable

I can’t say that the 11” is very comfortable when you want to use it on a lap. It’s very small and because it doesn’t have any weight it wobbles a lot.

However, I can say that there is one great thing using it on your lap. It doesn’t get hot! Normally when you use a MacBook it’ll get warm after a couple of hours (depending on the work you’re doing). I barely can use it and have to stop after a while. But this is not the case with the iPad Pro. It feels different because you always expect it to be warm, but it’s not :)

Screen size

I went with the 11” because I’m using my iPad for many things, not just coding or writing stuff. It’s my main consumption device, such as watching videos, reading books and articles, interacting on social media, etc.. Hence I always went with the smaller size.

Some of my friends have the 12.9 and I feel like it’s too big. It’s not comfortable to hold in your hands. I think I would pick the 12.9 if I had only one single machine at home. However, as an iMac Pro user, I already have a powerful machine with a big screen (27”). Therefore if I somehow need more screen estate I always can opt-in for the iMac.

I definitely recommend you to see it in real before you decide on a size. They are very different and I think it entirely depends if you feel comfortable using a bigger screen or not. I’m ok with the 11” and can use it for anything. This might be not the case for you.

Keyboard

You can purchase a compatible keyboard for the iPad Pro, called Smart Keyboard. It doesn’t require any battery and is attached directly via the connectors behind the iPad. So no pairing is required as well. You snap it and that’s it. Also, it automatically shuts down if you close the lid or turns on if you open the lid. If you unfold it completely, the keys are also disabled, which is great if you plan to use the pencil to draw something or just want to read/watch on the iPad.

Writing a blog post with Ulysses and Smart Keyboard

Writing a blog post with Ulysses and Smart Keyboard

On the paper, it’s really great and it works also surprisingly well. But I can’t say it’s perfect, especially if you coding. First of all, there is no ESC key or the function row. This means it’s not easy to cancel anything (say to close a modal) or change the brightness of the screen. For that, you always have to use the touchscreen. The keyboard quality is ok, but I have to say that it’s sometimes better to write on this keyboard than on a Macbook.

I don’t use the Esc a lot nevertheless for Vim. To switch from Insert mode to Normal mode, I’m using either the ctrl-c shortcut or jj (my custom mapping in insert mode). However, now the problem begins. Because I use ctrl so much, my Caps Lock is mapped to ctrl. It’s not only Vim where I use ctrl a lot, think of the readline shortcuts, such as ctrl-e or ctrl-a to jump to the beginning or end of the line. There is no way to change Caps Lock to ctrl system wide.

Luckily, Blink has an option to map Caps Lock to Ctrl, but that’s only visible and useful when you’re Blink.sh. Even with that, there are times it doesn’t detect that I’ve pressed Caps Lock, so I can’t say it’s perfect. Another issue with this approach is because you constantly press Caps Lock when you exit Blink.sh, you don’t know in which state Caps Lock is. It’s either enabled or not, so when I start writing somewhere else, I have to disable Caps Lock 50% of the time. It’s just annoying. You could use an external mechanical keyboard where Caps Lock is absent, but then you lose the portability and all the great features of the Smart Keyboard.

A lot of applications have keyboard support, such as Twitter, Ulysses, Things, etc.. Most of them are really good, but some doesn’t support it at all. For example, Apple Photos doesn’t support the keyboard, so you cannot delete photos or scroll over them with the keyboard. To see if an App supports any kind of shortcut, you have to press and hold CMD key. This will show a modal with all the shortcuts you can use.

Just like on a macOS, you can use cmd + space to jump or open anything. This works really great and I love it. I hope Apple continues improving the state of the keyboard software wise in iOS 13 so it’s even better. In this state, you constantly fight with the limitations at some point.

Pencil

Like the keyboard, you can also buy the Apple Pencil in addition. It’s fundamentally very different compared to the old version. I didn’t use the older version of the pencil, so I don’t have to add much and can’t compare. However, the one I’m using (latest iteration) is amazing. It feels like a pencil and the way it charges (snaps automatically on the bezel) feels very natural. I never care about the battery life of the pencil. It’s ready to go whenever I want to use it.

One thing I have to clarify is, I’m a Software engineer and my main area is distributed systems. Nothing in my job description is about drawing or designing something. So you might think, why did you get an Apple Pencil? Well because it’s not just for designing, it’s also usable for taking notes, annotating screenshots, editing pictures, creating diagrams, etc…

Especially annotating pictures is one of the highlights of using the pencil. If I want to show something, I just take a screenshot and immediately start annotating it with the Pencil. It’s amazing how wonderful it feels and it let me quickly finish my job.

Secondly, creating diagrams with the pencil is really great. There are several applications you can use, I really like Paper from WeTransfer (old Paper53). It has a Diagram mode where it allows you to create diagrams in natural mode. So you draw a circle, it becomes a perfect circle. You can even connect shapes together.

Face ID interaction

The new iPad Pro uses now also Face ID. This is important for people who use the iPad Pro with the keyboard, because it makes the interaction with everything so much easier. You don’t have to touch anymore to unlock the iPad.

Secondly, with the new Password Manager integration (I’m using 1Password), login into websites is so convenient. Whenever you see a login page, you click on the password button, Face ID unlocks 1Password and your login data is then pasted into the login form. It feels very magical.

The only caveat I here is the Face ID sensor placements. I think the Face ID cameras should be placed a little above, near the buttons. Most of the time, if I’m holding the iPad, my hands always cover the cameras. I have to make sure I don’t accidentally hover the cameras. I think Apple made a mistake by putting the Face ID cameras in their current position. They should be just below the place where we snap the Apple Pencil to the bezel. Maybe I’m the minority (as a user holding the iPad always horizontally), but the iPad with the Keyboard is also in its horizontal mode, so it’s not a bad idea in my opinion.

Accessories

The iPad Pro now has a USB-C input (instead of Lightning). USB-C was introduced first with the new TouchBar MacBooks (in the Apple ecosystem). Of course with that, they also removed all other ports, which means you have to buy tons of dongles. I’m now carrying a bag with a lot of dongles (it’s not fun IMHO). But on the bright side, all these dongles and cables now work with the iPad Pro as well. This is such a huge step because it enables tons of new opportunities.

USB-C Dongles and Cables

USB-C Dongles and Cables

What do I carry with me? These are the following dongles and cables:

You can easily charge your Apple Watch with the new Apple Watch Magnetic Charger to USB-C

You can easily charge your Apple Watch with the new Apple Watch Magnetic Charger to USB-C

Before the iPad Pro, I really hated using the USB-C accessories because my MacBook (work laptop) was the only device that could use it. But now that iPad Pro also uses USB-C, everything is much easier to use. I’m looking forward when the iPhone also switches to USB-C so I can get rid of all my cables and start to use USB-C for everything.

Photo management

I like taking photos. I’m an avid user of my Fujifilm X-H1 and use it a lot. One thing I really love about the iPad Pro is how easy it’s to manage your photos and edit them. First of all, I’m using Apple Photos to store all my photos (I have the 2TB plan). I have used Dropbox and Google Photos in the past, but I eventually settled down with Apple Photos 1-1.5 years ago because of these benefits:

Having said that, Apple Photos is not perfect. It has these two fundamentals issue in my opinion:

I think these problems will be eventually fixed in the upcoming versions.

I can directly connect my Fuji X-H1 to the iPad Pro and start importing photos

I can directly connect my Fuji X-H1 to the iPad Pro and start importing photos

Back to the iPad Pro. I bought the 512GB version because I wanted to have the ability to quickly and instantaneously edit and see my photos. I have around 220GB worth of Photos, so the 512GB is perfect in this sense. I’m still using iCloud to sync my photos between all my iDevices but on the iPad and iMac, I enabled the “Download Originals” options. This allows me to edit the photos and manage my photos easily.

If you don’t have a lot of photos or don’t want to work on big files, I don’t think it’s worth buying the iPad with bigger storage. I think the 64GB is perfect for lots of people, but I would opt into the 256GB just to be on the safer side (because you won’t be able to upgrade it later)

iCloud Sync (Continuity)

I think this is something worth mentioning. If you’re into the Apple ecosystem, the way iCloud syncs all your settings and files are just amazing. Don’t think iCloud as a Dropbox replacement. It’s more than that.

First of all the whole idea of moving seamlessly between your iDevices (iPhone, iPad, iMac, MacBook, etc…) is called “Continuity”. Under the hood, it uses iCloud, which is the universal sync system that makes sure everything works fine. If you’re using iCloud, this means all your notes, photos, etc.. are synced across all your devices. Take a photo with your iPhoto and boom, it’s on your iPad and MacBook immediately. Write something down in Apple Notes and it’ll be available immediately in your other devices.

But this all is not the only great thing. I especially like two things that work very well for me. One is “Handoff” and the other one is “Universal Clipboard”.

Handoff enables you to start something on one device and later pick it up on another device, without losing focus on what you’re doing. For example, I wrote this blog post mainly on my iPad Pro with Ulysses. However, sometimes I have to jump back to my iMac and do some errands. I can easily continue writing on my iMac by opening Ulysses. It’s immediately there and ready to be used. This works on so many apps that it’s just amazing. For example, suppose you’re browsing something on your iMac. You grab your iPad, leave your home and open your iPad and boom it’s there.

Second, “Universal Clipboard” is an amazing feature. This feature allows you to copy paste from one device and paste it on another. For example, I can copy from iMac and then paste it on my iPad. It’s not text, you can even copy/paste images as well. This feature is amazing, just like “Handoff”, because it allows you to seamlessly switch devices.

Copy & Paste

Talking about copy&paste, there is a serious issue when you use a remote workstation (or let’s say something very annoying).

Everything you copy there, unfortunately, won’t be available in iOS’s clipboard. Suppose you copy a line in Vim via yy and then want to paste it into Apple Notes. Forget it. It’s not possible because both of these systems use a different clipboard.

What we need is “Universal Clipboard” integration in our remote workstation. If you’re using SSH and Blink, copying into Tmux’s clipboard buffer actually forwards it to the iOS clipboard. But this doesn’t work with Mosh at all. I hope Blink implements (and documents) a proper clipboard sharing between the host and remote workstations, that can be used with Mosh or SSH as well.

Notable apps

Some notable apps I’m using and I think you should give it a try:

Cost

I mentioned many things throughout the blog post, but I think I also should mention a little bit about some of the costs if you’re planning to use the iPad as your main development machine:

As you see, you’re going to have a pay least $30 per month (remote workstation + iCloud + data). And this is just the minimum. You can say that iCloud is also used by all other iDevices, even if you think like that, I picked up the cheapest options for the remote workstation and your data plan for the cellular connectivity.

There are certain options to minimize these costs. For example, you could theoretically shut down your remote instance whenever you don’t use it and only start whenever you start working. Let’s say, you don’t use it throughout the night, just shut it down. Also many Cloud providers are working on making the Container as a Service platform more usable. There will be options where you can run your docker image for a longer period, instead of spinning up the whole instance, and then stop the container whenever you don’t use it.

Verdict

After using the iPad Pro for a while, you’re starting to use sentences that start with “What if … ?”. What do I mean by this? Here are a couple of questions:

Importing and editing my photos, writing blog posts (note: this whole article was written on the iPad Pro), reading books, researching, etc.. All the ordinary stuff is very possible. On the coding side, I was able to develop, test and ship a new feature for Fixmie. However, I’m not sure if I could do the same if I had to test the website or had to fix something in the authentication workflow. I have mixed feelings here

The issue with the iPad Pro is, because it’s not a real computer and IMHO not a laptop replacement, you don’t know what the limits are or when you’re going to hit the wall doing some stuff. There were so many times where I just couldn’t continue with the iPad. I had to use my iMac to finish my job.

If you’re using the iPad Pro in the mindset of “This is going to be my main work machine”, then you’ll be living in constant fear. I really mean it. However, if you’re using the iPad in the mindset of “This is a great device with a constant connectivity to the internet, I think I can use it for almost all my needs” then you’re thinking differently because you know the limitations and therefore can prepare yourself.

I have decided that the iPad is the perfect mobile device for most of my work, but it can’t replace my main work devices (MacBook or iMac). I know it sounds cool to use the iPad as the main development machine, however, the constant limitations you’re hitting is just frustrating. I agree with most of the people out there that iOS is still limiting in several ways.

Nonetheless, I think Apple will tackle this with the upcoming iOS releases, so I’m positive and believe the future of development on iPad will be a first-class citizen.

If you have made it so far, thanks for reading! Please let me know if you have any questions and feel free to share your thoughts.


If you have any questions or feedback, please feel free to share it with me on Twitter: @fatih