Ma non dormi mai? – Behind Schedipedia

👋 INTRO

Da piccolo ho sempre seguito il collezionismo in generale grazie alla passione trasmessa da mio padre (monete, banconote, schede telefoniche, francobolli, etc…) poi con gli anni è calato l’interesse in quanto come passione diventava sempre più costosa quando iniziavano a mancare soltanto le rarità…

Ultimamente ho ritrovato a casa dei miei genitori la mia vecchia collezione di schede telefoniche che ho deciso di riprendere in mano.

Ho acquistato dei cataloghi recenti ed iniziato a rimettere tutto in ordine, soltanto che a furia di acquistare involontariamente doppioni ho pensato mi servisse uno strumento per gestire il tutto in maniera facile e veloce.

Nulla di geniale ovviamente ma non essendoci nulla sul mercato ho pensato bene di fare un’app utile al mio scopo.

Inizialmente era solo per iOS (essendo appunto uno sviluppatore principalmente iOS), girava in locale e la usavo soltanto io, dopodiché ho pensato di metterci i “fiocchettini” e l’ho resa disponibile a tutti. Creando in seguito anche la versione per Android.

🔥 Essendo un appassionato collezionista ed un appassionato di sviluppo software mi sono calato nei panni di un full-stackv2.

Al solito visto che non è il mio lavoro principale e il tempo libero durante il giorno è poco, ho con piacere rinunciato a qualche ora di sonno durante le serate invernali…


Il backend con le relative API (utenti, liste, dati, etc) è realizzato a microservizi indipendenti tra di loro, ogni macro feature è un servizio a parte, alcuni di essi sono scritti in Python / Flask (soprattutto per la parte di AI) ed altri in nodeJS / Express.

Il tutto è appoggiato su diverse istanze mongoDB Atlas (versione cloud).

Viene deployato tramite pipeline automatiche su AWS, Heroku (Salesforce) o Back4App (dipende dal servizio e dall’ambiente di sviluppo dev/prod).

Le API vengono a loro volta autenticate tramite token recuperato da Firebase (con social login).

Le app, inizialmente è stata lanciata solo per iOS (scritta in SwiftUI) ed in seguito anche per Android usando Kotlin in Jetpack Compose.

Sono due applicazioni NATIVE, non cross-platform, web o similari… in quanto non sono particolarmente un fan, anzi.
Anche in questo caso le pipeline automatiche (tra cui Xcode Cloud e Bitbucket) pensano al rilascio sugli store.

Tra i servizi disponibili o disponibili a breve vi è una parte di image-search-by-similarity, realizzata usando i modelli di AI di AWS Bedrock, come Titan Embedding.

I contenuti, le mancoliste condivise tramite PDF o tramite app e lo share della singola scheda sui social, fanno (o cercano di fare) in autonomia la parte di marketing.


Automatizziamo anche questa parte – o comunque rendiamoci le cose semplici per cui sono state realizzate un paio di applicazioni native per macOS sempre in Swift/SwiftUI che si occupano di gestire, caricare e modificare le foto (qualora fossero da aggiornare) e le informazioni tecniche di dettaglio di ogni scheda.

Una seconda applicazione è stata fatta per inserire i contenuti della parte Wikipedia, ovvero le informazioni e curiosità presenti su ogni scheda – come ad esempio delle note storiche, o del perché è stata fatta quella particolare scheda o quella variante particolare.


L’app è un catalogo di schede telefoniche in digitale, è possibile cercare informazioni su tutte le possibili ed esistenti schede telefoniche italiane, comprese Vaticano, San Marino, Infostrada, Tiscali, Ricariche, Internazionali, etc…


WIKI(SCHEDI)PEDIA

Oltre ai dati classici come Produttore, scadenza, tiratura, ed altro è anche presente una sezione Wiki, che racconta informazioni storiche sul perché di quella scheda, curiosità ed altro.

La collezione presente sul database è stata, con la pazienza… riempita giorno dopo giorno recuperando informazioni da cataloghi cartacei, online, foto personali o da altri collezionisti, o da ebay, o altri siti di settore, e via dicendo.


LISTE E LISTE CONDIVISE

I codici dei vecchi e nuovi cataloghi vengono inseriti dagli utenti in una modalità collaborativa. Ognuno è libero di inserire il codice del catalogo mancante e dopo approvazione dall’admin (ovvero io…) diventa visibile a tutti automaticamente.

E’ possibile quindi ricercare qualsiasi cosa ed aggiungerla nelle 3 liste presenti, ovvero la “collezione“, la lista “duplicati” e la “mancolista“.

Una volta inserire nelle liste vengono automaticamente categorizzate in album per essere facilmente visibili e poi in griglia con tutti i dettagli al loro interno.

Ogni lista può essere quindi esportata sia in un PDF corredato di immagini e descrizioni, sia in formato Excel per i più smanettoni. Tutto effettuato tramite API per avere meno complessità lato mobile.

La mancolista inoltre può essere esportata su un’altra app, per mandarla ad un amico ad esempio ed effettuare scambi, segnando con dei check quelle in possesso. Si crea quindi una mancolista condivisa e sempre aggiornata, tra gli amici o i rivenditori.

Oltre a ricercare le schede via codici, nomi o qualunque cosa, c’è la possibilità di usare la fotocamera per fotografare un intero foglio (da 10, da 8 o del layout che si preferisce) e fare in modo che l’intelligenza artificiale faccia i riconoscimenti dividendo l’immagine in parti uguali (riconoscendo i rettangoli).


IMAGE RECOGNITION

Anche in questo caso ci pensa Python per snellire la complessità lato mobile.

Dopo aver sperimentato CoreML, OpenCV, ed altri tool di image-recognition anche fatti in casa (ORB, SIFT, etc..) e deployati sulla Raspberry5, ho puntato tutto su AWS banalmente per problemi di performance.

Per il riconoscimento via AI è stato sfruttato un modello chiamato Amazon Titan Multimodal Embeddings che crea una vector di dati a partire da un immagine.

Usando mongoDB e la potentissima funzionalità di vector-search è possibile quindi fare una query istantanea ed avere un risultato cercando un immagine simile in un database di oltre 10.000 schede presenti. Sempre perfetto.

Viene quindi ritornato dall’API il best-match in percentuale e le successive varianti “meno best” in modo da far eventualmente scegliere all’utente quella migliore qualora il modello avesse risposto con un falso-positivo.

Tramite l’SDK di AWS viene fatta una chiamata a Bedrock passando l’immagine da mappare in vettore.

Esempio veloce:

L’output deve essere mandato come insert o come query a mongodb dopo che il db è stato configurato ad accettare ed indicizzare un vettore per usare la funzionalità di vector-search:

Ogni dato salvato, sarà quindi di dimensione fissa a 384, ovvero un array di interi da 384 elementi.

Una query di esempio per recuperare il best-match ad esempio potrebbe essere la seguente:

Risultato, un array di match con lo score rilevato dall’algoritmo e il codice catalogo:


L’app sfrutta il pattern FREEMIUM, può essere usata all’infinito gratuitamente ma giustamente per il lavoro che c’è dietro ha alcune piccole limitazioni.

Possono essere scaricati gratuitamente soltanto i cataloghi relativi alle schede SIP e Telecom Italia e possono essere inserite al massimo 150 schede e fatti 10 export (PDF o Excel™).

Le altre tipologie di cataloghi, come Vaticano, San Marino, Chiamagratis, Infostrada, etc… sono legate ad un abbonamento.

Le modalità di sblocco sono tre:

  1. abbonamento Mensile o Annuale
  2. acquisto una-tantum
  3. scambio schede mancanti in cambio di subscription gratuita

Il punto 3 sembrerebbe essere il più apprezzato. Diversi utenti preferiscono scambiare (ed io sono solo contento) in cambio di un abbonamento gratuito.

Obiettivo delle app non è guadagnarci in subscription (male non fa chiaramente…) ma avanzare con le schede telefoniche mancanti bilanciando il più possibile entrate-uscite.


SOCIAL SHARING

📌Non è stata fatta nessuna campagna ADV, tramite social o altro. L’idea è di sfruttare lo share delle singole immagini (con logo e tutto) sui vari social e far si che i potenziali utenti interessati siano incuriositi del “come è stata fatta quest’immagine” andando a scaricare l’app.

Esempio di social image per lo share.

Effetti dello share:


PDF SHARING

📌Stessa logica per i PDF esportati e fatti girare online. Un PDF così completo non può passare inosservato se sei un appassionato collezionista…

Questo PDF viene generato a backend tramite nodeJS utilizzando le librerie pdf-lib e sharp:


PLACEHOLDER PRINT

📌Sempre nell’idea delle immagini “passaparola“, è possibile anche stampare come placeholder la scheda mancante ed inserirla in album. Verrà generato un foglio A4 pronto per la stampa con tutto il necessario per ritagliare la scheda.


PROMO CARD

📌Una tecnica utilizzata da “venditore“, in quanto alcune doppie le vendo anche io, è stata di inserire in ogni spedizione effettuata, una scheda “pubblicitaria”, varrebbe a dire una reale scheda con un adesivo sul retro che sponsorizza l’app. Osservando le analytics parrebbe funzionare come strategia…

Anche se non tutti colgono la “pubblicità“… 😀, ma l’importante è che se ne parli!

Ovviamente anche gli annunci di vendita su eBay sono quasi automatizzati e collegati ai dati dell’app. Anche per questo c’è un’altra app per macOS che crea i contenuti dei post senza fatica, tra cui TITOLO, DESCRIZIONE e IMMAGINI


Oltre ad avere gli insight e il tracking tramite Google Analytics nelle due app è stata sviluppata anche una seconda app interna, che ha anche un Widget comodo da visualizzare per sapere l’andamento delle collezioni, numero di utenti divisi per piattaforma e conteggi chiaramente anonimi non avendo dati personali salvati:


Che fai ora con tutti questi dati presenti nell’app?

Iniziamo a sfruttarne una parte… e quindi si crea l’ennesima app per macOS ma questa volta per uno scopo leggermente diverso, ovvero: “SCRIVERE UN CATALOGO” – ma essendo un informatico e non uno scrittore, ho come obiettivo di generarlo in automatico.

Come funziona questo generatore?

Partendo da dei range di codici presenti nel db dell’app, crea ed impagina un PDF secondo le mie esigenze, pronto per la stampa (un pò come lo share del PDF visto prima, ma un pò più elegante).

Lanciamo l’export et voilà – 230 pagine generate via script pronte da mandare in review ad Amazon!

Il primo Catalogo Chiamagratis 2024 generato one-click, è ora disponibile in vendita su Amazon!

👉 https://www.amazon.it/Catalogo-2024-Schede-Telefoniche-Chiamagratis/dp/B0D6WDVMV6

(*Chiamagratis è una categoria di schede telefoniche italiane.)


Questa è la classica frase che mi sento ripetere ogni volta che tiro fuori un nuovo progetto… in effetti dopo che sono tutti a letto mi dedico volentieri alle mie passioni.

In questo caso le passioni sono ben due (l’informatica e il collezionismo) quindi diventa ancora più complicato dormire soprattutto se poi non vedi l’ora di pubblicare…

Sia le app che il catalogo nascono per un esigenza personale o comunque per delle mancanze. L’ultimo catalogo di Chiamagratis risale agli anni 2000 e di app che fanno questo non ce ne sono sugli store.

Nessuna scienza estrema dietro questo progetto, ma lo stack tecnologico usato mi ha permesso di approfondire aree dell’informatica che solitamente per il mio lavoro non tocco a pieno.

Una volta pubblicate le app online, arrivano i suggerimenti ed anche i complimenti per l’idea.

CURIOSI DI PROVARLA?

🚀Se tra di voi c’è qualche collezionista – ovviamente sono pronto a scambiare materiale, nonché acquistare o vendere doppie o mancanti.

❤️Ringrazio ovviamente i miei amici Savino (per le martellate su Android) e Roberto (per la vector-search ormai mia feature preferita), i tester, i top-users che sfornano idee e suggerimenti come se piovessero e soprattuto chi ha lasciato le 5 stelle sugli store!

📲 iOS App Store -> https://apps.apple.com/app/schedipedia/id6475237768

📲 Android Play Store -> https://play.google.com/store/apps/details?id=it.albertopasca.schedipedia


Stay tuned – le app si aggiornano continuamente con tante incredibili feature ogni volta!

 

Alberto Pasca

Software engineer @ Pirelli & C. S.p.A. with a strong passion for mobile  development, security, and connected things.