Las fotos se quedan contigo
EventSlide funciona en un solo equipo: un portátil, un miniPC, una Raspberry Pi bajo el proyector. Nada sale de ahí.
EventSlide es software libre: puedes ejecutarlo en tu propio equipo y tus fotos no salen nunca de él. Esta página está pensada para quien se maneja con un servidor. Si no es tu caso, existe el acceso alojado, y no hay nada que instalar.
Ver los comandos Código fuente en GitHub
La mayoría de las herramientas de fotos para fiestas te piden una de dos cosas: que tus invitados instalen una app, o que confíes cientos de fotos de familia a una empresa que no conoces. EventSlide no te pide ninguna de las dos.
EventSlide funciona en un solo equipo: un portátil, un miniPC, una Raspberry Pi bajo el proyector. Nada sale de ahí.
Tú decides cuánto tiempo se conserva el álbum, haces la copia de seguridad cuando quieres y lo eliminas cuando quieres. Nada de esto depende de mí.
El código es público: puedes comprobar qué hace el software, modificarlo y compartirlo. La imagen publicada va firmada y se analiza en cada versión.
En un equipo instalado en la sala, los envíos se vuelven a poner en cola y el muro sigue pasando fotos cuando se cae la red. Puede funcionar solo durante una fiesta de ocho horas.
Un portátil, un miniPC o una Raspberry Pi. La imagen existe para linux/amd64 y linux/arm64.
Con docker compose. No se compila nada en tu equipo: simplemente se descarga la imagen publicada.
Es la dirección que contiene el código QR (PUBLIC_URL). Nunca localhost: un código QR que apunta a localhost es la forma más habitual de que la instalación falle la noche de la fiesta. Escanea tu propio código QR con el móvil antes de que lleguen los invitados.
EventSlide habla en http simple y no cifra por sí mismo. Algo tiene que ponerse delante: Caddy, nginx o Traefik, el que ya uses. Con Caddy, basta una sola línea de configuración.
Los comandos de más abajo lo usan para fabricar dos secretos al azar. Con Docker, no hace falta para nada más.
Este caso hoy no está cubierto. Un equipo en una red local, sin DNS ni certificado, no puede servir un https que el móvil de un invitado acepte, y EventSlide no funciona en http simple en producción. La respuesta actual: un nombre de dominio real que apunte al equipo (funciona con el wifi del local siempre que los móviles tengan un camino hasta él), o un proxy en --network host con un certificado que ya tengas. Para un muro totalmente sin conexión, cuéntalo en el seguimiento de incidencias del repositorio.
La imagen se publica como ghcr.io/irony42/eventslide, para linux/amd64 y linux/arm64. Va firmada y se analiza en cada versión. Los comandos de más abajo proceden del README del repositorio (versión 3.6.0), incluidos sus comentarios en inglés. En caso de duda, manda el repositorio.
git clone https://github.com/Irony42/EventSlide.git
cd EventSlide
# Two secrets, and the address your guests' phones will reach.
node -e "console.log('SESSION_SECRET='+require('crypto').randomBytes(48).toString('base64url'))" >> .env
node -e "console.log('GUEST_TOKEN_SECRET='+require('crypto').randomBytes(48).toString('base64url'))" >> .env
echo "PUBLIC_URL=https://photos.example.com" >> .env
# Your own account, created on the first boot, with a generated password.
echo "BOOTSTRAP_OWNER_EMAIL=you@example.com" >> .env
node -e "console.log('BOOTSTRAP_OWNER_PASSWORD='+require('crypto').randomBytes(18).toString('base64url'))" >> .env
docker compose up # the first time, and read what it says
docker compose up -d # once it has booted cleanlyLos comandos node generan dos secretos al azar (SESSION_SECRET, GUEST_TOKEN_SECRET), y después anotas la dirección a la que llegarán los móviles (PUBLIC_URL). Las dos líneas BOOTSTRAP_OWNER sirven para crear tu cuenta en el primer arranque: no hay administrador por defecto ni página de instalación. La contraseña también se genera, porque la que se escribe en un tutorial es la que todo el mundo probaría primero.
El primer comando up descarga la imagen publicada, en la versión que has descargado. Si falta una variable o está mal formada, el servidor muestra todos los problemas de golpe y se detiene. En segundo plano, el contenedor se reinicia solo y la lista se pierde de vista. Cuando todo arranca bien, -d es la forma adecuada de dejarlo funcionando.
La cookie de inicio de sesión lleva la marca Secure: un navegador nunca la devuelve por http simple. Por eso EventSlide se niega a arrancar sin https, en lugar de darte un formulario que nunca te deja entrar. compose.yaml enlaza el puerto a 127.0.0.1 para que el proxy llegue a él y ajusta TRUST_PROXY_HOPS=1 en consecuencia. Si tu proxy es un contenedor de la misma red Docker, elimina el bloque ports: y apúntalo a eventslide:4300.
photos.example.com {
reverse_proxy 127.0.0.1:4300
}En un archivo Caddyfile, junto al archivo compose. Caddy y Traefik transmiten por sí solos lo que necesita el servidor. Con nginx, añade proxy_set_header X-Forwarded-Proto $scheme; y proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;. Sin el primero, la cookie de inicio de sesión no se envía nunca; sin el segundo, todos tus invitados comparten la misma dirección para el limitador de frecuencia.
Con el proxy ya en su sitio, abre PUBLIC_URL/login con el correo electrónico y la contraseña generada (grep BOOTSTRAP_OWNER .env la muestra). En el primer inicio de sesión te pide elegir una propia: al menos 12 caracteres y que no sea una contraseña común. Después, elimina las dos líneas BOOTSTRAP_OWNER o conserva las dos: con una sola no arranca.
Desde el repositorio descargado, en lugar de descargar la imagen:
docker compose -f compose.yaml -f compose.build.yaml up --buildHace falta Node 24 o posterior, y después los comandos npm descritos en la sección «Install» del README. Detrás de tu proxy https, TRUST_PROXY_HOPS=1 es imprescindible: sin él, el formulario de inicio de sesión acepta tu contraseña y sigues sin sesión.
El archivo docs/IMAGE-SOURCES.md explica qué contiene la imagen, dónde está el código fuente de cada parte y cómo comprobar la firma. No se compila nada en tu equipo: lo que ejecutas es la imagen publicada, la que está firmada.
Haz una antes de la fiesta y otra a la mañana siguiente. El servidor sigue funcionando durante la copia. El paso que todo el mundo se salta es el más importante: sacar el archivo del equipo. Los comandos de más abajo proceden de docs/OPERATING.md del repositorio (versión 3.6.0).
# 1. Take it. It prints the name, e.g. /data/backups/eventslide-2026-09-12T08-00-00Z
docker compose exec eventslide node dist/ops/scripts/backup.js
# 2. Take it off the volume, check the copy, and only then delete it there. Until it is
# off the machine it is on the same disk as the photographs, and the command says so.
A=eventslide-2026-09-12T08-00-00Z
docker compose cp "eventslide:/data/backups/$A" . &&
docker compose run --rm -v "$PWD/$A:/restore:ro" eventslide \
node dist/ops/scripts/backup.js --verify /restore &&
docker compose exec eventslide rm -r "/data/backups/$A"El archivo es una carpeta: una instantánea coherente de la base de datos, todas las fotos y un inventario de los ficheros con sus huellas. El comando vuelve a leer todo lo que acaba de escribir antes de decir OK.
Una copia en el mismo disco que el álbum no sobrevive a una avería de ese disco. Es una copia de seguridad cuando hay una copia en otro equipo, o en un disco que puedas desconectar.
Detén siempre el servidor antes de restaurar: el comando restore sustituye el archivo de la base de datos, y hacerlo con el servidor en marcha deja un muro que no sirve ni la fiesta antigua ni la nueva. El comando comprueba todo el archivo antes de tocar nada y se niega a sobrescribir una instalación sin --force.
Los secretos no están en el archivo. Restaurar fotos con secretos nuevos cierra la sesión de todos los anfitriones.
Los libros de fotos (PDF) y los montajes de vídeo no están en la copia de seguridad: se vuelven a generar cuando se piden desde la página del evento. Los detalles, y lo que las comprobaciones detectan o no, están en docs/SECURITY.md, sección 11. La restauración paso a paso está en docs/OPERATING.md, sección «Backups».
Ejecuta una versión publicada, no la punta de la rama principal (en la que te deja git clone). Haz antes una copia de seguridad: las migraciones que aplica una versión nueva al arrancar solo van hacia delante, y la copia es el único camino de vuelta.
git fetch --tags && git checkout vX.Y.Z
docker compose pull
docker compose up -dSustituye vX.Y.Z por la versión que quieras. Lo que puede romper una versión mayor, cómo se anuncia una ruptura y cómo volver atrás se explica en docs/UPGRADING.md.
Este es el resumen en palabras sencillas. No es asesoramiento jurídico: lo que vale es el texto de la licencia.
Si modificas EventSlide y otras personas usan tu versión a través de la red, debes ofrecerles el código fuente de tu versión, con la misma licencia. Ejecutar una copia sin modificar no añade nada.
Cada pantalla de invitado y de anfitrión lleva un enlace «Código fuente (AGPL-3.0)». Puedes cambiar la dirección a la que apunta (SOURCE_CODE_URL), por ejemplo para una versión modificada. Ningún ajuste lo oculta.
La versión 3.0.0 es la primera con AGPL-3.0, «solamente»: sin la cláusula «o cualquier versión posterior». La 2.1.0 es la última con GPL-3.0, y lo publicado antes seguirá con GPL-3.0 para siempre.
Lo que la licencia exige a quien ejecuta, modifica o retoma el programa: docs/LICENSING-FAQ.md.
Todo está en github.com/Irony42/EventSlide. Aquí tienes por dónde empezar. Los documentos están en inglés.
El código, las versiones publicadas y el seguimiento de incidencias.
Qué hace EventSlide, la instalación, las copias de seguridad y las actualizaciones.
El modelo de amenazas, escrito pensando en quién está de verdad en la sala.
Lo que la licencia exige a quien lo ejecuta, lo modifica o lo retoma.
Lo que puede romper una versión mayor y cómo volver atrás.
De qué está hecha la imagen y cómo comprobar su firma.
¿Quieres ayudar? Mira CONTRIBUTING.md, o la página apoyar el proyecto.
Solicita acceso a la instancia alojada en app.eventslide.fr: gratis, con invitación. No tienes nada que instalar.