zkast.io

Hosting video crittografato end-to-end: cifratura locale, upload di soli ciphertext e player web con chiave di decrittazione controllata dal tuo backend.

Software
Tecnologie: Node.jsTypeScriptffmpegWeb ComponentsAES-GCMStripe

Player in azione

Video demo crittografato con zkast e riprodotto nel browser tramite il web component ufficiale.

Prova la stessa pagina su www.commis.dev : il player non riprodurrà nulla — in dashboard zkast ho autorizzato solo commis.dev, non www.commis.dev.

Cos’è

zkast è una piattaforma di hosting e streaming video con architettura zero-knowledge: i file vengono crittografati sul dispositivo dell’uploader prima di lasciare il computer, e il servizio non riceve mai video in chiaro né la chiave di decrittazione.

Il flusso è pensato per chi distribuisce contenuti premium — corsi online, video riservati, materiali protetti — senza affidare la chiave a un CDN tradizionale. Tu conservi il controllo su chi può guardare, tramite un endpoint bootstrap sul tuo backend.

Documentazione utente completa su docs.zkast.io. Dashboard su dashboard.zkast.io.

Funzionalità principali

  • Cifratura locale — la chiave AES-GCM nasce sul computer dell’uploader; zkast memorizza solo ciphertext e manifest.
  • CLI zkast-upload — transcoding multi-rendition (fino a 2160p), cifratura per chunk, upload ripristinabile con --resume.
  • Player web component<zkast-player> con adaptive bitrate, selezione qualità, audio multi-track e sottotitoli WebVTT.
  • Bootstrap server — la chiave di decrittazione la restituisce solo il backend del cliente, dopo aver verificato l’autorizzazione del viewer.
  • Verifica dominio — registrazione hostname + record DNS TXT per legare il player al sito autorizzato.
  • Dashboard — libreria video, embed sicuro, piani storage (Starter 1 TB, Pro 3 TB, Studio 10 TB) con billing Stripe.
  • API REST — upload programmatico, gestione video, sessioni embed con token temporanei.

Architettura

Video sorgente
  → CLI (ffmpeg + AES-GCM) — cifratura locale
  → API zkast — solo ciphertext + manifest v2
  → Player nel browser — session token + bootstrap-url
  → Decrittazione in RAM via Web Crypto API, mai su disco

Punti chiave del design:

  • Zero-knowledge storage — zkast non può decifrare i contenuti, nemmeno in caso di accesso al backend o allo storage.
  • Separazione chiave/contenuto — la decryption_key non compare mai nell’HTML pubblico; transita solo dal bootstrap server autorizzato.
  • Session token temporanei — il player rinnova i token durante la riproduzione; gli URL dei chunk scadono rapidamente.
  • Manifest v2 — renditions indicizzate, chunk cifrati, sottotitoli WebVTT estratti e caricati separatamente.

Esempi di codice

Embed sul sito

<script src="https://api.zkast.io/player/zkast-player.js?v=39"></script>
<zkast-player
  api-base="https://api.zkast.io"
  video-id="vid_a1b2c3d4e5f67890"
  embed-id="550e8400-e29b-41d4-a716-446655440000"
  bootstrap-url="https://tuosito.com/api/zkast/video/vid_a1b2c3d4e5f67890/session"
></zkast-player>

Bootstrap server (controllo accessi)

app.get('/api/zkast/video/:id/session', (req, res) => {
  if (!req.user) {
    return res.status(403).json({ error: 'Unauthorized' });
  }

  const videoId = req.params.id;
  const key = getDecryptionKeyFromYourDatabase(videoId);

  res.set('Cache-Control', 'no-store');
  res.json({ video_id: videoId, decryption_key: key });
});

Upload con la CLI

zkast-upload \
  --api-base https://api.zkast.io \
  --api-key YOUR_API_KEY \
  --file ~/Videos/lezione-01.mp4 \
  --title "Lezione 1"

Dettagli su pipeline CLI, player e bootstrap nelle pagine di documentazione in fondo.

Stack

LayerTecnologia
CLINode.js 18+, ffmpeg/ffprobe
CifraturaAES-GCM 256-bit (Web Crypto API nel player)
APIREST, auth Bearer (API key / session token)
StorageObject storage (chunk cifrati + manifest)
PlayerWeb Component, decrittazione in-browser via MSE
BillingStripe (abbonamenti mensili)
DashboardAccount, CORS domains, video library

Sviluppo con agenti AI

L’intero prodotto — API, CLI, player, dashboard, documentazione e sito marketing — è stato costruito in collaborazione con agenti AI (Claude e Codex). Il ruolo umano: definire requisiti di sicurezza e modello zero-knowledge, rivedere architettura e diff, decidere tradeoff (es. cifratura client-side vs costi di transcoding, scadenza token, formato manifest). Gli agenti hanno prodotto implementazioni, refactor e documentazione; ogni cambio è passato per review prima del deploy.

Documentazione