diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000..7e8509a
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1,2 @@
+playground/playground.log
+playground/__pycache__/
diff --git a/analysis.md b/analysis.md
index 6aa9962..b779cfe 100644
--- a/analysis.md
+++ b/analysis.md
@@ -25,7 +25,23 @@ Analisis didactico de **NATS** como sistema de mensajeria pub/sub entre procesos
Los scripts `notebooks/procs/publisher.py` y `notebooks/procs/subscriber.py` son los programas que el notebook 03 lanza como procesos reales.
-El notebook 04 requiere `ipywidgets` (incluido en el `.venv` del análisis). El simulador es interactivo: al abrir el notebook en JupyterLab, ejecuta sus celdas hasta el widget y pulsa **▶ Ejecutar benchmark** (los sliders ajustan número de mensajes y de subscribers). La gráfica se anima mientras corre.
+El notebook 04 requiere `ipywidgets` (incluido en el `.venv` del análisis). El simulador del notebook es interactivo: al abrir el notebook en JupyterLab, ejecuta sus celdas hasta el widget y pulsa **▶ Ejecutar benchmark** (los sliders ajustan número de mensajes y de subscribers). La gráfica se anima mientras corre.
+
+> Si al abrir el notebook el widget muestra `Error displaying widget: model not found`, **re-ejecuta la celda del widget** en tu kernel (los modelos de `ipywidgets` no se rehidratan desde un kernel anterior). Para una versión interactiva más robusta y sin depender de Jupyter, usa el **playground** (ver abajo).
+
+## Playground: simulador de rendimiento (webapp)
+
+`playground/` es una webapp standalone equivalente al simulador del notebook 04, pero sin `ipywidgets`: sirve una página con un botón y unos sliders, y al pulsarlo lanza el benchmark en el servidor y transmite las muestras por WebSocket a un canvas que dibuja la gráfica en movimiento en el navegador. Reutiliza el `.venv` del análisis (con `nats-py` y `websockets`); no tiene dependencias ni repo propios.
+
+```bash
+cd analysis/nats/playground
+../.venv/bin/python server.py
+# abrir http://127.0.0.1:7788 (WebSocket en 7879)
+```
+
+Pulsa **▶ Ejecutar benchmark**: un publisher envía N mensajes (slider, hasta 200.000) a M subscribers (slider, hasta 12) y la gráfica muestra en vivo los acumulados de enviados vs recibidos. Verificado: 100.000 msgs → 4 subs = 400.000 entregas en ~1,1 s (fan-out ×4 exacto, ~367.000 entregas/s).
+
+Archivos: `playground/server.py` (servidor WebSocket + HTTP estático + benchmark NATS) y `playground/index.html` (UI con canvas, sin librerías externas).
### Como usar
diff --git a/playground/index.html b/playground/index.html
new file mode 100644
index 0000000..990df9c
--- /dev/null
+++ b/playground/index.html
@@ -0,0 +1,221 @@
+
+
+