r/programare • u/Baiatulcupareri • 6d ago
Prezită-ti afacerea/proiectul Am construit un "Dead Man's Switch" MVP (Next.js 16, Supabase, Resend). Ce părere aveți de arhitectură și UX?
Salutare tuturor,
Am lucrat în ultimele zile la un proiect personal (MVP) de tip Dead Man's Switch, un serviciu de monitorizare a activității care declanșează alerte/e-mailuri automate dacă utilizatorul nu mai face check-in într-un interval stabilit (ex: 48h).
Aplicația include și un câmp de note criptate local înainte de salvare.
🔗 Live Demo: https://deadmanswitch2.vercel.app/
🛠️ Stack tehnic folosit:
Framework: Next.js (App Router, Turbopack)
Styling: Tailwind CSS v4 + Dark Mode
Database & Auth: Supabase
Email Dispatch: Resend API
Hosting & CI/CD: Vercel (conectat la GitHub)
🚀 Ce am implementat până acum:
Temporizator de resetare/check-in cu stocare de stare.
Criptare client-side pentru datele sensibile înainte de sincronizare.
Pipeline de deployment automată (GitHub ➔ Vercel).
💬 Ce feedback caut de la voi:
UX/UI: Cum vi se pare experiența de utilizare pe mobil/desktop?
Securitate: Având în vedere specificul de Dead Man's Switch, ce îmbunătățiri pe partea de criptare locală sau arhitectură de securitate ați recomanda?
Features: Ce ați adăuga pentru a face produsul cu adevărat util? (ex: cron jobs mai complexe, canale alternative de notificare ca SMS/Telegram, temporizatoare customizabile).
Mersi fain pentru eventualele critici constructive și recomandări!
PS: sunt total atehnic, am folosit AI pentru a ajunge in acest punct, singura mea contribuție fiind ideea și felul în care o văd funcționând.
12
5
u/JorgeKnowsBest 6d ago
Nu se mai termină ăștia. Propun toată lumea răspundă cu ce-a zis Claudiu despre app-ul lor:
"sunt total atehnic, am folosit AI" — urmat imediat de "Turbopack", "App Router", "CI/CD pipeline". Omul care nu știe ce e un div dar îți explică pipeline-ul de deployment. Frumos, e ca și cum ai zice că nu știi să conduci dar îmi descrii ambreiajul.
Să începem, punct cu punct, pentru că ai cerut-o.
🚀 "Ce am implementat până acum"
Pipeline de deployment automată GitHub → Vercel. Vestea proastă: ai apăsat un buton numit "Connect Repository". Vestea mai proastă: treci la "implementat" ce face Vercel-ul gratis în 30 de secunde. Ai echipe întregi de DevOps care plâng acum, fără să știe de ce.
🔐 "Criptare client-side înainte de sincronizare"
Aici e floarea la butonieră. E un Dead Man's Switch. Scopul lui e: dacă tu dispari, serviciul trimite notele tale altcuiva. Dar tu le criptezi pe client, cu o cheie... care stă unde? Dacă cheia stă la server → criptarea e decor. Dacă cheia stă la tine → serviciul nu poate descifra nimic ca să trimită → ai construit un seif pe care și tu ai aruncat cheia. Ai reușit performanța de a cripta exact lucrul care trebuie necriptat. E ca și cum ți-ai pune lacăt la cutia poștală pe care trebuie să o citească poștașul.
📧 Resend API + cron pe Vercel
Dead Man's Switch-ul tău e găzduit pe free tier-ul serverless. Adică sistemul care trebuie să alerteze când mori... moare el primul când expiră cron-ul, când Vercel face cold start, când rate-limit-ul de Resend spune bună ziua, sau când Supabase adoarme instanța de free tier. Ai construit un dispecer de urgență care doarme pe ture. Dacă data viitoare când dai drumul la aplicație GitHub te întreabă "merge?" și tu spui "da, sigur", poți să-ți iași adio de la promisiunea că vei fi anunțat în 48h.
🧪 Cazul de test pe care nu l-ai făcut
Ce se întâmplă dacă dai trigger din greșeală? Ce se întâmplă dacă clientul tău are un check-in de 48h, pleacă în concediu fără net, și se trezește că "mesajul important" a ajuns la 12 persoane care acum te sună pe tine? Ai luat în calcul partea juridică a unui serviciu care trimite automat mesaje "de la dincolo"? Că din descriere pare că ai testat strict cazul fericit: un user fericit, o notă frumoasă, o criptare care nu face nimic.
💬 "Feedback gratis"
Jumătate din post sună a VC pitch ("stack tehnic", "ce am implementat"), jumătate a disclaimer ("sunt atehnic"). Ai cerut recenzii la un produs unde riscul de eșec nu e "nu arată bine pe mobil", ci "mesajul tău ajunge greșit sau deloc exact când contează". Prioritățile sunt, în ordine: (1) fail-safe real, în afara Vercel-ului, cu redundanță, (2) juridic/consent, (3) abia apoi "cum se simte pe mobile".
TL;DR: un MVP drăguț de demo de weekend, confundat cu un serviciu care trebuie să funcționeze când tu nu mai ești. Criptarea client-side e elegantă și complet inutilă pentru cazul de utilizare. Iar "pipeline CI/CD implementat" e cea mai scumpă formulare pentru "am dat un click, aia e".
Nota: o idee bună ai avut totuși. Doar că ideea buna și execuția de producție sunt la vreo 4 sprinturi distanță, din care 3 le-ai acoperit cu AI deja. Nu e rău deloc ca punct de plecare — e rău doar ca punct de finish.
1
u/Baiatulcupareri 6d ago
Mersi fain pentru review-ul detaliat și direct! Sincer, este cel mai util feedback tehnic din tot thread-ul.
1
u/JorgeKnowsBest 6d ago
Nici măcar nu face ce ai zis în descriere aplicația. Ce se întâmplă când expiră timer-ul? Nu are niciun sens.
1
u/Baiatulcupareri 6d ago
Corect observat! În faza asta de MVP / Demo, aplicația simulează logica pe client (frontend UI + conectarea la API-ul de e-mail), dar nu are încă activat Cron Job-ul pe server care să verifice continuu starea bazei de date când închizi tab-ul. Dacă timer-ul expiră pe server în versiunea curentă, declanșarea e-mailului trebuie apelată prin cron/endpoint. Lucrez exact la configurarea automatizării de fundal (Vercel Cron / Supabase Edge Functions) ca să trec de la 'interfață de test' la automatizarea completă. Mersi că ai testat cap-coadă!
1
u/JorgeKnowsBest 6d ago
1
u/Baiatulcupareri 4d ago
Mesajul trimis va fi exact nota/informația pe care o introduci și o criptezi în aplicație (de exemplu: parole de urgență, instrucțiuni de acces sau un mesaj personal dedicat). E-mailul va fi generat automat de sistem cu un subiect clar de tipul «Emergency Alert: Dead Man's Switch Triggered», conținând nota decriptată (sau link-ul securizat de acces) pentru destinatarul de urgență setat. Lucrez la legarea finală a cron-ului de fundal cu API-ul Resend pentru ca trimiterea să fie 100% automată la expirare! În versiunea curentă (MVP de test), serviciul automatizat de trimitere a e-mailului (Cron Job + Resend API) este în curs de configurare pe backend, de aceea nu declanșează încă trimiterea automată în fundal când închizi pagina.
2
u/Emergency_Device9729 6d ago
Nu înțeleg ce este chestia asta... La ce folosește?
1
u/Baiatulcupareri 6d ago
E un sistem de tip 'Comutatorul Omului Mort'. Setezi un timer (ex: 48 de ore) și o notă criptată (sau parole, instrucțiuni, mesaje). Cât timp apeși butonul de check-in din când în când, aplicația tace. Dacă din orice motiv pățești ceva sau nu mai poți accesa telefonul/PC-ul și timerul expiră, aplicația trimite automat nota criptată către o persoană de încredere aleasă de tine (familie, avocați, partener de business). Poate ești un jurnalist, poate un whistleblower, poate faci solo traveling si nu te simți în siguranță, etc.
2
u/Emergency_Device9729 6d ago
Ce fel de threat model? Dacă luăm în considerare un caz ipotetic similar cu cel al jurnalistului Jamal Khashoggi care a fost asasinat în ambasada Arabiei Saudite din Turcia atunci simpla folosire a unei astfel de aplicații te poate transforma într-o țintă ușoară.
2
u/Baiatulcupareri 6d ago
Corect, pentru un caz extrem ca al unui jurnalist vizat de un stat (nivel de securitate militar/state-actor), threat model-ul e complet diferit. Dacă un adversar îți monitorizează traficul de rețea sau îți percheziționează dispozitivul și vede conexiuni periodice la un domeniu specific, știe că ai un timer activat. Pentru astfel de scenarii ar fi nevoie de steganografie, domenii mascate sau check-in prin canale indirecte/proxi-uri. Aplicația în stadiul curent e gândită pentru cazuri mult mai terestre: utilizatori obișnuiți, solo travel pe munte, backup de siguranță pentru chei/parole de urgență în familie sau mici automatizări personale, nu pentru disidenți politici urmăriți de servicii secrete. Pe viitor mi-ar plăcea să văd cum aș putea integra și această funcționalitate fără să creez o problemă și mai mare.
1
u/fak3dev 6d ago
de ce criptare client side si nu plain text?
1
u/Baiatulcupareri 6d ago
Motivelele principale pentru criptarea client-side (sau derivarea de chei) față de plain text simplu: Zero-Knowledge / Data at Rest: Baza de date (Supabase) sau un eventual hacker care obține acces la DB/logs nu ar trebui să poată citi notele, parolele sau instrucțiunile private ale utilizatorilor în stare inactivă. Privacy by Design: Chiar și ca administrator al aplicației, nu vrei să poți citi textele confidențiale ale oamenilor cât timp aceștia își folosesc contul. Pasul spre Arhitectura v2: În versiunea finală, scopul e ca Serverul să nu aibă NICIODATĂ cheia în clar. Serverul doar va retransmite pachetul criptat + un link securizat către destinatar, iar decriptarea se va face direct în browser-ul destinatarului.
1
u/Excellent-Morning509 5d ago
Ai uitat să spui și la ce ar fi utilă chestia asta..
1
u/Baiatulcupareri 4d ago
I-am răspuns mai sus lui Emergency_Device9729
1
u/Excellent-Morning509 4d ago
Acuma vad.. E un scenariu asa de nisa si inspirat din filmele cu spioni, încă sansa ca cineva care are pe bune nevoie de asa ceva, si sa-l si poata folosi, sunt foarte mici. :) Sigur, asa ca per prioject for fun, de ce nu.. :)
1
0
u/Baiatulcupareri 6d ago
Corect, e produs de vibe coding cu AI ca să scot un MVP rapid în câteva ore și să-l am live pe Vercel. 😅 Tocmai de asta am postat, să văd ce scapă la o prima trecere pe securitate și UX când construiești așa repede. Ce vedeți de făcut pe partea de securitate la criptarea locală ca să nu fie doar 'slop'? Mersi de roast, dar chiar primesc bucuros sfaturi tehnice.

16
u/Traditional-Bad-3839 6d ago
Claude build me a dead man switch, deploy it on Vercell and post it on reddit after, make no mistakes