Tap.me.
Una codebase,
tre piattaforme
Abbiamo portato sull'App Store l'app di un'associazione no-profit senza riscriverla, senza un Mac e senza costi infrastrutturali aggiuntivi — unificando tre canali di notifiche push su un unico backend.
Un saluto, un tap
Tap.me, sviluppata per l'Associazione Anna e Marco E.T.S., ha un proposito semplice e umano: mandare un saluto alle persone care con un solo tocco. Un tap, e tutti i contatti ricevono una notifica con il tuo messaggio.
L'app era già sul Play Store come PWA (Trusted Web Activity) con backend Node.js e notifiche Web Push. Il problema: metà degli utenti potenziali ha un iPhone, e su iOS quella tecnologia non arriva sull'App Store. Serviva una vera app nativa.
Quattro vincoli, zero scorciatoie
01 · Niente riscrittura
Una precedente riscrittura in React Native era arrivata a TestFlight dopo 33 build: due codebase da mantenere per sempre. Serviva un'altra strada.
02 · Push native
Le Web Push non funzionano nelle app iOS: andava integrato APNs lato app e lato server, senza rompere i canali esistenti.
03 · Niente Mac
Sviluppo, firma del codice e distribuzione interamente in cloud, senza hardware Apple.
04 · Conformità App Store
Cancellazione account in-app, dichiarazione DSA per l'UE, export compliance, certificati e provisioning.
Un bridge nativo, non una riscrittura
Abbiamo impacchettato la web app esistente in un guscio nativo con Capacitor: stessa identica interfaccia, stesso codice, con un bridge JavaScript che — solo quando l'app gira su iOS — sostituisce le Web Push con le notifiche native APNs, apre i link esterni fuori dall'app e aggiunge il feedback aptico. Sul web e su Android il codice resta invariato.
┌─ FRONTEND — una sola codebase ────────────────────┐
│ HTML/CSS/JS vanilla · i18n 5 lingue · RTL │
│ bridge nativo condizionale (Capacitor) │
└──────┬──────────────┬──────────────┬──────────────┘
│ │ │
PWA / TWA App iOS Browser
Play Store App Store Web
│ │ │
┌──────┴──────────────┴──────────────┴──────────────┐
│ BACKEND — Node.js / Express su Railway │
│ MongoDB · JWT · bcrypt · rate limiting │
│ push a 3 canali: Web Push · APNs · FCM │
└───────────────────────────────────────────────────┘
La build iOS avviene interamente in cloud con Codemagic (macOS M2): firma automatica via App Store Connect API, numerazione build incrementale e upload diretto a TestFlight. Dal push su GitHub all'app installabile, nessun Mac coinvolto.
Problemi notevoli risolti
Push multi-canale. Il server sceglie per ogni dispositivo il canale giusto: Web Push (VAPID) per le PWA, APNs diretto (HTTP/2, token-based) per iOS, FCM come canale legacy — con pulizia automatica di token e subscription scadute.
Cache che congelava gli aggiornamenti. Il service worker serviva il codice dalla cache e gli utenti restavano su versioni vecchie anche dopo i deploy. Risolto con strategia network-first e fallback offline.
Recupero password senza email né SMS. Gli account sono identificati dal solo numero di telefono. Soluzione a costo zero: il codice di reset arriva come notifica push sui dispositivi registrati, con hash bcrypt e scadenza a 15 minuti.
Prefissi internazionali retrocompatibili. Numeri esteri supportati preservando il matching dei numeri italiani già in produzione — senza migrazione del database.
Conformità Apple. Cancellazione account in-app (Guideline 5.1.1), dichiarazione DSA, export compliance, safe-area per notch e home indicator: i dettagli che separano un'approvazione da un rifiuto.
Il software Tap.me è depositato presso il Registro Pubblico Speciale per i Programmi per Elaboratore (SIAE) — registrazione n. D000029673 del 29/05/2026, titolare dei diritti Associazione Anna e Marco E.T.S. Andrea Di Leo figura tra gli autori registrati del programma.
Deploy continuo su tre fronti
Gli aggiornamenti web e Android vanno in produzione con un git push e raggiungono gli utenti alla prima riapertura dell'app; iOS segue con una build cloud automatica su TestFlight. Un'unica squadra, un'unica codebase, tre piattaforme allineate.