🎸

Indie Shows Tracker

Bot de seguimiento de recitales indie en Buenos Aires

/home/mati/indie_shows.db /home/mati/indie_shows.py skill: indie-shows-tracker
16
Artistas
5
Cron Jobs
1
SQLite DB
24/7
Activo
Sección 01

¿Qué es Hermes?

Hermes es un agente de IA que vive corriendo en un servidor y se comunica conmigo (Mati) principalmente por WhatsApp. No es un chatbot común: además de "hablar", hace cosas concretas.

💡 Analogía rápida

Imaginate un asistente que está todo el día en la compu. Le podés pedir cosas por WhatsApp, pero también hace cosas solo: cada tanto revisa si hay recitales nuevos, y si encuentra, te avisa al grupo. Eso es Hermes con este bot.

Sección 02

¿Qué son las Skills?

Las Skills son manuales de instrucciones que le damos a Hermes para que sepa cómo manejar tareas específicas. Cada skill es un archivo de texto (SKILL.md) que describe:

🎯 Ejemplo con este bot

Cuando alguien manda un mensaje al grupo de WhatsApp, Hermes carga la skill indie-shows-tracker. Esa skill le dice: "No busques en Google para responder. Toda la info está en la DB local. Consultala con el script."

Las skills se asocian a grupos de WhatsApp vía channel_skill_bindings en el config. Es como decirle: "Si te hablan desde este grupo, primero leé este manual".

Sección 03

¿Qué hace el bot?

Rastrea shows en vivo de artistas indie en Buenos Aires y alrededores (CABA, La Plata, Bernal, Quilmes) y manda notificaciones a un grupo de WhatsApp.

Artistas rastreados

🎸 Pérez
🎸 Mi amigo invencible
🎸 El mato a un policía motorizado
🎸 Carmen Sanchez Viamonte
🎸 Tobogán andaluz
🎸 Barbi Recanati
🎸 Niña lobo
🎸 Nina Suarez
🎸 107 faunos
🎸 RYAN
🎸 Toe (Japón)
🎸 Los besos
🎸 Ainda
🎸 Bestia bebe
🎸 NAFTA
🎸 Las ligas menores

Tipos de notificaciones

DIARIO · 21:00
📣 Aviso día anterior
Si hay shows mañana, manda un mensaje al grupo con hora, venue y link para comprar entradas.
SEMANAL · LUNES 10:00
📅 Resumen semanal
Resumen con todos los shows de la semana, agrupados por día.
MENSUAL · 1ER LUNES
🗓️ Resumen mensual
Resumen de los próximos 30 días de shows indie.
SCRAPE · MIÉR + SÁB
🔍 Búsqueda de shows
Busca shows nuevos en internet para los 16 artistas rastreados.
Sección 04

Arquitectura general

El sistema tiene 5 componentes principales que trabajan juntos:

1. Base de datos (SQLite)

Archivo /home/mati/indie_shows.db con todos los show: artista, fecha, venue, hora, precio, link de entradas y estado de notificación.

2. Script Python (indie_shows.py)

El "cerebro operativo". Se llama desde la línea de comandos con modos: list, daily, weekly, monthly, add-json, cleanup. Opera sobre la DB y manda WhatsApp.

3. Agente Hermes (con skill)

Cuando un cron lo dispara, carga la skill indie-shows-tracker, hace web scraping y usa add-json para insertar datos. También responde consultas del grupo de WA.

4. Cron Jobs (tareas programadas)

5 tareas automáticas: notificación diaria, resumen semanal, resumen mensual, scraping 2×/semana, y cleanup mensual.

5. Puente de WhatsApp (bridge)

Baileys (Node.js) en http://127.0.0.1:3000. El script manda un POST con chatId + message y el bridge lo envía al grupo.

┌──────────────┐ web_search ┌──────────────┐ │ Cron Job │ ──────────────────▶ │ Agent IA │ │ (miérc+sáb) │ │ (Hermes) │ └──────────────┘ └──────┬───────┘ │ add-json ▼ ┌──────────────┐ ┌──────────────┐ │ WhatsApp │ ◀── POST /send ─── │ SQLite DB │ │ Grupo │ │ .db file │ └──────────────┘ └──────────────┘ ▲ ▲ │ POST /send │ list/daily/ │ │ weekly/monthly ┌──────────────┐ ┌──────────────┐ │ Cron Jobs │ ──────────────────▶ │ Python │ │ (diario,sem)│ │ script.py │ └──────────────┘ └──────────────┘
Sección 05

Cómo busca los recitales

Dos veces por semana (miércoles y sábado a las 11:00), se dispara un cron job que despierta al agente para buscar shows nuevos.

1

Se activa el cron

El scheduler ejecuta el prompt: "Cargá la skill, consultá la DB, buscá shows para los 16 artistas."

2

Consulta DB actual

Ejecuta indie_shows.py list para ver qué shows ya existen y evitar duplicados.

3

Búsquedas web

web_search para cada artista. Agrupa cuando puede. Fuentes: Passline, Venti, Ticketek, Bandsintown, Instagram, Indiehoy.

4

Extraer detalles

web_extract para entrar a cada página y sacar fecha, hora, venue, precio y el link para comprar entradas.

5

Filtrar por ubicación

Descarta shows fuera de CABA y alrededores. Córdoba, Rosario, MDQ no.

6

Insertar en DB

Arma JSON y ejecuta add-json. El UPSERT inserta o actualiza sin duplicar.

Sección 06

Cómo guarda los datos (SQLite)

SQLite guarda todo en un solo archivo (indie_shows.db). No necesita servidor. Python lo accede con el módulo sqlite3 que viene built-in.

Estructura de la tabla shows

CREATE TABLE shows (
    id           INTEGER PRIMARY KEY,
    artista      TEXT NOT NULL,        -- "Pérez"
    fecha        DATE NOT NULL,         -- "2026-11-01"
    titulo       TEXT NOT NULL,         -- "Pérez presenta..."
    venue        TEXT DEFAULT '',       -- "Club Social 911 (CABA)"
    hora         TEXT DEFAULT '',       -- "21:00"
    precio       TEXT DEFAULT '',       -- "12000"
    link         TEXT DEFAULT '',       -- URL de entradas
    fuente       TEXT DEFAULT '',       -- URL de dónde salió
    detalle      TEXT DEFAULT '',      -- Info adicional
    notif_dia    INT DEFAULT 0,        -- 1=ya se avisó
    notif_sem    INT DEFAULT 0,        -- 1=ya se avisó
    creado_en    DATETIME,
    actualizado  DATETIME,
    UNIQUE(fecha, artista, titulo)     -- Sin duplicados
);

🔑 ¿Qué es el UPSERT?

La restricción UNIQUE(fecha, artista, titulo) evita duplicados. Si el agente encuentra un show que ya existe pero cambió la hora, el ON CONFLICT ... DO UPDATE actualiza los campos existentes en vez de crear un duplicado.

Sección 07

Cómo envía las notificaciones

El script manda el mensaje haciendo un HTTP POST al bridge de Baileys:

curl -s -X POST http://127.0.0.1:3000/send \
  -H "Content-Type: application/json" \
  -d '{"chatId":"120363428208084868@g.us",
       "message":"🎵 ¡Shows indie mañana! ..."}'

El bridge es Baileys, una biblioteca de Node.js que se conecta a WhatsApp Web y expone una API HTTP local. Así podemos enviar mensajes programáticamente desde cualquier script.

Configuración del grupo en WhatsApp

whatsapp:
  channel_prompts:
    "120363428208084868@g.us": |
      GRUPO DE SHOWS INDIE BAIRES.
      REGLAS: 1) NUNCA busques en Google.
      2) TODA la info está en la DB local.
      3) Cargá la skill ANTES de responder.
  channel_skill_bindings:
    - id: "120363428208084868@g.us"
      skills:
        - indie-shows-tracker

Cuando alguien manda un mensaje al grupo, Hermes carga la skill y limita su comportamiento a lo que la skill define.

Sección 08

Los Cron Jobs: tareas programadas

Un cron job es una tarea que se ejecuta automáticamente en un horario determinado. Es como poner una alarma, pero en vez de sonar, ejecuta un programa.

HorarioNombreQué hace
Todos los días 21:00dailyAvisa si hay shows mañana
Lunes 10:00weeklyResumen semanal (7 días)
1er lunes 10:30monthlyResumen mensual (30 días)
Mié + Sáb 11:00scrapeBusca shows nuevos en internet
Día 1 del mes 09:00cleanupBorra shows pasados (>7 días)
Sección 09

La DB en detalle: queries

Listar próximos shows (90 días)

SELECT * FROM shows
WHERE fecha >= date('now')
  AND fecha <= date('now', '+90 days')
ORDER BY fecha, hora;

Shows de mañana (notificación diaria)

SELECT * FROM shows
WHERE fecha = date('now', '+1 day')
  AND notificado_dia_anterior = 0
ORDER BY hora;

UPSERT (insertar o actualizar)

INSERT INTO shows (artista, fecha, titulo, venue, ...)
VALUES (?, ?, ?, ?, ...)
ON CONFLICT(fecha, artista, titulo) DO UPDATE SET
    venue = excluded.venue,
    hora = excluded.hora,
    link = excluded.link,
    actualizado_en = CURRENT_TIMESTAMP;

Marcar como notificado

UPDATE shows
SET notificado_dia_anterior = 1
WHERE id = ?;
Sección 10

El script Python: modos de uso

python3 /home/mati/indie_shows.py <modo>

  init        → Crear/actualizar la tabla
  add-json    → Agregar shows desde JSON (batch)
  list        → Listar próximos shows (90 días)
  daily       → Notificación día anterior
  weekly      → Resumen semanal (7 días)
  monthly     → Resumen mensual (30 días)
  mark-sent   → Marcar shows como notificados
  cleanup     → Borrar shows pasados
  artists     → Listar artistas rastreados

Ejemplo de inserción

python3 /home/mati/indie_shows.py add-json '[
  {"artista":"Toe", "fecha":"2026-09-13",
   "titulo":"Toe - Latin America Tour 2026",
   "venue":"Niceto Club (CABA)", "hora":"20:00",
   "precio":"55000", "link":"https://venti.com.ar/...",
   "fuente":"https://venti.com.ar/...",
   "detalle":"Banda japonesa, tour latinoamericano"}
]'
Sección 11

Flujo completo paso a paso

Así funciona el sistema de punta a punta cuando busca nuevos shows:

1

Cron scheduler dispara tarea

Cada miérc + sáb a las 11:00, el scheduler de Hermes ejecuta el prompt del cron job.

2

Agente se despierta

Hermes carga la skill indie-shows-tracker como primer paso.

3

Consulta DB actual

indie_shows.py list para ver qué shows ya existen.

4

Web scraping

web_search para buscar cada artista en Passline, Venti, Bandsintown, Instagram.

5

Extracción

web_extract para entrar a cada página y sacar fecha, hora, venue, precio y link de entradas.

6

Filtrado

Descarta shows fuera de CABA y alrededores.

7

Inserción

Arma JSON y ejecuta add-json. UPSERT evita duplicados.

8

Verificación

indie_shows.py list otra vez para confirmar.

📲 Para las notificaciones automáticas

  • Daily (21:00): Busca shows para mañana, arma mensaje de WhatsApp y lo envía. Marca notif_dia=1.
  • Weekly (lunes 10:00): Busca shows de los próximos 7 días, agrupa por día, envía resumen. Marca notif_sem=1.
  • Monthly (1er lunes 10:30): Igual pero para 30 días.
Sección 12

Vocabulario rápido

Hermes
Agente de IA que vive en el servidor. Tiene herramientas (web search, terminal, etc.) y skills especializadas.
Skill
Archivo SKILL.md con instrucciones para una tarea específica. Se carga automáticamente según el contexto.
Cron Job
Tarea programada que se ejecuta en un horario definido, como un cron de Linux, pero manejado por Hermes.
SQLite
Base de datos en un archivo .db. No necesita servidor. Python la accede con el módulo sqlite3.
UPSERT
Operación SQL: inserta si no existe, actualiza si ya existe. Evita duplicados.
Bridge (WA)
Servicio Baileys (Node.js) que conecta con WhatsApp Web vía API HTTP local.
Web Scraping
Buscar información en internet y extraer datos estructurados de páginas web.
web_search
Herramienta de Hermes para buscar en Google/internet.
web_extract
Herramienta para entrar a una URL y extraer su contenido como texto.
Grupo JID
Identificador único de un grupo de WhatsApp. Formato: número@g.us.
Channel Prompt
Instrucciones que se inyectan cuando Hermes recibe un mensaje de un grupo específico.
Skill Binding
Asociación de un grupo de WA con una skill para carga automática.

✨ Sobre esta página

Esta misma documentación que estás leyendo fue generada íntegramente por Hermes, el mismo agente de IA que maneja el bot de conciertos. Hermes diseñó el diseño, escribió el HTML, CSS y contenido, creó el Dockerfile con nginx, y desplegó el sitio estático en un contenedor Docker detrás de Traefik con HTTPS automático vía Let's Encrypt — todo desde su sesión de trabajo en el VPS.

El sitio se sirve desde un contenedor nginx en docs.rapoport.com.ar, corriendo en el mismo servidor que el bot. Así que estás viendo la documentación de un sistema que, en cierta forma, también se documentó a sí mismo.

Hermes Agent Docker Traefik nginx Let's Encrypt SQLite Python WhatsApp Bridge