Tether: Linux + iPhone

Toen ik volledig overstapte naar Linux, was ik verrast dat ik macOS nauwelijks miste. Kort gezegd: ik heb Tether gemaakt om alle functies te implementeren die ik wél miste.

Het ontbreken van AirPlay was vervelend, maar waar ik constant naar verlangde was wat Apple "Continuity" noemt: de mogelijkheid om iMessages en sms-berichten te verzenden en te ontvangen, bestanden te delen, het klembord te synchroniseren en meldingen van mijn iPhone op mijn computer te zien.

Met name het automatisch invullen van OTP-codes (eenmalige wachtwoorden) uit Mail of Berichten in het inlogveld op de Mac was een functie die ik echt miste. Het klinkt als een klein detail, maar voor mij was het essentieel.

Hoewel het onmogelijk is om alle aspecten van Continuity volledig op Linux te implementeren, is het doel van Tether om alles te realiseren wat technisch mogelijk is. Voor wie zich afvraagt of dit niet al kan: ik weet dat KDE Connect bestaat. Dat is een geweldige tool, en als je Android gebruikt, is het een absolute aanrader. Het probleem is dat het niet deed wat ik nodig had en de roadmap aangaf dat dit ook niet zou gebeuren.

Oorsprong

Tether begon met het vullen van de grootste gaten. Klembord-synchronisatie was de eerste prioriteit; ik wilde de OTP-flow mogelijk maken en wist dat dit een vereiste zou zijn. Bovendien was dit het eenvoudigst te implementeren. Hierdoor kon ik tekst kopiëren en plakken tussen macOS en Linux (Wayland), wat bovendien de basis legde voor de verdere ontwikkeling van het project.

Omdat ik wist dat de App Store een hindernis zou zijn, bracht ik eerst de iOS-app uit, die in het begin alleen ondersteuning bood voor klembord-synchronisatie. Aan de Linux-zijde was er een zeer basis tetherd daemon, maar dat was alles.

Beveiliging was vanaf dag één een prioriteit. Ik heb nooit concessies gedaan aan de veiligheid. De netwerkverbinding tussen iOS en Linux maakt vanaf het begin gebruik van mTLS, waarbij beide zijden akkoord moeten gaan voordat er communicatie plaatsvindt. Sindsdien heb ik regelmatig Opus- en Fable-beveiligingscontroles uitgevoerd.

Na de basis was bestandsoverdracht de logische volgende stap, wat snel en eenvoudig kon worden geïmplementeerd.

Functionaliteit

Wat betreft de mail- en browserfuncties heb ik een pragmatische aanpak gekozen. Ik gebruik Zen Browser (Firefox) en Betterbird (Thunderbird), en beide ondersteunen WebExtensions zeer goed. Daarom heb ik een browser- en mail-extensie gemaakt om de OTP-codes af te handelen.

De mail-extensie zoekt naar OTP-codes en stuurt deze naar de browser-extensie. Deze zoekt vervolgens naar OTP-invoervelden en vult de codes automatisch in zodra ze vanuit de mail binnenkomen.

Dit werkt uitstekend, maar de ondersteuning is momenteel beperkt: als je een andere mailclient gebruikt, heb je hier nu geen baat bij. Ik zou het fantastisch vinden als iemand wil helpen om dit uit te breiden, maar aangezien dat buiten mijn expertise ligt, focus ik me voorlopig op de backend.

De doorbraak bij Bluetooth

Tot voor kort was mijn aanname dat er geen directe interface was voor iMessage/SMS. Men kon altijd een proxy op een Mac draaien om berichten te verzenden en te ontvangen, maar naar mijn mening is dat geen echte oplossing. Ik heb het geprobeerd, zelfs met Tailscale, maar de ervaring was onbevredigend.

Toen stuitte ik op ancs4linux en later BlueFerry, wat me volledig verraste. In het bijzonder de protocol-documentatie van erikwb gaf me eindelijk genoeg informatie om te begrijpen wat er precies gebeurde.

Er was een licentie kwestie: deze projecten vallen onder GPL, terwijl Tether MIT is en altijd MIT zal blijven. Ik wilde echter sowieso een 'clean room'-implementatie in C++. Persoonlijk vind ik het jammer om een implementatie van een interoperabiliteitsprotocol achter een copyleft-licentie te plaatsen; ik zou liever zien dat zoiets bruikbaar is voor iedereen, ongeacht de licentie van het project dat het gebruikt (bijvoorbeeld via libtether).

Nu het echt moeilijke probleem was opgelost, verliep de implementatie ongeveer zoals je van een Bluetooth-integratie mag verwachten (het is in 2026 nog steeds een chaos). Er waren talloze problemen zonder duidelijke uitleg, automatische disconnects en een reeks zorgvuldig bijgehouden edge-cases om de tekortkomingen van Bluetooth te compenseren.

Maar we zijn er gekomen. Tether ondersteunt nu de volgende functies op Linux:

  • iMessage
  • SMS
  • Meldingen
  • Synchronisatie van contacten
  • Bestandsoverdracht
  • Klembord-synchronisatie
  • OTP-afhandeling

Eindelijk worden die tekst-OTP-codes automatisch ingevuld in de webbrowser!

Waarom?

Hoewel ik met dit project mijn eigen probleem heb opgelost, wil ik oprecht dat Tether voor iedereen toegankelijk is. Ik haal er niets uit behalve de voldoening dat iets wat ik heb gebouwd nuttig is voor anderen.

Bijdragen zijn welkom! Bugs, feature-verzoeken, vertalingen, documentatie; werkelijk alles is welkom. Als je Linux gebruikt met een iPhone, hoop ik echt dat je het een kans geeft.