Icona dell'app Calíope

Funzionalità

Ogni funzionalità, verificata rispetto al codice sorgente.

Calíope si distribuisce come un'unica applicazione con le funzionalità elencate qui sotto, disponibili su macOS, iPad e iPhone. Ogni voce corrisponde a codice che esiste oggi — questo è un catalogo, non una lista dei desideri. Usa le scorciatoie per saltare a una categoria o scorri l'elenco completo.

Questa pagina descrive Calíope 1.5, la versione che stiamo costruendo adesso. La 1.4 è sull'App Store per iPad, iPhone, Apple Watch, Apple TV e Apple Vision Pro, e sul Mac il negozio serve oggi la 1.3 mentre la 1.4 è in revisione sull'App Store. Il changelog dice in quale versione è arrivata ogni funzione.

Connessione e sicurezza

Tunnel SSH nativo

“Il tuo tunnel SSH, senza terminale né .ssh/config.”

Raggiungi server dietro un bastion dal sandbox di macOS — senza ssh locale, senza ~/.ssh/config, senza lotte di permessi.

SwiftNIO + NIOSSH. Autenticazione tramite password o chiave privata (ed25519, ECDSA P-256/P-384/P-521). Parser OpenSSH e decifratura della passphrase in memoria. Proxy locale su 127.0.0.1 collegato tramite SSH direct-tcpip.

Verifica TOFU della host-key

“Ti avvisa se qualcuno ha intercettato il tuo tunnel — prima che tu scriva qualcosa.”

Rileva un MITM contro il tuo bastion SSH senza lasciare un known_hosts su disco.

Fingerprint salvati nel Keychain. La prima connessione richiede una conferma esplicita; un fingerprint cambiato fallisce di netto — equivalente a StrictHostKeyChecking=yes.

TLS rigoroso di default

“SSL che protegge davvero — non un semplice interruttore.”

Attivare «SSL» significa SSL verificato. I certificati autofirmati richiedono una CA o un opt-out esplicito con avviso visibile.

Politica unica: saltare la verifica è opt-in; una CA fornita permette la verifica senza hostname; in tutti gli altri casi, verifica completa.

Keychain con sincronizzazione iCloud opt-in

“Le tue password non vanno su iCloud a meno che tu non le inviti.”

Decidi tu quali credenziali viaggiano tra i tuoi dispositivi. Di default, nessuna.

La modalità solo-locale imposta le credenziali con WhenUnlockedThisDeviceOnly; attivare la sincronizzazione le migra ad AfterFirstUnlock per iCloud Keychain. Il toggle è idempotente.

Autenticazione biometrica opzionale per profilo

“La tua impronta sblocca la produzione, non solo il tuo Mac in sospensione.”

Aggiunge un varco Touch ID / Face ID prima di connettersi ai server di produzione, configurabile per profilo.

Costruito sul framework LocalAuthentication. Attivabile per profilo di connessione.

Connection pool deterministico

“Un connection pool che si chiude sempre — anche quando qualcosa va storto.”

Connessioni che non disperdono risorse né bloccano la UI, nemmeno quando cambi sessione.

SwiftNIO EventLoopGroupConnectionPool, con un limite di 5 connessioni per event loop in un event-loop group a thread singolo. Chiusura asincrona con timeout di sicurezza e una chiusura SSH pulita quando il binding locale fallisce.

Prepared statement nativi

“Binding preparati, non interpolazione di stringhe — dalla base dello stack.”

I valori che scrivi non vengono mai concatenati all'SQL — viaggiano sul protocollo di rete, separati dallo statement.

Prepared statement nativi di MySQLNIO: senza binding → percorso rapido simpleQuery; con binding → conn.query(sql, [MySQLData]). Gli statement si chiudono automaticamente in done(), così il pool non disperde mai. Gli identificatori passano comunque per l'helper di escape centralizzato nei casi DCL/DDL residui.

Host alternativo per profilo

“Un server, due indirizzi — e li prova entrambi.”

Allo stesso server si arriva spesso da un indirizzo dal Mac e da un altro dall'iPad. Dai al profilo un secondo indirizzo e Calíope lo prova quando il primo non risponde, con la stessa porta e le stesse credenziali.

La destinazione la risolve connectionEndpoints, mai leggendo il campo host: i tre punti che aprono un pool ricevono l'endpoint. Ordine fisso, principale e poi alternativo, senza ricordare quale ha vinto — quello stato è proprio ciò che non può viaggiare tra dispositivi. Accetta host:porta per la rotta che pubblica un'altra porta. Con tunnel SSH viene ignorato, e l'interfaccia lo dice: lì l'host lo risolve il bastione, non il tuo dispositivo.

Editor SQL e produttività

Completamento automatico sensibile al contesto

“L'editor sa se sei nel FROM, nel WHERE o nell'elenco delle colonne.”

Scrivi meno e commetti meno errori, perché il suggerimento capisce dove ti trovi all'interno dello statement.

Suggerisce le colonne della tabella attiva, i nomi dei database, i token dello schema (tabelle, viste, funzioni), le keyword DML/DDL/di controllo, i tipi di dati e le frasi ausiliarie SQL filtrate per motore.

Linter lessicale in tempo reale

“Le parentesi sbilanciate non arrivano mai al server.”

Cattura l'errore evidente prima che MySQL lo rifiuti.

Rileva commenti non chiusi, stringhe non chiuse, parentesi sbilanciate e identificatori con backtick aperto. Scansione O(n), senza parser completo.

Formattatore con modalità sicura

“Formatta le tue query — non riscrive mai il tuo UPDATE.”

Formattazione elegante per SELECT, senza sorprese su un UPDATE senza WHERE.

Conosce oltre 150 keyword, tipi e funzioni. La modalità sicura blocca la formattazione automatica sugli statement distruttivi (ALTER, CREATE, DELETE, DROP, GRANT, TRUNCATE, UPDATE, REPLACE, RENAME) per prevenire riscritture accidentali.

Oscuramento delle credenziali nei log e nella sincronizzazione

“Sincronizza la tua cronologia, non le tue credenziali.”

Il tuo log delle query non diventa un archivio di password su iCloud.

Neutralizza IDENTIFIED BY, IDENTIFIED WITH … AS, IDENTIFIED BY PASSWORD, SET PASSWORD FOR e PASSWORD(…). Oscuramento idempotente, applicato prima di esportare il log delle query su CloudKit.

Costruttori visuali di query

“Componi le query con dei clic; escono pronte per la produzione.”

Un SELECT … WHERE … JOIN … corretto senza memorizzare la sintassi.

Costruttori visuali dedicati per le quattro forme più frequenti: SELECT, WHERE, UPDATE e CREATE di tabella.

Rinomina di simbolo con confini di parola

“Rinomina id senza rompere client_id.”

Rifattorizza gli identificatori in sicurezza, senza rovinare i nomi simili.

Regex con confini di parola \b ed escape adeguato. Non matcha mai all'interno di identificatori più lunghi.

Palette Quick Open (⌘⇧O)

“⌘⇧O e sei nella tabella che cercavi.”

Raggiungi qualsiasi oggetto dello schema senza scendere lungo l'albero.

Ricerca fuzzy incrementale su tabelle, viste, routine e oggetti, con navigazione tramite frecce ed Enter per aprire.

Gestore di snippet con seeding per motore

“I tuoi snippet si adattano al motore, non il contrario.”

Le tue ricette SQL sempre a portata di mano, filtrate sul motore che stai usando.

Archiviazione JSON locale. Ogni snippet dichiara per quali motori vale (MySQL, MariaDB, PostgreSQL…). Connettersi a un nuovo motore aggiunge i default senza duplicati. Supporta la categorizzazione.

Popover di documentazione DDL e di funzioni

“La doc di GROUP_CONCAT si apre dove stai scrivendo.”

Documentazione senza uscire dall'editor né aprire un browser.

Mostra la firma della funzione SQL o il DDL dell'oggetto dello schema sotto il cursore.

Editor di cella avanzato e modifica inline di riga

“Modifica la cella, guarda l'SQL e decidi.”

Modifica i dati rapidamente e visualizza in anteprima l'SQL esatto che verrà eseguito.

Modifica in stile foglio di calcolo sui risultati, con anteprima dell'UPDATE o del DELETE generato prima di eseguire.

SQL Player — cronologia di esecuzione

“Riproduci la tua sessione SQL come un video.”

Esegui il debug di un batch di query statement per statement, senza rieseguire tutto.

Riproduzione in stile timeline degli statement eseguiti, legata alla cronologia persistente delle query.

Barre di aiuto dell'iPad sopra la tastiera

“Tastiera dell'iPad con superpoteri SQL.”

Suggerimenti tattili rapidi proprio sopra la tastiera a schermo.

Barre contestuali per l'oggetto o la funzione sotto il cursore, con accesso rapido a «Vedi DDL» e ai parametri di funzione.

Barra degli strumenti personalizzabile

“La tua barra, nel tuo ordine.”

Ognuno ha la propria ergonomia; i DBA riordinano una volta e se ne dimenticano.

Riordina o nascondi gruppi di pulsanti da un pannello di personalizzazione dedicato. Il layout viene mantenuto.

Cerca e sostituisci in tutto il database

“Una ricerca su tutte le colonne di testo che hai.”

Cerca un testo in tutte le colonne testuali di tutte le tabelle in una volta, guarda le corrispondenze per tabella e colonna, visualizza l'anteprima calcolata dal server e sostituisci in blocco dentro una transazione per tabella.

Mostra due cifre, non una: le collation di solito ignorano le maiuscole e REPLACE() non lo fa mai, quindi senza quell'avviso una modifica di massa annuncia 300 righe e ne cambia 100 senza che nulla fallisca. Lo scarto si misura con CAST(col AS BINARY) e non con una collation specifica. Colonne generate, chiave primaria e uniche restano fuori per impostazione predefinita — MariaDB accetta l'UPDATE di una colonna generata, riporta una riga interessata e non cambia nulla. L'escape usa |, perché la barra rovesciata si rompe con NO_BACKSLASH_ESCAPES.

Dati spaziali su una mappa vera

“Le tue colonne GEOMETRY smettono di essere 25 byte.”

Punti, linee e poligoni disegnati su una mappa agganciata all'editor, con stili satellite e piatto, raggruppamento e un comando per inquadrare i dati. Trascina un segnaposto o un vertice e Calíope compone l'istruzione — te la mostra prima di scrivere qualsiasi cosa.

Il WKB sul cavo è sempre in (longitudine, latitudine); ciò che cambia è il testo, perché MySQL 8 con un SRID geografico scrive prima la latitudine e MariaDB non lo fa mai. Lo scambio vive solo alla frontiera testuale, dove il parametro non ha valore predefinito: sbagliare non dà errore, sposta la riga di continente e il server lo accetta. Lo SRID viaggia con la geometria, senza chiave primaria affidabile non si modifica e viene detto perché, e non c'è CoreLocation da nessuna parte.

Report

Una query salvata con l’output dichiarato

“Una query salvata che risponde due volte la stessa cosa.”

Salva una query con i suoi parametri dichiarati e il suo output definito — quali colonne, in che ordine, con quali titoli e formati — ed eseguila quando vuoi, a mano o pianificata. Esportala in CSV, TSV, JSON, Markdown, HTML, XML, testo, Excel o PDF impaginato, e trova l’ultimo risultato che ti aspetta sul telefono.

I parametri sono legati, mai incollati nel testo della query: niente di ciò che ci si scrive può cambiare quello che fa, in nessuno dei due modi SQL. Il contratto delle colonne si verifica all’esecuzione — una colonna che smette di arrivare, o che arriva con un altro tipo, viene annunciata invece di essere disegnata in silenzio. Ogni esecuzione lascia la sua riga in una cronologia condivisa con i backup, con i suoi parametri, il conteggio e la macchina che l’ha eseguita. Il pianificato apre una connessione propria dal profilo, e non promette mai di girare ad app chiusa.

Tre tipi di database, una sola cucitura

“Lo stesso report, contro tre tipi di database diversi.”

Lo stesso artefatto e la stessa schermata servono il tuo MySQL di produzione, il file .sqlite di un’app e una collezione MongoDB.

Il motore dei report non dipende dal provider di database: ha una cucitura propria, più stretta, con tre membri e non uno di più. Ci sono implementazioni per database relazionali, per file SQLite aperti da te e per MongoDB con find e aggregate. Aggiungere una fonte significa implementare quel protocollo senza toccare il motore. E nessuna fonte conserva stato dall’esecuzione precedente — quando una lo fece, il secondo report veniva proiettato con le colonne del primo: una tabella di celle vuote, senza errore e senza avviso.

Report che preparano prima di leggere

“Prepara, indicizza e leggi — su una sola connessione, e senza toccare le tue tabelle.”

I report che un DBA scriverebbe come uno script in cinque passi stanno in un report, senza rinunciare alla garanzia che non tocchi i tuoi dati.

Non ogni report nasce da una query: fissare una variabile di sessione, costruire una tabella temporanea in più passate, indicizzarla e leggerla alla fine. L’intero lotto gira su una sola connessione presa in prestito — con una connessione per istruzione, la temporanea creata dalla prima non esisterebbe più all’ultima. Le istruzioni di preparazione passano da una lista bianca e possono scrivere solo su temporanee del proprio lotto; il tetto di righe vale per l’ultima.

Nove formati di esportazione, e un PDF che misura la pagina

“Nove formati, e il PDF sa dove finisce la pagina.”

Il PDF che mandi in direzione dice «Importo», e il CSV dello stesso report dice «Importo» — non total_eur.

CSV, TSV, JSON, Markdown, HTML, XML, testo semplice e XLSX — scritto da Calíope stessa come ZIP più XML, senza dipendenze — più un PDF impaginato. Si esporta ciò che dichiara l’output, non ciò che è arrivato dal server. E l’impaginazione del PDF si misura a partire da ascendente, discendente e interlinea del font invece di stimarla con una costante: una costante taglia a metà l’ultima riga di ogni pagina, e lo si vede solo una volta stampato.

Amministrazione e catalogo

Albero dello schema navigabile

“Il tuo schema, in un albero che riflette come lo pensi.”

Una sola vista per tutto il catalogo del server.

Database → tabelle / viste / routine / trigger / eventi, con caricamento pigro e azioni contestuali: DDL, colonne, indici, importazione di dati, WHERE builder.

Schema Diff con generazione di ALTER

“Confronta il tuo schema, genera l'ALTER, rivedi prima di applicare.”

Promuovi uno schema da staging a produzione senza raccogliere i diff a mano.

Confronta due schemi e genera l'ALTER TABLE necessario per portare l'uno all'altro. Il confronto delle colonne gira in parallelo tramite structured concurrency. Fonte di verità: INFORMATION_SCHEMA.

Audit DDL locale

“Sa quale DDL hai eseguito, quando e su quale server.”

Tracciabilità delle modifiche allo schema, senza toccare il server.

Ogni CREATE / ALTER / DROP / RENAME viene registrato localmente con timestamp e server di destinazione, nello store SQLite locale dell'app.

Migrazione di oggetti tra server

“Da staging a produzione in tre clic — con anteprima.”

Clona oggetti tra ambienti senza mysqldump né file .sql fatti a mano.

Connessione doppia (origine + destinazione), selezione granulare di tabelle, viste, routine, trigger ed eventi, con opzioni di REPLACE, includere i dati o omettere le chiavi esterne. Anteprima dell'SQL prima di eseguire.

Editor di oggetti avanzati

“Un editor per tipo di oggetto, non un .sql generico per tutto.”

Modifica routine ed eventi correttamente, in un editor pensato per l'oggetto.

Pannelli dedicati per routine memorizzate, trigger, eventi, viste e indici. Ognuno emette DDL ben formato.

Manutenzione delle tabelle

“OPTIMIZE, ANALYZE e REPAIR, in un pulsante.”

Manutenzione delle tabelle MyISAM/InnoDB senza memorizzare i comandi.

Esegue OPTIMIZE TABLE, REPAIR TABLE e ANALYZE TABLE con feedback di avanzamento.

Amministrazione di utenti e privilegi

“GRANT e REVOKE — con delle caselle.”

Gestisci gli utenti del server senza scrivere ogni GRANT a mano.

CREATE / ALTER / DROP USER, più GRANT e REVOKE da una UI dedicata.

Advisor ed editor di indici

“Gli indici che ti avanzano e quelli che ti mancano — con le prove.”

Identifica gli indici ridondanti o mancanti usando dati che il server già espone.

Vista advisor che analizza l'uso degli indici, insieme a un editor dedicato al catalogo degli indici.

Profiler di colonna

“Profila la colonna, non indovinare i dati.”

Comprendi la qualità dei tuoi dati prima di scrivere la query analitica.

Distribuzioni per colonna: istogramma, percentili e cardinalità.

Diagramma ER interattivo

“Il diagramma ER che non devi più disegnare.”

Documenta le relazioni senza disegnare caselle su Miro.

Generazione automatica dallo schema attivo, con visualizzazione delle chiavi esterne.

MongoDB

MongoDB

“Database a documenti, con il loro vocabolario.”

Percorri collezioni e documenti, modificali come JSON, scrivi filtri e pipeline di aggregazione, gestisci gli indici e guarda il server, le operazioni in corso e i suoi utenti — senza uscire dall’app che già usi per MySQL.

Strumento autonomo: nulla di MongoDB tocca lo strato dei provider relazionali. I documenti si mostrano come alberi richiudibili con il tipo di ogni valore (ObjectId, decimal128, date, binari), perché una collezione non ha schema e due documenti vicini possono non condividere alcun campo. JSON esteso in entrambe le direzioni con parser proprio: l’ordine dei campi e l’ampiezza dei numeri sopravvivono all’andata e ritorno. Riutilizza il profilo di connessione, il portachiavi e il tunnel SSH nativo. Cursori paginati, chiusi quando vengono abbandonati.

Senza server

Editor SQLite

“Due motori, una app: il tuo MySQL remoto e il tuo SQLite locale.”

Apri e modifica il .sqlite di una app iOS o di uno script Python nello stesso strumento in cui amministri MySQL — con una transazione esplicita prima di scrivere qualsiasi cosa.

Livello autonomo (actor SQLiteConnection sopra l'API C di sistema — senza MySQLKit) con Struttura · Dati · Esegui SQL · Pragma: progettazione di tabelle, indici e viste, rinomina, ricerca e filtri, paginazione e ordinamento, editor di cella avanzato, transazioni Salva/Ripristina, manutenzione (integrity_check, VACUUM, ANALYZE, REINDEX), pragma modificabili e import/export CSV · JSON · SQL. Compatibile con la sandbox tramite security-scoped bookmark. Solo database non cifrati.

Anteprima file

“Leggere un file non dovrebbe richiedere una connessione.”

Leggi il .md della documentazione, il .sql di un collega, il .json di configurazione, un .csv esportato, un .rtf che ti hanno mandato o il .log del server senza uscire dalla app, senza connetterti e senza rischio di eseguire qualcosa per sbaglio.

Sola lettura, un file alla volta, risolto per estensione: renderer Markdown proprio (ATX e setext, elenchi annidati, checklist, codice con recinto e con rientro di quattro spazi, citazioni, righe, tabelle GFM), evidenziatore SQL, formattatore JSON, lettore CSV secondo RFC 4180 con rilevamento del separatore, e lettore RTF che conserva struttura ed enfasi — titoli, elenchi annidati, grassetto, corsivo, sottolineato, barrato, collegamenti e allineamento — mentre carattere, corpi e colori restano quelli di Calíope, così il testo scala con la dimensione dinamica del testo e si legge in entrambi i temi. Tutto viene interpretato fuori dal thread principale e arriva alla vista come dati inerti. Sorveglia il percorso del file con DispatchSource, così sopravvive al salvataggio atomico. Tetti dichiarati e indicati a piè di pagina: 5 MB di lettura, 500 KB di evidenziazione SQL, 2 MB di formattazione JSON, 10 000 righe e 64 colonne CSV. Non apre mai la rete — le immagini remote di Markdown mostrano il loro testo alt.

Assistente IA (BYOK)

Porta la tua chiave. L'acquisto non include crediti IA — usi la tua API key. Questo viene dichiarato apertamente nel paywall: «L'assistente funziona senza nessuna chiave con Apple Intelligence o con Ollama; i provider cloud (OpenAI, Google Gemini, Anthropic Claude) richiedono una tua chiave, non inclusa nell'acquisto.»

Con Apple Intelligence e Ollama non esce nulla dalla tua macchina. Con OpenAI, Gemini o Claude, lo schema del database attivo — nomi di tabelle, colonne e chiavi esterne — va davvero a quel provider, con la tua chiave. Le righe e le credenziali non escono mai. Su macOS, Calíope può anche fare da server MCP per un client IA dello stesso Mac: sola lettura, su 127.0.0.1, spento di fabbrica.

Apple Intelligence e Ollama, senza chiave

“Due provider che non costano nulla e non chiedono nulla.”

Apple Intelligence esegue il modello di sistema sul tuo dispositivo: senza chiave, senza account, senza costi, e la tua domanda non esce dal Mac. Ollama esegue modelli aperti dove dici tu — la tua macchina, o una della tua rete — e Calíope gli parla all'indirizzo che scrivi.

Apple Intelligence tramite FoundationModels; si offre solo dove il sistema dice che c'è. Ollama tramite il protocollo di OpenAI contro la tua URL di base, senza intestazione Authorization, e con l'elenco dei modelli non filtrato — i nomi sono quelli che hai scaricato. Quando lo schema non entra nella finestra locale, l'assistente lo dice nella conversazione e propone cosa fare.

Provider OpenAI, Gemini e Claude

“IA che gira con i tuoi token, non con la tua fattura.”

Usa il modello che già paghi e non dipendere dagli aumenti di prezzo per token di Calíope.

OpenAI (GPT-4, GPT-4o, o1, o3) con token Bearer. Google Gemini con API key; filtrato ai modelli che espongono generateContent. Anthropic Claude (claude-*) con x-api-key e il system prompt nel suo campo dedicato (non dentro messages). System prompt bilingue con il contesto dello schema attivo, conservando gli ultimi tre scambi.

Oscuramento dell'API key negli errori e nei log

“La tua chiave non appare mai in uno stack trace.”

Se un messaggio di errore finisce in uno screenshot o in un canale Slack, la tua API key non viaggia con esso.

Mascheramento tramite regex per sk-* (OpenAI), AIza* (Gemini), sk-ant-* (Anthropic Claude, inclusi sk-ant-api03-…) e Bearer … in qualsiasi messaggio di errore del provider.

Backoff esponenziale con Retry-After

“Se OpenAI dice di aspettare, Calíope aspetta esattamente quello.”

I picchi di rate-limit non rompono la tua sessione.

In caso di 429 / 503, riprova fino a tre volte (1 s / 2 s / 4 s), rispettando l'header Retry-After. Timeout: 30 s per la generazione, 15 s per elencare i modelli.

Voce in SQL

“Pronuncia la domanda; esegui l'SQL.”

Detta una richiesta e l'assistente la converte in SQL — utile su iPad e nelle sessioni pair-DBA con le mani occupate. La tua voce non esce dal dispositivo.

Costruito su SpeechAnalyzer e DictationTranscriber di Apple (macOS 26 / iPadOS 26): il riconoscimento avviene sul dispositivo, non viene inviato audio a nessun server e la dettatura funziona offline. Il modello della lingua viene scaricato una volta, con avanzamento visibile, nella lingua impostata in Calíope — o in qualsiasi altra supportata dalla dettatura di sistema, scelta dalla capsula accanto al microfono, che dice in quale sta ascoltando. Viene richiesto solo il permesso del microfono — il riconoscimento locale non ha bisogno di quello di riconoscimento vocale. Risultati parziali in tempo reale.

Assistente conversazionale persistente

“Una conversazione con il tuo database, non un prompt isolato.”

Chiedi «ora con un LEFT JOIN» e sa già a quale query ti riferivi.

Mantiene il contesto dello schema attivo più gli ultimi scambi, per conversazione.

Backup, importazione e sincronizzazione

Motore di backup con credenziali opt-in

“Backup con gzip nativo — e senza esportare password per sbaglio.”

Dump compatti e sicuri di default — nessuno esporta hash di password senza volerlo.

Genera .sql con opzioni di drop-before, includere i dati, includere gli utenti, includere le credenziali utente (opt-in, off di default) e compressione gzip nativa. CREATE USER / ALTER USER / GRANT vengono neutralizzati quando si escludono le credenziali. Eventi di avanzamento con ETA.

Backup programmati con retention

“Backup che non dipendono dal fatto che tu te ne ricordi.”

Il tuo Mac esegue il backup in tempo, anche se era in sospensione, e non riempie il tuo disco.

Pianificazioni giornaliere o settimanali. Usa bookmark security-scoped alla destinazione per funzionare dentro il sandbox. Gestisce le pianificazioni perse tra i riavvii dell'app, nomi di file con suffisso in nanosecondi per evitare collisioni, purga per retention e notifiche di successo/errore/omissione.

Importazione CSV / JSON / XLSX

“Da un foglio di calcolo a una tabella in tre clic.”

Importa file tabulari del mondo reale — non solo il CSV ideale.

CSV in stile RFC 4180 (virgolette con escape, campi con virgole), JSON (array di oggetti) e XLSX in streaming. Modalità: INSERT, INSERT IGNORE, REPLACE.

Log locale persistente delle query

“Il comando che hai eseguito martedì, in due secondi.”

Cerca tra migliaia di query passate per testo SQL o data.

Store SQLite locale in Application Support con tabelle per le query eseguite e l'audit DDL, indicizzato per testo della query (asc) e data (desc).

Sincronizzazione del log delle query con iCloud (opt-in, oscurata)

“La tua cronologia SQL, nel tuo iCloud, senza le tue credenziali.”

Cerca nella cronologia del tuo Mac dal tuo iPad — con le credenziali rimosse.

Contenitore CloudKit iCloud.org.caliope.caliope, lotti di 400 record, retention configurabile (30 giorni di default). Applica l'oscuramento delle credenziali prima del caricamento. Verifica lo stato dell'account iCloud prima di sincronizzare.

Toggle di sincronizzazione per sezione

“Decidi tu cosa va su iCloud.”

Sincronizza solo ciò che ti interessa — non tutto o niente.

Toggle indipendenti per la sincronizzazione iCloud del Keychain e del log delle query, dalle Preferenze.

Dump di molti gigabyte

“722 MB scaricati con 68 MB di memoria.”

Backup e ripristino non dipendono più dalla RAM della macchina. Un dump di 722 MB con 4 milioni di righe tocca un picco di 68 MB; ripristinarlo richiede 19 secondi usando 14 MB. Annullare ferma davvero il dump, invece di lasciarlo arrivare alla fine.

Il motore orchestra e il provider scrive SQL: aggiungere un motore al backup significa implementare BackupDataSource e nient'altro — il banco di prova lo implementa in memoria con dialetti SQLite e Postgres senza toccare il motore. Il ripristino tira una istruzione alla volta invece di riceverle spinte, perché un flusso con buffer scarta istruzioni in silenzio e finisce annunciando successo. La lettura usa read(2) e non un file mappato: lo stesso spezzettamento ha misurato +201 MB residenti con FileHandle e 1,1 MB così.

Un backup della tua configurazione

“Prima di toccare iCloud c'è una copia.”

Esporta e importa tutto ciò che Calíope conserva fuori dal dispositivo — profili, gruppi, preferenze — con copie programmate nel contenitore iCloud e punti di ripristino locali creati da soli prima di ogni operazione rischiosa: attivare o disattivare la sincronizzazione, cancellare, importare.

Esiste per un incidente misurato: attivare la sincronizzazione su un iPad ha sostituito un connections.json di 16 470 byte con 28 profili con uno di 514 byte contenente un profilo di esempio. I segreti sono opt-in e sempre cifrati (AES-GCM, PBKDF2-SHA256 con 210 000 iterazioni, sale e costo scritti nel file stesso). Ciò che resta fuori viene scritto nella copia con il suo motivo — una copia che tace le proprie assenze è quella che fa credere di poter ripristinare tutto. Ripristinare unisce; un backup non cancella mai.

Calíope sul tuo iPhone

“Il client intero, senza il Mac davanti.”

La stessa Calíope, disposta per il telefono — il client intero, non un visualizzatore. Si connette ai tuoi server ed esegue le tue query, con l'editor SQL, l'esploratore di schema, il cruscotto, il diagramma ER e i report lì dentro; e i tuoi profili di connessione, i tuoi snippet salvati, la cronologia e le conversazioni con l'assistente sono già lì ad aspettarti, portati dal tuo iCloud. Face ID per sbloccare, cinque lingue e una modalità dimostrativa per dare un'occhiata prima di collegare qualcosa. Si installa dalla stessa pagina dell'App Store del Mac e dell'iPad.

È il binario di iOS, ed è lo stesso codice dell'iPad: non manca un solo strumento, e in tutto l'albero non c'è una sola verifica del dispositivo — ciò che cambia è la disposizione, non l'elenco delle funzioni. I profili di connessione vengono uniti al file iCloud condiviso invece di sostituirlo, perché i campi che uno schermo stretto non mostra — tunnel SSH, certificati, set di caratteri — restino intatti. Senza iCloud dice quale interruttore è chiuso, invece di mostrare una schermata vuota lasciandoti supporre che vada tutto bene.

Calíope sul tuo Apple Watch

“Cosa hanno fatto i tuoi server, senza tirare fuori il telefono.”

Calíope al polso, che arriva con Calíope su iPhone ed è coperta dallo stesso acquisto, senza acquisti a parte. Mostra i messaggi di sistema che Calíope pubblica: diciotto tipi in otto gruppi, con i backup e i report terminati o non riusciti, le query lente, i tunnel SSH caduti e ripristinati, la sincronizzazione iCloud non riuscita e i server vicini alle tue soglie. Raggruppati per giorni, con notifiche facoltative su un interruttore a parte, e una modalità demo che mostra anche le schermate vuote.

I messaggi viaggiano come identificatore più le loro cifre grezze, mai come una frase già scritta: l'orologio è impostato su una lingua diversa da quella del Mac più spesso che no, quindi la frase si scrive al polso. La cadenza che scegli è un minimo e non una promessa — con l'app chiusa decide watchOS quando svegliarla — e l'app lo dice in alto nella sua schermata di impostazioni, non in grigio in fondo. Il segnalibro è dell'ultimo messaggio consegnato e non dell'orologio da parete, perché i risvegli saltano e chiedere «qualcosa negli ultimi quindici minuti?» scarta il resto senza fallire. Si limita a leggere: non apre nessuna connessione verso un tuo server.

Calíope sulla tua Apple TV

“La salute dei server, letta dall'altro capo della stanza.”

Un pannello a muro per i tuoi server MySQL, MariaDB e PostgreSQL: un riquadro ciascuno, con il suo stato — A posto, Avviso, Critico, Irraggiungibile o Nessun dato — e, quando qualcosa non va, che cosa non va. Tempo di attività, connessioni, thread in esecuzione, query al secondo, tasso di successo della cache, query più lunga e ritardo della replica. Due schede, perché un televisore non è un apparecchio in cui si naviga, e un gruppo dimostrativo di otto server per dare un'occhiata prima.

L'attualità la calcola chi legge, a partire dalla cadenza che Calíope dichiara: chi ha pubblicato non sa di aver smesso di pubblicare, quindi un Mac spento il venerdì lascerebbe il pannello verde per tutto il fine settimana. Lo stato non si distingue mai solo dal colore, e le soglie sono di Calíope: il televisore disegna, non giudica. Apple TV non ha né iCloud Drive né Portachiavi iCloud, quindi «si limita a leggere» lo sostiene la piattaforma e non una promessa.

Calíope su Apple Vision Pro

“Il client intero, appeso nella stanza.”

Un Vision Pro installa Calíope stessa, come app per iPad: l'editor SQL, il navigatore di schema, il diagramma ER, i backup, i report, il costruttore di query — tutti gli strumenti che ha l'iPad, senza toglierne nessuno. Si connette ai tuoi server e scrive. Collochi la finestra, la ridimensioni e la lasci dove vuoi, e arriva dalla stessa pagina dell'App Store e dallo stesso acquisto del Mac e dell'iPad.

Abbiamo costruito anche un'app nativa visionOS — un pannello di sola lettura con il parco e i gruppi di replicazione — e abbiamo deciso di non pubblicarla. Un binario visionOS nativo ha la precedenza sull'app per iPad su quel dispositivo: pubblicarlo vorrebbe dire che chi ha un Vision Pro paga lo stesso prezzo e riceve un pannello invece di un client per database. Quel target dichiarava CloudKit e nient'altro, non collegava alcun driver di database e non aveva un solo percorso di scrittura. Meno non è una funzione. A chi ha un Vision Pro questo non toglie niente che avrebbe avuto altrimenti: una finestra dimensionata per la stanza invece che disposta per essa. Il codice resta nel repository; se un giorno uscirà una versione nativa, sarà perché fa tutto ciò che già fa quella per iPad.

Monitoraggio, diagnostica e replicazione

Motore di monitoraggio con il tuo storage

“Metriche del tuo MySQL, salvate nel tuo MySQL.”

Monitoraggio storico senza installare Prometheus.

Un collector dedicato scrive snapshot su un server di storage che scegli tu, predisponendo tabelle per i campioni (CPU, memoria, connessioni, QPS) e gli eventi (superamenti di soglia, lag di replicazione). Retention automatica.

Visual EXPLAIN interattivo

“Il tuo piano di query come un diagramma che respira.”

Individua l'ALL che sta uccidendo la tua query senza leggere il JSON a mano.

Prende EXPLAIN FORMAT=JSON e lo disegna come un albero. Codificato a colori secondo il tipo di accesso: full scan, range / index merge, ottimizzato, sort, join. Tooltip con access_type, righe stimate e tempi. Zoom con la rotellina, con il pizzico sul trackpad o con i pulsanti della barra — la scala è sempre visibile, e ⌘+ / ⌘− / ⌘0 fanno lo stesso senza trackpad. Pan trascinando.

Profiler di query

“Guarda dove stai perdendo i millisecondi.”

Individua quale fase della query si sta prendendo il tempo.

Costruito su SHOW PROFILE. Tabella più grafico a barre per fase (starting, Sending data, ecc.) con tempi in millisecondi.

Query lente, sul motore che stai usando

“Ciò che il tuo server ha già annotato sulle query che hanno tardato troppo.”

Leggi ciò che il server ha registrato — da tutti i client che si collegano a lui, non solo da Calíope — e dalla stessa schermata accendi il registro, sposti la soglia e lo svuoti. Un pulsante porta la query nell'editor, e il profiler è proprio lì.

Ogni motore con il suo vocabolario. MySQL e MariaDB: le voci arrivano da mysql.slow_log quando il server scrive su tabella, e il riepilogo per istruzione da performance_schema; la soglia è long_query_time. PostgreSQL: pg_stat_statements, aggregato per forma dell'istruzione e non una riga per esecuzione, e la soglia si scrive con ALTER SYSTEM più pg_reload_conf() — una arrivata dalla riga di comando con cui il server è stato avviato viene dichiarata non modificabile da qui invece di fallire in silenzio. MongoDB: uno strumento a sé, perché il profiler è per database. Una lista vuota non è mai la risposta: se il registro finisce in un file della macchina del server, se performance_schema è spento o se l'estensione non è creata in quel database, quel motivo esatto si legge sullo schermo. Su Aurora le impostazioni sono di sola lettura — vivono nel parameter group del cluster. Nessun grafico, e nulla viene copiato in Calíope: vedi la finestra che il server conserva, con l'orologio del server.

Process List con KILL guidato

“Un KILL per la query che ha bloccato la tua produzione.”

Termina una query fuori controllo senza aprire un terminale.

SHOW FULL PROCESSLIST con colonne per id, user, host, database, command, time, state e info. Azioni per KILL QUERY e KILL CONNECTION.

Monitor di replicazione (MySQL 8 e legacy)

“Repliche di MySQL 8 e 5.7, nello stesso pannello.”

Osserva il lag della replica senza combattere con il vocabolario legacy vs. 8.0.

SHOW REPLICA STATUS (MySQL 8) con fallback automatico a SHOW SLAVE STATUS (MariaDB 10.5 / MySQL 5.7). Metriche: IO/SQL running, secondi di ritardo rispetto al source, ultimi errori con timestamp, GTID set, posizioni di log. Auto-refresh configurabile.

Topologia di replicazione

“Una replica può dire zero secondi mentre è indietro di ore. Qui si vede.”

Vedi l’intero gruppo in una volta, e smetti di fidarti di uno «0 secondi» che in realtà significa «ho appena riconnesso».

Dichiari quale macchina è la primaria e quali sono le repliche. Nulla viene rilevato in automatico: SHOW REPLICA HOSTS vede solo ciò che è connesso in quell’istante, quindi un gruppo rilevato cambierebbe da solo e «questa replica non c’è più» sarebbe indistinguibile da «questa replica è caduta». Quella query serve a contraddire una configurazione incoerente, mai a riconfigurarla. Che una replica legga da un’altra macchina si decide dal server_id, mai dal nome host — dietro Docker, NAT, una VPN o un tunnel, confrontare stringhe dà un avviso permanente e falso. Un thread IO fermo è critico anche quando il ritardo dice zero, e accanto va la deriva di GTID, contata per origine anziché sottratta. Un membro che non risponde non trascina gli altri: «7 su 9» è una lettura normale, e quelli che mancano vengono nominati. Legge soltanto — non opera mai sul gruppo. Il diagramma porta una tabella come alternativa accessibile, e nessuno stato si distingue solo per colore.

Visualizzatore di binlog con filtri e PURGE

“Il tuo binlog, filtrabile e purgabile — dall'app.”

Verifica quali eventi hanno prodotto i tuoi statement senza scendere a mysqlbinlog.

SHOW BINLOG EVENTS con categorizzazione in DDL / DML / Sistema, ricerca per testo e un limite di righe configurabile (300 di default). Supporta i binlog crittografati (MySQL 8.0.14+). PURGE BINARY LOGS TO con conferma esplicita.

Dashboard, Server Info e Health

“Il battito del tuo MySQL, in una sola vista.”

Consolida lo stato di salute del server senza aprire cinque client.

Server Info a più schede (variabili globali e di sessione, status globale e di sessione, uso dell'HDD), Server Dashboard con grafici in tempo reale e un Server Health Monitor.

Benchmark in tempo reale

“Due query sulla bilancia; una vince.”

Scegli tra due query con le prove, non con l'intuito.

Confronta i tempi di esecuzione di varianti di query fianco a fianco.

Avvisi e notifiche locali

“Il tuo Mac ti avvisa quando la replica va in ritardo.”

Il sistema ti avvisa — non devi restare a fissare l'app.

Avvisi per soglia su CPU, memoria, connessioni e lag di replicazione. Notifiche native di macOS/iOS.

Tutto ciò che sta girando, in un solo posto

“Ciò che sta girando non sparisce più cambiando scheda.”

Query, backup, migrazioni e lavori pianificati si registrano in un unico posto, con tempo trascorso, destinazione e uno Stop che ferma davvero. Si vede dal piede della barra laterale, dalla scheda che lavora e dal selettore di server.

Le operazioni si iscrivono da sole — nulla sonda le bandiere altrui, perché un registro che indovina finisce per mentire in entrambe le direzioni. I compiti (che iniziano e finiscono) e le modalità (accese finché qualcuno non le spegne) sono tipi distinti, quindi una modalità non porta barra di avanzamento né cronometro. Un lotto sopravvive alla distruzione della sua vista: il controller vive in uno store indicizzato per scheda, non nello stato della vista. Soglia di 0,8 s prima che appaia qualcosa — una query di 40 ms non è un processo.

Errori che si spiegano — e che il tuo telefono può leggere

“Un guasto con la sua causa, il suo suggerimento e la sua traccia.”

Quando qualcosa va storto, Calíope dice cosa è successo, suggerisce cosa controllare e rimanda alla voce di aiuto pertinente. Tutto finisce in un registro con la sua data e il suo dispositivo, che l'app per iPhone può leggere da dovunque tu sia.

Nessun codice di errore nomina un motore: la tabella dei codici nativi vive con il suo provider, quindi aggiungerne uno significa implementare un protocollo. Il numero nativo si legge dal pacchetto tipizzato, non si estrae dal messaggio — MySQLNIO non lo scrive, così un errore di credenziali veniva classificato come guasto di connessione e ti mandava a controllare la porta. Il telefono è in sola lettura: sfoltire ed eliminare restano sulla scrivania. E «nessun errore» è un'affermazione — si distinguono sei motivi diversi di schermata vuota, perché dare la buona notizia quando il canale è semplicemente chiuso è una bugia a sé.

Widget nativi

Widget desktop macOS

“Stato del server, a colpo d'occhio, sulla tua scrivania.”

Guarda il battito del tuo server senza aprire Calíope.

Famiglie Small, Medium, Large e ExtraLarge. Gli snapshot vengono letti da un app group condiviso con file coordination per letture concorrenti sicure. I payload superiori a una soglia di sicurezza vengono rifiutati (protezione DoS).

Widget della schermata Home e della schermata di blocco dell'iPad

“Il tuo MySQL sulla schermata di blocco dell'iPad.”

Metriche del server sulla schermata di blocco del tuo iPad — a pochi secondi di distanza.

Sette famiglie in totale: Small, Medium, Large, ExtraLarge, più le accessorie Rectangular, Circular e Inline (iOS 16.1+).

Deep-linking al profilo fissato

“Tocca il widget → la dashboard del server giusto, in un solo movimento.”

Un tocco e sei nella dashboard del server giusto.

URL del widget caliope://server/<uuid> quando c'è un profilo collegato; altrimenti, ripiega su caliope://.

Selezione basata su AppIntent

“Un widget per server — modificabile come un widget del meteo.”

Assegna un widget diverso a ogni server — configurato in pochi secondi.

Configurabile dalla UI di modifica dei widget di sistema tramite un AppIntentConfiguration. Non richiede codice dell'utente.

Aggiornamento in background con budget di sistema

“Si aggiorna quando serve; dorme quando no.”

Il widget non prosciuga la tua batteria e mostra comunque dati aggiornati.

La policy di timeline delega il controllo a WidgetKit, rispettando il budget di aggiornamento del sistema. Ripiega sull'ultimo snapshot quando non ci sono dati aggiornati.

Integrazioni di sistema

Siri e App Intents

“Un SELECT COUNT(*) da Siri, senza aprire Calíope.”

Esegui una query o elenca i database da Comandi rapidi, senza aprire l'app.

Intent registrati: connettersi a un server, eseguire una query (restituisce TSV con intestazioni), elencare i database, aprire una tab del workspace. Supportato da un bridge interno che espone i session e database manager agli AppIntents.

Menu macOS e gestione dei file .sql

“Sa aprire da Spotlight con un .sql — come qualsiasi app nativa.”

Si comporta come una vera app per Mac — non come un port da Windows o Electron.

Barra dei menu completa: Informazioni, Apri file SQL, File recenti, Quick Open, navigazione tra le tab, Aiuto, Novità, Informativa sulla privacy, Supporto. Gestisce le aperture di file .sql tramite NotificationCenter.

Elemento nella barra dei menu

“Un'icona nella barra dei menu: sai se sei connesso senza cambiare finestra.”

Contesto di connessione a colpo d'occhio, senza portare l'app in primo piano.

Icona nella barra dei menu che riflette lo stato di connessione e il profilo attivo.

Onboarding con TipKit

“Scopri ciò che ti serve, quando ti serve.”

Impara le funzionalità nel momento in cui sono rilevanti.

Tip contestuali per Quick Open, WHERE Builder, importazione di dati, audit DDL, visualizzatore di binlog, monitor di replicazione, migrazione di oggetti, Visual EXPLAIN, profiler di query e albero dello schema.

Continuità via iCloud, gesti dell'iPad e trackpad

“L'SQL che scrivi sul Mac ti aspetta sull'iPad — anche a Mac spento.”

Su iPad con Magic Keyboard, lavori proprio come sul Mac.

La sincronizzazione iCloud opzionale porta connessioni, contenuto dell'editor e preferenze da un dispositivo all'altro — senza prossimità né Bluetooth. Gestione nativa del puntatore e della tastiera su iPad. Gesti: pizzicare per ridimensionare il carattere nell'editor e nella griglia dei risultati, pizzicare per ingrandire l'immagine di una cella, swipe sulle righe dei risultati, pressione prolungata per i menu contestuali, pan e zoom nei diagrammi ER e in Visual EXPLAIN, separatori dei pannelli trascinabili. Split View.

Modalità screenshot

“Screenshot pronti per la documentazione — non screenshot amatoriali.”

Cattura screenshot pronti per la documentazione con un aspetto coerente.

Cmd+Opt+P su macOS produce PNG con uno stile pronto per la documentazione e il marketing.

«Novità» dentro l'app

“Novità, dentro l'app — non in un changelog.”

Scopri le novità senza leggere le note di versione dell'App Store.

Highlight per versione, con stato locale di «già visto».

Interfaccia in cinque lingue (spagnolo, inglese, francese, tedesco, italiano)

“Calíope parla la tua lingua — spagnolo, inglese, francese, tedesco o italiano.”

Un'app progettata prima in spagnolo, così non sembra una traduzione automatica.

Bundle di risorse completi en, es, fr, de e it, con un manager di lingua a runtime e un helper di localizzazione. Fallback all'inglese.

Privacy, sandbox e conformità

Sandbox App Store attivo

“Sandbox attivo — fa ciò che dichiara, e nulla più.”

Calíope non può accedere a nulla al di fuori degli entitlement dichiarati. Il sistema lo garantisce.

App sandbox abilitato con un set ristretto di entitlement: client e server di rete (per il proxy SSH), ingresso audio (voce in SQL), file selezionati dall'utente (documenti), app group (per i widget) e iCloud (CloudKit e Cloud Documents).

Servizio di cancellazione dei dati

“Un pulsante, e non resta nulla.”

Un pulsante per lasciare la macchina pulita prima di restituirla o venderla.

Cancellazione sicura su richiesta di sessioni, credenziali e log delle query.

BYOK con disclosure formale

“Prezzo onesto — l'IA va con la tua chiave, e lo diciamo.”

Sai esattamente cosa paga l'acquisto e cosa no.

Il paywall mostra una nota BYOK e le condizioni dell'acquisto: un solo addebito, nessun rinnovo, ripristinabile su ogni dispositivo.

Acquisto unico con 60 giorni di prova

“Sessanta giorni gratis, senza trucchi.”

Prova Calíope sessanta giorni senza costi; se la tieni, paghi una sola volta.

Prodotto non consumabile di StoreKit 2 con 60 giorni di prova gratuita come non consumabile a prezzo zero (linea guida 3.1.1 di App Review). Verifica tramite AppTransaction.shared e Transaction.latest(for:) di StoreKit 2. Ripristino tramite AppStore.sync(). Il prezzo viene sempre presentato da product.displayPrice.

Cancellare tutto, e sapere cosa è successo

“Sei posti, un rapporto, nessun errore muto.”

Il pulsante di cancellazione raggiunge i file locali, il contenitore iCloud Drive, l'archivio chiave-valore, CloudKit e il gruppo di app — e pubblica un segnale perché anche gli altri tuoi dispositivi cancellino invece di ricaricare tutto.

Una cancellazione remota non consulta l'interruttore di sincronizzazione: l'interruttore dice se da adesso si carica, non se lassù c'è già qualcosa, e chi l'ha attivato, caricato e poi spento è proprio il caso che una cancellazione per privacy non può lasciare fuori. La propagazione è asimmetrica per non entrare in ciclo, e il confronto è > e non !=, perché un vecchio segnale ripubblicato da un dispositivo addormentato non inneschi una seconda cancellazione. Il rapporto ha una riga per canale con il suo conteggio e il suo errore — la versione precedente era scritta con try? muti e finiva sempre con «tutti i tuoi dati sono stati eliminati correttamente», una frase che non poteva essere falsa nemmeno con CloudKit fuori uso.

Pronto a provare Calíope?

Ogni funzionalità di questa pagina è inclusa nell'acquisto unico. Sessanta giorni gratis e poi si compra una volta ed è tua per sempre.

Prova gratis per 60 giorni →