Telltail: Universal Clipboard for Text
Find the repository here.
Apple Handoff has a neat feature called Universal Clipboard. With it, you can copy a text from one Apple device and paste onto another. Like many, all my devices aren’t of Apple’s, and like them I too am using an intermediary like WhatsApp or sometimes a file sharing tool. This is so common to do that even WhatsApp recognised it and advertised it as a feature.
This is my attempt to solve it.
Before I start telling you about it:
- If all what you want is to send a URL, both Firefox and Chrome provide a way to send tabs to other devices. You should look into it first.
- There is always some privacy concern when we share data over in this manner. I won’t delve into it here, but Daniel Aleksandersen has a good blog post on it if you want to read about it.
With that out of the way, we can observe that there are three parts to this problem:
- The devices should be able to somehow identify each other, securely and privately
- We need to create a base platform over which we can send and receive texts
- We need to make it convenient, otherwise we won’t use it
Tailscale already handles first point for us, so we need to work on the latter two.
Let’s Start Simple
The easiest way I could think to achieve this is to make a website whose backend will store the text. I started with making a home page /
where I can view and change the text. And as I already knew that I would use iOS Shortcuts app down the line (Shortcuts help you to program and automate few stuff on iPhone) so I also created /set
and /get
APIs, to store and get the text back. I named this web server I created as Telltail.
Each program you create in Shortcuts app is called a shortcut. Using APIs I built, I created two shortcuts — one to receive the text stored in Telltail into the phone and another to send the text out of the phone. Beside giving the ability to invoke these shortcuts from within the Shortcuts app, it also gives an option to place an icon on the home screen and also on the share sheet, which I did.
On the website side, I placed a handy copy button but I soon found out that browsers don’t allow access to clipboard if your website is not on HTTPS. Thankfully, tailscale cert
helped me to easily generate certificates for my server.
This is of what I posted a demo on Twitter that got some interest.
I always wanted to easily copy paste text across my devices, as it is something I do a lot. With @Tailscale I can.
— Ajit (@ajitid) March 5, 2023
It’s not as seamless as Apple’s Handoff but here I don’t have to initialise any app either. pic.twitter.com/7MI8clpvFl
Then I started thinking…
Let’s See How Much I Can Stretch It
“It will going to stop somewhere. I just learnt about VPC, and this telltail has substance to work upon rather than going over gobyexample.com for the third time. And it will be a good excuse for learning about clipboard, as I always wondered how something I copy from VS Code appears highlighted in MS Word”, I told myself and got started working again.
iOS Shortcuts
I started with improving the shortcuts I made for iOS. Tailscale too provides few building blocks that I can include in my shortcuts. I heard about battery drain due to Tailscale on both GitHub and Reddit. To conserve battery, I experimented with few ways and ended up connecting to tailnet at the start of shortcuts and automatically disconnecting from tailnet at 6 AM and 6 PM.
Using share button works well for most of the time. But if you’ve selected a piece of text, to share it you need to go to the end of the tooltip to find the Share option, and sometimes that option isn’t even there. To solve this, I created another shortcut that can send the text I just copied.
I thought about how I can invoke it easily… Well, do you know, you can invoke a Shortcut by tapping twice or thrice your iPhone on its back? Or you can make sound of a crying baby to invoke it? Or you can use a floating button that is omnipresent on your screen and invoke a Shortcut from there? All of them come with either inconvenience or distraction though:
- Back Tap: The taps need to be intentional. You have to change your hand position to make that gesture. And its is always a hit or miss for me.
- Sound Recognition: You probably don’t want to send your text only when your dog barks. Moreover it is inconsistent. Sometimes iOS notifies that it recognised a sound in batches. It’s a no go.
- Assistive Touch: Totally works to receive the text from Telltail without leaving the screen you are in. Great if you’re using Assistive Touch already. Distracting if you aren’t.
You can also mix and match them. I still think going to the homescreen and tapping the Shortcut is the most reliable and least distracting way to receive the text. And I settled on Back Tap to send off the text I copy.
Telltail Sync
I first tried to make the copy/paste from Telltail slightly convenient for myself by binding my Win + C and Win + V to invoke /set
and /get
APIs. In practice, doing that key combo is odd — you first do Ctrl + C to copy and then Win + C to send. Meanwhile, my mind started brewing the idea of making copy/paste seamless as it happens using Universal Clipboard on macOS, you don’t have to remember these extra actions to perform.
To make it happen, it requires:
- Make Ctrl + V to work magically
- Make Ctrl + C to work magically
To automatically get the contents from Telltail to my clipboard so I can perform paste, I used SSE (server-sent events) to listen any changes made over Telltail.
For automatically sending the content I copied, I explored and found utilities for my Linux machine that can look for any changes made in the clipboard and tell me when that happens. None of the option covered everything:
- clipnotify exists, but it only works on X (X.Org)
- clipman exists for Wayland, but it won’t work Gnome because it doesn’t implements a protocol that the program requires
- I was already using a clipboard manager, and so I looked in its code and found that in Gnome Development Kit I can access an event that reports whenever any change in clipboard has been made. This is great because I can use this event to send the copied text to Telltail. However, working on it would be too foreign for me.
I was using Fedora with Gnome on Wayland, but facing issues to incorporate this feature, I switched to X.Org. And hence I went with clipnotify.
With all of this in place I built a way to keep my clipboard in sync; I named the program telltail-sync. And because the idea of clipnotify is simple — a CLI tool when invoked keeps itself running until something is copied — and because of the curiosity and interest I had, I implemented clipnotify for Windows and macOS so that Telltail Sync can work on those platforms as well.
To run both Telltail and Telltail Sync automatically when my system starts, I utilised systemd on Fedora and AutoHotKey on Windows as I found they work the way as I desire. I also switched to using tsnet for Telltail because it can self-manage SSL certificates for HTTPS and also because I was looking for a way to run Telltail in both Fedora and Windows. I needed it because I have dual-booted laptop with those OSes and I wanted to keep the same domain for Telltail irrespective of the OS it is being run on. (Update: It didn’t work out because an ephemeral node isn’t removed immediately, and even if that could happen, tsnet asks to pass a context which I have no idea where to get from.)
So, here is the result of all of this work:
This was my foray into VPN, Golang, systemd, cross platform programs and clipboard, and I learnt a lot in this.