IT

Perché abbiamo fatto scadere i nostri link video

Perché i link che scadono di JustRec sono una scelta di prodotto: privacy, costi stabili, consegna e non hosting. Compromessi, obiezioni e come funziona nel codice.

Nicolas Ricardi7 min di lettura

In breve

  • Abbiamo deciso presto che un link di JustRec consegna un video, non lo ospita. Quindi i link scadono: 3 giorni con Lifetime, 30 giorni con Personal e Team.
  • I link che scadono tengono online i dati dei clienti solo finché servono, mantengono stabili i nostri costi di storage e ci impediscono di trasformarci in una piattaforma video.
  • Il server rifiuta un link scaduto nell'istante in cui scade, e un job orario cancella dallo storage video, sottotitoli e miniatura.
  • I compromessi sono reali: niente link permanenti, qualche ricondivisione ogni tanto e una frase sulla pagina che spiega cosa è successo.

I nostri link video scadono perché abbiamo deciso presto che JustRec consegna i video, non li ospita. Un link esiste perché il tuo cliente possa guardare una spiegazione questa settimana, e una volta fatto questo, tenerlo online aggiunge solo rischi e costi. I link a scadenza erano nel nostro documento di prodotto prima che scrivessimo una riga di codice server.

Abbiamo spiegato il lato di chi usa l’app, e come lavorare con link che scadono, in perché i link video con scadenza sono più sicuri di un archivio permanente. Questo è l’altro lato: perché l’abbiamo scelto, quanto ci è costato e come funziona dietro le quinte.

Consegna, non hosting

La maggior parte degli strumenti video per il lavoro è costruita intorno a una libreria nel cloud. I tuoi video vivono lì, i link puntano lì dentro e il prodotto cresce aggiungendo cose alla libreria: cartelle, ricerca, conteggio delle visualizzazioni, commenti, embed.

Pensa a cosa mandano ai clienti agenzie e freelance: il secondo giro della homepage, un bug nel checkout, due minuti su un preventivo. Quei video hanno un destinatario e una scadenza. Il cliente guarda, risponde, e la versione successiva sostituisce quella vecchia. Nessuno torna a marzo sul secondo giro della homepage.

Così abbiamo pensato JustRec come uno strumento di consegna. La registrazione, la libreria e lo storico vivono sul tuo Mac. Il server tiene una copia per il tempo della consegna, poi la lascia andare. Tutte le altre decisioni discendono da questa.

I clienti dei nostri utenti non si sono iscritti a un archivio video

Una registrazione dello schermo del lavoro per un cliente mostra spesso dati del cliente: un pannello di amministrazione, il nome di un suo cliente, una dashboard. Il principio di limitazione della conservazione del GDPR prevede che i dati personali siano conservati per un tempo non superiore a quello necessario. Un link permanente li tiene online a tempo indeterminato, su server che né tu né il tuo cliente avete scelto. Un link a scadenza trasforma il “non oltre il necessario” in un’impostazione predefinita invece che in un compito da ricordare. L’articolo su GDPR e video per i clienti spiega chi è responsabile di cosa.

Costi che restano stabili

Con una libreria permanente, ogni utente costa ogni mese più del mese precedente, per sempre. Con i link a scadenza, un utente che condivide la stessa quantità ogni mese costa la stessa cifra ogni mese. Abbiamo fatto il calcolo completo in quanto costa ospitare i video dei clienti su Cloudflare R2: un utente molto attivo con link da 30 giorni si stabilizza intorno ai 5 GB di storage, mentre lo stesso utente con una libreria permanente supera i 60 GB dopo un anno e continua a crescere.

È anche quello che ci permette di vendere una licenza Lifetime. Un pagamento unico non può finanziare uno storage che cresce per anni. Può finanziare link da 3 giorni.

Concentrazione

Se i link non vivono per sempre, un’intera categoria di funzioni smette di avere senso: cartelle nel cloud, ricerca nel cloud, statistiche sulle visualizzazioni, embed per i siti web. Non dobbiamo svilupparle, metterle in sicurezza né farle pagare. JustRec non tiene una libreria nel cloud, ed è una scelta voluta.

Perché 3 giorni e 30 giorni

Le due durate seguono i piani:

Quanto dura un link con ogni piano
Piano Il link dura Durata massima del video Perché
Lifetime 3 giorni 10 min Bastano per feedback, revisioni e segnalazioni di bug; un prezzo una tantum lo può sostenere
Personal, Team 30 giorni 30 min Copre consegne, formazione e preventivi che il cliente riguarda prima di decidere

Piani e limiti possono cambiare prima del lancio.

Tre giorni bastano per la maggior parte dei video di revisione: il cliente guarda il giorno stesso o quello dopo. Trenta giorni coprono i video a cui le persone tornano mentre imparano un nuovo CMS o ci pensano su una proposta. Oltre un mese, un video diventa materiale di riferimento, e il materiale di riferimento merita una casa adatta.

Come funziona la scadenza sul nostro server

Il server è un Cloudflare Worker con Hono. Video, sottotitoli e miniature stanno in un bucket R2 limitato all’UE; i metadati stanno in D1, anche loro nell’UE. La scadenza è fatta di due meccanismi separati, di proposito.

  1. Il caricamento finisce

    Parte il conto alla rovescia

    Il server salva l'ora di scadenza: tra 3 o 30 giorni, a seconda del piano.

  2. Fino alla scadenza

    Il link funziona

    Ogni richiesta per la pagina, il video, i sottotitoli o la miniatura controlla prima l'ora di scadenza.

  3. Nell'istante in cui scade

    410 Gone

    La pagina dice che il link è scaduto e a chi chiederne uno nuovo.

  4. Entro un'ora

    File cancellati

    Un job orario rimuove da R2 video, sottotitoli e miniatura.

1. Il link si ferma al secondo esatto. Quando un caricamento finisce, il server imposta expires_at all’ora attuale più la durata del link. Ogni richiesta per la pagina, il video, i sottotitoli o la miniatura lo controlla per prima cosa:

async function liveVideo(env: Env, id: string) {
  const row = await env.DB.prepare("SELECT * FROM videos WHERE id = ?").bind(id).first();
  const live = !!row && row.status === "ready" && (row.expires_at ?? 0) > now();
  return { row, live };
}

Se non è attivo, la pagina risponde con HTTP 410 Gone, dice che il link è scaduto o è stato ritirato e invita chi guarda a richiederlo di nuovo a chi l’ha mandato, indicato per nome. 410 è lo stato che significa che la risorsa esisteva ed è stata rimossa di proposito, che è esattamente il caso.

2. I file vengono cancellati entro un’ora. Un Cron Trigger esegue il Worker ogni ora, al minuto 17. Trova ogni video oltre la scadenza, cancella da R2 i tre oggetti e segna la riga come scaduta:

async function cleanUp(env: Env) {
  const expired = await env.DB.prepare(
    "SELECT id FROM videos WHERE status = 'ready' AND expires_at <= ?",
  ).bind(now()).all<{ id: string }>();
  for (const { id } of expired.results) {
    await env.VIDEOS.delete([`videos/${id}.mp4`, `videos/${id}.vtt`, `videos/${id}.jpg`]);
    await env.DB.prepare("UPDATE videos SET status = 'expired' WHERE id = ?").bind(id).run();
  }
  // …poi interrompe gli upload avviati più di 24 ore fa e mai completati
}

Ritirare un link dall’app salta l’attesa: il server cancella subito i file e segna la riga come revocata. Gli upload mai completati vengono interrotti dopo 24 ore, così nemmeno i video caricati a metà restano nello storage.

Cosa resta, e perché

Vogliamo essere precisi su cosa significa “cancellato”:

  • Cancellati da R2: il video, il file dei sottotitoli e la miniatura.
  • Tenuto in D1: la riga con id, titolo, nome del mittente, peso, durata, date e stato del video. È quello che permette alla pagina di scadenza di dire al tuo cliente di chi era il video e a chi chiederlo.
  • Tenuti sul tuo Mac: il video originale e i suoi sottotitoli, intatti.
  • Nel browser di chi guarda: la risposta del video permette al browser di metterla in cache privatamente per 10 minuti, quindi una scheda che ne aveva già caricato una parte potrebbe riprodurre quella parte per poco dopo la scadenza.

Perché non le regole del ciclo di vita di R2?

R2 può far scadere gli oggetti da solo con le regole del ciclo di vita, per età e prefisso. Non le abbiamo usate per i link perché lavorano sull’età dell’oggetto, si applicano per regola e non per singolo video, e gli oggetti di solito vengono rimossi entro 24 ore dalla loro scadenza. A noi serve che il link si fermi a un orario esatto, durate diverse per piano e la cancellazione immediata quando qualcuno ritira un link. Una query su D1 e un job orario lo fanno in una ventina di righe.

Le obiezioni, e le nostre risposte

Ce le aspettiamo, e alcune sono giuste:

Obiezioni ai link che scadono
Obiezione La nostra risposta Cosa accettiamo
“Il mio cliente apre il link in ritardo.” La pagina gli dice a chi chiedere, e ricondividere è un clic dalla tua libreria. Una ricondivisione ogni tanto.
“Mi serve un link duraturo per il materiale di formazione.” Per i video di lunga durata usa una piattaforma video, un centro assistenza o il tuo sito. JustRec non è lo strumento giusto per quelli.
“Perché non posso scegliere ‘mai’?” Allora saremmo un’azienda di hosting con una bolletta in crescita e anni di dati dei clienti online. Qualcuno sceglierà un altro strumento.
“Tre giorni sono pochi.” Vanno bene per i giri di revisione e le segnalazioni di bug, e rendono possibile il prezzo di Lifetime. Personal e Team hanno 30 giorni. Chi usa Lifetime per le consegne ricondividerà di più.

A cosa abbiamo rinunciato

Essere uno strumento di consegna ha un costo. Non ci sono link permanenti da incollare in un sito. Non ci sono conteggi delle visualizzazioni, perché non tracciamo nemmeno chi guarda. Qualche cliente vedrà una pagina di scadenza, e qualcuno si irriterà. Pensiamo che siano i compromessi giusti per video che, alla fine, sono conversazioni. Se ti serve l’opposto, una libreria permanente con le statistiche, ci sono buoni strumenti per quello, e la nostra pagina sull’alternativa a Loom confronta i due approcci.

L’idea sotto tutto questo è che i tuoi video sono tuoi e dovrebbero vivere sul tuo computer. Ne abbiamo scritto in registrare lo schermo in locale.

Domande frequenti

Perché i link di JustRec scadono?

Perché un video per un cliente è un messaggio, non un archivio. I link che scadono tengono la copia online solo finché serve al cliente, il che protegge i suoi dati, rende i costi prevedibili e permette di tenere basso il prezzo.

Quanto durano i link di JustRec?

3 giorni con il piano Lifetime e 30 giorni con Personal e Team. Puoi ritirare un link prima in qualsiasi momento, e il video originale resta sul tuo Mac.

Cosa vede il mio cliente quando un link è scaduto?

Una pagina che dice che il link è scaduto o è stato ritirato, con il nome di chi l'ha mandato e l'invito a chiedergli di inviarlo di nuovo. Video, sottotitoli e miniatura non sono più sul server.

Posso creare un link che non scade mai?

No. Per i video che devono restare online per mesi, come i tutorial pubblici o le librerie di formazione, una piattaforma video o il tuo sito sono un posto migliore. JustRec è fatto per video che fanno il loro lavoro in pochi giorni.

Quanto tempo dopo la scadenza del link viene cancellato il video?

Il link smette di funzionare all'ora di scadenza. I file vengono cancellati dallo storage da un job di pulizia che gira ogni ora, quindi spariscono entro circa un'ora dalla scadenza.

Scritto da

Nicolas Ricardi

Maker of JustRec, at Nube

Nicolas makes JustRec at Nube, a web studio in Italy. He built it for the videos Nube sends to its own clients: design reviews, handovers and quotes explained in a few minutes instead of a meeting.

www.wearenube.dev
Dietro le quinte