De auteur onderzoekt waarom het Bluesky-logo alleen zichtbaar is in screenshots en niet tijdens het normale gebruik van de app. Uit analyse van de open-source code (GrowthHack.tsx en het pakket expo-privacy-sensitive) blijkt dat de app gebruikmaakt van een UITextField met de eigenschap isSecureTextEntry op true.
Omdat iOS deze velden automatisch maskeert bij het maken van een screenshot, wordt de inhoud van de bovenliggende laag (de 'Follow'-knop) verborgen, waardoor het onderliggende logo zichtbaar wordt. De auteur merkt op dat deze techniek ook wordt gebruikt door apps zoals Signal en Telegram voor privacy-doeleinden in geheime chats.
Hoe Bluesky zijn logo in screenshots plaatst
Ik merkte het Bluesky-logo in de rechterhoek op en vond het vreemd dat het logo me niet stoort wanneer ik de app gebruik. Toen ik opnieuw naar de post in de app keek, was het logo niet aanwezig; het was vervangen door de "Follow"-knop.
Ik herinnerde me dat sommige apps hun logo verbergen waar de iPhone-notch zit, zodat het niet opvalt, tenzij je een screenshot maakt. Maar hier is het logo openlijk geplaatst, dus hoe doen ze dat?
Een experiment
Ik probeerde opnieuw een screenshot te maken, ditmaal midden in de overgang naar een andere app. De "Follow"-knop is zichtbaar wanneer ik de screenshot maak tijdens het wisselen van app.
Hadden ze op een bepaalde manier een listener ingesteld voor de twee knoppen die ik indruk voordat er op het laatste moment een wisseltruc wordt uitgevoerd? Ik ben geen iOS-ontwikkelaar, dus ik weet niet zeker wat daar wel en niet mogelijk is.
Op dit punt was ik licht geïntrigeerd. Gelukkig herinnerde ik me dat de Bluesky-app open source is (of in ieder geval is de code beschikbaar om in te kijken).
De technische oplossing
Het antwoord stond in het bestand dat letterlijk GrowthHack.tsx heet, geïntroduceerd in januari 2026 door mozzius. Dit bestand maakte echter gebruik van een dependency, dus om het te begrijpen keek ik in het pakket expo-privacy-sensitive, eveneens door hen gemaakt.
Het pakket creëert een UITextField met de eigenschap isSecureTextEntry ingesteld op true en rendert de eigenlijke inhoud (de knop) in de .layer van dat veld. Wanneer ik een screenshot maak, verbergt iOS dit UITextField door de laag leeg te maken, waardoor het Bluesky-logo zichtbaar wordt (het was de hele tijd aanwezig). Voor andere platforms rendert het de inhoud gewoon zoals deze is, zonder maskering.
Analyse van het gedrag
Waarom werkt het niet wanneer ik tussen apps wissel? Ik vermoed dat iOS zelf een snapshot maakt aan het begin van het gebaar (zonder de maskering te triggeren), en wanneer ik een screenshot maak, is er geen live UITextField-instantie die daarop kan reageren, maar enkel de inerte snapshot. Maar wederom: ik ben geen iOS-ontwikkelaar.
Is dit een slimme truc of een misbruik van een API die bedoeld is voor privacy? De mensen in de thread die dit gedrag toevoegden, waren er grotendeels niet blij mee, voordat de thread werd gesloten. Ik vind het wel leuk.
Ik heb wat gegoogeld en de truc is bekend. Telegram heeft iets soortgelijks geïmplementeerd voor zijn "geheime" chats, net als Signal, dus ik verwacht niet dat dit binnenkort door Apple zal worden gepatcht.
Hoe Bluesky zijn logo in screenshots plaatst
Ik merkte het Bluesky-logo in de rechterhoek op en vond het vreemd dat het logo me niet stoort wanneer ik de app gebruik. Toen ik opnieuw naar de post in de app keek, was het logo niet aanwezig; het was vervangen door de "Follow"-knop.
Ik herinnerde me dat sommige apps hun logo verbergen waar de iPhone-notch zit, zodat het niet opvalt, tenzij je een screenshot maakt. Maar hier is het logo openlijk geplaatst, dus hoe doen ze dat?
Een experiment
Ik probeerde opnieuw een screenshot te maken, ditmaal midden in de overgang naar een andere app. De "Follow"-knop is zichtbaar wanneer ik de screenshot maak tijdens het wisselen van app.
Hadden ze op een bepaalde manier een listener ingesteld voor de twee knoppen die ik indruk voordat er op het laatste moment een wisseltruc wordt uitgevoerd? Ik ben geen iOS-ontwikkelaar, dus ik weet niet zeker wat daar wel en niet mogelijk is.
Op dit punt was ik licht geïntrigeerd. Gelukkig herinnerde ik me dat de Bluesky-app open source is (of in ieder geval is de code beschikbaar om in te kijken).
De technische oplossing
Het antwoord stond in het bestand dat letterlijk GrowthHack.tsx heet, geïntroduceerd in januari 2026 door mozzius. Dit bestand maakte echter gebruik van een dependency, dus om het te begrijpen keek ik in het pakket expo-privacy-sensitive, eveneens door hen gemaakt.
Het pakket creëert een UITextField met de eigenschap isSecureTextEntry ingesteld op true en rendert de eigenlijke inhoud (de knop) in de .layer van dat veld. Wanneer ik een screenshot maak, verbergt iOS dit UITextField door de laag leeg te maken, waardoor het Bluesky-logo zichtbaar wordt (het was de hele tijd aanwezig). Voor andere platforms rendert het de inhoud gewoon zoals deze is, zonder maskering.
Analyse van het gedrag
Waarom werkt het niet wanneer ik tussen apps wissel? Ik vermoed dat iOS zelf een snapshot maakt aan het begin van het gebaar (zonder de maskering te triggeren), en wanneer ik een screenshot maak, is er geen live UITextField-instantie die daarop kan reageren, maar enkel de inerte snapshot. Maar wederom: ik ben geen iOS-ontwikkelaar.
Is dit een slimme truc of een misbruik van een API die bedoeld is voor privacy? De mensen in de thread die dit gedrag toevoegden, waren er grotendeels niet blij mee, voordat de thread werd gesloten. Ik vind het wel leuk.
Ik heb wat gegoogeld en de truc is bekend. Telegram heeft iets soortgelijks geïmplementeerd voor zijn "geheime" chats, net als Signal, dus ik verwacht niet dat dit binnenkort door Apple zal worden gepatcht.