~/progetti/dit/README.md

COOKIES_ADVICE PRIVACY_POLICY.

~/progetti/dit/README.md

Dit

{ data: “2026-05-14”, stato: “live”, moduli_stack: 11 }

Segnali di presenza minimali tra persone — niente chat, niente messaggi, solo presenza

Dit è un'app mobile (iOS e Android) che permette di scambiare segnali di presenza minimali tra persone. Niente testo, niente immagini, niente messaggi vocali — solo due primitive ispirate al codice Morse: un Dit (·) significa "sono qui", un Dah (—) significa "ricevuto". L'app è per chiunque voglia restare in contatto con persone importanti senza la pressione di una conversazione.

## Il concetto

Dit si basa su una semplice osservazione: a volte vuoi mostrare a qualcuno che stai pensando a lui — senza dover formulare un messaggio. Ispirato alla vecchia abitudine di chiamare qualcuno e riattaccare prima che risponda — un segnale gratuito che significava "penso a te" o "richiamami".

·Dit (·) — un segnale breve a un'altra persona, con una durata configurabile di 1 ora, 6 ore o 24 ore
·Dah (—) — una conferma come risposta, significa "ricevuto" o "sono anche qui"
·Nessun Dit simultaneamente attivo per coppia di utenti — un segnale alla volta, non di più
·Toni di notifica codificati in codice Morse: ·· (lettera I = io) per Dit, ··— (lettera U = tu) per Dah

## Funzionalità principali

L'app include le seguenti aree funzionali:

·Autenticazione: Email + Password, Email OTP (senza password), Google OAuth, Facebook OAuth
·Sistema contatti: Ricerca per username, salvataggio unilaterale e silenzioso, nickname privati, risoluzione nome display (nickname → nome → username)
·Consegna real-time: I segnali vengono consegnati immediatamente via WebSocket quando il destinatario è online
·Notifiche push: toni Morse personalizzati, pulsanti azione direttamente nella notifica (invia Dah senza aprire l'app), promemoria programmati prima della scadenza
·Multi-dispositivo: Notifiche su tutti i dispositivi, sincronizzazione dismiss cross-device, eliminazione token al logout
·Privacy: Visibilità profilo (Tutti/Contatti/Nessuno), blocco utente con eliminazione dati immediata e irreversibile, risposte 404 generiche senza indicazione di blocco
·Timeline ping: Rappresentazione visuale a diagramma di sequenza di tutti i segnali tra due utenti, renderizzata con Skia su GPU

## Architettura

Quattro servizi indipendenti che comunicano esclusivamente attraverso infrastruttura condivisa — nessun servizio chiama un altro direttamente:

·dit-api (NestJS + Fastify): API REST per auth, utenti, contatti, creazione ping, gestione token push
·dit-ping (Go): Engine WebSocket per consegna real-time, elaborazione Dah/Ignore, monitoraggio TTL, gestione presenza
·dit-notifications-worker (Node.js + BullMQ): Consegna notifiche push via FCM, promemoria programmati, pulizia token
·dit-mobile (React Native + Expo): Client cross-platform per iOS e Android

## Stack tecnologico

Le scelte tecniche riflettono i requisiti del prodotto:

·Mobile: React Native 0.83+, Expo SDK 55 (Bare Workflow), expo-router, React Native Skia, Reanimated 4, Unistyles v3, Zustand, Notifee
·Backend API: NestJS 11, Fastify, BetterAuth, Prisma, ioredis, BullMQ
·Engine real-time: Go 1.23+, Fiber v3, nhooyr.io/websocket, go-redis v9, pgx v5
·Notification worker: Node.js, BullMQ, Firebase Admin SDK, Zod
·Database: PostgreSQL 16 + TimescaleDB 2 (Hypertable per Ping con partizionamento time-series)
·Cache e queue: Redis 7 (presenza, Pub/Sub, coda BullMQ, stato TTL)
·Auth: BetterAuth (self-hosted), Sistema a due token: Cookie di sessione (REST) + JWT HS256 a breve durata (WebSocket)
·Email: Brevo SMTP per email transazionali
·Push: Firebase Cloud Messaging per Android e iOS (proxy FCM-to-APNs)

## Design system

Un sistema visuale coerente attraversa l'intera app:

·Colore primario: verde tossico (#2EF080 Dark, #00B84E Light)
·Sistema a due font: DM Mono per momenti di identità (timestamp, codici, segnali), System UI per testo corpo
·Animazioni: esclusivamente Spring-Physics (Reanimated 4), quattro preset configurati
·DitPressable: unico componente interattivo, combina Gesture Handler + Reanimated + Haptics
·PingTimeline: Canvas Skia con design Dot-and-Thread, halos pulsanti, dots tappabili con tooltip
·DitGlow: Effetto gradiente radiale Skia sotto la action bar con animazione pulse
·Floating tab bar: a forma di pillola con sfondo blur e icone animate con spring

## Decisioni di design importanti

Decisioni che plasmano il prodotto e l'architettura:

·Due backend separati senza contatto runtime diretto: dit-api crea ping via REST, dit-ping elabora aggiornamenti di stato via WebSocket — comunicazione solo via Redis Pub/Sub
·JWT validato indipendentemente: il servizio Go valida i token con lo stesso secret, senza chiamare l'API NestJS — Zero Runtime Coupling
·ProfileFormatterService come unico enforcer di visibilità: ogni risposta API con dati utente passa attraverso questo servizio
·Il blocco restituisce 404 generico: l'utente bloccato non può distinguere tra "bloccato" e "account eliminato"
·FCM per entrambe le piattaforme: Firebase Admin SDK instrada automaticamente — FCM diretto per Android, proxy FCM-to-APNs per iOS
·TimescaleDB per Ping: partizionamento time-series abilita query efficienti basate sul tempo e pulizia automatica dei dati

## Cosa sto imparando

Intuizioni dallo sviluppo di un sistema real-time con quattro servizi indipendenti:

·Definire confini di ownership chiari tra servizi dal primo giorno — chi scrive cosa in quale tabella
·Redis Pub/Sub come bus di comunicazione tra servizi eterogenei (TypeScript e Go) senza contatto diretto
·Privacy come vincolo architetturale: errori generici, visibilità centralizzata, blocco distruttivo
·Preferire animazioni Spring rispetto a withTiming — la differenza nella qualità percepita è significativa
·Suoni di notifica come elemento di branding: i toni in codice Morse rendono l'app immediatamente riconoscibile senza marker visivi

Dit è disponibile su Google Play Store. Un prodotto europeo con sede in Italia. Say nothing. Mean everything.

// stack
[react-native”, expo”, nestjs”, go”, postgres”, redis”, timescaledb”, websocket”, mobile”, real-time”, presence”, ]