← Todos los proyectos

Biblioteca visual · App de macOS e iOS

Ambrel app icon

Ambrel

Lo que ves, se queda.

Creé Ambrel para las referencias que se pierden entre capturas, imágenes copiadas y pestañas del navegador. Un atajo las guarda con su origen. El propio Mac lee su texto, extrae sus colores y encuentra imágenes parecidas, para que puedas volver a lo que viste aunque no recuerdes dónde estaba.

Capturas reales de Ambrel, siempre con la misma biblioteca de dieciocho referencias visuales. Baja para recorrerla, espécimen a espécimen. Más abajo, la nueva app para iPhone y iPad y cómo se sincroniza la biblioteca.

Ver proyecto

01 Guardar

Guárdalo antes de perder el hilo.

Captura una región, guarda una imagen copiada o conserva un enlace. El panel de guardado rápido deja elegir pizarra y etiquetas sin abrir la biblioteca. También recoge tus capturas habituales de macOS desde la barra de menús.

  • ⌃⇧4 Capturar una región
  • ⌃⇧V Guardar lo copiado
02 Texto

Basta con el año del cartel.

Busca 1926: Ambrel encuentra el cartel porque lee el texto dentro de la imagen. También busca por títulos, origen y lo que reconoce en ella, aunque nunca le hayas puesto una etiqueta.

03 Color

Te acuerdas del amarillo.

Elige hasta tres colores, escribe un valor hexadecimal o usa el cuentagotas en cualquier punto de la pantalla. Ambrel muestra primero las referencias donde más destacan, entre todas tus pizarras.

04 Parecido

Una referencia lleva a las demás.

La propia imagen puede ser la búsqueda. Pide las parecidas y Ambrel la compara con toda la biblioteca. Así puedes seguir el hilo visual entre referencias sin ponerle nombre ni etiquetar lo que tienen en común.

05 Ver

La imagen conserva su contexto.

Abre una captura para ver juntos su origen, pizarra, etiquetas, texto reconocido y paleta. Copia el texto, busca por un color o vuelve a la web original sin perder de vista la referencia.

06 Local

Una biblioteca que se queda en tu Mac.

El reconocimiento de texto, el análisis de color y el parecido se calculan en tu Mac. La biblioteca es local y no necesita cuenta. Sincronizarla con iCloud es opcional. Las capturas se guardan en HEIC para que la colección ocupe poco.

Construida alrededor del Mac.

La ventana es solo la parte visible. Capturar, entender y recuperar una referencia aprovecha piezas distintas del sistema.

Sin salir de lo que estás haciendo

SwiftUI y AppKit unen la biblioteca, los atajos globales y el panel de guardado de la barra de menús. Guardar una referencia encaja en el trabajo que ya tienes en pantalla.

Imágenes que se pueden buscar

Vision, de Apple, lee el texto, reconoce lo que aparece y obtiene las huellas visuales que permiten comparar imágenes. El análisis se hace en el dispositivo.

Los archivos y su índice

Las imágenes viven en una biblioteca local, con SQLite para los metadatos y el análisis de las imágenes. HEIC reduce el espacio de las capturas y su origen sigue unido a ellas.

Novedad de la 1.3

Tu biblioteca, también en el bolsillo.

La 1.3 añade una app compañera y gratuita para iPhone y iPad. Trae la biblioteca que tienes en el Mac a través de tu propia cuenta de iCloud: la bandeja, las pizarras que elijas y tus búsquedas guardadas. Guarda imágenes y enlaces desde el botón Compartir de cualquier app y, en el iPad, deja editar el lienzo de una pizarra.

No usa menús del sistema. Cada acción vive en barras flotantes de cristal que cambian con lo que seleccionas, en una hoja propia o en una burbuja sobre el lienzo, y una pizarra se abre con un zoom desde la tarjeta que tocas. La idea era que estuviera tan cuidada como la app del Mac.

Ambrel en el iPhone: la pantalla de inicio de la biblioteca Estudio, con sus apartados y pizarras
iPhone · Inicio Bandeja, todas, favoritas, enlaces y las pizarras sincronizadas en una sola pantalla.
Ambrel en el iPad: la pizarra de lienzo Verano mediterráneo, con imágenes, un título y notas
iPad · Lienzo Una pizarra de lienzo tal como se montó en el Mac. En el iPad se edita: imágenes, títulos, textos y notas.

Capturas reales del simulador de iOS, con la biblioteca de ejemplo que trae la app para poder probarla sin un Mac.

Lo difícil: sincronizar una biblioteca que ya existía.

En el Mac, una biblioteca es una carpeta con una base de datos SQLite, los originales y las miniaturas, además de índices en memoria. Llevarla a iCloud no podía significar rehacer la app sobre otro almacén, perder capturas en un conflicto ni llenar un teléfono con gigas de originales. Estas fueron las decisiones.

  1. CKSyncEngine sobre la misma SQLite

    Sin migrar a Core Data ni a SwiftData: el almacén, las búsquedas y los índices siguen igual, y la sincronización es una capa que lee y escribe filas. Tampoco la carpeta de la biblioteca en iCloud Drive, que sincroniza archivo a archivo y corrompe una base en modo WAL. Los datos viven en la base privada de CloudKit de la propia cuenta del usuario, sin un servidor mío de por medio.

  2. Una bandeja de salida que llena la propia base

    Los disparadores de SQLite apuntan cada fila que cambia y qué grupos de campos cambiaron, así que ningún camino de escritura, deshacer incluido, puede olvidarse de sincronizar. El registro se construye al enviarlo, con la fila tal como está en ese momento, y lo que llega de iCloud se aplica con los disparadores en silencio para que no rebote.

  3. Conflictos campo a campo y borrados con red

    Si CloudKit rechaza un guardado porque el registro cambió en otro dispositivo, la app toma la versión del servidor, vuelve a aplicar solo los campos que cambió este y la reenvía. Un lote de otro dispositivo que borraría más de 50 capturas y una quinta parte de la biblioteca detiene la sincronización, y el Mac pregunta antes. Los archivos borrados van a la Papelera.

  4. Solo lo que eliges, y los originales bajo demanda

    La sincronización se activa por biblioteca y ninguna pizarra se sincroniza por defecto: se eligen en el Mac. Cada biblioteca tiene dos zonas, una con los metadatos y las miniaturas y otra con los originales. El Mac descarga las dos, y el iPhone pide un original solo al abrirlo, compartirlo o exportarlo, y guarda una caché pequeña.

  5. Una extensión de compartir que escribe en CloudKit

    Una extensión de compartir de iOS tiene unos 120 MB de memoria, poco para descodificar un PNG grande. Las imágenes se copian al contenedor compartido para que la app las procese después, pero los enlaces suben a CloudKit desde la propia extensión, con su título, su autor y un único fotograma de portada, nunca el vídeo. Cada enlace tiene su id desde que se abre la hoja, así que nunca se guarda dos veces.

  6. La licencia del Mac, reflejada con un token firmado

    La app de iOS es gratuita y no vende nada. Cada Mac publica en la cuenta de iCloud su token de licencia firmado (Ed25519), y el iPhone lo verifica con las mismas claves públicas: con una licencia o una prueba vigentes puede guardar, y sin ellas queda en solo lectura, igual que el Mac. Cada biblioteca va ligada a una única cuenta de iCloud.

Lo que cambió al probar entre dispositivos reales

  • CKSyncEngine solo busca cambios cuando un push marca la base o la app pasa a primer plano. Los push llegan, pero no siempre enseguida, así que nada da por hecho que vayan a llegar.
  • Un envío programado solo cubre las zonas que tenían cambios al programarse. Lo que se encola entretanto en otra zona se pide ahora aparte al acabar cada envío, desde una tarea desligada, porque esperar al motor dentro de su propio callback cierra la app.
  • En una red lenta, la primera subida de una biblioteca real (42 capturas, unos 25 MB) caducaba una y otra vez. Ahora sube en lotes de 8 MB o 100 registros como mucho, primero los metadatos y después los originales, y el Mac muestra cuántas capturas faltan.