git log · 195 giorni di storia

La nascita di Taski

Da un primo commit incerto a un ecosistema completo su 6 piattaforme. Sei mesi di notti insonni, dubbi e piccole vittorie. E una promessa che non si è mai piegata: la tua privacy, prima di tutto.

0Commit
0Piattaforme
0Giorni
0Deploy
$ git log --since="2025-11-26" --oneline | wc -l
01 La Scintilla

Initial Commit

Tutto parte da una cartella vuota e un'idea: un'app di messaggistica che metta la privacy al primo posto. Il primo commit è nudo, uno scheletro Xcode, un progetto SwiftUI con più speranza che codice. "tentativo sistemazione login" recita il secondo commit, pochi minuti dopo. Non funziona ancora niente, ma il viaggio è iniziato.

Initial Commit
Il secondo commit: tentativo sistemazione login

Le prime parole

In 24 ore, le push notification e la connessione WebSocket prendono vita. Il backend riesce a recapitare un messaggio da un dispositivo all'altro, in tempo reale. L'implementazione della foto profilo fallisce al primo tentativo. "App compila update profilo fallito" ma la mattina dopo funziona. I messaggi appaiono. Per la prima volta, due dispositivi parlano tra loro.

Chat funzionante!

Il commit message dice tutto: "Chat funzionante, profilo funzionante" Per la prima volta le chat persistono, i messaggi arrivano, il profilo si aggiorna. La foundation c'e. Da qui in poi si costruisce.

Le notti bianche

I timestamp non mentono: commit alle 00:52, alle 2:13, alle 2:30, alle 4:53, alle 5:07. Una raffica di commit notturni porta l'app da "funziona" a "sembra vera". Indicatore di digitazione, spunte di lettura, deeplink, badge. Alle 4:53 arriva il primo dei fantasmi che perseguiteranno il progetto: "fix chat fantasma e push" Alle 5:07, esausto: "risolti" Una sola parola. Poi silenzio fino a domani.

02 La Fortezza

E2EE Implementata

Cinque giorni dopo il primo commit, la crittografia end-to-end prende vita. Da questo istante ogni messaggio nasce blindato: lo possono leggere solo due persone al mondo, chi scrive e chi riceve. Nessun altro. Nemmeno chi ha passato le notti a costruire Taski. Non è una funzione tra le tante: è una promessa scolpita nel codice, il motivo per cui tutto questo esiste. È il momento in cui un esperimento diventa un patto di fiducia.

E2EE Implementata

"TUTTO FUNZIONANTE DA QUESTO PUNTO"

Il commit message in maiuscolo non mente. Notifiche push con anteprima cifrata, risposte ai messaggi, messaggi cifrati con ora corretta. In soli 6 giorni, Taski ha le basi complete di un messenger sicuro. "NOTIFICHE FUNZIONANTI" grida un commit poco prima. L'entusiasmo è palpabile nel git log.

Contatti e verifica SMS

Ancora di notte, all'1:06. Match utenti per numero di telefono. Login via SMS. Taski smette di essere un esperimento e diventa qualcosa che potresti installare sul telefono di tua madre.

Gruppi: la montagna russa

Il 4 dicembre, i gruppi entrano nel codice. Il git log racconta un'epopea in quattro atti: "Gruppi funzionanti" "Gruppi perfettamente funzionanti" "Gruppi quasi perfetti" "GRUPPI PERFETTI" Il giorno dopo, ancora: "Logica gruppi perfetta" Cinque commit, cinque livelli crescenti di certezza. O forse di autoconvincimento.

La settimana dei "forse"

21 commit in 4 giorni, e il dubbio permea ogni riga: "Per ora BENE" "Sistamazione spunte? Forse!" "chat eliminate sembra funzionare" "Abbinamento chat quasi perfetto" "sistemato forse tutto" Non è sicurezza: è speranza. Le spunte funzionano, poi smettono. Le chat fantasma appaiono e scompaiono. I typo nei commit tradiscono la stanchezza: "Sistamato", "nofifiche", "implemenzazione". Ma il codice avanza.

Il limbo natalizio

Mentre il mondo festeggia, i commit non si fermano. Trascrizione messaggi vocali. Anteprime link. Video. Il 23 dicembre: "Posizionamento messaggi quasi perfetto" Il 27: "Forse ci siamo, chat sistamata" "Chat sembra ok" "Sembra". "Forse". "Quasi". Le parole di chi ha imparato a non fidarsi. Il 26 dicembre, giorno di Santo Stefano: "Sistemato problema freeze UI in chat" Nessun giorno di riposo per l'app.

03 La Maturità

Chiamate vocali e video

Arrivano le chiamate vocali e video in tempo reale, costruite su WebRTC con segnalazione via WebSocket. Ringback tone, gestione delle chiamate perse, speaker automatico in videochiamata. E anche la voce, come ogni parola scritta, viaggia cifrata end-to-end. "Nascondi tasto videochiamata (da riabilitare)" racconta la lotta tra ambizione e stabilità. Il 5 gennaio: "Chiamate quasi perfette" Di nuovo quel "quasi". E poi il vero nemico: "Fix call zombie: terminate active call when app goes to background or is killed" Le chiamate fantasma, quelle che restano attive quando l'app muore, perseguiteranno il codice per settimane.

Il Watchdog

Il codice di errore più temuto dagli sviluppatori iOS: 0x8BADF00D ("ate bad food"). Significa che il sistema ha ucciso l'app perché il thread principale era bloccato. "fix: prevent watchdog crash (0x8BADF00D) from background reloadData" Apparira tre volte nella storia di Taski. Ogni volta, ore di debug per capire quale operazione stava tenendo in ostaggio il main thread. In aprile il backup. In maggio l'AI search. Il watchdog non perdona.

Nasce il Worker

Il backend diventa un Cloudflare Worker: serverless, distribuito sull'edge, sempre vicino a chi scrive. È il primo commit di un repository dedicato. Da qui partiranno 844 deploy in cinque mesi: 844 volte in cui qualcuno ha trattenuto il fiato premendo «invio». Il cuore di Taski inizia a battere a un ritmo nuovo.

L'infrastruttura cresce

Versioning per la rotazione delle chiavi E2EE. Sistema di heartbeat per le chiamate. Sticker con storage dedicato e TTL. Coda di push costruita sui Durable Objects, con ACK di conferma dal client. Rate limit anti-abuso sugli SMS. Sistema di presenza pub/sub in tempo reale. Ogni settimana un sistema nuovo, costruito mattone su mattone, spesso fino all'alba.

Forza bruta

A volte l'eleganza deve farsi da parte. Le notifiche si duplicano, i filtri non reggono, e a un certo punto serve solo che la cosa funzioni. "Forza retry push bypassando dedupe" Il giorno dopo: "Fix push duplicate" E il ciclo classico: la correzione della correzione. Un copione che diventa familiare. Ci saranno giornate in cui lo stesso pezzo di backend verrà rilasciato 34 volte: 34 piccole speranze, una dopo l'altra.

Febbraio 2026

Zero compromessi sulle notifiche

Una notifica persa è un messaggio che non arriva. Così il sistema di notifiche viene ripensato da zero: viaggiano alla velocità del tempo reale, ma nessuna va mai perduta. Anche quando sei offline, restano in attesa, al sicuro, finché non ti raggiungono. Velocità e affidabilità, senza dover scegliere tra le due. È l'inizio di un'ossessione per le performance che definirà i mesi successivi: ogni dettaglio limato è un messaggio che arriva un istante prima, un utente servito meglio.

I fantasmi del backend

I Durable Objects introducono un tipo di bug inedito: le sessioni zombie. WebSocket che sembrano aperte ma sono già morte. La presenza degli amici che lampeggia, appare e sparisce. "Fix forceDelivery for zombie WS sessions" "alarm-based stale sweep for zombie WS detection" "self-heal stale state" Il codice impara a curarsi da solo: un alarm periodico fa lo sweep delle connessioni stantie e ripulisce lo stato. Non è elegante. Ma alle tre di notte, «funziona» è la parola più bella del mondo.

-60% di chiamate tra i Durable Objects

Un solo commit dimezza il traffico tra i Durable Objects. L'idea: invece di interrogare la presenza di ogni utente uno alla volta, un PresenceRegistry sharded raccoglie le query in batch. Una sola chiamata al posto di decine. I costi crollano, la latenza cala. Quella riga di codice, scritta in silenzio, nessun utente la vedrà mai. Ma la sentiranno tutti.

Hibernation: il sonno dei Durable Objects

I Durable Objects sono potenti, ma costano finché restano svegli. La Hibernation API li mette in letargo quando non servono, mantenendo aperte le connessioni WebSocket senza consumare risorse. ChatRoom e UserHub passano entrambi in hibernation. "eliminate ~99.7% DO GB*s" esulta il commit: un risparmio quasi commovente, frutto di settimane di studio. Poi, il giorno dopo, il prezzo: "Fix presence false-offline after hibernation wake" Il risveglio non è sempre dolce. Ogni vittoria, qui, si paga con un nuovo problema da amare.

94 migrazioni database

Ogni migrazione D1 è un'operazione a cuore aperto sul database vivo, senza mai poterlo spegnere. Aggiungere una colonna, creare un indice, rimuovere un vincolo: gesti minuscoli che, se sbagliati, fermerebbero tutto. 94 migrazioni in sei mesi, e nessuna ha mai causato un secondo di downtime. Dietro quel silenzio perfetto, un cuore che ogni volta batteva forte.

04 L'Espansione

Nasce Taski Web

React, Vite e Tailwind. Il client web arriva con pairing via QR code, E2EE completa e WebSocket in tempo reale. In appena 17 giorni diventa un client completo: chat, media, chiamate. "SECURITY: Remove open user search" La cautela non è un ripensamento: è già parte del DNA. Proteggere le persone viene prima di stupirle.

Storie e reazioni

Le Storie arrivano su Taski: condivisibili, effimere e cifrate. Reazioni ai messaggi con emoji. Like alle storie con push avatar. L'app comincia a sentirsi completa, non più un progetto ma un prodotto.

Siri e verifica chiavi QR

"Hey Siri, manda un messaggio con Taski" e parte, cifrato end-to-end, senza un tocco. Puoi verificare di persona che stai parlando davvero con chi credi, scansionando un codice. E condividere foto e video da qualsiasi app, sempre protetti. La sicurezza che smette di essere un peso e diventa un gesto naturale.

Apple Watch companion

In una sola giornata, sei commit portano Taski sull'Apple Watch: chat, foto, avatar, logo nella toolbar, sync in tempo reale, fetch parallelo. Il giorno dopo, la resa dei conti: fix per il freeze della UI, decrypt spostato fuori dal main thread, lock resi asincroni. Lo schermo è grande come un francobollo, ma i problemi sono enormi. Eppure, la mattina dopo, i messaggi arrivano anche lì.

Taski Desktop: Mac e Windows

Tauri 2 avvolge il client web in un'app nativa. macOS e Windows nello stesso giorno. Menu bar nativo, notifiche di sistema con anteprima cifrata, risposta diretta dalla notifica, badge nel dock, auto-update e Handoff con iOS. Quattro schermi diversi, una sola conversazione che ti segue ovunque vai. Serviranno 85 commit per renderlo completo, e ognuno è un pezzo di vita lasciato lì dentro.

La grande migrazione: da SwiftUI a ObjC

La chat nasce in SwiftUI: elegante, dichiarativa, moderna. E lenta. La tastiera appare e scompare come un fantasma, e niente fa più male di una cosa che funziona quasi: "Usato UIkit per chat da risolvere problema tastiera fantasma" Il 28 dicembre 2025 il primo tentativo di passare a UIKit. Poi mesi di convivenza ibrida: SwiftUI che avvolge UIKit che richiama SwiftUI. Il 7 marzo, il crash che spezza ogni pazienza: "il datasource rows e il batch update non restano coerenti e UIKit abortisce con SIGABRT" Il 20 marzo, la decisione radicale: riscrivere la chat intera in Objective-C. Non Swift, non SwiftUI. Objective-C. Il linguaggio dei nonni. Ma UICollectionView in ObjC non ha overhead di bridge, non ha i capricci del layout SwiftUI, non ha fantasmi. In 4 giorni, 20 commit portano la chat da SwiftUI a ObjC: bolle, input bar, emoji, risposte, miniature, video, link cliccabili, player musicale, viewer media nativo. Il risultato: scroll fluido, zero jank, zero crash. A volte il progresso è tornare indietro.

feat(chat): ObjC chat collection view with input bar, emoji sizing, camera, scroll fixes
05 L'Intelligenza

TaskiAI: riscrittura messaggi

L'intelligenza artificiale entra in Taski in punta di piedi. Un bottone sparkle nella barra di input riscrive una frase: più formale, più casual, corretta, tradotta. Mai imposta, sempre offerta: un aiuto gentile che resta un passo indietro, dentro i confini della privacy promessa il primo giorno.

TaskiAI Chatbot

In un solo giorno, 10 commit costruiscono un assistente conversazionale completo, che vive accanto alle chat nella lista. Allegati foto e PDF, rendering Markdown, generazione di documenti PDF, rate limit di 20 richieste l'ora, auto-switch tra modelli. "AI memo creation with reminders + Siri App Shortcut" L'AI trasforma un messaggio in un promemoria e te lo programma via Siri. Tecnologia che, per una volta, sembra prendersi cura di te.

AKD: Auditable Key Directory

Un Auditable Key Directory: un registro delle chiavi pubbliche protetto da una hash-chain, con firme lato client. Se qualcuno provasse a sostituire di nascosto la tua chiave per spiarti, la catena crittografica lo smaschererebbe all'istante. È un'ossessione: rendere il tradimento impossibile, non solo improbabile. "Houston, we have a problem!" scherza la schermata di manutenzione a tema spaziale aggiunta il giorno dopo. Perché anche nei momenti più seri, serve sorridere un po'.

TaskiAI tra le righe

Fino a ieri l'AI viveva in una stanza tutta sua. Ora basta scrivere @TaskiAI in mezzo a una conversazione e lei risponde lì, nel flusso del discorso, davanti a tutti. Nei gruppi diventa un partecipante in più: uno che sa rispondere, riassumere, tradurre, e non dorme mai. La risposta appare come per magia tra i messaggi degli umani, parte naturale del discorso.

Una memoria che non tradisce

Un assistente che dimentica tutto a ogni messaggio è solo un'eco. Così TaskiAI impara a ricordare: i fatti che le confidi restano, conversazione dopo conversazione. Ma con una regola di ferro — la memoria è cifrata end-to-end come ogni altra cosa. I tuoi ricordi con l'assistente sono tuoi e basta: nemmeno il server sa cosa TaskiAI ricorda di te.

Aprile 2026

Spotify, Voice AI e Anti-Abuso

Aprile è un mese di esplosione creativa. Integrazione Spotify con PKCE auth. Voice TaskiAI con GPT Realtime per conversazioni vocali. Sistema anti-abuso AI con Llama Guard 3 + Haiku double-check, auto-sospensione 7 giorni. Ban system con broadcast real-time via WebSocket. L'app non è solo bella — è anche sicura.

Il giorno più lungo

59 commit in 24 ore. Il record assoluto del progetto. Un giorno in cui tutto accade insieme: bug critici, idee nuove, correzioni su correzioni. Il diario di quel giorno è un romanzo intero. Più di quanto Taski Desktop abbia accumulato in tutta la sua vita. Dormire, quel giorno, era un lusso che qualcuno ha scelto di non concedersi.

Le 72 ore

Tre giorni consecutivi: 34, 34 e 41 commit tra iOS e Worker. Anti-abuso AI, ban system, broadcast in tempo reale, dedup della coda push, contesto immagini per TaskiAI. Il Worker raggiunge 34 deploy in un solo giorno: in media, uno ogni 42 minuti. Per tre giorni, dormire è stato facoltativo. La passione, a volte, somiglia tantissimo alla follia.

06 La Corazzatura

Audit e Hardening

Due round di audit di sicurezza. Confronti a tempo costante su tutti i dati sensibili, query D1 atomiche per le menzioni AI, controllo della dimensione prima di ogni upload. Ogni endpoint passato al setaccio, ogni input validato. Nessuno l'ha chiesto, nessuno se ne accorgerà. Ma è qui che la fiducia si costruisce davvero: nei dettagli che restano invisibili.

Voice Web Search

TaskiAI Voice ottiene uno strumento di ricerca sul web: durante una conversazione vocale può cercare in rete, annunciando ogni ricerca ad alta voce per trasparenza. Country mapping per lingua, massimo 3 ricerche per chiamata. Anche l'onestà, qui, è una funzionalità: niente magie silenziose, niente segreti.

Taski arriva su Android

Prima come wrapper Capacitor, poi la migrazione verso un client nativo in Kotlin. Il 17 e 18 maggio, in lunghe sessioni notturne davanti al monitor, prende forma: WebSocket, E2EE, push FCM, media cifrati. Spunta un bug crudele tra iOS e Android: le push cifrate semplicemente non arrivano. La soluzione sono due righe nel Notification Service Extension di iOS, rimaste invisibili per settimane perché una cache copriva il percorso. Due righe, settimane di ricerca. Dieci bug critici sistemati dopo l'ultimo audit. La sesta piattaforma è viva. Ora chiunque, su qualunque telefono, può scriversi al sicuro.

Il client Android nativo: CryptoService.kt, stessa E2EE di iOS e web

Il bug accettato

A volte la risposta giusta non è "sistemare" ma "accettare". In condizioni rare, una seconda notifica arriva dopo 60 secondi: una rete di sicurezza per quando la prima non viene confermata. Ore di analisi del problema, con l'aiuto dell'AI. Tre tentativi precedenti di sistemarlo avevano rotto cose più importanti. La conclusione: meglio una notifica duplicata una volta su mille che una notifica persa. iOS, quasi sempre, la deduplica tramite collapse-id, e il caso che resta è rarissimo. Il bug viene documentato e accettato. Non tutto va sistemato: alcune cose vanno capite, e lasciate andare. È una delle lezioni più difficili da imparare, per chi scrive codice, e forse non solo.

Security Audit offensivo

Un audit offensivo completo: provare a rompere con le proprie mani ciò che si è costruito, prima che lo faccia qualcun altro. Sei fix deployati: protezione XSS, rate limit sull'admin, eliminazione degli error oracle, blocco SMS per paese, whitelist CORS, accesso al pannello admin blindato. Non si aspetta l'attacco seduti: lo si va a cercare. La paranoia, qui, è la forma più alta di rispetto verso chi ti affida i suoi messaggi più intimi.

Apple App Attest

Apple App Attest integrato: attestation e assertion, trust tier per i dispositivi. Solo le app genuine, verificate dal Secure Enclave di Apple, possono parlare col backend. Ogni header di bypass rimosso. La catena di fiducia ora è intera, dal silicio Apple fino al server. Niente di tutto questo si vede usando l'app. Ma è ciò che ti permette di dormire tranquillo.

Un aiuto sempre acceso

Anche il prodotto più curato, prima o poi, ha bisogno di spiegarsi. Così nasce Taski Support: non una pagina di FAQ morta, ma un assistente vero, con un cervello AI dedicato tutto suo, separato dal resto dell'app. Quando qualcosa non va, apri una richiesta e dall'altra parte c'è qualcuno che risponde — a qualunque ora, in qualunque lingua. Perché un'app che mette le persone al primo posto non può lasciarle sole proprio nel momento del bisogno.

Key Transparency: fidati, ma verifica

Il traguardo più ambizioso di tutti, e arriva alla sessione di lavoro numero 400. Fin qui l'AKD verificava la tua catena di chiavi; la Key Transparency va oltre: un log append-only in stile Certificate Transparency, con Merkle tree, inclusion proof e consistency proof. Il server non può mentire a un utente senza mentire a tutti, e mentire a tutti lascia una traccia matematica impossibile da nascondere. I client si scambiano la testa del log piggyback nei messaggi cifrati (gossip): se il server mostrasse due versioni diverse della verità, qualcuno se ne accorgerebbe. E il tocco finale: il log vive su due infrastrutture cloud indipendenti, gestite da aziende diverse, una che co-firma lo stato dell'altra. Per falsificare la verità bisognerebbe corromperle entrambe nello stesso istante. Niente magie: solo matematica e firme crittografiche. Live su Worker, web e iOS lo stesso giorno. È il punto d'arrivo di un'ossessione cominciata quel primo dicembre. La fiducia, da oggi, non si chiede più: si dimostra.

L'AI che dà vita alle immagini

TaskiAI sapeva già scrivere, riassumere, leggere foto e documenti, creare promemoria. Il 3 giugno impara qualcosa di nuovo: a generare video. Glielo chiedi, e da un'idea nasce qualcosa che si muove, lì nella chat, accanto ai messaggi di tutti i giorni. Un altro passo di un assistente che non smette mai di imparare.

Il fantasma, finalmente catturato

Ricordi il bug accettato? La seconda notifica che ogni tanto arrivava di troppo, quella che avevamo deciso di lasciar vivere perché sembrava impossibile da prendere. Settimane dopo, una notte davanti ai log, la verità è emersa: non era affatto inevitabile. Era una race condition: due eventi che gareggiavano, e ogni tanto arrivavano nell'ordine sbagliato. Capito il meccanismo, è bastato un piccolo segnaposto in memoria per rimettere in ordine la corsa. Nessuna notifica persa, nessun fantasma di troppo. Quello che avevamo accettato di non capire, alla fine l'abbiamo capito. E ciò che si capisce, si può risolvere.

Una casa con il proprio nome

Per mesi il cuore di Taski ha vissuto su un indirizzo di servizio, un sottodominio tecnico preso in prestito. Poi una notte qualcuno da fuori prova a bussare proprio da quella porta secondaria — e la trova. Nessun danno: le difese vere erano altrove. Ma il messaggio è chiaro: è ora di chiudere l'ultima porta di servizio. Il backend trasloca interamente sotto taski.chat, il suo nome, il suo indirizzo. Niente più stanze sul retro: una sola casa, una sola porta, sorvegliata.

La firma che nessuno può falsificare

L'AKD e la Key Transparency rendevano impossibile cambiare le chiavi di nascosto. Restava un'ombra sottile: e se fosse il server stesso, fin dall'inizio, a fingere la tua identità? Il 6 giugno quell'ombra svanisce. Ogni persona ha ora un'unica chiave d'identità, che vive solo sui suoi dispositivi e non tocca mai il server né il web. La prima volta che incontri qualcuno, il suo segno viene impresso; da quel momento, se qualcosa non combacia, lo sai. AKD, Key Transparency, Identity Key: tre lucchetti sulla stessa porta. La fiducia non è più una promessa del server: è matematica nelle tue mani.

Un solo telefono, il tuo

Il tuo account vive su un solo telefono alla volta: il tuo. Web e desktop smettono di essere porte d'ingresso e diventano finestre che si aprono soltanto se le inviti, scansionando un codice dal dispositivo che hai in mano. E quando passi a un telefono nuovo, le tue chiavi non rinascono da zero né transitano dal server: migrano da un device all'altro, da te a te, come un testimone consegnato a mano. Così, anche se qualcuno ti rubasse il numero, troverebbe solo una porta che non si apre. Per essere te non basta la tua SIM: serve il telefono che tieni in tasca.

07 L'Ecosistema
Da Maggio 2026 a Oggi

6 piattaforme, un ecosistema

iPhone. Apple Watch. Mac. Windows. Web. Android.
4.121 commit. 844 deploy del worker. 94 migrazioni database. 369 commit web. 85 commit desktop. 644 commit Android.
Crittografia end-to-end su ogni messaggio, chiamata, foto, video, sticker.
AI integrata che rispetta la privacy. Anti-abuso con doppio modello AI.
Hash-chained key directory per trasparenza crittografica.
Apple App Attest per fiducia hardware.

59 commit in un solo giorno. Commit alle 5 del mattino. Typo nei commit che tradiscono la stanchezza. "Forse", "sembra", "quasi perfetto" — le parole di chi costruisce qualcosa di più grande di se.

Da Initial Commit a qui: 195 giorni. Da una cartella vuota a un ecosistema.

La storia
continua

Ogni commit è un passo avanti. Ogni bug fixato è una lezione imparata. Ogni feature è una promessa mantenuta.

$ git log --oneline | wc -l 4121