{
  "profile": {
    "name": "Juan Mónigo",
    "headline": "Analista en Infraestructura IT",
    "tagline": "Linux, redes y automatización. Infraestructura que se despliega con un comando y se documenta sola.",
    "summary": "Técnico en Infraestructura IT con experiencia en soporte, redes, Linux y automatización con Python. Me destaco por implementar soluciones eficientes, brindar soporte técnico eficaz y mantener la seguridad y continuidad operativa de la infraestructura informática. Apasionado por la innovación y la mejora continua.",
    "location": "Montevideo, Uruguay",
    "email": "jmonigo.work@gmail.com",
    "phone": "(598) 97 968 471",
    "linkedin": "https://www.linkedin.com/in/juan-monigo",
    "github": "https://github.com/frankfrot30",
    "open_to_work": true,
    "status": "Abierto a propuestas"
  },
  "experience": [
    {
      "company": "Thot Computación",
      "role": "Departamento de expedición",
      "location": "Montevideo, Uruguay",
      "period": "ago 2026 — actualidad",
      "duration": "2 meses",
      "current": true,
      "bullets": [
        "Preparación, verificación y despacho de pedidos de equipamiento informático, cuidando que cada envío salga completo y a tiempo.",
        "Coordinación diaria con ventas y logística para priorizar entregas y resolver incidencias antes de que lleguen al cliente.",
        "El mismo criterio que aplico en infraestructura: procesos claros, verificación antes de entregar y trazabilidad de punta a punta."
      ],
      "stack": []
    },
    {
      "company": "Slantis LLC",
      "role": "Coordinador IT",
      "location": "Montevideo",
      "period": "feb 2026 — mar 2026",
      "duration": "1 mes",
      "current": false,
      "bullets": [
        "Referente en procesos de onboarding/offboarding.",
        "Soporte a usuario final, Ubiquiti y MikroTik."
      ],
      "stack": [
        "Ubiquiti",
        "MikroTik"
      ]
    },
    {
      "company": "Kópel Sánchez",
      "role": "Asesoramiento tecnológico e innovación",
      "location": "Montevideo, Uruguay",
      "period": "nov 2024 — feb 2026",
      "duration": "1 año y 3 meses",
      "current": false,
      "bullets": [
        "Administración de sistemas Linux y servicios en la nube (AWS / Google Cloud).",
        "Implementación de soluciones de cerrajería digital y control de accesos.",
        "Soporte técnico a más de 150 usuarios internos en Google Workspace y sistemas internos.",
        "Optimización de redes LAN internas (Ubiquiti y MikroTik) y documentación de la infraestructura."
      ],
      "stack": [
        "Linux",
        "AWS",
        "Google Cloud",
        "Google Workspace",
        "Redes LAN",
        "Ubiquiti",
        "MikroTik",
        "Control de accesos"
      ]
    }
  ],
  "education": [
    {
      "kind": "course",
      "institution": "Taller de informática",
      "title": "Técnico en mantenimiento y reparación de PC",
      "status": "Realizado",
      "period": "Octubre 2022 — Diciembre 2022",
      "detail": [
        "Instalación de software, reparación de hardware, mantenimiento preventivo."
      ],
      "in_progress": false
    },
    {
      "kind": "degree",
      "institution": "Universidad ORT Uruguay",
      "title": "Analista en Infraestructura Informática",
      "status": "Egresado",
      "period": "2023 — 2025",
      "detail": [],
      "in_progress": false
    },
    {
      "kind": "degree",
      "institution": "Universidad ORT Uruguay",
      "title": "Administrador de Servidores y Aplicaciones",
      "status": "Egresado",
      "period": "2023 — 2025",
      "detail": [],
      "in_progress": false
    },
    {
      "kind": "degree",
      "institution": "UDELAR",
      "title": "Ingeniería en Computación",
      "status": "En curso",
      "period": "2020 — presente",
      "detail": [],
      "in_progress": true
    }
  ],
  "skills": [
    {
      "name": "Linux (Debian / Ubuntu)",
      "category": "Sistemas",
      "level": 88,
      "band": "expert",
      "note": "Administración diaria, hardening, systemd"
    },
    {
      "name": "Proxmox VE",
      "category": "Sistemas",
      "level": 85,
      "band": "expert",
      "note": "Virtualización, plantillas cloud-init, GPU passthrough"
    },
    {
      "name": "Windows Server",
      "category": "Sistemas",
      "level": 78,
      "band": "advanced",
      "note": "Active Directory, GPO, servicios de archivos"
    },
    {
      "name": "Bash",
      "category": "Sistemas",
      "level": 82,
      "band": "advanced",
      "note": "Scripting de provisión y mantenimiento"
    },
    {
      "name": "PowerShell",
      "category": "Sistemas",
      "level": 75,
      "band": "advanced",
      "note": "Automatización sobre Windows y Proxmox"
    },
    {
      "name": "Docker",
      "category": "Contenedores y orquestación",
      "level": 85,
      "band": "expert",
      "note": "Imágenes multi-stage, compose, registries"
    },
    {
      "name": "Kubernetes (kubeadm)",
      "category": "Contenedores y orquestación",
      "level": 70,
      "band": "advanced",
      "note": "Clusters HA, kube-vip, Calico, RBAC"
    },
    {
      "name": "MetalLB / ingress-nginx",
      "category": "Contenedores y orquestación",
      "level": 70,
      "band": "advanced",
      "note": "Exposición de servicios en LAN"
    },
    {
      "name": "Longhorn",
      "category": "Contenedores y orquestación",
      "level": 66,
      "band": "solid",
      "note": "Almacenamiento distribuido replicado"
    },
    {
      "name": "Python",
      "category": "IaC y automatización",
      "level": 86,
      "band": "expert",
      "note": "Automatización, scraping, APIs, bots"
    },
    {
      "name": "Terraform",
      "category": "IaC y automatización",
      "level": 82,
      "band": "advanced",
      "note": "Provisión sobre Proxmox y cloud"
    },
    {
      "name": "cloud-init",
      "category": "IaC y automatización",
      "level": 69,
      "band": "solid",
      "note": "Plantillas de VM reproducibles"
    },
    {
      "name": "Ansible",
      "category": "IaC y automatización",
      "level": 72,
      "band": "advanced",
      "note": "Configuración de flotas de servidores"
    },
    {
      "name": "GitHub Actions",
      "category": "IaC y automatización",
      "level": 70,
      "band": "advanced",
      "note": "CI/CD, build y publicación de imágenes"
    },
    {
      "name": "Google Workspace",
      "category": "Cloud",
      "level": 85,
      "band": "expert",
      "note": "Administración para +150 usuarios"
    },
    {
      "name": "AWS",
      "category": "Cloud",
      "level": 68,
      "band": "solid",
      "note": "EC2, S3, IAM, VPC"
    },
    {
      "name": "Google Cloud",
      "category": "Cloud",
      "level": 79,
      "band": "advanced",
      "note": "Compute Engine, IAM, almacenamiento"
    },
    {
      "name": "LAN / VLAN / routing",
      "category": "Redes",
      "level": 82,
      "band": "advanced",
      "note": "Segmentación y optimización de redes internas"
    },
    {
      "name": "pfSense",
      "category": "Redes",
      "level": 85,
      "band": "expert",
      "note": "Firewall, portal cautivo, HA"
    },
    {
      "name": "DNS / DHCP",
      "category": "Redes",
      "level": 82,
      "band": "advanced",
      "note": "Servicios de red internos"
    },
    {
      "name": "WireGuard",
      "category": "Redes",
      "level": 80,
      "band": "advanced",
      "note": "VPN site-to-site y road-warrior"
    },
    {
      "name": "RADIUS / 802.1X",
      "category": "Redes",
      "level": 78,
      "band": "advanced",
      "note": "Autenticación de red WPA2-Enterprise"
    },
    {
      "name": "Hardening de Linux",
      "category": "Seguridad",
      "level": 75,
      "band": "advanced",
      "note": "Superficie mínima, SSH por clave, sudo acotado"
    },
    {
      "name": "Control de accesos",
      "category": "Seguridad",
      "level": 78,
      "band": "advanced",
      "note": "Cerrajería digital y accesos físicos"
    },
    {
      "name": "Wazuh / SIEM",
      "category": "Seguridad",
      "level": 72,
      "band": "advanced",
      "note": "Detección y respuesta activa"
    },
    {
      "name": "Gestión de vulnerabilidades",
      "category": "Seguridad",
      "level": 72,
      "band": "advanced",
      "note": "Escaneo de CVE y remediación"
    },
    {
      "name": "Git",
      "category": "Desarrollo",
      "level": 80,
      "band": "advanced",
      "note": "Ramas, revisión, flujo con CI"
    },
    {
      "name": "Django",
      "category": "Desarrollo",
      "level": 76,
      "band": "advanced",
      "note": "Apps de gestión, ORM, admin, despliegue"
    },
    {
      "name": "SQL (MySQL / MariaDB)",
      "category": "Desarrollo",
      "level": 72,
      "band": "advanced",
      "note": "Modelado, consultas, respaldos"
    },
    {
      "name": "HTML / CSS / JS",
      "category": "Desarrollo",
      "level": 72,
      "band": "advanced",
      "note": "Interfaces sin frameworks pesados"
    }
  ],
  "languages": [
    {
      "name": "Español",
      "level": "Nativo",
      "dots": 5
    },
    {
      "name": "Inglés",
      "level": "Intermedio alto — técnico y conversacional",
      "dots": 5
    }
  ],
  "projects": [
    {
      "slug": "k8s-ha-proxmox",
      "title": "Cluster Kubernetes HA sobre Proxmox",
      "summary": "Cluster kubeadm en alta disponibilidad, escalable a N nodos, provisionado con Terraform y levantado con un solo comando.",
      "body": [
        "Terraform clona N máquinas Debian desde una plantilla cloud-init sobre Proxmox VE y un único script las convierte en un cluster de Kubernetes listo para producir.",
        "El control-plane se sirve detrás de una VIP gestionada por kube-vip en modo ARP: si cae un nodo, otro toma la IP y el cluster sigue respondiendo sin balanceador externo.",
        "Encima quedan instalados los addons que hacen falta para que el cluster sea usable de verdad en bare-metal: CNI, LoadBalancer, ingress, métricas y almacenamiento replicado."
      ],
      "highlights": [
        "Topología por defecto 3 control-plane + 2 workers, parametrizable",
        "kube-vip para HA del control-plane sin balanceador externo",
        "Calico como CNI con NetworkPolicies, MetalLB en modo L2 e ingress-nginx",
        "Longhorn como StorageClass por defecto, con réplicas entre nodos",
        "Plantilla cloud-init de Debian creada por el propio script: cero pasos manuales"
      ],
      "stack": [
        "Terraform",
        "Proxmox VE",
        "Kubernetes",
        "kubeadm",
        "kube-vip",
        "Calico",
        "MetalLB",
        "ingress-nginx",
        "Longhorn",
        "containerd",
        "cloud-init"
      ],
      "area": "infra",
      "year": "2026",
      "status": "done",
      "repo": "",
      "demo": "",
      "url": "/proyectos/k8s-ha-proxmox/"
    },
    {
      "slug": "portal-cautivo-pfsense",
      "title": "Portal cautivo con pfSense y vouchers",
      "summary": "Migración de una WiFi WPA2-Enterprise (802.1X / RADIUS) a red abierta con portal cautivo, reutilizando el RADIUS existente y sumando vouchers para invitados.",
      "body": [
        "La red WiFi usaba WPA2-Enterprise con RADIUS, que funcionaba pero dejaba fuera a cualquier invitado y a todo dispositivo que no supiera hablar 802.1X.",
        "La migración pasó la red a abierta con portal cautivo de pfSense manteniendo el mismo servidor RADIUS como base de usuarios, así que nadie tuvo que cambiar su contraseña.",
        "Para las visitas se agregó un sistema de vouchers con caducidad, y las páginas del portal (login, error y logout) se escribieron a mano para que la experiencia no pareciera un formulario de router."
      ],
      "highlights": [
        "Autenticación contra el RADIUS existente, sin migrar credenciales",
        "Vouchers con caducidad para invitados",
        "Páginas de login, error y logout propias, responsive",
        "Compatible con dispositivos que no soportan 802.1X (IoT, consolas, TVs)"
      ],
      "stack": [
        "pfSense",
        "FreeRADIUS",
        "802.1X",
        "HTML",
        "CSS",
        "Redes WiFi"
      ],
      "area": "redes",
      "year": "2025",
      "status": "live",
      "repo": "",
      "demo": "",
      "url": "/proyectos/portal-cautivo-pfsense/"
    },
    {
      "slug": "bot-busqueda-laboral",
      "title": "Bot de búsqueda laboral con scoring",
      "summary": "Recolecta ofertas de varios portales, deduplica contra SQLite, puntúa el encaje con el perfil y avisa por Telegram solo lo que vale la pena leer.",
      "body": [
        "El problema no era encontrar ofertas sino releer las mismas cien veces. El bot consulta varios portales en paralelo con consultas separadas por rol y guarda todo lo visto en SQLite, así que cada ejecución muestra únicamente lo nuevo.",
        "Antes de notificar aplica un filtro de encaje local de 0 a 100 que mira el rol en el título, las tecnologías, el nivel (penaliza senior, lead y manager) y la elegibilidad geográfica del remoto. Lo que no llega al umbral se descarta sin gastar nada.",
        "Solo las candidatas que superan el filtro pasan opcionalmente por la API de Claude para una puntuación comentada y un borrador de postulación."
      ],
      "highlights": [
        "Deduplicación persistente en SQLite: nunca repite una oferta",
        "Scoring local sin coste antes de gastar tokens de IA",
        "Modo --solo-buscar para calibrar umbrales sin efectos secundarios",
        "Notificación por Telegram, email o consola",
        "Generación de carta y borrador de email para las mejores ofertas"
      ],
      "stack": [
        "Python",
        "SQLite",
        "Claude API",
        "Telegram Bot API",
        "YAML",
        "requests"
      ],
      "area": "automatizacion",
      "year": "2025",
      "status": "live",
      "repo": "",
      "demo": "",
      "url": "/proyectos/bot-busqueda-laboral/"
    },
    {
      "slug": "premiadent",
      "title": "Premiadent: gestión de turnos y despliegue IaC",
      "summary": "Aplicación Django de gestión de turnos y pacientes, con su infraestructura desplegada por Terraform sobre Proxmox y una auditoría de vulnerabilidades del stack.",
      "body": [
        "Aplicación web para gestionar turnos, pacientes y cuentas, construida con Django y su ORM sobre un modelo relacional propio.",
        "El despliegue no se hace a mano: Terraform levanta la infraestructura sobre Proxmox y deja el entorno reproducible desde cero.",
        "Sobre el resultado se corrió un trabajo de reconocimiento y escaneo de CVE del stack desplegado, con su informe de hallazgos y remediación."
      ],
      "highlights": [
        "Modelo de dominio propio: cuentas, pacientes y turnos",
        "Infraestructura declarada en Terraform sobre Proxmox",
        "Reconocimiento, escaneo de CVE e informe de remediación",
        "Migración posterior del despliegue a Kubernetes"
      ],
      "stack": [
        "Django",
        "Python",
        "SQL",
        "Terraform",
        "Proxmox",
        "Docker"
      ],
      "area": "dev",
      "year": "2025",
      "status": "live",
      "repo": "",
      "demo": "",
      "url": "/proyectos/premiadent/"
    },
    {
      "slug": "wazuh-cloudflare",
      "title": "Respuesta activa: Wazuh bloqueando en Cloudflare",
      "summary": "Integración que conecta las alertas de Wazuh con la API de Cloudflare para bloquear IPs atacantes en el borde, antes de que lleguen al servidor.",
      "body": [
        "Detectar un ataque y no poder cortarlo hasta el día siguiente es medio trabajo. Esta integración cierra el ciclo: cuando Wazuh dispara una alerta con la severidad configurada, un script de respuesta activa llama a la API de Cloudflare y agrega la IP de origen a una regla de bloqueo.",
        "El bloqueo ocurre en el borde de Cloudflare, así que el tráfico malicioso ni siquiera consume ancho de banda ni ciclos del servidor de origen."
      ],
      "highlights": [
        "Respuesta activa de Wazuh conectada a la API de Cloudflare",
        "Bloqueo en el borde, sin tocar el firewall del origen",
        "Umbral de severidad configurable para evitar falsos positivos",
        "Wazuh publicado detrás de Caddy con TLS"
      ],
      "stack": [
        "Wazuh",
        "Cloudflare API",
        "Bash",
        "Python",
        "Caddy",
        "Docker"
      ],
      "area": "seguridad",
      "year": "2025",
      "status": "live",
      "repo": "",
      "demo": "",
      "url": "/proyectos/wazuh-cloudflare/"
    },
    {
      "slug": "migracion-k8s",
      "title": "Migración de una app monolítica a Kubernetes",
      "summary": "Contenerización de una aplicación que corría directo sobre una VM y su traslado a manifiestos de Kubernetes, con almacenamiento persistente e ingress.",
      "body": [
        "La aplicación vivía instalada a mano sobre una VM: funcionaba, pero cada cambio era irrepetible y cada restauración, una tarde perdida.",
        "El trabajo consistió en escribir su Dockerfile, definir Deployment, Service e Ingress, resolver el estado con volúmenes persistentes y dejar el despliegue versionado en Git."
      ],
      "highlights": [
        "Contenerización de una app instalada a mano",
        "Deployment, Service e Ingress versionados",
        "Estado resuelto con volúmenes persistentes",
        "Despliegue repetible desde cero"
      ],
      "stack": [
        "Docker",
        "Kubernetes",
        "YAML",
        "Ingress",
        "PersistentVolumes"
      ],
      "area": "infra",
      "year": "2026",
      "status": "done",
      "repo": "",
      "demo": "",
      "url": "/proyectos/migracion-k8s/"
    },
    {
      "slug": "cv-web",
      "title": "Este sitio: CV interactivo en Django",
      "summary": "El sitio que estás leyendo. Django + PostgreSQL en un LXC no privilegiado de Proxmox, supervisado por systemd, con el contenido editable desde el admin y cero JavaScript de terceros.",
      "body": [
        "El CV no está escrito en el HTML: vive en la base de datos y se edita desde el admin de Django, así que corregir una fecha no requiere un despliegue.",
        "Corre en un contenedor LXC no privilegiado sobre Proxmox, con systemd supervisando gunicorn. La unidad está endurecida: usuario sin shell, disco en solo lectura salvo dos rutas, sin capabilities y con el filtro de syscalls acotado.",
        "El terminal de la portada no es un juguete de frontend: cada comando viaja a un endpoint de Django que lo resuelve consultando los mismos modelos que renderizan la página, y está cubierto por tests.",
        "No hay ni un byte de JavaScript de terceros, ni fuentes remotas, ni CDNs: todo se sirve desde el propio servidor. Carga rápido y no filtra datos del visitante."
      ],
      "highlights": [
        "LXC no privilegiado creado desde script, no desde la interfaz",
        "Unidad de systemd endurecida: sin capabilities, disco en solo lectura",
        "PostgreSQL sin escuchar en la red, solo socket unix local",
        "Contenido bilingüe en la base, editable sin redesplegar",
        "Terminal con motor de comandos server-side y tests",
        "Despliegue que valida antes de recargar: si falla, sigue la versión anterior"
      ],
      "stack": [
        "Django",
        "Python",
        "PostgreSQL",
        "Proxmox LXC",
        "systemd",
        "gunicorn",
        "WhiteNoise",
        "Bash",
        "HTML",
        "CSS",
        "JavaScript"
      ],
      "area": "dev",
      "year": "2026",
      "status": "live",
      "repo": "",
      "demo": "",
      "url": "/proyectos/cv-web/"
    }
  ],
  "meta": {
    "lang": "es",
    "source": "https://cv.juanmonigo.com"
  }
}