Ir al contenido
Nicolás Amorosi

Proyecto personal, para iglesias

WorshipApp

Durante un culto, una persona maneja la pantalla: letras, un pasaje bíblico, las diapositivas del sermón, un video. WorshipApp es la app de escritorio para esa tarea, con una ventana de control para quien opera y una de proyección para todos los demás.

El problema

WorshipApp nació para reemplazar a EasyWorship. Es el tercer intento: antes hubo un proyecto, hoy archivado, y una versión en JavaScript plano.

Restricciones

  • Apunta a Windows; desarrollada en una Mac.
  • Uso en vivo: si la ventana de proyección se cierra, tiene que volver exactamente como estaba.
  • Sin conexión: todo local, incluido el texto bíblico y su búsqueda.
  • Las diapositivas del sermón llegan como archivos de PowerPoint.

Qué construí

Una app Electron con una separación estricta: el proceso principal es dueño del estado y la base de datos, quien opera trabaja en una ventana de control, y la ventana de proyección es una función pura de la última salida que recibió. Si se reabre, el proceso principal reenvía esa salida y la pantalla vuelve exactamente como estaba.

Valores seguros por defecto —renderers en sandbox, web security activado—, con los archivos locales servidos por un protocolo propio worship:// en lugar de URLs file://.

SQLite con Drizzle para canciones, programas de culto y la Biblia RV1960, con búsqueda de texto completo FTS5 que ignora acentos: escribir “senor” encuentra “Señor”.

Lo difícil

Ventana de control

Quien opera encola canciones, pasajes, diapositivas

Contrato IPC tipado

Proceso principal

Dueño del estado y de SQLite; reenvía la última salida

ProjectionOutput

Ventana de proyección

Una función pura de la última salida

Pipeline de diapositivas

  1. .pptx
  2. LibreOffice
  3. PDF
  4. pdf.js
  5. WebP
  6. (Cacheado por contenido)
La ventana de proyección solo dibuja la última salida que recibió, así que siempre se puede reconstruir. Las diapositivas pasan por LibreOffice y pdf.js.

Un único contrato IPC tipado

Cada mensaje entre procesos se declara una sola vez, en un único tipo de contrato. Un handler faltante o mal tipado no compila, y los errores vuelven como un resultado tipado en lugar de excepciones cruzando procesos.

PowerPoint sin PowerPoint

Automatizar PowerPoint por COM ataba la app a Office. El pipeline actual convierte .pptx a PDF con LibreOffice headless, renderiza cada página a WebP con pdf.js y cachea el resultado por contenido, esquivando que LibreOffice exporta a PNG solo la primera diapositiva. Los tiempos y el audio se leen directo del XML de la presentación.

Resultado

  • Versión 2.1 en beta, con un instalador para Windows compilado desde macOS.
  • Alrededor de 320 tests automatizados en 24 archivos.

El código pertenece al cliente y es privado. Las figuras son ilustraciones con datos de ejemplo; en esta página no aparece ningún registro real.