Centro de notificaciones inteligente para equipos de desarrollo. Recibe eventos de GitLab (webhooks o polling), evalúa reglas personalizables y envía efectos visuales y sonoros al cliente de escritorio.
GitLab ──webhook──► Servidor (FastAPI, :8000) ──► Motor de reglas (rule.me)
GitLab ◄──polling──► Servidor │
│ ▼
└── WebSocket ──► Cliente Tauri (escritorio)
Admin panel (React, :3001) ──► Admin API (FastAPI, :8001)
- Docker + Docker Compose
- Rust + Cargo (para compilar el cliente Tauri)
- Node.js 20
cp .env.dist .envEdita .env y rellena:
RULES_ENGINE_EMAIL=tu@email.com
RULES_ENGINE_PASSWORD=tu_password
RULES_ENGINE_EMBED_API_KEY=re_live_...
JWT_SECRET=un-secreto-seguro-aqui
echo "127.0.0.1 alert.me" | sudo tee -a /etc/hostsVisita https://rule.me:8444/rule-engine-widget.iife.js en el navegador y acepta la excepción de seguridad (solo una vez).
make up| Servicio | URL |
|---|---|
| Admin panel | http://alert.me:3001 |
| Admin API | http://alert.me:8001 |
| Servidor webhooks | http://alert.me:8000 |
| Base de datos | localhost:3306 |
cd client && npx tauri buildmake client-debug # Con logs
make client # Modo desarrolloAl primer arranque, la app pide email y password. La configuración se guarda en ~/.config/mashware-alert/config.yaml y el token en el keyring del SO (con fallback al config).
Coloca archivos .wav en ~/.config/mashware-alert/sounds/. El nombre del archivo (sin extensión) es el que se usa en las reglas. Si no existe un sonido personalizado, se usa el embebido en la app (si existe).
Sonidos incluidos: success, error, alert, info.
make up # Levantar todos los servicios
make down # Parar y eliminar contenedores
make logs # Ver logs en tiempo real
make ps # Estado de los contenedores
make build # Reconstruir imágenes
make client # Cliente Tauri en modo dev
make client-debug # Cliente compilado con logsEn el admin panel ve a Integrations → GitLab → Configure para obtener la URL y el secret token. Configúralo en GitLab → Settings → Webhooks.
Eventos recomendados: Push, Job, Pipeline, Merge request, Comments.
Si no hay webhook configurado, cada usuario puede activar polling desde su panel:
- Login en el admin panel como usuario
- Integrations → GitLab → LINK
- Poner el GitLab username + Personal Access Token (scope
read_api) - Activar "Enable polling"
El servidor consultará la API de GitLab cada 30 segundos.
Los efectos son las acciones que ejecuta el cliente de escritorio cuando una regla del motor de reglas matchea. Se envían como JSON por WebSocket:
{ "type": "effect", "effect": { "keyword": "...", "params": { ... } } }Muestra un borde de color degradado en los bordes de la pantalla. Transparente y click-through — no interfiere con el trabajo.
{
"keyword": "OVERLAY",
"params": {
"color": "#FF5500",
"animation": "pulse",
"duration": 3.0,
"persistent": true
}
}| Param | Tipo | Default | Descripción |
|---|---|---|---|
color |
string (hex o nombre) | "#FF5500" |
Color del borde. Hex (#EF4444) o nombre (red, yellow, green, blue) |
animation |
string | "pulse" |
Tipo de animación |
duration |
number | 3.0 |
Duración en segundos (solo para flash) |
persistent |
boolean | true |
Si es true, el overlay no desaparece solo. Si es false, desaparece tras duration |
Animaciones disponibles:
| Nombre | Comportamiento |
|---|---|
pulse |
Opacidad sinusoidal suave (0.30 ↔ 0.55). Ideal para estados en curso (deploy, pipeline running) |
blink |
Parpadeo rápido 0.8s + transición a pulso. Ideal para errores urgentes |
flash |
Fade out progresivo. Ideal para éxito o eventos informativos que no requieren atención continua |
solid |
Opacidad fija al 40%. Ideal para estados permanentes |
Ejemplos de uso:
// Deploy en curso — pulso amarillo persistente
{ "keyword": "OVERLAY", "params": { "color": "#F59E0B", "animation": "pulse" } }
// Pipeline falló — parpadeo rojo
{ "keyword": "OVERLAY", "params": { "color": "#EF4444", "animation": "blink" } }
// Deploy exitoso — flash verde de 3 segundos
{ "keyword": "OVERLAY", "params": { "color": "#22C55E", "animation": "flash", "duration": 3.0, "persistent": false } }Cerrar overlay:
- Desde la app: botón DISMISS en el header del dashboard
- Desde el motor de reglas: enviar efecto
HIDE
Reproduce un archivo de sonido. Soporta reproducción única o en bucle.
{
"keyword": "SOUND",
"params": {
"name": "alert",
"loop": false
}
}| Param | Tipo | Default | Descripción |
|---|---|---|---|
name |
string | (requerido) | Nombre del sonido o ruta absoluta al archivo |
loop |
boolean | false |
Si es true, el sonido se repite indefinidamente hasta que se pare |
Resolución del nombre:
~/.config/mashware-alert/sounds/<name>.wav— sonido personalizado del usuario- Sonido embebido en la app (
success,error,alert,info) - Ruta absoluta al archivo (ej:
/home/user/sounds/custom.wav)
Parar sonido en bucle:
- Desde la app: botón MUTE en el header del dashboard
- Desde el motor de reglas: enviar efecto
STOP_SOUND
Ejemplos:
// Sonido de error (una vez)
{ "keyword": "SOUND", "params": { "name": "error" } }
// Sonido de alerta en bucle mientras dura el deploy
{ "keyword": "SOUND", "params": { "name": "alert", "loop": true } }
// Sonido personalizado del usuario
{ "keyword": "SOUND", "params": { "name": "mi-sonido-custom" } }Muestra una notificación nativa del sistema operativo.
{
"keyword": "NOTIFICATION",
"params": {
"title": "Pipeline Failed",
"message": "Pipeline #1234 en proyecto api-backend ha fallado"
}
}| Param | Tipo | Default | Descripción |
|---|---|---|---|
title |
string | "Mashware Alert" |
Título de la notificación |
message |
string | "New event" |
Cuerpo de la notificación |
Oculta el overlay activo.
{ "keyword": "HIDE" }Para cualquier sonido en reproducción (incluidos los que están en bucle).
{ "keyword": "STOP_SOUND" }Una regla puede enviar múltiples efectos. Ejemplos de combinaciones:
Deploy en curso:
[
{ "keyword": "OVERLAY", "params": { "color": "#F59E0B", "animation": "pulse" } },
{ "keyword": "SOUND", "params": { "name": "alert", "loop": true } }
]Deploy exitoso:
[
{ "keyword": "OVERLAY", "params": { "color": "#22C55E", "animation": "flash", "duration": 3.0, "persistent": false } },
{ "keyword": "SOUND", "params": { "name": "success" } },
{ "keyword": "STOP_SOUND" }
]Deploy fallido:
[
{ "keyword": "OVERLAY", "params": { "color": "#EF4444", "animation": "blink" } },
{ "keyword": "SOUND", "params": { "name": "error" } }
]MR aprobado:
[
{ "keyword": "NOTIFICATION", "params": { "title": "MR Approved", "message": "Tu MR ha sido aprobada" } },
{ "keyword": "SOUND", "params": { "name": "info" } }
]Mención en comentario:
[
{ "keyword": "NOTIFICATION", "params": { "title": "Te han mencionado", "message": "En el proyecto X" } },
{ "keyword": "SOUND", "params": { "name": "alert" } }
]