Yolk
Lanzas el servidor y te contesta que el puerto 3000 está ocupado. ¿Por quién? Por ti, casi siempre: algo que dejaste encendido hace días en una terminal que ya ni existe.
Me encanta la terminal, y de hecho es donde paso el día. Pero nadie escribe un comando para saber qué hora es: levantas la vista y ya. Yolk es eso para los puertos, poco más que un vistazo en la barra de menús.
Qué es
Una app nativa y pequeñita que vive en la barra de menús de macOS. Sin ventana principal, sin icono en el Dock, sin dependencias de terceros. Pulsas y ahí está todo lo que tu Mac tiene escuchando en local, con nombre y apellidos.
Cada fila dice lo justo para no tener que preguntar más: puerto, nombre, el comando que lo lanzó y cuánto lleva encendido. Si el proceso vive en una carpeta con package.json, el nombre sale de ahí, mirando hasta tres carpetas hacia arriba; si no lo hay, vale el de la carpeta. Todo ordenado en grupos plegables: desarrollo, bases de datos, apps, sistema y el cajón de sastre.
Antes se llamaba Port Dog. Mismo bicho, otro collar.
Cómo sabe lo que sabe
Aquí está la parte que más me divirtió, así que permíteme el paréntesis de taller.
Lo cómodo habría sido lanzar por debajo el comando de siempre y trocear su salida. Lo hace medio mundo. Es frágil, es lento y te ata al formato de un texto pensado para ojos humanos.
Yolk le pregunta directamente al sistema, a través de libproc, con un adaptador mínimo en C que traduce sus estructuras. Y pregunta poco: solo sockets TCP en estado de escucha, y solo en direcciones de casa. El 127.0.0.0/8 de toda la vida, el ::1 de IPv6, las IPv4 disfrazadas de IPv6 y las direcciones comodín, que también atienden en local. Fuera se quedan UDP, las conexiones ya establecidas y lo que esté atado en exclusiva a una IP de la red.
Después junta. Un mismo servicio suele escuchar por IPv4 y por IPv6 a la vez, y a ti te da exactamente igual: es una fila, no dos.
Lo que haces con ella
Mirar, lo primero. Que parece poca cosa y es el noventa por ciento del asunto.
Lo segundo, no soltar el teclado. Escribes y la lista se filtra sola; las flechas eligen; Intro abre en el navegador; ⌘C copia la dirección. Y ⌘⌫ detiene al que tengas señalado.
Detener merece dos líneas, porque es donde una app así puede hacer daño de verdad.
Primero se pide por las buenas: un SIGTERM, que viene a ser recoge y vete. Si a los dos segundos el proceso sigue ahí haciéndose el sueco, entonces, y con confirmación, aparece el SIGKILL. Y antes de mandar ninguna de las dos, Yolk comprueba de quién es el proceso y a qué hora nació. ¿Por qué? Porque los identificadores de proceso se reciclan: el número que hace un rato era tu servidor huérfano puede ser ahora otra cosa que no tiene culpa de nada. Matar al vecino por un número repetido es de esas averías que se recuerdan.
¿Es infalible? No. Entre comprobar y disparar pasa un instante, y el sistema no ofrece hacerlo en un solo gesto. Es lo más cerca que se puede estar, y prefiero contártelo.
Lo demás son detalles de los que se echan de menos cuando faltan:
- Favoritos que se quedan arriba. Se recuerdan por proyecto y puerto, no por número de proceso, así que sobreviven a cada reinicio del servidor.
- Ocultar lo que no quieres ver sin tener que apagarlo.
- Docker, con el nombre y la imagen de cada contenedor. Detienes ese contenedor, no Docker entero.
- Abrir el proyecto en Finder, en el editor o en una terminal, desde la propia fila.
- Un puntito en el icono cuando aparece un puerto que antes no estaba.
Lo que no hace
Me importaba tanto como lo otro. Una herramienta que husmea en tus procesos tiene que ganarse la confianza a base de límites.
No pide permisos de administrador. Ve lo que macOS le deja ver a tu usuario, y punto.
Para ponerle cara a cada servicio busca un icono: el de la app si la hay, el favicon del proyecto en las carpetas de costumbre y, si no aparece, se lo pide al servidor. A ese servidor, en ese puerto y con ese protocolo; a nadie más. No sigue redirecciones hacia fuera, no manda cookies ni credenciales, cada respuesta tiene tope de tamaño y de tiempo, y los SVG solo entran si no arrastran scripts ni recursos de terceros. Lo que encuentra, y lo que no encuentra, lo guarda diez minutos para no andar llamando a la puerta cada tres segundos.
¿Y si no hay icono que valga? Iniciales, y a otra cosa.
Tampoco es adivina. Deducir de qué proyecto es un proceso tiene su parte de olfato, y en un monorepo enrevesado se puede despistar.
De qué está hecha
SwiftUI y MenuBarExtra, de macOS 13 en adelante. La lista se refresca cada tres segundos aunque el panel esté cerrado, y puedes dejarlo en dos, cinco o diez.
Los ajustes viven dentro del propio panel: claro, oscuro o lo que diga el sistema, fondo sólido o translúcido y cuatro paletas, de la formal a la que no llevarías a una boda.
Hay 49 pruebas automáticas. Las que tocan procesos levantan sus propios sockets y sus propios procesos de usar y tirar, porque probar una app que mata servidores usando los tuyos sería una forma original de perder amigos.
Y un detalle del que estoy tontamente orgulloso: al plegar un grupo o filtrar, el panel cambia de altura sin que se le mueva el borde de arriba. No lo notarás. De eso se trata.
Licencia MIT.
Letra pequeña
Va por la 1.4 y sigue en beta. Dos consecuencias prácticas.
Una: no está notarizada por Apple, así que macOS torcerá el gesto la primera vez que la abras. Tampoco va en sandbox, y no por dejadez: una app encerrada no puede inspeccionar ni detener procesos ajenos, que es justo su trabajo.
Dos: la compilación incluye Intel, pero en un Intel de carne y hueso aún no la he probado como se merece.
Si aun así quieres saber quién te ha quitado el 3000, ya sabes hacia dónde mirar.