Control de presentaciones para eventos en vivo.
Armá la lista de oradores, tocá GO y la presentación sale al aire en modo moderador de PowerPoint — con animaciones y video con audio, tal como fue creada.
Gratis · Instalador .exe · No hace falta saber programar
Presenter es la mesa de control de un evento con varios oradores. Los .pptx
se sueltan en la ventana, se ordenan como cards y se lanzan de a uno.
Las presentaciones se abren en PowerPoint real. Nunca se convierten a imágenes ni a PDF: las animaciones, las transiciones y el video con audio embebido funcionan porque quien las reproduce es PowerPoint, no un visor.
Important
Requiere Windows con PowerPoint instalado y licenciado. Toda la automatización se hace por COM — no hay modo Mac, Linux ni web.
| 🔴 Tally al aire | La card muestra en rojo lo que la sala está viendo |
| 🟠 Tally armado | Cargado y listo, todavía sin salir |
| 🎬 Audio verificado | Cada video del deck se audita antes del evento |
| ⚡ 80 ms por diapositiva | Conexión COM caliente, sin relanzar procesos |
| 💾 Playlist persistente | El orden de oradores sobrevive al cierre |
Para usar la app
Para tocar el código
- Compilar desde el código
- Cómo funciona por dentro
- Decisiones de diseño
- Desarrollo
- Empaquetado
- Roadmap
No hace falta saber programar ni instalar nada más. Es un programa normal de Windows.
- Descargar el instalador —
Presenter-Setup-<versión>.exe - Doble clic. Elegís la carpeta y te deja accesos en el escritorio y en el menú de inicio.
- Abrir Presenter. Listo.
Note
Windows va a decir "editor desconocido". Es esperable.
El instalador todavía no está firmado con certificado, así que SmartScreen muestra una pantalla azul de advertencia. Para instalar igual: Más información → Ejecutar de todas formas.
Si preferís no correr un ejecutable sin firmar —criterio razonable en una máquina de control ajena— el código está entero acá arriba y podés compilarlo vos mismo.
| Necesitás | Detalle |
|---|---|
| Windows | 10 u 11 |
| PowerPoint | Instalado y licenciado (probado con 16.0) |
| Monitores | Dos, con el proyector como pantalla extendida |
Abrí la app y mirá el riel de arriba. Ahí te dice si el equipo está listo:
| Lo que dice el riel | Qué significa | Qué hacer |
|---|---|---|
PowerPoint 16.0 · 2 salidas |
Todo en orden | Nada, a operar |
1 · sin extendida |
Falta el segundo monitor | Enchufar el proyector y extender el escritorio |
sin conexión |
No encuentra PowerPoint | Verificar que PowerPoint esté instalado y licenciado |
El contador de salidas es en vivo: si el proyector se enchufa con la app ya
abierta, el riel pasa solo de 1 · sin extendida a 2 sin reiniciar nada.
La vista de moderador no necesita que la configures en la cinta de PowerPoint: la app la activa en cada lanzamiento.
La app usa el mismo lenguaje que un switcher de video. Quien haya operado uno ya sabe leerla.
| Señal | Significa |
|---|---|
| Franja roja en la card | Está al aire. Es lo que la sala ve en este momento. |
| Franja ámbar en la card | Está armada. Cargada y lista, pero todavía no salió. |
| Botón GO | Manda al aire lo que está armado. |
| GO en rojo, con "reemplaza" | Al tocarlo se corta la presentación que está al aire. |
Esos dos colores no se usan en ningún otro lado de la interfaz. Una mirada de reojo responde "¿qué está al aire?" antes de leer una sola palabra.
flowchart LR
A["📥 Soltar .pptx"] --> B["🔍 Análisis<br/><sub>portada · videos · audio</sub>"]
B --> C["↕️ Reordenar<br/><sub>según oradores</sub>"]
C --> D["🟠 Clic = armar<br/><sub>no lanza nada</sub>"]
D --> E["🔴 GO = al aire"]
E --> F["⌨️ Avanzar<br/><sub>app o PowerPoint</sub>"]
F -.->|siguiente orador| D
style A fill:#1c212a,stroke:#272e3a,color:#e8ebf0
style B fill:#1c212a,stroke:#272e3a,color:#e8ebf0
style C fill:#1c212a,stroke:#272e3a,color:#e8ebf0
style D fill:#1c212a,stroke:#ffb020,color:#ffb020
style E fill:#1c212a,stroke:#ff4438,color:#ff4438
style F fill:#1c212a,stroke:#272e3a,color:#e8ebf0
- Arrastrar los
.pptxa la ventana. Cada archivo se analiza una sola vez. - Reordenar las cards arrastrándolas, según el orden de oradores.
- Clic en una card para armarla. Clic no lanza nada: solo prepara.
- GO para mandarla al aire.
- Avanzar las diapositivas desde la app o desde PowerPoint, indistintamente.
Al cambiar de orador, la presentación anterior se cierra antes de abrir la siguiente. Si hay algo al aire, la app pide confirmación nombrando ambas.
Funciona mientras haya algo al aire, sin necesidad de que la vista de moderador esté en primer plano.
| Tecla | Acción |
|---|---|
→ · espacio · AvPág |
Avanzar |
← · RePág |
Retroceder |
B |
Pantalla en negro / volver |
Home |
Volver a la diapositiva 1 |
- Portada de la primera diapositiva.
- Cantidad de diapositivas.
- En qué diapositiva está cada video.
- Estado del audio de esos videos: Audio OK, Sin audio (rojo) o Audio sin verificar (ámbar).
Tip
El audio es lo que falla en silencio delante del público. Un deck que no puede demostrar que tiene sonido lo dice en la card, antes del evento.
A partir de acá el README es técnico. Si solo querés usar la app, con instalar y operar ya está.
Hace falta Node.js 20 o superior.
npm install
npm start # abre la app
npm test # 106 tests, runner nativo de Node
npm run dist # genera dist/Presenter-Setup-<versión>.exeWarning
Atención con Electron. En algunas instalaciones npm install baja el
paquete pero no el binario. Si npm start falla:
node node_modules/electron/install.jsy verificar que exista node_modules/electron/dist/electron.exe.
npm run probe # versión de PowerPoint y cantidad de monitores
node bin/analyze.js "ruta\deck.pptx" # qué detecta en un archivo
node bin/ingest.js "ruta\deck.pptx" # el análisis completo, con cachéCuatro capas, cada una con un solo trabajo.
flowchart TD
UI["<b>src/app</b><br/>Electron · main, preload, renderer"]
PL["<b>src/playlist</b><br/>caché de análisis · orden de oradores"]
AN["<b>src/analyzer</b><br/>lectura del .pptx · portadas · audio"]
LA["<b>src/launcher</b><br/>automatización COM"]
PS["<b>src/powershell</b><br/>runner compartido"]
PPT(["PowerPoint<br/>16.0"])
FS[("%APPDATA%\Presenter\store")]
UI --> PL
UI --> LA
PL --> AN
PL --> FS
AN --> PS
LA --> PS
PS -->|COM| PPT
style UI fill:#1c212a,stroke:#272e3a,color:#e8ebf0
style PL fill:#1c212a,stroke:#272e3a,color:#e8ebf0
style AN fill:#1c212a,stroke:#272e3a,color:#e8ebf0
style LA fill:#1c212a,stroke:#272e3a,color:#e8ebf0
style PS fill:#1c212a,stroke:#272e3a,color:#e8ebf0
style PPT fill:#14171c,stroke:#ff4438,color:#ff4438
style FS fill:#14171c,stroke:#ffb020,color:#ffb020
| Capa | Responsabilidad |
|---|---|
src/launcher |
Automatización COM: abrir, forzar modo moderador, cerrar el deck anterior, avanzar diapositivas. |
src/analyzer |
Leer el .pptx como zip y renderizar portadas por COM cuando el archivo no trae ninguna. |
src/playlist |
Caché del análisis y persistencia del orden de oradores. |
src/powershell |
Runner compartido de scripts .ps1. |
src/app |
Proceso principal de Electron, puente seguro y superficie de control. |
Conviene conocerlas antes de tocar el código.
El modo moderador se fuerza por lanzamiento
Se aplica SlideShowSettings.ShowPresenterView en cada apertura, en vez de
depender del tilde "Usar vista de moderador" de la cinta.
Ese tilde es un estado global que cualquiera puede cambiar sin querer — incluido el orador anterior mientras probaba su deck.
El audio se detecta sin ffmpeg
src/analyzer/media-audio.js recorre el árbol de boxes ISO-BMFF
(moov → trak → mdia → hdlr) buscando una pista de sonido.
Evita instalar ffmpeg en una máquina de control, y solo lee el encabezado del archivo — no decodifica nada.
Un único proceso PowerShell mantiene la conexión COM abierta
src/launcher/show-session.ps1 reporta la posición y ejecuta los comandos.
Medido en la máquina de control:
| Operación | Proceso por comando | Proceso caliente |
|---|---|---|
| Avanzar una diapositiva | 791 ms (picos de 7,9 s) | 80 ms |
Un pico de 7,9 segundos delante del público no es aceptable. De ahí el proceso persistente.
Los reintentos son selectivos
PowerPoint rechaza llamadas COM mientras está ocupado (RPC_E_CALL_REJECTED).
- Los comandos del operador reintentan, porque fueron pedidos a propósito.
- El sondeo de posición no reintenta: saltea el tick.
El indicador puede atrasarse; la proyección nunca se interrumpe.
Todo el trabajo pesado ocurre al soltar los archivos, nunca al lanzar
| Operación | Costo |
|---|---|
| Leer portada embebida del zip | ~10 ms |
| Renderizar portada por COM | ~1800 ms |
| Segunda apertura, ya cacheado | ~3 ms |
Nada cosmético bloquea el show
Portada faltante, audio no verificable, PowerPoint ocupado o un deck ilegible avisan, pero no impiden que el resto de la lista salga al aire.
Estos comportamientos son deliberados o están medidos. No son bugs pendientes.
| Límite | Motivo |
|---|---|
| El contador de posición se atrasa durante videos largos. | PowerPoint rechaza llamadas COM mientras reproduce. Se prefiere un contador atrasado antes que arriesgar un tirón en la proyección. |
Los videos .wmv y .avi informan "audio sin verificar". |
La detección nativa cubre mp4, m4v y mov. Un falso "tiene audio" sería peor que una advertencia honesta. |
| El total de diapositivas ignora diapositivas ocultas y presentaciones personalizadas. | Se usa Slides.Count, que es el total real del archivo. |
| Los videos enlazados (no embebidos) se marcan pero no se analizan. | El archivo vive fuera del .pptx y puede no viajar con él. |
Los tests usan archivos reales: .pptx construidos como zip y bytes
ISO-BMFF armados a mano, no mocks. La automatización COM se prueba con un
ejecutor inyectado, sin depender de PowerPoint.
src/
launcher/ COM: lanzamiento, transición y control del show
analyzer/ lectura del .pptx y renderizado de portadas
playlist/ caché e ingesta
powershell/ runner compartido de scripts
app/ Electron: main, preload y renderer
bin/ herramientas de línea de comandos para verificar sin la UI
test/ suite completa
Una sola dependencia de runtime: adm-zip.
Note
Verificación en vivo. Los tests protegen las refactorizaciones, pero los problemas más serios de este proyecto aparecieron operando la app a mano con PowerPoint en movimiento, no en la suite. Antes de un evento conviene ensayar con la cantidad real de oradores, encadenando cambios y con un video largo en el medio.
La playlist sobrevive al cierre:
| Archivo | Contenido |
|---|---|
session.json |
Orden de oradores |
playlist.json |
Metadatos del análisis |
thumbnails/ |
Portadas renderizadas |
Los tres dentro de %APPDATA%\Presenter\store\.
Es una carpeta propia, no Cache. En Windows Cache y cache son el mismo
directorio, y ese lo administra Chromium para su caché HTTP: purga cuando quiere
y se llevaría la lista puesta. src/app/paths.js decide la ubicación y sus
tests fallan si vuelve a caer en un nombre reservado por Chromium.
Caution
%APPDATA%\Presenter la deriva Electron del nombre del producto. Si
alguna vez se renombra la app, Windows pasa a mirar una carpeta nueva y vacía:
la lista aparece en blanco aunque los archivos viejos sigan ahí. Para
recuperarla hay que copiar session.json, playlist.json y thumbnails/ de
la carpeta anterior a la nueva.
npm run distDeja el instalador en dist/Presenter-Setup-<version>.exe. Es un instalador
NSIS asistido: el operador elige la carpeta y le quedan accesos en el escritorio
y en el menú de inicio.
Por qué asar: false. La app maneja PowerPoint lanzando powershell.exe
contra los .ps1 de src/launcher/, resueltos por __dirname. PowerShell es
un proceso externo y no sabe leer adentro de app.asar, así que empacar
rompería todos los comandos del show en runtime.
El icono sale de build/icon.ico por convención de electron-builder: alcanza
con dejar el archivo ahí y volver a correr npm run dist, no hay que tocar
package.json. Ver build/README.md.
Warning
El instalador no está firmado. Windows va a mostrar el aviso de SmartScreen con "editor desconocido" al ejecutarlo. Los datos de MateCode aparecen igual en Panel de control → Programas, pero sin firma nadie los puede verificar.
- Reemplazar el wordmark placeholder por la marca definitiva: Presenter.
- Empaquetar con
electron-builderpara instalar en la máquina de control. - Dejar el icono de MateCode en
build/icon.ico. - Firmar el instalador con un certificado de code signing a nombre de MateCode, para que Windows no muestre "editor desconocido" al instalar.
- Ensayo completo con 6 a 8 presentaciones reales.