DEV Community

Cover image for Bluesky usa un campo de texto seguro para mostrar su logo en capturas
lu1tr0n
lu1tr0n

Posted on Originally published at elsolitario.org

Bluesky usa un campo de texto seguro para mostrar su logo en capturas

Cuando tomás una captura de pantalla de un post en Bluesky, en la esquina superior derecha aparece la mariposa que es el logo de Bluesky. Pero si mirás la misma pantalla dentro de la app, ese espacio lo ocupa el botón Seguir. Nadie te avisa: el cambio ocurre en el instante exacto en que el sistema genera la imagen.

El hallazgo lo publicó el 16 de agosto de 2026 un desarrollador que firma como mt, en un post en su blog personal, después de notar que la mariposa nunca lo molestaba dentro de la app pero sí aparecía en cada captura que guardaba. La explicación estaba en el código abierto de Bluesky: un archivo llamado GrowthHack.tsx que reutiliza una función de iOS pensada originalmente para ocultar contraseñas.

TL;DR

  • La app iOS de Bluesky reemplaza el botón Seguir por el logo de Bluesky al detectar una captura de pantalla.
  • El mecanismo vive en GrowthHack.tsx, agregado en enero de 2026 por el desarrollador mozzius.
  • La librería expo-privacy-sensitive crea un UITextField con isSecureTextEntry y dibuja el botón dentro de su layer.
  • iOS vacía el layer de un campo de texto seguro al capturar pantalla, revelando el logo que estaba detrás.
  • El truco no funciona al cambiar de app: iOS toma esa vista previa sin activar el vaciado del campo seguro.
  • En Android y web, expo-privacy-sensitive renderiza el contenido normal, sin ocultar nada.
  • Telegram y Signal usan el mismo mecanismo de UITextField seguro para proteger chats secretos de capturas.
  • El hilo donde el equipo discutió el cambio quedó bloqueado tras críticas de la comunidad.

Qué pasó con el logo de Bluesky en las capturas

mt hizo una prueba simple: capturó un post que le gustaba para reenviarlo a un grupo de amigos. En la imagen final, el logo de Bluesky aparecía donde antes había un botón Seguir. Volvió a abrir la app y ahí, en la pantalla real, seguía el botón: nunca el logo.

La primera hipótesis fue que la app detectaba la combinación de teclas de la captura y cambiaba la vista antes de que el sistema tomara la foto. mt probó otra cosa: deslizar hacia arriba para cambiar de app a mitad de gesto, sin completar la captura. En ese caso, la vista previa que genera iOS sí mostraba el botón Seguir, no el logo.

Esa diferencia fue la pista clave. Si el cambio dependiera de una combinación de teclas, debería verse igual en los dos casos. Como no era así, el mecanismo tenía que depender de una función del propio sistema operativo, no de código de la app reaccionando a un gesto.

Comparación real: la app muestra el botón; la captura, el logo.

Contexto e historia: un truco viejo con un uso nuevo

iOS incluye desde hace más de una década una protección pensada para campos de contraseña: si marcás un UITextField con la propiedad isSecureTextEntry en true, el sistema oculta su contenido automáticamente cuando detecta una captura de pantalla o cuando genera la miniatura del selector de apps. Es la misma razón por la que tu contraseña nunca aparece en la vista previa del multitarea.

Apps de mensajería cifrada llevan años reutilizando esa misma protección para todo tipo de contenido, no solo contraseñas. Telegram la aplica en sus chats secretos, y Signal hace algo equivalente para blindar el contenido completo de una conversación contra capturas no autorizadas. En ambos casos la lógica es defensiva: ocultar información sensible.

Bluesky le dio la vuelta a esa lógica en enero de 2026. El desarrollador que usa el identificador mozzius agregó el archivo GrowthHack.tsx a la app, apoyado en una librería propia llamada expo-privacy-sensitive. El objetivo ya no era ocultar algo sensible, sino mostrar algo: el logo de Bluesky, que hasta ese momento quedaba tapado por el botón Seguir en cada perfil.

Este tipo de decisiones se enmarca en lo que en la industria se conoce como growth hacking: cambios pequeños de producto, muchas veces invisibles para el usuario final, diseñados para aumentar la exposición orgánica de una marca sin gastar en publicidad. El propio nombre del archivo, GrowthHack.tsx, lo deja explícito.

💭 Clave: el logo de Bluesky no aparece por arte de magia en la captura: estuvo ahí todo el tiempo, dibujado detrás del botón Seguir, esperando a que el sistema vaciara el campo que lo tapaba.

Detalles técnicos: cómo un campo de contraseña dibuja un logo

El paquete expo-privacy-sensitive no dibuja un ícono nuevo cuando detecta una captura. Hace algo más sutil: crea un UITextField invisible, le pone isSecureTextEntry = true, y renderiza el contenido real, en este caso el botón Seguir, dentro de la capa (.layer) de ese campo.

Un ejemplo simplificado en Swift de la idea central, sin el envoltorio de Expo, se vería así:

let secureField = UITextField()
secureField.isSecureTextEntry = true
secureField.isUserInteractionEnabled = false

let followButton = UIButton(type: .system)
followButton.setTitle("Seguir", for: .normal)

secureField.layer.addSublayer(followButton.layer)
view.addSubview(secureField)
Enter fullscreen mode Exit fullscreen mode

Cuando el usuario toma una captura de pantalla, iOS vacía automáticamente el layer de cualquier UITextField seguro visible en ese momento. El botón Seguir desaparece de la imagen resultante y, como estaba dibujado encima del logo, ese logo queda al descubierto.

Del lado de React Native, el uso del paquete es mucho más simple: se envuelve el componente sensible en un wrapper que hace ese trabajo por debajo.

import { PrivacySensitiveView } from "expo-privacy-sensitive";

export function FollowButtonOverlay() {
  return (



  );
}
Enter fullscreen mode Exit fullscreen mode

La pregunta que queda es por qué el truco no se activa al cambiar de app con el gesto de deslizar. mt propone una explicación razonable, aunque aclara que no es developer de iOS: el sistema toma esa vista previa del selector de apps al inicio del gesto, antes de que exista una instancia viva del UITextField que reaccione. La captura de pantalla, en cambio, sí encuentra un campo seguro activo para vaciar.

Por qué falla la vista previa del multitarea

Dicho de otro modo: la protección de isSecureTextEntry depende de que el campo exista en pantalla en el momento exacto en que el sistema decide vaciarlo. La captura de pantalla dispara ese vaciado en vivo. El snapshot del selector de apps, en cambio, parece generarse a partir de una instantánea ya congelada, sin ese disparador.

sequenceDiagram
    participant U as Usuario
    participant App as App de Bluesky
    participant iOS as Sistema iOS
    App->>iOS: dibuja el boton Seguir dentro del layer de un UITextField seguro
    U->>iOS: toma una captura de pantalla
    iOS-->>App: vacia el layer del campo seguro
    Note over U,iOS: el logo de Bluesky que estaba detras queda visible en la imagen final
Enter fullscreen mode Exit fullscreen mode

Un UITextField seguro puede ocultar cualquier vista dentro de su layer.

Cómo probarlo vos mismo

El experimento de mt se puede repetir con cualquier cuenta de Bluesky en un iPhone. Solo hacen falta tres pasos:

  • Abrí cualquier perfil en la app oficial de Bluesky para iOS y ubicá el botón Seguir en la esquina superior derecha.
  • Tomá una captura de pantalla normal (botón lateral más subir volumen, o el gesto equivalente en tu modelo).
  • Compará: en la app sigue el botón Seguir, en la imagen guardada aparece el logo de Bluesky.

Si además querés reproducir el mecanismo en tu propio proyecto, expo-privacy-sensitive es instalable como cualquier paquete de npm dentro de un proyecto Expo:

# Windows (PowerShell), macOS y Linux usan el mismo comando
npx create-expo-app mi-app
cd mi-app
npm install expo-privacy-sensitive
Enter fullscreen mode Exit fullscreen mode

La instalación del paquete es idéntica en Windows, macOS y Linux porque corre sobre Node.js. La diferencia aparece al compilar: generar un build de iOS requiere Xcode, que solo corre en macOS, o el servicio en la nube EAS Build de Expo si trabajás desde Windows o Linux.

⚠️ Ojo: el efecto solo se ve en un build nativo de iOS, no en Expo Go ni en la vista previa web. Necesitás compilar la app real para que isSecureTextEntry tenga efecto.

Impacto y análisis: entre lo ingenioso y el uso indebido

La reacción en el hilo interno donde el equipo de Bluesky discutió agregar este comportamiento fue mayormente negativa, según relata mt: varios desarrolladores lo señalaron como un uso cuestionable de una API pensada para proteger privacidad, no para forzar visibilidad de marca. El hilo terminó bloqueado.

El propio mt, sin embargo, lo describe como algo tierno más que como un abuso: nadie pierde datos, no hay tracking oculto, y el resultado es visualmente prolijo. La discusión de fondo es si reutilizar una protección de seguridad para un objetivo de crecimiento sienta un precedente incómodo para otras apps.

App o plataformaQué ocultaCuándo se activaMecanismo

Bluesky (iOS)Botón Seguir, revela el logo de BlueskyCaptura de pantallaUITextField seguro + layer
Telegram (chats secretos)Contenido del chatCaptura de pantallaMismo mecanismo de iOS
SignalContenido de la conversaciónCaptura de pantallaMismo mecanismo de iOS
Bluesky (Android/web)NadaNo aplicaexpo-privacy-sensitive renderiza normal

Qué sigue

mt escribe que investigó un poco más y encontró que el truco es conocido desde hace tiempo en el ecosistema de apps de mensajería, así que no espera que Apple lo bloquee pronto: bloquear isSecureTextEntry rompería la protección de contraseñas en miles de apps, incluidas las del propio sistema.

Lo más probable es que otras apps con presión de crecimiento copien la idea para colar su marca en cada captura que un usuario comparte fuera de la app. Es una forma de conseguir presencia en redes sociales y grupos de mensajería sin pedirle nada al usuario.

📖 Resumen en Telegram: Ver resumen

Probalo vos: instalá expo-privacy-sensitive en un proyecto Expo nuevo y compará cómo se ve tu componente dentro de la app y en una captura de pantalla real.

Preguntas frecuentes

¿Por qué el botón Seguir desaparece en las capturas de pantalla de Bluesky?

Porque está dibujado dentro del layer de un UITextField marcado como seguro. iOS vacía ese layer automáticamente cada vez que detecta una captura de pantalla, y detrás queda visible el logo de Bluesky.

¿Funciona este truco en Android o en la versión web de Bluesky?

No. Según describe el análisis del código, en esas plataformas expo-privacy-sensitive simplemente renderiza el contenido tal cual, sin ningún tipo de ocultamiento.

¿Es un uso indebido de una función de privacidad de Apple?

Depende de a quién le preguntes. Dentro del propio equipo de Bluesky la opinión mayoritaria fue crítica; el investigador que lo documentó lo ve como un uso ingenioso, no dañino, porque no oculta ni filtra datos del usuario.

¿Qué otras apps usan un mecanismo similar?

Telegram lo aplica en sus chats secretos y Signal protege así el contenido completo de una conversación. La diferencia con Bluesky es el objetivo: en esos casos es privacidad, en Bluesky es identidad de marca.

¿Puedo aplicar esto en mi propia app hecha con React Native o Expo?

Sí, instalando expo-privacy-sensitive y envolviendo el componente que quieras ocultar en capturas. El efecto solo se nota en un build nativo de iOS compilado con Xcode o con EAS Build.

¿Apple va a bloquear este comportamiento?

No hay señales de eso. El mecanismo de base lleva años sosteniendo la protección de contraseñas y del contenido cifrado de Telegram y Signal, así que bloquearlo tendría un costo alto para la plataforma.

Referencias

  • timmarinin.net: publicación original donde mt documenta y explica el mecanismo del logo de Bluesky en capturas.
  • github.com/bluesky-social/social-app: repositorio abierto de la app de Bluesky donde vive el archivo GrowthHack.tsx.
  • developer.apple.com: documentación oficial de Apple sobre UITextField y la propiedad isSecureTextEntry.
  • npmjs.com: página del paquete expo-privacy-sensitive usado por Bluesky para implementar el efecto.

📱 ¿Te gusta este contenido? Únete a nuestro canal de Telegram @programacion donde publicamos a diario lo más relevante de tecnología, IA y desarrollo. Resúmenes rápidos, contenido fresco todos los días.

Top comments (0)