Diario en vídeo de las clases de kung fu: las formas y técnicas que aprendemos, para poder repasarlas en el entreno desde el móvil.
navegador ──► Cloudflare Worker (src/) ──► R2 bucket "arwuchivo-storage"
│
└─► estáticos (public/)
src/worker.js — router. Todo pasa por el gate de sesión (worker/gate.js)
salvo /login.src/worker/handlers/ — un fichero por endpoint (upload, edit,
delete, people, serve).public/ — la app (HTML + CSS + módulos JS sin build). Ver la cabecera de
public/app/app.js para el mapa de módulos.public/sw.js — service worker de la PWA (instalable, funciona offline con
lo último visto, cola de subidas sin conexión).| key | qué es |
|---|---|
data/index.json |
días con vídeos: { days: [{ d: "26-01-15", people, count }] } |
data/days/YY-MM-DD.json |
vídeos de un día: { d, items: [{ id, src, thumb, title, notes, person }] } |
data/leyenda.json |
personas y su color: { people: { Manu: { color: "Purple" } } } |
videos/YY/MM/DD/<id>.webm + .jpg |
vídeo y miniatura |
trash/… |
lo borrado (ver abajo). Nunca se sirve. |
Años a 2 dígitos (26-01 = enero 2026) por diseño.
“borrar” en la app no borra de verdad: mueve el vídeo y su miniatura a
trash/videos/... y guarda su ficha en trash/items/<día>__<id>.json.
videos/... y
añadir el item del trash/items/...json al JSON del día (y su entrada en
data/index.json).Borrado definitivo: lo hace R2 solo con una regla de ciclo de vida
(borra lo que lleve 30 días en trash/). Se crea una vez con:
npx wrangler r2 bucket lifecycle add arwuchivo-storage vaciar-papelera trash/ --expire-days 30
.dev.vars (no se sube) con UPLOAD_PASSWORD=<lo que quieras>.npx wrangler dev --port 8788 (config “arwuchivo-local” en
.claude/launch.json) y abrir http://localhost:8788.npx wrangler r2 object put arwuchivo-storage/<key> --file=<f> --local.Si añades o quitas ficheros de public/, actualiza la lista SHELL y sube
VERSION en public/sw.js. El service worker va “red primero”, así que con
conexión siempre se ve lo último.
npx wrangler deploy
Variables (en Cloudflare → Worker → Settings): UPLOAD_PASSWORD (secreto,
la contraseña de entrada) y opcional LOGIN_HINT (pista en el login; vacía
para no mostrar ninguna).