Pretype — Tu Mac termina tus frases
texto que existe antes de que lo escribas.
Tu editor de código termina líneas por ti. Pretype lo hace con todo lo que escribes en tu Mac.
Tú escribes la mitad oscura — un modelo en tu propio chip escribe la gris.
La mejor interfaz es invisible — vive en tu cursor.
El texto fantasma es la idea entera, pero no la app entera. Todo lo de abajo es el mismo modelo local en el mismo cursor — en teclas donde ya tienes las manos.
- Tab
Corrige la errata
El diccionario de macOS, flotando sobre la palabra — en el idioma que lee alrededor del cursor. Esc lo descarta, y nunca vuelve a preguntar por esa misma palabra.
- Tab
Deletrea el emoji
macOS ya conoce todos los nombres Unicode, así que miles de atajos aparecen en esa misma píldora sin incluir ninguna tabla.
- ⌥Tab
Reescribe lo torpe
Gramática y redacción arregladas ahí mismo, con tu propio tono — o la palabra que acabas de escribir, si no hay nada seleccionado. Siempre en vista previa, nunca a tus espaldas.
- ⌥⇧Tab
Escribe la respuesta entera
Ante un chat vacío lee la conversación en pantalla y redacta tu siguiente mensaje como un solo fantasma. Opcional, con OCR en el propio Mac y solo con este acorde.
- por su cuenta
Aprende tus palabras
Tus nombres, tu jerga, la frase que escribes diez veces al día — desde un modelo de tu propia escritura, construido en este Mac, que responde antes de que arranque el LLM. Se borra, y se apaga.
- por su cuenta
Sabe cuándo callarse
Nunca en terminales ni gestores de contraseñas, nunca mientras macOS informa de entrada segura. En una app donde lo ignoras siempre, deja de ofrecer — y lo dice en el menú, con un clic para reanudar.
Tab funciona aquí. Y en cualquier otro campo de texto de tu Mac — sin un plugin por app.
Siguen siendo tus palabras. Solo que ya escritas.
Instala
Arrástralo a Aplicaciones. Sin cuenta, sin asistente — un icono en la barra de menús, un aviso de Accesibilidad y un modelo descargado una vez (≈2 GB).
Escribe
Escribe como siempre. El texto fantasma aparece en el cursor, con la tipografía del propio campo. ¿Falló? Sigue escribiendo.
Tab
Tab toma una palabra, ⇧Tab la frase. Lo que tomará el próximo Tab se ve un tono más oscuro. Si no hay sugerencia, Tab es solo Tab.
Completado, correcciones y respuestas se miden cada uno con su propio eval — y el predeterminado se ajusta a la memoria de tu Mac. Puedes simplemente no preocuparte.
El texto fantasma que Tab termina. Once modelos sobre las mismas frases reservadas, ordenables por el idioma en el que realmente escribes.
La selección reparada en su sitio. Este atajo no corre sobre el modelo que elegiste, sino sobre su hermano instruct: por eso estas seis filas son los hermanos, y cada una dice qué modelos acaban en ella.
Un mensaje entero redactado a partir de la conversación en pantalla. Los mismos seis hermanos que en la corrección — y casi el orden inverso.
Tamaño del punto = memoria residente (hueco = integrado en macOS) · cobertura = casos con respuesta · ± = este idioma frente a la media de 17
Precisión de primera palabra con el silencio contado como fallo, celdas emparejadas (OpenSubtitles · Tatoeba · Leipzig) · las celdas por idioma son finas (±5–10 pp): compara modelos dentro de un idioma, no cifras entre idiomas · 07-2026
Bigote = intervalo del 95% · marca roja = con qué frecuencia reescribe una línea que ya era correcta (170 controles limpios) · propuesto = líneas en las que propuso algo · tamaño del punto = memoria residente
Una errata real por línea, 17 idiomas, a través de la misma tubería que se envía — la puerta de edición mínima ya está dentro de las cifras. Una corrección acertada pero formulada de otro modo cuenta como fallo, así que la utilidad real queda por encima de este listón. Las celdas por idioma son 30 líneas: lee el bigote, no el número. Los niveles E4B 8-bit y 6-bit corren sobre el hermano de 6 bits, que el barrido no cubrió; la fila de 4 bits es su mínimo medido. Apple Intelligence no está en este barrido · 07-2026
Bigote = intervalo del 95% · respondió = casos en los que redactó algo · tamaño del punto = memoria residente · ± = este idioma frente al total de 19 del modelo
Un borrador cuenta como utilizable si está en el idioma de la conversación y no repite la pantalla — es un suelo de utilidad, no una nota de calidad; la similitud con la referencia resultó demasiado ruidosa. 19 idiomas con 30 conversaciones cada uno, así que las celdas por idioma son anchas: lee el bigote. Apple Intelligence no está en este barrido · 07-2026
Cada ajuste muestra su coste medido.
Tres paneles — presentación, modelo, personalización. Pasa el cursor por cualquier control y Pretype muestra qué mejora y qué cuesta, con mediciones reales.
Texto fantasma en línea o panel flotante, atajo de aceptación, visibilidad con vista previa en vivo — y desactivación por aplicación.
Un mapa medido de todo el catálogo: precisión arriba, velocidad a la derecha, el tamaño de burbuja es memoria. Un clic cambia el modelo.
Una persona y estilos por aplicación dirigen el tono y la redacción. Todo se queda en tu Mac.
Tus palabras son tuyas.
No te fíes de la privacidad por fe — toda la ruta de entrada son tres archivos. Léelos antes de confiar en ellos.
/// Fallback for apps whose focus
/// notifications never fire (some
/// Electron builds): ask the system-
/// wide element who has focus now.
static func
systemFocusedTextElement()
-> AXUIElement? {
let sys =
AXUIElementCreateSystemWide()
guard CopyAttributeValue(sys,
kAXFocusedUIElementAttribute,
&ref) == .success
else { return nil }
return isEditableTextElement(el)
? el : nil
} /// CGEvent tap on key-down events.
/// The handler returns `true` to
/// swallow the event — used to eat
/// Tab while a suggestion is shown.
final class KeyTap {
func start() {
let mask = CGEventMask(
1 << CGEventType
.keyDown.rawValue)
tapPort = CGEvent.tapCreate(
tap: .cgSessionEventTap,
place: .headInsertEventTap,
options: .defaultTap,
eventsOfInterest: mask,
...)
}
} /// Inserts text by posting synthetic
/// keyboard events — the most app-
/// agnostic path (AppKit, Electron,
/// web views, terminals alike).
enum TextInjector {
/// Tags our synthetic events so
/// the key tap ignores them.
static let magicTag: Int64 =
0x5052_5459 // "PRTY"
static func insert(_ t: String) {
for c in utf16Chunks(t.utf16) {
post(chunk: c, keyDown: true)
post(chunk: c, keyDown: false)
}
}
}