← Tutte le idee Strumenti online

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.