Agosto 11, 2026

Alla scoperta di Decimen Optical Transfer: Fountain Codes e Trasmissioni Air-Gapped

Progetto GitHub: bashalarmistalt / decimen-optical-transfer

https://github.com/bashalarmistalt/decimen-optical-transfer

Vi siete mai chiesti come trasferire un file tra due dispositivi senza alcuna
connessione di rete, Bluetooth, processo di pairing o app installate? Il progetto
open-source Decimen Optical Transfer affronta questo scenario in modo tanto
elegante quanto ingegnoso: trasportando i dati letteralmente attraverso lo spettro
visibile.
Il concetto è affascinante: un dispositivo codifica un file trasformandolo in uno
stream infinito di codici QR animati sul proprio schermo. Un secondo dispositivo
inquadra lo schermo con la fotocamera per catturare e ricostruire il file in tempo
reale. Nessun permesso è richiesto oltre all’accesso alla fotocamera.

Il Problema del Canale Unidirezionale

Trasferire file da uno schermo a una fotocamera (screen-to-camera) presenta una
sfida enorme: l’assenza di un canale di ritorno (back-channel). Il ricevitore non
ha alcun modo per avvisare il mittente di aver perso un frame a causa di una
sfocatura, di un riflesso o della messa a fuoco automatica.
Se il mittente si limitasse a mostrare in sequenza ciclica i frammenti di un file,
perdere un singolo frame significherebbe dover aspettare un’intera iterazione
sperando di catturare il frammento mancante al giro successivo. Le performance
crollerebbero drasticamente.

La Soluzione: I Fountain Codes

La vera magia tecnica di questo progetto risiede nell’implementazione dei
Fountain Codes (nello specifico la codifica Luby Transform). Il mittente non

trasmette mai i blocchi del file in modo diretto o sequenziale. Al contrario, ogni
frame QR generato è il risultato di uno XOR logico di un sottoinsieme
pseudocasuale dei blocchi originali del file.
Come funziona in pratica? Il ricevitore si limita a “raccogliere” i frame letti,
in qualsiasi ordine essi arrivino. Matematicamente, sono necessari circa K ×
1.15 frame distinti per decodificare con successo il file (dove K è il numero di
blocchi originali).

Una volta ottenuta questa “massa critica”, l’algoritmo innesca un effetto a cascata
che risolve e assembla il file completo. I vantaggi sono immensi: perdere un
frame costa semplicemente una frazione di secondo in più per leggere il frame
casuale successivo, ma non compromette mai l’integrità dei dati o l’ordine di
ricezione. Non c’è alcun handshake iniziale, permettendo al ricevitore di
agganciarsi al flusso in qualsiasi istante.
Dettagli Tecnici e Insidie del Browser

Per far girare questo sistema interamente in ambiente Web, lo sviluppatore ha
dovuto aggirare diversi limiti architetturali:

Il Bug di Math.log: I motori JavaScript approssimano la funzione Math.log
in modi lievissimamente differenti. Poiché mittente e ricevitore devono
ricostruire la medesima distribuzione probabilistica solida per decodificare i
Fountain Codes, una discrepanza tra V8 (Chrome) e JavaScriptCore (Safari)
causerebbe un blocco silente. L’autore ha risolto implementando un calcolo
logaritmico matematicamente deterministico, basato rigorosamente sulle
specifiche IEEE-754.

Decodifica WebAssembly: Safari su WebKit non implementa l’API nativa
BarcodeDetector. Il progetto sfrutta perciò zxing-cpp, compilato in
WASM e delegato ai Web Worker. Se i worker si saturano e scartano frame, lo
strato dei Fountain Codes assorbe la perdita senza problemi.
Framerate su iOS: Richiedendo l’attributo frameRate: {ideal: 60} la
fotocamera dell’iPhone fornisce 30 FPS silenziosamente. È necessario
imporre l’attributo {exact: 60} per costringere l’hardware a lavorare a
regimi più elevati.

Velocità, Tuning e Alternative

Nel suo setup sperimentale più spinto (frame molto densi su un display
ProMotion a 120Hz), l’autore ha raggiunto un goodput di 128 KB/s tenendo il
ricevitore in mano e 186 KB/s appoggiandolo su un supporto (azzerando così la
caccia continua dell’autofocus causata dal tremolio). La Proof of Concept fornita
usa invece settaggi conservativi che trasmettono comodamente immagini da 512
KB o 2 MB sfruttando la ridondanza dei QR di livello L.
Per provare il progetto in locale, basta lanciare:

npm install
npm run dev


Lo strumento avvierà un server di sviluppo con certificato auto-firmato. Questa
misura è obbligatoria perché i browser moderni disattivano completamente le API
video getUserMedia in contesti non sicuri (HTTP standard).


Progetti Simili da Esplorare


L’ecosistema open-source offre iniziative affini nate per convergenza evolutiva,
perfette per chi vuole approfondire il trasferimento dati air-gapped:
divan/txqr (2018): Implementazione in linguaggio Go con logiche simili,
unendo QR animati e Fountain Codes.
sz3/libcimbar: Un approccio che abbandona del tutto i classici QR a favore di
un codice colore ad alta densità studiato appositamente per le trasmissioni da
display a camera.


Scopri di più da TuttoeOltre.it - Blog di idee in rete

Abbonati per ricevere gli ultimi articoli inviati alla tua e-mail.

di Claudio Ferri

Live, Work, Create and Skelereate! ✌️

Related Post

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *

Scopri di più da TuttoeOltre.it - Blog di idee in rete

Abbonati ora per continuare a leggere e avere accesso all'archivio completo.

Continua a leggere