DE

Warum unsere Video-Links ablaufen

Warum ablaufende Links bei JustRec eine Produktentscheidung waren: Datenschutz, stabile Kosten, Zustellen statt Hosten. Kompromisse, Einwände und der Code dahinter.

Nicolas Ricardi6 Min. Lesezeit

Kurz gesagt

  • Wir haben früh entschieden, dass ein JustRec-Link ein Video zustellt, nicht hostet. Deshalb laufen Links ab: nach 3 Tagen bei Lifetime, nach 30 Tagen bei Personal und Team.
  • Ablaufende Links halten Kundendaten nur so lange online, wie sie gebraucht werden, halten unsere Speicherkosten stabil und verhindern, dass wir zur Videoplattform werden.
  • Der Server lehnt einen abgelaufenen Link in der Sekunde ab, in der er abläuft, und ein stündlicher Job löscht Video, Untertitel und Vorschaubild aus dem Speicher.
  • Die Kompromisse sind echt: keine dauerhaften Links, gelegentlich erneutes Teilen und ein Satz auf der Seite, der erklärt, was passiert ist.

Unsere Video-Links laufen ab, weil wir früh entschieden haben, dass JustRec Videos zustellt und nicht hostet. Ein Link existiert, damit dein Kunde diese Woche einen Walkthrough ansehen kann, und wenn das erledigt ist, bringt es nur Risiko und Kosten, ihn online zu lassen. Ablaufende Links standen in unserem Produktdokument, bevor wir eine Zeile Servercode geschrieben hatten.

Die Seite der Nutzer, und wie man mit ablaufenden Links arbeitet, haben wir in Video-Links mit Ablaufdatum: sicherer als eine dauerhafte Mediathek erklärt. Das hier ist die andere Seite: warum wir uns dafür entschieden haben, was es uns gekostet hat und wie es unter der Haube funktioniert.

Zustellen, nicht hosten

Die meisten Video-Tools für die Arbeit sind um eine Mediathek in der Cloud herum gebaut. Deine Videos liegen dort, Links zeigen hinein, und das Produkt wächst, indem es der Mediathek Dinge hinzufügt: Ordner, Suche, Aufrufzahlen, Kommentare, Einbettungen.

Denk daran, was Agenturen und Freelancer an Kunden schicken: Runde zwei der Homepage, einen Bug im Checkout, zwei Minuten zu einem Angebot. Diese Videos haben einen Empfänger und eine Frist. Der Kunde schaut, antwortet, und die nächste Version ersetzt die alte. Niemand kommt im März auf Runde zwei der Homepage zurück.

Also haben wir JustRec als Zustellung gedacht. Die Aufnahme, die Mediathek und der Verlauf liegen auf deinem Mac. Der Server hält eine Kopie, solange die Zustellung dauert, und gibt sie dann frei. Jede andere Entscheidung folgt aus dieser einen.

Die Kunden unserer Nutzer haben sich für kein Videoarchiv angemeldet

Eine Bildschirmaufnahme von Kundenarbeit zeigt oft Kundendaten: einen Admin-Bereich, den Namen eines Endkunden, ein Dashboard. Der Grundsatz der Speicherbegrenzung in der DSGVO besagt, dass personenbezogene Daten nicht länger gespeichert werden sollen als nötig. Ein dauerhafter Link hält sie unbegrenzt online, auf Servern, die weder du noch dein Kunde ausgesucht habt. Ein ablaufender Link macht „nicht länger als nötig“ zum Standard statt zur lästigen Pflicht. Der Artikel DSGVO und Kundenvideos klärt, wer wofür verantwortlich ist.

Kosten, die stabil bleiben

Mit einer dauerhaften Mediathek kostet jeder Nutzer jeden Monat mehr als im Monat davor, für immer. Mit ablaufenden Links kostet ein Nutzer, der jeden Monat gleich viel teilt, jeden Monat gleich viel. Die ganze Rechnung steht in Cloudflare R2: Was uns das Hosting von Kundenvideos kostet: Ein intensiver Nutzer mit Links für 30 Tage pendelt sich bei etwa 5 GB Speicher ein, derselbe Nutzer mit dauerhafter Mediathek überschreitet nach einem Jahr 60 GB und wächst weiter.

Das ist auch der Grund, warum wir überhaupt eine Lifetime-Lizenz verkaufen können. Eine Einmalzahlung kann keinen Speicher finanzieren, der über Jahre wächst. Links für 3 Tage kann sie finanzieren.

Fokus

Wenn Links nicht ewig leben, ergibt eine ganze Kategorie von Funktionen keinen Sinn mehr: Cloud-Ordner, Cloud-Suche, Aufrufstatistiken, Einbettungen für Websites. Wir müssen sie nicht bauen, absichern oder berechnen. JustRec hat keine Mediathek in der Cloud, und das ist Absicht.

Warum 3 Tage und 30 Tage

Die beiden Laufzeiten folgen den Tarifen:

Wie lange ein Link in jedem Tarif gilt
Tarif Link gilt Max. Videolänge Warum
Lifetime 3 Tage 10 Min. Reicht für Feedback, Reviews und Bug-Reports, ein Einmalpreis kann das tragen
Personal, Team 30 Tage 30 Min. Deckt Übergaben, Schulungen und Angebote ab, die der Kunde vor der Entscheidung noch einmal ansieht

Tarife und Limits können sich vor dem Start ändern.

Drei Tage reichen für die meisten Review-Videos: Der Kunde schaut am selben oder am nächsten Tag. Dreißig Tage decken die Videos ab, auf die man zurückkommt, während man ein neues CMS lernt oder über ein Angebot nachdenkt. Nach mehr als einem Monat ist ein Video Nachschlagematerial, und Nachschlagematerial verdient einen richtigen Platz.

Wie der Ablauf auf unserem Server funktioniert

Der Server ist ein Cloudflare Worker mit Hono. Videos, Untertitel und Vorschaubilder liegen in einem R2-Bucket, der auf die EU beschränkt ist, die Metadaten liegen in D1, ebenfalls in der EU. Der Ablauf besteht absichtlich aus zwei getrennten Mechanismen.

  1. Upload abgeschlossen

    Die Uhr läuft

    Der Server speichert den Ablaufzeitpunkt: 3 oder 30 Tage ab jetzt, je nach Tarif.

  2. Bis zum Ablauf

    Der Link funktioniert

    Jede Anfrage für Seite, Video, Untertitel oder Vorschaubild prüft zuerst den Ablaufzeitpunkt.

  3. In der Sekunde des Ablaufs

    410 Gone

    Die Seite sagt, dass der Link abgelaufen ist und wen man um einen neuen bitten kann.

  4. Innerhalb einer Stunde

    Dateien gelöscht

    Ein stündlicher Job entfernt Video, Untertitel und Vorschaubild aus R2.

1. Der Link stoppt auf die Sekunde genau. Wenn ein Upload abgeschlossen ist, setzt der Server expires_at auf die aktuelle Zeit plus die Laufzeit des Links. Jede Anfrage für die Seite, das Video, die Untertitel oder das Vorschaubild prüft das zuerst:

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 };
}

Wenn der Link nicht aktiv ist, antwortet die Seite mit HTTP 410 Gone, sagt, dass der Link abgelaufen ist oder zurückgezogen wurde, und bittet den Zuschauer, ihn beim Absender erneut anzufordern, mit Namen. 410 ist der Status für eine Ressource, die existiert hat und absichtlich entfernt wurde, und genau das ist hier der Fall.

2. Die Dateien werden innerhalb einer Stunde gelöscht. Ein Cron Trigger startet den Worker jede Stunde, zur Minute 17. Er findet jedes Video, das abgelaufen ist, löscht die drei Objekte aus R2 und markiert die Zeile als abgelaufen:

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();
  }
  // …dann Uploads abbrechen, die vor mehr als 24 Stunden gestartet und nie abgeschlossen wurden
}

Wenn du einen Link in der App zurückziehst, entfällt das Warten: Der Server löscht die Dateien sofort und markiert die Zeile als widerrufen. Uploads, die nie abgeschlossen wurden, werden nach 24 Stunden abgebrochen, damit auch halb hochgeladene Videos nicht im Speicher liegen bleiben.

Was bleibt, und warum

Wir wollen genau sagen, was „gelöscht“ heißt:

  • Aus R2 gelöscht: das Video, die Untertiteldatei und das Vorschaubild.
  • In D1 behalten: die Zeile mit ID, Titel, Name des Absenders, Größe, Dauer, Daten und Status des Videos. Nur so kann die Seite für abgelaufene Links deinem Kunden sagen, von wem das Video war und wen er fragen kann.
  • Auf deinem Mac behalten: das Originalvideo und seine Untertitel, unverändert.
  • Im Browser des Zuschauers: Die Antwort mit dem Video erlaubt dem Browser, es 10 Minuten privat zwischenzuspeichern. Ein Tab, der schon einen Teil geladen hat, kann diesen Teil also nach dem Ablauf noch kurz abspielen.

Warum keine Lifecycle-Regeln von R2?

R2 kann Objekte mit Lifecycle-Regeln selbst ablaufen lassen, nach Alter und Präfix. Für Links nutzen wir sie nicht, weil sie mit dem Alter des Objekts arbeiten, pro Regel gelten statt pro Video und Objekte typischerweise innerhalb von 24 Stunden nach ihrem Ablauf entfernt werden. Wir brauchen einen Link, der zu einem exakten Zeitpunkt stoppt, unterschiedliche Laufzeiten je Tarif und sofortiges Löschen, wenn jemand einen Link zurückzieht. Eine Abfrage auf D1 und ein stündlicher Job erledigen das in etwa zwanzig Zeilen.

Die Einwände und unsere Antworten

Mit diesen rechnen wir, und manche sind berechtigt:

Einwände gegen ablaufende Links
Einwand Unsere Antwort Was wir in Kauf nehmen
„Mein Kunde öffnet den Link spät.“ Die Seite sagt ihm, wen er fragen soll, und erneut teilen ist ein Klick in deiner Mediathek. Gelegentlich erneutes Teilen.
„Ich brauche einen dauerhaften Link für Schulungsmaterial.“ Nimm für langlebige Videos eine Videoplattform, ein Hilfe-Center oder deine eigene Website. JustRec ist dafür nicht das richtige Werkzeug.
„Warum kann ich nicht ‚nie‘ wählen?“ Dann wären wir eine Hosting-Firma mit wachsender Rechnung und jahrelang Kundendaten online. Manche werden ein anderes Werkzeug wählen.
„Drei Tage sind kurz.“ Es passt zu Review-Runden und Bug-Reports und hält den Lifetime-Preis möglich. Personal und Team bekommen 30 Tage. Lifetime-Nutzer, die Übergaben schicken, teilen öfter neu.

Worauf wir verzichtet haben

Ein Zustellwerkzeug zu sein hat seinen Preis. Es gibt keine dauerhaften Links, die man in eine Website einfügt. Es gibt keine Aufrufzahlen, weil wir auch keine Zuschauer tracken. Manche Kunden werden eine Seite für abgelaufene Links sehen, und ein paar werden sich ärgern. Wir halten das für die richtigen Kompromisse bei Videos, die am Ende Gespräche sind. Wenn du das Gegenteil brauchst, eine dauerhafte Mediathek mit Statistiken, gibt es gute Werkzeuge dafür, und unsere Seite zur Loom-Alternative vergleicht die beiden Ansätze.

Die Idee hinter all dem: Deine Videos gehören dir und sollten auf deinem Rechner liegen. Darüber haben wir in Local-First: Warum deine Videos auf deinem Mac bleiben sollten geschrieben.

Quellen

Häufige Fragen

Warum laufen JustRec-Links ab?

Weil ein Kundenvideo eine Nachricht ist, kein Archiv. Ablaufende Links halten die Online-Kopie nur so lange vor, wie der Kunde sie braucht. Das schützt seine Daten, hält die Kosten planbar und den Preis niedrig.

Wie lange gelten JustRec-Links?

3 Tage im Tarif Lifetime und 30 Tage bei Personal und Team. Du kannst einen Link jederzeit früher zurückziehen, und das Originalvideo bleibt auf deinem Mac.

Was sieht mein Kunde, wenn ein Link abgelaufen ist?

Eine Seite, die sagt, dass der Link abgelaufen ist oder zurückgezogen wurde, mit dem Namen des Absenders und der Bitte, ihn erneut anzufordern. Video, Untertitel und Vorschaubild liegen nicht mehr auf dem Server.

Kann ich einen Link erstellen, der nie abläuft?

Nein. Für Videos, die monatelang online bleiben sollen, etwa öffentliche Tutorials oder Schulungsbibliotheken, ist eine Videoplattform oder deine eigene Website der bessere Ort. JustRec ist für Videos gebaut, die ihre Aufgabe in Tagen erledigen.

Wie schnell wird ein Video gelöscht, nachdem sein Link abgelaufen ist?

Der Link funktioniert ab dem Ablaufzeitpunkt nicht mehr. Die Dateien löscht ein Bereinigungsjob, der jede Stunde läuft, sie sind also spätestens etwa eine Stunde nach dem Ablauf weg.

Geschrieben von

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
Hinter den Kulissen