Esta página cuenta cómo está armada Calíope: sobre qué frameworks se apoya, dónde está la frontera con el motor, qué permite el sandbox y qué es lo que la app no hace a propósito. Cada cifra sale del árbol de código, a septiembre de 2026.
Una app, tres binarios
Calíope se distribuye como una sola app, org.caliope.caliope, con compra universal: una compra cubre todos los dispositivos Apple en los que corre. Detrás de esa sola app hay tres binarios: uno para macOS, uno para iPhone e iPad (el mismo binario sirve a los dos, y la app de Apple Watch viaja embebida dentro) y uno para Apple TV.
La mayor parte del código no se escribe tres veces. Sources/Shared tiene 268 archivos Swift y 234 vistas SwiftUI que compilan tanto en el binario del Mac como en el de iOS. Los widgets son extensiones de la misma app y leen lo que la app publica a través de un App Group; la app escribe, el widget sólo lee.
SwiftUI de punta a punta
Cada ventana es SwiftUI nativo — sin web views, sin emulación multiplataforma. Esa frase está en la portada y es literalmente cierta: las 234 vistas compartidas son SwiftUI, y donde un Mac y un iPad necesitan comportarse distinto, la diferencia se decide al compilar, dentro del mismo archivo, no en una capa de compatibilidad en tiempo de ejecución.
La frontera con el motor
Todo lo que habla con un motor de base de datos vive detrás de 15 protocolos en Sources/Models/Database/Protocols/, uno por sub-área. Cada motor tiene una implementación de esos protocolos, y nada por encima de la frontera — ni una vista, ni el orquestador — escribe SQL ni conoce los códigos de error de un motor. Sumar un motor es implementar los protocolos, no editar a quien los llama.
MySQL y MariaDB pasan por MySQLKit 4.10.1, y PostgreSQL por PostgresKit 2.16.1 sobre PostgresNIO 1.33.1, todo sobre SwiftNIO 2.101.0 (versiones a septiembre de 2026). Las consultas con parámetros usan los bindings nativos de sentencias preparadas de MySQLNIO: los valores viajan por el protocolo de red y nunca se concatenan en el SQL.
SQLite es distinto: el editor SQLite habla con la biblioteca del sistema por su API en C, sin ningún driver en medio. MongoDB es distinto otra vez. Está soportado a través de MongoKitten 7.16.3, un driver comunitario, y queda fuera de la frontera con el motor a propósito: ninguna vista importa MongoKitten, y toda la capa de MongoDB está diseñada para poder quitarse sin tocar el lado relacional.
SSH sin ssh
El túnel SSH está escrito dentro de la app, sobre SwiftNIO SSH 0.13.0 y swift-crypto 3.15.1. Sin depender del ssh del sistema. Las claves descifradas nunca se escriben en disco.
Calíope lee por sí misma las claves privadas OpenSSH, acepta ed25519 y ECDSA P-256, P-384 y P-521, verifica la clave del host antes de enviar nada más y abre un canal direct-tcpip hasta la base de datos. De tu lado escucha en 127.0.0.1, en un puerto elegido al abrir el túnel, y la conexión a la base pasa por ese proxy local. Una clave protegida con frase de paso se descifra en memoria, y ahí se queda.
Dentro del sandbox
Calíope corre con el App Sandbox activo, como exige la Mac App Store, y Caliope.entitlements pide exactamente esto:
com.apple.security.app-sandboxcom.apple.security.network.client— las conexiones salientes a tus servidorescom.apple.security.network.server— los escuchas locales: el proxy del túnel y el servidor MCPcom.apple.security.device.audio-input— el dictado, que corre en el dispositivocom.apple.security.files.user-selected.read-write— los archivos.sqlque abres y las carpetas que eliges para los respaldoscom.apple.security.application-groups— el contenedor compartido del que leen los widgets- iCloud:
CloudDocuments,CloudKity el almacén clave-valor, para la sincronización que puedes activar
Y lo que no está: ni acceso a todo el sistema de archivos, ni excepción a la validación de bibliotecas, ni JIT.
IA y MCP en tus términos
El asistente de IA tiene tres clases de proveedor. Apple Intelligence corre a través del framework FoundationModels de Apple, en el dispositivo, sin clave y sin cuenta. Ollama corre en tu propia máquina, contra los modelos que instalaste ahí. Los proveedores en la nube funcionan con tu propia clave. La app decide cómo hablar con un proveedor por las capacidades que declara, no por su nombre. Es un asistente, no un agente.
El servidor MCP, en macOS, le da la vuelta y deja que un cliente de IA externo — Cursor, Claude Desktop, cualquiera que hable MCP — le pregunte a Calíope por tus bases de datos, dentro de unos límites. Viene apagado. Escucha sólo en 127.0.0.1, en el puerto 41500 salvo que lo cambies, y esa dirección no se puede configurar. Cada petición necesita un token Bearer que Calíope genera (32 bytes aleatorios) y guarda en el Llavero. El cliente ve sólo las conexiones que expones explícitamente, y esa lista nace vacía. Es de sólo lectura: una sentencia por llamada, revisada por una puerta que también rechaza FOR UPDATE y LOCK IN SHARE MODE, y los resultados se cortan a 200 filas. Cinco herramientas, JSON-RPC 2.0 sobre una sola ruta POST /mcp, versión de protocolo 2025-06-18. Ninguno de los dos consentimientos — ni el interruptor ni la lista expuesta — se sincroniza a otro dispositivo ni viaja en un respaldo de ajustes. La página del servidor MCP lista las cinco herramientas y explica cómo apuntarle un cliente.
Lo que a propósito no hace
- Ni Windows ni Linux. Calíope está escrita para las plataformas de Apple y ahí se queda.
- Ni SQL Server, ni Oracle, ni Redis. Los motores son MySQL, MariaDB, PostgreSQL, SQLite y MongoDB.
- Ni espacios de equipo. No hay servidor nuestro ni cuentas; tus perfiles y tu historial son tuyos, y la sincronización por iCloud es una opción entre tus propios dispositivos.
Si necesitas alguna de esas tres cosas, la comparación de la portada nombra las herramientas que lo hacen bien.