Tres cosas este mes: una build correctiva de SharkTTY Desk que puedes descargar hoy, un repaso honesto de lo que está en marcha para la app de iPhone y iPad (en marcha: nada de esto se ha publicado aún) y un informe de situación de un transporte de terminal experimental. Esta es la crónica de ingeniería; las notas breves para usuarios están en Novedades.
SharkTTY Desk 0.8.0 — build del 10 de julio (disponible ya)
Es una build de seguimiento del 0.8.0 de la semana pasada, con el mismo número de versión. Descárgala aquí.
El bug de «Detener pantalla compartida»
Este lo sufrimos nosotros mismos, en el uso diario. Cuando tu pantalla está siendo vista, macOS coloca su propio indicador en la barra de menús, con su propio control de «Detener». Terminar la sesión desde ahí —en lugar de desde SharkTTY— podía dejar Desk atascado: el código QR desaparecía, el servicio decía estar arrancando y cada reconexión fallaba, hasta salir y relanzar la app. Apagar y encender el control remoto tampoco ayudaba. Es el peor tipo de fallo: no un crash que puedas reportar, sino un servicio que deja de serlo en silencio.
Lo que ocurría en realidad: al terminar una sesión, el agente reconstruye su listener de red para la siguiente conexión, y esa reconstrucción necesita recuperar el mismo puerto local. Pero la liberación del puerto del listener antiguo era solo un efecto secundario de una limpieza interna cuyo momento dependía de cómo hubiera terminado la sesión — y en esta ruta concreta la limpieza podía quedar muy por detrás de la reconstrucción, o no completarse nunca. La reconstrucción intentaba el bind, encontraba el puerto aún ocupado, se rendía tras una ventana de reintentos que resultó ser más corta que la limpieza, y dejaba al agente sin listener alguno. Desde fuera: «arrancando», para siempre.
El arreglo convierte ese traspaso de coincidencia en contrato: el apagado ahora libera el puerto explícitamente y confirma la liberación antes de permitir que la reconstrucción continúe; el propio rebind es más paciente y registra cada intento, para que un informe futuro se diagnostique desde la Consola. La lección que nos llevamos: el teardown merece el mismo determinismo que el startup. «El puerto se libera solo, tarde o temprano» no es un contrato.
Visualización de la clave de conexión
Tres arreglos menores en cómo se muestra la clave de conexión en el Mac, todos de presentación: nada cambia en cómo se genera o protege la clave. La clave oculta muestra ahora un marcador de longitud fija en lugar de un punto por carácter, así el estado enmascarado ya no insinúa la longitud. Las claves personalizadas muy largas se reducen para caber en una línea en vez de desbordar la tarjeta (el culpable era un interletrado que no se encogía con la fuente). Y Desk recuerda entre arranques que elegiste ocultarla — ocultarla no debería ser una tarea que repites cada mañana. Revelarla sigue pidiendo Touch ID o tu contraseña, como siempre.
La compatibilidad no cambia: esta build funciona con SharkTTY 1.6 o posterior en iPhone y iPad. Si tu app es más antigua, la build SharkTTY Desk 0.5.0 sigue disponible.
SharkTTY para iPhone y iPad — en desarrollo
Que quede claro desde el principio: nada de esta sección se ha publicado. Es lo que ya funciona en nuestras builds de desarrollo, camino de la próxima actualización del App Store — preferimos contarte dónde están las cosas antes que callar hasta el lanzamiento.
El teclado flotante, segundo acto
El teclado flotante estrena segundo acto. Pasa de una distribución a seis — US,
UK ISO, JIS japonés, AZERTY francés, QWERTZ alemán y española ISO — y son
distribuciones de verdad, no teclas con otra pegatina: las europeas llevan un
tercer nivel AltGr como es debido (un terminal sin
| { } [ ] \ no es
un terminal), las ISO tienen su tecla extra junto al Shift izquierdo, y la fila
fn→F1–F12 se mapea por posición física en cada distribución. Escribimos un test que
recorre todas las distribuciones y demuestra que cada carácter crítico de terminal
es alcanzable — cazó dos teclas ausentes durante el desarrollo, que es exactamente
el tipo de vergüenza que un test debe provocar. El cambio entre teclado flotante,
panel de voz y teclado del sistema vive ahora en el propio popover de ajustes del
teclado, donde siempre debió estar.
Sobre las teclas hay una nueva tira de candidatos: autocompletados sacados de lo que tu terminal ha impreso hace poco, de las palabras que has tecleado en la sesión y de una lista corta de comandos de shell habituales. Todo se calcula en el dispositivo, a partir de texto que tu pantalla ya muestra — nada sale del aparato para generar una sugerencia. El botón de micrófono del teclado gana dictado pulsar-para-hablar con vista previa en vivo en esa misma tira, y el resultado solo se inserta cuando lo tocas. Ese último detalle es deliberado: un terminal no perdona las palabras mal oídas, así que la voz nunca va directa a la shell.
Panel de entrada por voz
El panel de voz adopta los mismos modales de ventana que ya tiene el teclado flotante: muévelo, redimensiónalo, baja su opacidad hasta que la shell se lea a través. Un solo juego de controles, dos paneles, cero sorpresas.
Pestañas de escritorio remoto que sobreviven a la desconexión
Un arreglo de coherencia que debía tiempo: desconectar una sesión de escritorio remoto cerraba su pestaña, mientras que desconectar una de SSH la conservaba con un botón de reconexión. La misma app, dos filosofías. Las pestañas de Desk se comportan ahora como las de SSH: desconectar conserva la pestaña, reconectar es un toque, y cerrar una pestaña es algo que solo haces sobre la propia pestaña.
Robustez de la sincronización
El trabajo menos visible del mes, y quizá el más importante. Tus hosts, scripts y ajustes guardados se sincronizan entre dispositivos, y durante cualquier despliegue tus dispositivos ejecutarán una mezcla de versiones — no es un caso límite, es el estado normal del mundo durante semanas alrededor de cada lanzamiento. Hemos rehecho el manejo del formato de sincronización para que los datos escritos por una versión más nueva atraviesen intactos una versión más antigua: la app vieja conserva lo que no entiende y lo reescribe tal cual, en vez de atragantarse o aplanarlo en silencio a la forma que conoce. La regla que ahora nos imponemos es simple: una app vieja jamás debe poder destruir lo que escribió una más nueva. Nunca verás esta función — y ese es precisamente el punto.
Experimental: transporte Eternal Terminal
SharkTTY habla SSH y Mosh. Mosh es lo que hace que un terminal sobreviva a un túnel
de tren — pero corre sobre UDP, y hay redes que sencillamente no dejan pasar UDP.
Eternal Terminal
resuelve el mismo problema sobre TCP puro, y mucha gente ya ejecuta
etserver en sus
máquinas. Nuestra postura es simple: si ya operas un servidor que resuelve esto, no
deberías necesitar nuestra infraestructura para beneficiarte — la app debería hablar
el idioma de tu servidor.
Así que construimos desde cero, en Rust, un cliente del protocolo abierto ET, y ya
completa el viaje entero contra un
etserver real:
conectar, teclear, cortar el enlace a media sesión, reconectar y no perder nada.
De momento vive tras un interruptor experimental mientras acumula kilómetros en el
mundo real; cuando los tenga, aparecerá como tercer transporte elegible por host,
junto a SSH y Mosh. Si ya ejecutas
etserver y quieres
ayudar a probarlo cuando se abra el interruptor, no pierdas de vista este blog.
¿Preguntas o errores sobre cualquier cosa de arriba? El tablón de comentarios es la vía más rápida.