This commit is contained in:
RGJorge
2026-05-11 01:14:22 +00:00
parent 3d544673ff
commit 77da10bfde
8 changed files with 368 additions and 165 deletions
+65
View File
@@ -0,0 +1,65 @@
---
name: Bug report
about: Something is broken or behaving unexpectedly
title: '[BUG] '
labels: bug
assignees: ''
---
## What happened?
<!-- Clear, short description of the bug -->
## Steps to reproduce
1.
2.
3.
## Expected behavior
<!-- What you thought would happen -->
## Actual behavior
<!-- What actually happened -->
## Screenshots / videos
<!-- Optional, but very helpful for UI bugs -->
## Environment
- **ContainerFlow version**: <!-- e.g. v0.0.33 (check git log or footer) -->
- **OS**: <!-- e.g. Ubuntu 24.04 -->
- **Docker version**: <!-- output of `docker --version` -->
- **Docker Compose version**: <!-- output of `docker compose version` -->
- **Browser**: <!-- e.g. Chrome 138 — only if it's a UI bug -->
- **Mode**: <!-- Docker container OR `bun run dev` native -->
## Container logs
<details>
<summary>ContainerFlow logs (click to expand)</summary>
```
<!-- Paste output of: docker logs alteonx-dockerflow-containerflow-1 --tail 50 -->
<!-- Or `bun run dev` console output if running native -->
```
</details>
## Browser console (if it's a UI bug)
<details>
<summary>Errors from DevTools → Console</summary>
```
<!-- Paste any red errors from the browser console -->
```
</details>
## Additional context
<!-- Anything else that might help: a specific compose setup, a particular container image, etc. -->
+8
View File
@@ -0,0 +1,8 @@
blank_issues_enabled: false
contact_links:
- name: Security vulnerability
url: https://github.com/RGJorge/containerflow/blob/main/SECURITY.md
about: Report security issues privately, NOT as a public issue
- name: Commercial / partnership inquiries
url: mailto:alteonx.servicios@gmail.com
about: Commercial support, custom features, or AGPL-3.0 alternatives
+43
View File
@@ -0,0 +1,43 @@
---
name: Feature request
about: Suggest a new feature or improvement
title: '[FEATURE] '
labels: enhancement
assignees: ''
---
## Problem you're trying to solve
<!-- Describe the situation/pain. NOT the solution yet.
Example: "When monitoring 30+ containers, I lose track of which ones are unhealthy because..." -->
## Proposed solution
<!-- How you'd want it to work in the UI / behavior -->
## Why existing features don't cover this
<!-- Optional but useful: what did you try first? -->
## Mockup / example
<!-- Sketch, screenshot from another tool, ASCII art, link to similar feature, etc. -->
## Alternatives considered
<!-- Any other approaches you thought about -->
## Priority / urgency for you
- [ ] Critical — blocking my workflow
- [ ] High — would significantly improve my workflow
- [ ] Medium — nice to have
- [ ] Low — just an idea
## Are you willing to wait?
ContainerFlow is currently maintainer-driven (no external PRs accepted yet). Features will land based on roadmap priority. See [monitoreo.md](../../monitoreo.md) for what's planned.
- [ ] Yes, I'll wait — I just want to flag this
- [ ] I'd contribute a PR if/when PRs open
- [ ] I need this fast — happy to discuss sponsorship/commercial support
+67
View File
@@ -0,0 +1,67 @@
# Code of Conduct
## Our Pledge
We as members, contributors, and maintainers pledge to make participation in the ContainerFlow project a harassment-free experience for everyone, regardless of age, body size, visible or invisible disability, ethnicity, sex characteristics, gender identity and expression, level of experience, education, socio-economic status, nationality, personal appearance, race, religion, or sexual identity and orientation.
We pledge to act and interact in ways that contribute to an open, welcoming, diverse, inclusive, and healthy community.
## Our Standards
Examples of behavior that contributes to a positive environment:
- Demonstrating empathy and kindness toward other people
- Being respectful of differing opinions, viewpoints, and experiences
- Giving and gracefully accepting constructive feedback
- Accepting responsibility and apologizing to those affected by mistakes
- Focusing on what is best for the overall community
Examples of unacceptable behavior:
- Sexualized language or imagery, sexual attention or advances of any kind
- Trolling, insulting, or derogatory comments and personal/political attacks
- Public or private harassment
- Publishing others' private information (physical or email address) without permission
- Other conduct which could reasonably be considered inappropriate
## Enforcement Responsibilities
Project maintainers are responsible for clarifying and enforcing these standards. They will take appropriate and fair corrective action in response to any behavior they deem inappropriate, threatening, offensive, or harmful.
Maintainers have the right and responsibility to remove, edit, or reject comments, commits, code, issues, and other contributions that are not aligned with this Code of Conduct, and will communicate reasons when appropriate.
## Scope
This Code of Conduct applies within all community spaces (issues, discussions, comments, pull requests, social media when representing the project) and also when an individual is officially representing the community in public spaces.
## Enforcement
Instances of abusive, harassing, or otherwise unacceptable behavior may be reported to the project team at:
📧 **alteonx.servicios@gmail.com**
All complaints will be reviewed and investigated promptly and fairly. The project team is obligated to respect the privacy and security of the reporter of any incident.
## Enforcement Guidelines
Maintainers will follow these Community Impact Guidelines:
### 1. Correction
**Community Impact**: Use of inappropriate language or other behavior deemed unprofessional or unwelcome.
**Consequence**: Private warning from maintainers, with clarification of the violation and why it was inappropriate. A public apology may be requested.
### 2. Warning
**Community Impact**: A violation through a single incident or series of actions.
**Consequence**: Warning with consequences for continued behavior. No interaction with people involved for a specified period.
### 3. Temporary Ban
**Community Impact**: A serious violation of community standards, including sustained inappropriate behavior.
**Consequence**: Temporary ban from any sort of interaction or public communication with the community for a specified period.
### 4. Permanent Ban
**Community Impact**: Demonstrating a pattern of violation, harassment of an individual, or aggression toward or disparagement of classes of individuals.
**Consequence**: Permanent ban from any sort of public interaction within the community.
## Attribution
This Code of Conduct is adapted from the [Contributor Covenant](https://www.contributor-covenant.org), version 2.1, available at https://www.contributor-covenant.org/version/2/1/code_of_conduct.html.
+78
View File
@@ -0,0 +1,78 @@
# Contributing to ContainerFlow
Thanks for your interest in ContainerFlow! This document explains how to participate **right now**.
## Current status: Issues only
ContainerFlow is in early development (`v0.x`). Until the architecture stabilizes and there's an active community, **we're not accepting pull requests yet**.
### What you can do today
**Open issues** — bug reports, feature requests, questions, ideas
**Star the repo** — helps visibility and motivates updates
**Share feedback** — what works, what doesn't, what's missing
**Try it in your setup** — and tell us what you broke
### What's coming
Once the project has a stable foundation, we'll open pull requests with:
- A `CODE_OF_CONDUCT.md` to set community expectations (already in repo)
- Coding standards / linting rules
- A "good first issue" label for easy entry points
- Review SLAs
Estimated timeline: when version reaches `v0.1.0` or earlier if there's clear demand.
## Reporting bugs
Use the [bug report template](.github/ISSUE_TEMPLATE/bug_report.md). Please include:
- ContainerFlow version (the `v0.0.X` tag you're on)
- OS + Docker version
- Reproduction steps
- Expected vs actual behavior
- Logs if relevant: `docker logs alteonx-dockerflow-containerflow-1`
## Requesting features
Use the [feature request template](.github/ISSUE_TEMPLATE/feature_request.md). Tell us:
- The problem you're trying to solve (not just the solution)
- Why existing functionality doesn't work
- A rough sketch of how you'd want it to work in the UI
We prioritize features that align with the [roadmap](monitoreo.md).
## Reporting security vulnerabilities
**Do not open public issues for security problems.** See [SECURITY.md](SECURITY.md) for the private reporting process.
## Asking questions
Open an issue with the label `question`. No silly questions.
## Local development
If you want to read the code, debug, or experiment locally:
```bash
git clone https://github.com/RGJorge/containerflow.git
cd containerflow
bun install
bun run dev # frontend + backend with hot reload
bun run typecheck # TypeScript check
bun run test # unit tests
bun run build # production build
```
Read the [README](README.md) for full setup details and architecture.
## Code of Conduct
By participating in any way (issues, comments, future PRs), you agree to follow our [Code of Conduct](CODE_OF_CONDUCT.md). TL;DR: be kind, be patient, no harassment.
## Commercial use / partnerships
ContainerFlow is licensed under AGPL-3.0. For commercial use with closed source, partnerships, or sponsored features, contact:
📧 **alteonx.servicios@gmail.com**
+53
View File
@@ -0,0 +1,53 @@
# Security Policy
## Supported Versions
Only the latest tagged release receives security updates. ContainerFlow is in early development (`v0.x`), so always pin a specific version in production.
| Version | Supported |
| ------- | --------- |
| latest | ✅ |
| older | ❌ |
## Reporting a Vulnerability
**Please do not open public GitHub issues for security vulnerabilities.**
Instead, report them privately by email:
📧 **alteonx.servicios@gmail.com**
Include in your report:
- A description of the vulnerability
- Steps to reproduce (or a proof-of-concept)
- Affected version(s)
- Suggested fix if you have one
You can expect:
- **Acknowledgement** within 72 hours
- **Status update** within 7 days
- **Patch + public disclosure** coordinated with you
## Scope
ContainerFlow has access to the Docker socket and host filesystem (read-only). Issues we consider in-scope:
- Privilege escalation beyond what the Docker socket already grants
- Unauthorized access bypassing `AUTH_TOKEN`
- Command injection via container names, env vars, or labels
- Path traversal in compose file resolution
- XSS / CSRF in the web UI
- Denial of service in the backend (memory leaks, infinite loops)
Out of scope:
- Vulnerabilities in dependencies — please report upstream
- Issues requiring physical access to the host
- Social engineering of operators
- Anything you can already do as the Docker daemon user (since you have `docker.sock`)
## Responsible Disclosure
We follow [CVD principles](https://www.first.org/global/sigs/vulnerability-coordination/multiparty/guidelines-v1.1). Public disclosure happens after a fix is released, with credit to the reporter (unless you prefer to remain anonymous).
-146
View File
@@ -1,146 +0,0 @@
# Mejoras Frontend - ContainerFlow
## Documentacion @xyflow/react 12
| Recurso | URL |
|---------|-----|
| **Docs principal** | https://reactflow.dev/learn |
| **API Reference** | https://reactflow.dev/api-reference |
| **Ejemplos** | https://reactflow.dev/examples |
| **UI Components** | https://reactflow.dev/ui |
| **Playground** | https://xyflow.com/labs/react-flow-playground |
| **GitHub** | https://github.com/xyflow/xyflow |
| **Migracion a v12** | https://reactflow.dev/learn/troubleshooting/migrate-to-v12 |
| **npm** | https://www.npmjs.com/package/@xyflow/react |
### Secciones clave de la documentacion
- **Learn > Core Concepts** — terms, building flows, interactivity, viewport, components
- **Learn > Customization** — custom nodes, handles, edges, labels, theming
- **Learn > Layouting** — overview, sub-flows
- **Learn > Advanced** — hooks, accessibility, testing, TypeScript, performance, state management
- **Reference > Hooks** — useNodes, useEdges, useReactFlow, etc.
- **Reference > Components** — Background, Controls, Handles, MiniMap, etc.
- **Reference > Utilities** — addEdge, applyNodeChanges, path functions
---
## Ejemplos relevantes para ContainerFlow
### Nodos
| Ejemplo | URL | Aplicacion en ContainerFlow |
|---------|-----|------------------------|
| Custom Nodes | https://reactflow.dev/examples/nodes/custom-node | Ya usamos ServiceNode y GroupNode custom |
| Node Toolbar | https://reactflow.dev/examples/nodes/node-toolbar | Agregar toolbar con acciones (restart, stop, logs) al seleccionar un container |
| Node Resizer | https://reactflow.dev/examples/nodes/node-resizer | Permitir redimensionar grupos manualmente |
| Updating Nodes | https://reactflow.dev/examples/nodes/update-node | Referencia para actualizar stats en tiempo real |
| Stress Test | https://reactflow.dev/examples/nodes/stress | Benchmark con muchos containers |
| Intersections | https://reactflow.dev/examples/nodes/intersections | Detectar overlaps entre nodos |
### Edges
| Ejemplo | URL | Aplicacion en ContainerFlow |
|---------|-----|------------------------|
| Animating Edges | https://reactflow.dev/examples/edges/animating-edges | Animaciones en edges para indicar actividad |
| Custom Edges | https://reactflow.dev/examples/edges/custom-edges | Ya usamos OffsetEdge custom |
| Edge Label Renderer | https://reactflow.dev/examples/edges/edge-label-renderer | Mostrar tipo de conexion (db, cache, proxy) como label en el edge |
| Floating Edges | https://reactflow.dev/examples/edges/floating-edges | Handles que se mueven con el edge en vez de posicion fija |
| Simple Floating Edges | https://reactflow.dev/examples/edges/simple-floating-edges | Alternativa mas simple — edges al handle mas cercano |
| Edge Markers | https://reactflow.dev/examples/edges/markers | Agregar flechas direccionales a las conexiones |
| Edge Toolbar | https://reactflow.dev/examples/edges/edge-toolbar | Mostrar info de conexion al hacer hover/click en un edge |
### Interaccion
| Ejemplo | URL | Aplicacion en ContainerFlow |
|---------|-----|------------------------|
| Context Menu | https://reactflow.dev/examples/interaction/context-menu | Click derecho en container → restart, stop, logs, inspect |
| Contextual Zoom | https://reactflow.dev/examples/interaction/contextual-zoom | Mostrar mas detalle (ports, stats) solo cuando hay zoom suficiente |
| Save and Restore | https://reactflow.dev/examples/interaction/save-and-restore | Ya tenemos posiciones persistidas, pero podriamos guardar/cargar layouts completos |
| Validation | https://reactflow.dev/examples/interaction/validation | Validar conexiones manuales si agregamos esa funcionalidad |
| Touch Device | https://reactflow.dev/examples/interaction/touch-device | Soporte para tablets/touch |
### Layout
| Ejemplo | URL | Aplicacion en ContainerFlow |
|---------|-----|------------------------|
| Dagre Tree | https://reactflow.dev/examples/layout/dagre | Ya tenemos dagre en package.json pero no lo usamos — alternativa a nuestro layout manual |
| Elkjs Tree | https://reactflow.dev/examples/layout/elkjs | Layout mas potente que dagre, reduce cruces de edges |
| Horizontal Flow | https://reactflow.dev/examples/layout/horizontal | Layout horizontal (izquierda a derecha) como alternativa |
| Node Collisions | https://reactflow.dev/examples/layout/node-collisions | Resolver overlaps automaticamente al mover nodos |
### Subflows y Agrupacion
| Ejemplo | URL | Aplicacion en ContainerFlow |
|---------|-----|------------------------|
| Sub Flows | https://reactflow.dev/examples/grouping/sub-flows | Referencia para nuestros GroupNode — grafos anidados |
### Estilos
| Ejemplo | URL | Aplicacion en ContainerFlow |
|---------|-----|------------------------|
| Dark Mode | https://reactflow.dev/examples/styling/dark-mode | Toggle dark/light mode |
| Tailwind | https://reactflow.dev/examples/styling/tailwind | Ya usamos Tailwind — referencia de estilos |
| Turbo Flow | https://reactflow.dev/examples/styling/turbo-flow | Nodos con bordes gradient animados — inspiracion visual |
### Misc
| Ejemplo | URL | Aplicacion en ContainerFlow |
|---------|-----|------------------------|
| Download Image | https://reactflow.dev/examples/misc/download-image | Exportar el diagrama como PNG para documentacion |
---
## Mejoras identificadas
### Criticas
- [ ] **Error boundaries** — Un crash en un nodo tumba toda la app. Agregar React error boundary alrededor de ReactFlow
- [ ] **Empty state** — Si no hay containers, mostrar mensaje "No containers found" en vez de canvas vacio
- [ ] **Reconnection feedback** — Mostrar "Reconnecting..." visible cuando se pierde el WebSocket
### UX
- [ ] **Context menu** — Click derecho en container: restart, stop, view logs, copy ID
- [ ] **Node toolbar** — Al seleccionar un nodo, mostrar acciones rapidas arriba del nodo
- [ ] **Contextual zoom** — Mostrar ports y stats detallados solo con zoom > 0.8, ocultar en zoom out
- [ ] **Edge labels** — Mostrar tipo de conexion (Database, Cache, Proxy) como label en cada edge
- [ ] **Edge markers** — Flechas direccionales para indicar flujo de datos
- [ ] **Download image** — Boton para exportar diagrama como PNG
- [ ] **Search/filter** — Buscar containers por nombre dentro del canvas
### Performance
- [ ] **Virtualizacion de logs** — LogPanel renderiza 2000 lineas de golpe. Usar virtualizacion (react-window o similar)
- [ ] **Reconnexion exponencial** — Backoff exponencial en vez de intervalo fijo 3s
- [ ] **Validacion de mensajes WS** — Validar estructura de mensajes con Zod antes de procesar
### Layout
- [ ] **Auto-layout con dagre/elkjs** — Usar la dependencia dagre que ya tenemos o migrar a elkjs para layout automatico
- [ ] **Collision detection** — Resolver overlaps automaticamente al mover nodos
- [ ] **Layout horizontal** — Opcion de layout izquierda-derecha ademas del actual
### Visual
- [ ] **Transiciones de layout** — Animar nodos cuando aparecen/desaparecen
- [ ] **Turbo-style glow** — Bordes con gradient animado para containers running
- [ ] **Dark/light mode** — Toggle de tema (actualmente solo dark)
### Accesibilidad
- [ ] **ARIA labels** — Agregar labels a botones de solo icono
- [ ] **Keyboard navigation** — Navegar entre nodos con teclado
- [ ] **Touch support** — Handles mas grandes para dispositivos tactiles
---
## Componentes UI de React Flow
React Flow lanzo "React Flow UI" (antes "React Flow Components") — componentes pre-hechos instalables via shadcn CLI:
- **Database Schema Node** — Visualizar tablas y relaciones
- **Zoom Slider** — Control de zoom mas visual que los botones default
- **Debug Components** — Inspeccionar propiedades de nodos y estado del flow
Docs: https://reactflow.dev/ui
+54 -19
View File
@@ -1,7 +1,8 @@
# ContainerFlow — Roadmap de Monitoreo
> Actualizado tras integración de eventos persistentes, notificaciones in-app,
> control de acceso por path y corrección de cálculo de memoria real.
> control de acceso por path, cálculo de memoria real, volúmenes/mounts en
> DetailPanel y recomendaciones de configuración Docker.
## Fase 1: Acciones básicas ✅ COMPLETA
- [x] Stop / Start / Restart desde el DetailPanel
@@ -10,15 +11,16 @@
- [x] Rebuild (docker compose up --build) por servicio
- [x] **Bonus**: Recreate (docker compose up --force-recreate) para aplicar cambios de compose sin rebuild
## Fase 2: Notificaciones ✅ MAYORMENTE COMPLETA
## Fase 2: Notificaciones ✅ COMPLETA
- [x] Webhooks configurables — **Discord implementado**, Slack pendiente (mismo patrón aplicaría)
- [ ] PWA — Service Worker + manifest (no implementado, depende de habilitar PWA web notifications)
- [x] Push notifications cuando un contenedor cae o health check falla — vía Discord + in-app
- [x] Panel de configuración de notificaciones en la UI (SettingsPage → Discord section)
- [x] **Bonus**: Notificaciones in-app (SQLite persistente, bell del header con read/unread, tab dedicado en Monitoring)
- [x] **Bonus**: Debounce de 15s para detectar restart vs stop+start
- [x] **Bonus**: Cooldown configurable + "Still Down" reminder
> **Descartado**: PWA + Service Worker para web push notifications — requiere HTTPS y agrega complejidad de deploy. Las notificaciones in-app + Discord cubren los casos de uso.
## Fase 3: Historial y métricas ✅ COMPLETA
- [x] SQLite para persistir stats — CPU/RAM (network I/O pendiente)
- [x] Gráficas temporales de CPU/RAM por servicio (1h, 6h, 24h, 7d) con buckets agregados
@@ -37,9 +39,9 @@
- [x] **Bonus**: Color amber en progress bars cuando supera threshold (dashboard ServiceNode + DetailPanel)
## Fase 5: Info avanzada
- [ ] Volumes/Mounts por contenedor en DetailPanel (no implementado)
- [x] Volumes/Mounts por contenedor en DetailPanel — tipo, source, destination, rw/ro, name del volumen
- [x] Terminal interactiva (docker exec) desde la UI — botón Exec en DetailPanel
- [ ] Network inspector (tráfico entre servicios) — parcial: conexiones visualizadas en grafo, no hay info de tráfico
- [ ] Network inspector (tráfico entre servicios) — parcial: conexiones visualizadas en grafo, no hay info de tráfico (rx/tx bytes)
- [ ] Image layers y tamaño (no implementado)
## Fase 6: Deployment (futuro)
@@ -52,6 +54,39 @@
---
## Fase nueva: Recomendaciones de configuración Docker
ContainerFlow no solo monitorea — detecta configuración sub-óptima y la marca con un banner ámbar en el DetailPanel. La idea es ayudar al usuario a adoptar buenas prácticas sin tener que recordarlas.
### Recomendaciones activas (✅ implementadas)
- [x] **Sin `memory_limit`** → banner "Sin límite de memoria configurado en Docker"
- [x] **Sin `cpu_quota`** → banner "Sin límite de CPU configurado en Docker"
- [x] **`restart: no` o vacío** → banner "Restart policy: none — el contenedor no se reiniciará automáticamente si se detiene"
### Recomendaciones planeadas
- [ ] **Sin `HEALTHCHECK`** → detectar `service.health_status === ""` y sugerir healthcheck contextual:
- postgres → `pg_isready -U $POSTGRES_USER`
- redis → `redis-cli ping`
- mysql/mariadb → `mysqladmin ping -h localhost`
- mongo → `mongosh --eval "db.adminCommand('ping')"`
- http app → `curl -f http://localhost:PORT/health`
- Banner copiable con el snippet del compose
- [ ] **`image:latest`** → warning "Imagen sin tag específico — no reproducible. Considera fijar versión."
- [ ] **DBs sin named volume** → warning "Container de DB (postgres/mysql/mongo/redis) sin named volume para datos persistentes. `docker-compose down` puede borrar datos."
- [ ] **Containers sin labels de compose** → info "Container manual (docker run). Acciones de rebuild no disponibles."
### Resumen del enfoque
```
docker stats: solo muestra números
otros dashboards: muestran números + gráficas
ContainerFlow: muestra + grafica + DETECTA config rota y enseña a arreglarla
```
Este eje diferenciador agrega valor educativo, no solo observabilidad.
---
## Features adicionales no contempladas en el roadmap original
### Seguridad / Multi-usuario
@@ -69,32 +104,32 @@
- [x] Tabs en Monitoring (Historial / Eventos / Notificaciones)
- [x] Click en notificación/evento → abre DetailPanel del container en tab Stats
- [x] DATA_DIR auto-creado en `./data/` (en vez de raíz del proyecto)
- [x] Bell del header con read/unread persistente (localStorage)
- [x] Card totales en Monitoring con color verde diferenciado
### Documentación
- [x] `docker-containerflow.md` — guía Docker explicada para usuarios
- [x] `.env.example` con secciones documentadas
- [x] README con sección Monitoreo e historial + Seguridad expandida
- [x] README con sección Monitoreo e historial + Seguridad + Mejores prácticas
---
## Pendientes prioritarios (próxima iteración sugerida)
## Pendientes prioritarios (próxima iteración)
1. **Alertas con duración** ("CPU > 80% por 5 min") — Fase 4 pendiente
- Requiere ventana deslizante de samples + state machine por threshold
2. ~~Volumes/Mounts en DetailPanel~~ — ✅ HECHO
3. **Recomendaciones de healthcheck**Nueva fase, "value add" para usuarios
- Detecta containers sin healthcheck (`service.health_status === ""`)
- Sugiere healthcheck contextual según la imagen (postgres → pg_isready, redis → redis-cli ping, etc.)
- Banner/widget en dashboard: "N containers sin healthcheck"
- Tooltip en DetailPanel con ejemplo copiable
- Opción de notificación diaria de resumen ("Tienes X containers sin healthcheck")
4. **Network I/O en stats history** — extiende `pollStats` con `networks.eth0.rx_bytes/tx_bytes`
5. **PWA + Service Worker** — para web push notifications cuando la pestaña no está abierta
6. **Image layers y tamaño** — vía `docker image inspect` + UI en DetailPanel
- Resuelve falsos positivos por spikes momentáneos
2. **Recomendaciones de healthcheck**Fase nueva
- Detectar containers sin healthcheck y sugerir uno contextual según la imagen
- Banner/widget en dashboard, tooltip con ejemplo copiable
3. **Network I/O en stats history** — extiende `pollStats` con `networks.eth0.rx_bytes/tx_bytes`
4. **Image layers y tamaño** — vía `docker image inspect` + UI en DetailPanel
5. **Slack webhook** — clonar el patrón de Discord para Slack
## Cosas que cambiaron sustancialmente desde el roadmap original
- **"Notificaciones"** evolucionó de "solo Discord" a "Discord + in-app + persistente + read/unread"
- **"Historial"** evolucionó de "CPU/RAM por servicio" a "+ totales agregados + per-service override + reset filtros"
- **"Notificaciones"** evolucionó de "solo Discord" a "Discord + in-app persistente + bell con read/unread + tab dedicado"
- **"Historial"** evolucionó de "CPU/RAM por servicio" a "+ totales agregados + per-service override + reset filtros + memoria real"
- **Acciones** evolucionó de "stop/start/restart/rebuild" a "+ recreate + exec + remove con confirmación"
- **Seguridad** se volvió un eje propio (ALLOWED_PATHS) que no estaba en el roadmap
- **Recomendaciones de config Docker** es un eje nuevo que no estaba contemplado — diferenciador del producto vs "solo otro dashboard"