En el navegador casi no uso el mouse. Trabajo con Surfingkeys, una extensión que pone una etiqueta sobre cada enlace y botón: escribo la etiqueta y listo, hice clic. Con los años armé todo mi ecosistema alrededor del teclado, y los atajos de Vim (h j k l) ya los tengo en los dedos.

El problema empezaba al salir del navegador. Para hacer clic en un solo botón de Finder, de la configuración del sistema o de cualquier otra app, tenía que soltar el teclado, buscar el mouse y volver. Son milisegundos, sí. Pero se repiten muchas veces al día y se acumulan, y soy fanático de la productividad: para mí esos milisegundos importan.

Así nació JUMP.

Qué hace

JUMP es una app de barra de menú para macOS. Presionas un atajo y cada elemento clicable de la ventana activa recibe una etiqueta corta. Escribes la etiqueta y JUMP hace clic.

Atajo Modo Qué hace
⌘ ⇧ Space Hints Etiqueta cada elemento clicable. Escribes la etiqueta y hace clic.
⌘ ⇧ J Scroll Desplaza la ventana estilo Vim: h j k l, d u, gg G.
⌘ ⇧ F Búsqueda Encuentra texto visible, sin importar mayúsculas ni acentos.

Si mantienes un modificador mientras escribes la etiqueta, eliges la acción: ⇧ hace clic derecho, ⌘ doble clic y ⌥ solo mueve el puntero. Los tres atajos y los modificadores se cambian en la configuración.

Las pantallas de configuración de JUMP: apariencia de las etiquetas y comportamiento de los clics

Por qué no usé algo que ya existía

Lo primero que hice fue buscar. Encontré dos opciones:

  • Vimac, de código abierto, pero sin cambios desde diciembre de 2022.
  • Homerow, su sucesor comercial: funciona bien, pero es de pago y cerrado.

Ninguna me convencía, así que pensé: ¿por qué no hacer mi propia herramienta, a mi gusto, gratis y de código abierto? Soy fanático del código abierto. Me gusta la comunidad que se forma alrededor de un proyecto y la idea de compartir lo que uno aprende. JUMP parte del código de Vimac, que es GPL-3.0, lo moderniza para macOS 26 y se publica con la misma licencia.

Cómo funciona por dentro

Accessibility API. macOS expone la interfaz de cada app como un árbol de elementos: botones, campos, enlaces. JUMP recorre ese árbol en la ventana activa, se queda con lo que se puede accionar y dibuja las etiquetas encima. Por eso necesita el permiso de Accessibility.

OCR como respaldo. Hay ventanas que no exponen texto por Accessibility, como las terminales o los PDF. Para esas, JUMP puede reconocer el texto en pantalla con el framework Vision. Viene apagado, pide el permiso de grabación de pantalla solo cuando lo activas, y las capturas nunca salen de la memoria.

Nada de Mac App Store. Las apps de la tienda corren en un sandbox, y una app que lee y controla otras apps con Accessibility no puede hacerlo desde ahí. JUMP se distribuye desde GitHub Releases.

Decisiones de ingeniería

El núcleo es un paquete aparte. La lógica vive en JumpKit, un paquete de Swift que se prueba sin abrir la app:

swift test --package-path Packages/JumpKit

Probar algo que depende de otras ventanas y de permisos del sistema es difícil. Separar el núcleo de la interfaz lo vuelve testeable.

El permiso que se perdía en cada build. macOS asocia el permiso de Accessibility a la firma de la app. Con la firma ad-hoc por defecto, la firma cambia en cada compilación y el permiso se pierde. La solución fue firmar con un certificado de desarrollo propio, y el script de release se niega a publicar si la app está firmada ad-hoc: los usuarios perderían el permiso con cada actualización.

Un release que no se puede hacer mal. Ese mismo script también rechaza cambios sin commitear y commits sin tag. Prefiero que falle a publicar algo que no puedo reproducir.

Pruébalo

JUMP necesita macOS 26 o posterior. Descárgalo desde su sitio o desde GitHub.

Todavía no está notarizado por Apple, así que la primera vez macOS lo bloquea. El README explica cómo abrirlo paso a paso.

Si lo usas y algo no funciona, o se te ocurre una mejora, abre un issue en el repositorio. Para eso es de código abierto.