Death Plan Switch
Se un giorno sparisci, passa le tue informazioni importanti a chi hai scelto
Cosa fa
Un "interruttore dell'uomo morto" per chi lavora da solo: se non confermi di esserci per un certo tempo, il servizio invia a persone di fiducia le istruzioni e gli accessi che hai preparato.
Come guadagna
Presentato su Hacker News dal suo creatore, che non dichiara incassi. Idee nostre per guadagnare con un progetto simile: abbonamento annuale per avere più contatti e più documenti; versione per famiglie.
Rendilo tuo
- Per le famiglie: dove sono i documenti, le polizze, le password, cosa fare con l'attività.
- La sicurezza è tutto: dati cifrati e controlli molto chiari prima di ogni invio.
Le frasi da scrivere all'AI
1. Base del sito e grafica
Crea un'app web in italiano chiamata "Se Non Ci Sono": per chi lavora da solo: se non confermi di esserci per un certo tempo, il servizio invia a persone di fiducia le istruzioni che hai preparato. Le informazioni sono cifrate nel tuo browser: il servizio non può leggerle. Usa React, Vite, TypeScript e Tailwind CSS.
Pagine da creare:
1. Pagina iniziale con come funziona, la sicurezza spiegata semplice e il prezzo
2. Registrazione e scelta dell'intervallo di controllo (ogni 7, 14 o 30 giorni)
3. Le mie istruzioni: testo cifrato nel browser con una frase segreta
4. Persone di fiducia e cosa ricevono
5. Stato: prossimo controllo, conferme, registro
Stile: serio e rassicurante: sfondo bianco, blu notte #1E293B, verde #059669 per "tutto ok", arancione #D97706 per gli avvisi, carattere "Inter", testi molto chiari. Nessuna immagine generica di stock.
Tutto deve funzionare perfettamente da telefono. Tutti i testi in italiano, chiari e senza parole tecniche.
2. Database, account e sicurezza
Collega il progetto a Supabase e attiva la registrazione con email e password.
Crea queste tabelle:
- "impostazioni": intervallo, ultimo segno di vita, stato (attivo, avvisi in corso, inviato), collegate all'utente
- "messaggi": istruzioni CIFRATE nel browser, destinatario
- "fiducia": nome ed email delle persone di fiducia
Regole di sicurezza obbligatorie:
- ogni utente vede solo i suoi dati
- il server conserva solo testo cifrato: la frase segreta non lascia mai il browser
- prima dell'invio, almeno 3 avvisi all'utente su canali diversi
Usa esattamente il codice SQL che trovi nei "Dettagli tecnici" di questa scheda: eseguilo nel SQL Editor di Supabase prima di continuare, poi collega le pagine alle tabelle.
3. Istruzioni cifrate nel browser
L'utente scrive le istruzioni (dove trovare i documenti, come avvisare i clienti, a chi passare i progetti). Prima di salvare, il testo viene cifrato nel browser con AES-GCM e una chiave ricavata da una frase segreta (codice nei Dettagli tecnici). Sul server arriva solo testo illeggibile.
La frase segreta va consegnata alle persone di fiducia di persona o su carta, in anticipo. Così, anche se il servizio venisse violato, le istruzioni non sarebbero leggibili. Sconsiglia in modo chiaro di inserire password complete: meglio indicare dove trovarle (es. il gestore di password e il suo accesso di emergenza).
4. Segni di vita e avvisi
Ogni N giorni l'utente riceve un'email "Ci sei?" con un pulsante: un clic e il contatore riparte. Si può confermare anche dall'app.
Se non conferma: avviso via email il giorno della scadenza, poi SMS dopo 2 giorni, poi un'altra email e SMS dopo 5 giorni. Solo dopo 7 giorni senza risposta parte l'invio alle persone di fiducia, con le istruzioni cifrate e la pagina per decifrarle con la frase. Pulsante "Pausa" per vacanze o ricoveri programmati.
5. Pagamenti con Stripe
Aggiungi un abbonamento a 4 € al mese o 36 € all'anno. Gratis l'utente ha: una persona di fiducia e un controllo ogni 30 giorni. Con il piano Pro sblocca: fino a 5 persone, messaggi diversi per persona, controlli ogni 7 giorni e avvisi via SMS.
A pagamento riuscito il webhook porta l'utente al piano Pro; se l'abbonamento viene disdetto o non rinnovato lo riporta al piano gratuito.
Per la sessione di pagamento e il webhook segui la guida "Pagamenti con Stripe" di Fattibile.
6. Controlli specifici di questo progetto
Oltre ai controlli della guida "Controllo finale", verifica in particolare:
1. Falsi allarmi: simula una scadenza con un account di prova e controlla che arrivino tutti gli avvisi nell'ordine giusto e che un clic in qualsiasi momento fermi tutto.
2. Cifratura: guarda nel database: il testo delle istruzioni deve essere illeggibile.
Correggi quello che non va e scrivimi cosa hai cambiato.
Dettagli tecnici
Cifrare nel browser con una frase segreta
Ricava una chiave dalla frase segreta (PBKDF2 con 600.000 ripetizioni) e cifra il testo con AES-GCM. Il server riceve solo sale, iv e testo cifrato.
const enc = new TextEncoder();
const base64 = (b: ArrayBuffer | Uint8Array) => btoa(String.fromCharCode(...new Uint8Array(b)));
const daBase64 = (s: string) => Uint8Array.from(atob(s), (c) => c.charCodeAt(0));
async function chiaveDaFrase(frase: string, sale: Uint8Array) {
const base = await crypto.subtle.importKey("raw", enc.encode(frase), "PBKDF2", false, ["deriveKey"]);
return crypto.subtle.deriveKey(
{ name: "PBKDF2", salt: sale, iterations: 600_000, hash: "SHA-256" },
base, { name: "AES-GCM", length: 256 }, false, ["encrypt", "decrypt"],
);
}
export async function cifra(testo: string, frase: string) {
const sale = crypto.getRandomValues(new Uint8Array(16));
const iv = crypto.getRandomValues(new Uint8Array(12));
const chiave = await chiaveDaFrase(frase, sale);
const cifrato = await crypto.subtle.encrypt({ name: "AES-GCM", iv }, chiave, enc.encode(testo));
return { sale: base64(sale), iv: base64(iv), testo: base64(cifrato) }; // questo va al server
}
export async function decifra(dati: { sale: string; iv: string; testo: string }, frase: string) {
const chiave = await chiaveDaFrase(frase, daBase64(dati.sale));
const chiaro = await crypto.subtle.decrypt({ name: "AES-GCM", iv: daBase64(dati.iv) }, chiave, daBase64(dati.testo));
return new TextDecoder().decode(chiaro); // se la frase è sbagliata, lancia un errore
}Chi va avvisato oggi
Calcola per ogni utente a che punto è: in regola, primo avviso, secondo, terzo o invio alle persone di fiducia.
create table impostazioni (
utente_id uuid primary key references auth.users(id) on delete cascade,
intervallo_giorni int not null default 30 check (intervallo_giorni in (7, 14, 30)),
ultimo_segno timestamptz not null default now(),
in_pausa_fino date,
inviato_il timestamptz
);
alter table impostazioni enable row level security;
create policy "le mie impostazioni" on impostazioni for all
using (auth.uid() = utente_id) with check (auth.uid() = utente_id and inviato_il is null);
create table messaggi (
id uuid primary key default gen_random_uuid(),
utente_id uuid not null references auth.users(id) on delete cascade,
destinatario_email text not null,
sale text not null, iv text not null, testo_cifrato text not null
);
alter table messaggi enable row level security;
create policy "le mie righe" on messaggi
for all using (auth.uid() = utente_id) with check (auth.uid() = utente_id);
-- Eseguita ogni ora da pg_cron tramite una Edge Function
select utente_id,
case
when giorni_scaduto >= 7 then 'invia_a_fiducia'
when giorni_scaduto >= 5 then 'terzo_avviso'
when giorni_scaduto >= 2 then 'secondo_avviso'
when giorni_scaduto >= 0 then 'primo_avviso'
end as azione
from (
select utente_id,
extract(day from now() - (ultimo_segno + make_interval(days => intervallo_giorni))) as giorni_scaduto
from impostazioni
where inviato_il is null and (in_pausa_fino is null or in_pausa_fino < current_date)
) s
where giorni_scaduto >= 0;
Pezzi comuni a tutti i progetti
Glossario
- Cron
- Un'operazione programmata che parte da sola a orari fissi, per esempio ogni lunedì mattina.
- Cifratura nel browser
- I dati vengono resi illeggibili sul tuo dispositivo prima di partire: il server conserva solo testo incomprensibile.
- AES-GCM
- Un metodo di cifratura moderno e molto sicuro, già presente in tutti i browser.