Come ho creato un blocco per iOS da 4 MB contro il doomscrolling
La storia di come la lotta ai loop di dopamina ha portato alla nascita di Scroll Brake, perché le app concorrenti chiedono permessi discutibili e come superare le trappole della Screen Time API di Apple.
Perché avevo bisogno di un blocco app in primo luogo
Prendo la produttività personale molto seriamente. Negli anni ho messo a punto un mio metodo di gestione del tempo e delle energie che dà ritmo alle mie giornate e mi consente di portare a termine progetti software complessi.
Eppure arrivano quei momenti in cui afferri lo smartphone con il pilota automatico e ti ritrovi a scorrere senza sosta i Reels su Instagram. Un breve video, un secondo, un terzo… l'algoritmo distribuisce una serie ininterrotta di contenuti coinvolgenti. Pensavi di staccare due minuti per riprendere fiato, e improvvisamente sono svaniti 40 minuti o un'ora intera. Gli algoritmi di raccomandazione sono progettati da ingegneri di altissimo livello per catturare l'attenzione umana a qualunque costo. Ogni swipe appare impercettibilmente più appagante del precedente, intrappolando il cervello in un loop di dopamina infinito.
Non avevo la minima intenzione di programmare una mia applicazione. Come sviluppatrice e fondatrice, il mio tempo è prezioso e preferisco di gran lunga affidarmi a strumenti collaudati. Sono quindi andata dritta sull'App Store.
Cosa non funziona nei moderni app blocker
Ho messo alla prova i protagonisti della categoria: Opal, OneSec, ScreenZen, Refocus, insieme alla funzione nativa Tempo di utilizzo di Apple. Quasi all'istante mi sono scontrata con scelte architetturali e di design che mi hanno lasciata perplessa:
Il paradosso delle notifiche push
Praticamente tutte queste applicazioni esordiscono chiedendo permessi per notifiche push e tracciamento analitico. Perché mai un'applicazione concepita per allontanarmi dallo smartphone dovrebbe risvegliare il display con dei banner? Come ho compreso in seguito durante lo sviluppo, non si trattava di malafede degli sviluppatori, ma di un vincolo storico del sistema iOS che spiego nel dettaglio nella sezione tecnica.
Schermate di abbonamento aggressive
Prima ancora di aver visto la schermata principale o di aver verificato se l'app risolva effettivamente il problema, vieni investito da un'aggressiva schermata di pagamento. Mascherata dietro un «periodo di prova gratuito» congegnato nella speranza che l'utente dimentichi di annullare il rinnovo. Da imprenditrice comprendo le dinamiche di conversione; da utente trovo questi dark pattern inaccettabili.
L'inefficacia del Tempo di utilizzo integrato di Apple
La funzione nativa di Apple fallisce sul piano della psicologia umana. Quando appare la schermata di blocco di sistema, il pollice preme in modo del tutto meccanico su «Ignora il limite per 15 minuti». Non c'è alcun attrito cognitivo: l'azione è interamente guidata dalla memoria muscolare.
Non avevo alcuna intenzione di passare al setaccio decine di cloni con abbonamenti ricorrenti identici. Ho capito che realizzare per me stessa uno strumento leggero e nativo sarebbe stato più veloce e infinitamente più onesto.
I principi di Scroll Brake: 4 MB, zero tracker, niente abbonamento
In NovaSynapse seguiamo un principio fondamentale: « Tutto ciò di cui hai bisogno. Niente di superfluo. » Un buon software deve risolvere il problema, preservare l'autonomia della batteria e rispettare lo spazio dell'utente.
È su queste basi che è nato Scroll Brake:
- Circa 4 MB di spazio occupato: Niente framework multipiattaforma pesanti, zero WebView, nessun SDK esterno di tracciamento.
- 100% Privacy-First: Nessun account utente, nessun database, nessun server remoto. Tutto viene eseguito in locale sul dispositivo sfruttando le API native di iOS.
- Attrito cognitivo invece di divieti ciechi: Per prolungare la permanenza in un'app bloccata, è necessario attivare la corteccia prefrontale risolvendo una breve operazione matematica. Quel singolo secondo di sforzo consapevole spezza la modalità automatica.
- Design anti-dopamina senza gamification: Dopo aver risolto l'operazione non compaiono coriandoli, animazioni festive o messaggi trionfanti. Premiare il cervello con dopamina a buon mercato per aver sbloccato i social non ha senso. La schermata rimane volutamente essenziale e tranquilla: il tempo viene concesso e il ritorno avviene tramite la freccia indietro nativa di iOS in alto a sinistra (per motivi di privacy, iOS non comunica all'app principale quale applicazione abbia fatto scattare il blocco, impedendo qualsiasi reindirizzamento automatico).
- Modello di prezzo trasparente: Fino a 3 regole sono completamente gratuite per sempre (personalmente ne uso una sola: categoria «Social network» limitata a 5 minuti al giorno). Chi ha bisogno di più regole paga una sola volta per una licenza a vita (Lifetime), senza abbonamenti periodici obbligati.
Sviluppato in 4 giorni: IA e strumenti Xcode
Ho sviluppato l'app con l'assistenza dell'intelligenza artificiale, impiegando Antigravity e i modelli Gemini 3.1 Pro e Flash.
Avevo già esperienza nello sviluppo mobile con Flutter e iOS nativo, ma risaliva all'epoca precedente alla diffusione dei coding assistant. Con l'IA, completare un'applicazione così mirata e leggera è stato straordinariamente rapido. Naturalmente non si può accettare ciecamente il codice generato: le estensioni di sistema di Apple sono particolarmente delicate, per cui ho esaminato ogni singola riga di persona per escludere crash e perdite di memoria. L'intero sviluppo, compresi i test manuali su dispositivi fisici e versioni precedenti di iOS, ha richiesto appena 3 o 4 giorni lavorativi:
- Icona pronta in 15 minuti: Invece di esportare a mano decine di livelli PNG, ho usato il tool per sviluppatori di Xcode Icon Composer. I livelli vettoriali si adattano automaticamente agli stili chiaro, scuro e colorato di iOS.
- Revisione dell'App Store in meno di 24 ore: Non contenendo SDK di terze parti e non raccogliendo dati personali, Apple ha approvato la build per l'App Store già il giorno successivo.
Deep-dive tecnico: le insidie della Screen Time API
Veniamo alla parte centrale: l'architettura imperniata sul trio ManagedSettings, DeviceActivity e FamilyControls. Chi sviluppa con la Screen Time API di Apple si imbatte prima o poi in tre limiti strutturali del sistema. Ecco come li ho superati:
Perché i concorrenti ricorrono alle notifiche push (iOS < 26.5 vs iOS 26.5+)
Gli utenti criticano spesso le notifiche invadenti dei vari app blocker, ma per molto tempo gli sviluppatori sono rimasti bloccati nella sandbox di Apple.
- Il vecchio limite di sistema:
Quando un'applicazione viene bloccata, il sistema mostra l'interfaccia protettiva tramite ShieldActionExtension. Se l'utente tocca un'azione come «Estendi», questa estensione gira in una sandbox limitata in cui la chiamata a UIApplication.shared.open è rigorosamente proibita sia dal compilatore che dal sistema operativo. L'enum ShieldActionResponse prevedeva in passato soltanto .close, .defer e .none. Non esisteva alcun modo legittimo per aprire l'app principale e mostrare un quesito o una sfida!
- L'espediente del settore:
L'unica scappatoia consisteva nel generare una notifica push locale con UNUserNotificationCenter. L'utente doveva toccare il banner per accedere all'app. Ecco spiegato il motivo per cui quasi ogni blocker sull'App Store richiede l'autorizzazione per le notifiche.
- La soluzione nativa a partire da iOS 26.5+:
Apple ha finalmente introdotto il caso ShieldActionResponse.openParentalControlsApp. Quando viene restituito, il sistema avvia all'istante l'applicazione principale mostrando direttamente la vista del calcolo matematico (MathPuzzleView):
// ShieldActionExtension.swift
defaults?.set(true, forKey: "launchedFromShieldAction")
completionHandler(.openParentalControlsApp)
Impostando iOS 26.5+ come base minima di rilascio (IPHONEOS_DEPLOYMENT_TARGET = 26.5), ho potuto fare a meno di qualsiasi trucco basato su notifiche push.
L'isolamento della sandbox sui dati di utilizzo
Mi viene spesso chiesto: «Perché l'app non include grafici di utilizzo dettagliati minuto per minuto?»
La risposta è netta: Apple isola completamente i dati di Screen Time dall'applicazione host.
- L'accesso alla raccolta
DeviceActivityResultsè riservato in esclusiva a DeviceActivityReportExtension, che viene eseguita in un processo di sistema isolato. - L'applicazione principale incorpora esclusivamente un contenitore visivo: DeviceActivityReport. Tale componente viene renderizzato fuori dal processo principale (out-of-process) e proiettato sull'interfaccia dell'app.
- I dati grezzi non escono mai dalla sandbox dell'estensione: l'applicazione host non può scriverli in un database SQLite, serializzarli o trasmetterli tramite rete.
La documentazione ufficiale di Apple è inequivocabile:
« Per proteggere la privacy dell'utente, l'estensione DeviceActivityReport viene eseguita in una sandbox e i suoi dati non lasciano l'estensione. Al suo posto, l'estensione crea e restituisce viste che la tua app visualizza. »
- Impatto sul monitoraggio:
Il controllo dei limiti con DeviceActivityCenter funziona unicamente secondo una logica di sottoscrizione a soglie (DeviceActivityEvent.threshold). Il sistema notifica DeviceActivityMonitorExtension solo nel momento in cui la soglia viene superata (eventDidReachThreshold), senza inviare dati continui sull'utilizzo.
- Perché si torna indietro dalla barra di stato:
In iOS, l'applicazione host non ha alcun modo di conoscere il bundleIdentifier dell'app bloccata. Non è quindi possibile reindirizzare via codice l'utente a Instagram o TikTok. Il rientro avviene semplicemente toccando la freccia di ritorno predisposta da iOS in alto a sinistra.
Soluzione ai bug critici della Screen Time API
Durante le sessioni di test più intense sono emersi alcuni comportamenti anomali di iOS capaci di compromettere l'affidabilità di qualsiasi app blocker:
Il bug della memorizzazione eventi in DeviceActivityCenter
- Il problema: Quando si aggiornava la soglia per un
DeviceActivityNamepreesistente durante un prolungamento di tempo, iOS spesso non reagiva al nuovo limite. - La soluzione: Generare un identificatore univoco dotato di token di sessione
DeviceActivityName("limit_, preceduto da una chiamata esplicita a_ ") stopMonitoring(). - Documentazione Apple: DeviceActivityCenter.startMonitoring.
deviceActivityCenter.stopMonitoring([previousActivityName])
let newActivity = DeviceActivityName("limit_\(UUID().uuidString)_\(sessionToken)")
try deviceActivityCenter.startMonitoring(newActivity, during: schedule, events: events)
L'errore di azzeramento del giorno successivo (Dual-Event Schedule)
- Il problema: Se un DeviceActivitySchedule veniva impostato con
repeats: truee l'utente estendeva il tempo di 1 minuto, il mattino successivo il sistema applicava per sbaglio la stessa soglia ridotta da 1 minuto invece di ripristinare l'intero limite giornaliero. - La soluzione: Registrare due eventi separati all'interno della medesima pianificazione:
mainEvent: il limite giornaliero completo previsto per l'indomani.extEvent: un evento temporaneo con la data odierna inserita nell'identificatore, impostato per scadere alle 23:59.
Crash OOM (Codice 11) in DeviceActivityReport
- Il problema: Inserire timer reattivi (come contatori al secondo in SwiftUI) nella gerarchia grafica di
DeviceActivityReportforzava continui ricalcoli XPC dei log di 7 giorni. Ciò causava rapide perdite di memoria e l'arresto improvviso del processo da parte di iOS per errore Out-Of-Memory (codice 11). - La soluzione: Rimuovere totalmente i timer reattivi dalle viste che includono i report, fissare i parametri di filtro senza continue modifiche e ricaricare i dati unicamente in corrispondenza degli eventi del ciclo di vita (
onAppear,willEnterForeground).
La mia configurazione personale
Dal giorno del rilascio, Scroll Brake è diventato la mia principale protezione contro le distrazioni continue.
Ecco come l'ho impostato per il mio uso:
- 1 regola: categoria «Social network» bloccata.
- Limite di base: 5 minuti al giorno.
- Prolungamento: 5 minuti concessi per ciascuna operazione risolta.
- Massimo prolungamenti: 5 volte al giorno al massimo.
Ne consegue che non posso trascorrere più di 25 minuti complessivi al giorno sui social. Ma l'effetto più prezioso riguarda l'atteggiamento mentale: il cervello ha imparato che visualizzare un video comporta un piccolo costo di attenzione. In 8 casi su 10, questa modesta barriera è sufficiente per posare il telefono e tornare a concentrarsi sulle cose importanti.
UPD (Ottobre 2026): Strict Mode, calibrazione adattiva e arrivo su Chrome
Dalla pubblicazione di questo articolo, Scroll Brake ha ricevuto diversi aggiornamenti sostanziali, e su App Store ho aggiornato il nome per rendere il suo obiettivo lampante: Scroll Brake: Math App Blocker.
L'esperienza sul campo ha confermato appieno l'intuizione iniziale: una breve operazione di calcolo a mente si conferma il metodo più discreto, naturale e universale per spezzare il riflesso automatico. Rispetto a strumenti che costringono a eseguire flessioni davanti alla fotocamera, inquadrare codici a barre su confezioni di caffè o sopportare allarmi acustici, il calcolo mentale richiede 5–15 secondi e funziona ovunque senza dare nell'occhio: su un vagone affollato, durante una riunione di lavoro o la sera prima di dormire.
Ecco i riscontri principali e le novità introdotte dall'uso reale quotidiano:
Revisione Apple su App Store: da 24 ore a 3 ore
La sorpresa più gradita: se la prima release ha richiesto circa 24 ore per l'approvazione, gli aggiornamenti di versione successivi vengono esaminati dai revisori Apple a tempo di record: l'ultimo update è stato approvato in appena 3 ore. Un codice pulito, senza SDK pubblicitari terzi, senza tracciamento e pienamente aderente alle linee guida Apple fa la differenza.
Strict Mode (Modalità Rigida): quando la mente impara a calcolare in automatico
L'uso continuativo ha fatto emergere un particolare schema comportamentale: nei momenti di stanchezza o stress, il bisogno di dopamina può farsi così insistente che il cervello si adatta a risolvere 3 o 4 operazioni consecutive pur di raggiungere i feed. Per chiudere questa scappatoia, ho introdotto lo Strict Mode:
- Limite massimo giornaliero di sblocchi (Daily Unlock Cap): Permette di impostare una quota inderogabile di prolungamenti (ad esempio non più di 4 o 5 al giorno).
- Sessioni brevi invece di un'ora continua: Anziché concedere un’ora consecutiva, è molto più efficace suddividere il tempo in blocchi da 10 minuti. Ogni 10 minuti la schermata di blocco ricompare e restituisce lucidità alle scelte.
- Blocco totale fino a mezzanotte: Non appena la quota giornaliera di sblocchi viene esaurita, il blocco rimane invalicabile fino alle 00:00. Nessuna operazione corretta consentirà di accedere prima del giorno successivo.
- Nessuna eccezione nel fine settimana: Ho deliberatamente evitato distinzioni tra giorni feriali e festivi. Le trappole della dopamina non guardano il calendario: concedersi scrolling incontrollato nel weekend vanifica all'istante l'abitudine virtuosa costruita durante la settimana.
Calibrazione automatica della difficoltà nell'onboarding
Affinché l'ostacolo matematico non risulti mai frustrante, ho inserito un breve test di calibrazione di 1 minuto al primo avvio: 3 quesiti guidati individuano il punto di partenza più confortevole (dalle semplici addizioni alle moltiplicazioni a due cifre a mente). L'algoritmo è inoltre adattivo: se la sera sei stanco e commetti un errore, la difficoltà si attenua; se rispondi con disinvoltura in pochi secondi, il livello cresce gradualmente per tenere vigile la concentrazione.
Espansione su desktop: estensione ufficiale per Chrome
Una volta debellata la distrazione sullo smartphone, l'impulso ha cercato di spostarsi sul computer di lavoro: mentre programmavo o scrivevo documenti, le dita aprivano d'istinto una nuova scheda digitando reddit.com, x.com o youtube.com.
Per sanare questa vulnerabilità su ogni schermo, in NovaSynapse abbiamo rilasciato l'estensione ufficiale Scroll Brake per Chrome (compatibile con tutti i browser Chromium: Brave, Microsoft Edge, Opera e Vivaldi):
- Manifest V3 e JavaScript nativo: Leggerissima, priva di framework pesanti e con impatto pressoché nullo su CPU e batteria.
- 100% Privacy & Zero Sync: Nessun account, nessuna registrazione e nessun database su cloud. Tutte le regole risiedono esclusivamente nel
chrome.storagelocale, permettendo di gestire impostazioni del tutto separate tra profilo professionale e personale. - Conteggio rigoroso del solo tempo attivo (True Active-Time): A differenza dei comuni blocchi web in cui il timer scorre anche con la scheda in secondo piano, Scroll Brake scala i minuti solo in presenza di reale interazione fisica (movimento del mouse, scorrimento, digitazione). Cambiando scheda o riducendo a icona il browser, il conteggio si arresta all'istante.
- Blocco chirurgico degli URL: È possibile bloccare interi domini o recidere selettivamente le sole sezioni ad alto tasso di dipendenza come
youtube.com/shorts*, mantenendo accessibili conferenze formative, tutorial e documentazione tecnica.
La mia configurazione attuale
Oggi questa combinazione protegge la mia concentrazione su entrambi i dispositivi:
- Su iPhone: Categoria «Social network» bloccata (5 min base + 5 min per prolungamento, massimo 4 volte in Strict Mode: non più di 25 minuti complessivi al giorno).
- In Chrome: Reddit, X e YouTube Shorts schermati dal medesimo attrito cognitivo e conteggio rigoroso della sola attività effettiva.
Questo intervallo di riflessione di una decina di secondi continua a essere sufficiente, in 9 casi su 10, per chiudere la scheda, posare il telefono e riprendere il lavoro significativo.