{
  "$schema": "https://raw.githubusercontent.com/jsonresume/resume-schema/v1.2.1/schema.json",
  "basics": {
    "name": "Imad El Malki Jaddi",
    "label": "Desarrollador de software · Angular & Java",
    "image": "https://imadelmalki.com/portrait.webp",
    "email": "imadelmalkij@gmail.com",
    "phone": "+34641829721",
    "summary": "Soy desarrollador de software especializado en Angular y Java. Desde 2023 trabajo en VIEWNEXT, desarrollando aplicaciones web junto a equipos de Java y QA. Fuera del trabajo construyo proyectos propios de principio a fin, con su base de datos, su despliegue y sus decisiones de producto; varios están publicados y en uso.",
    "location": {
      "city": "La Gornal",
      "region": "Barcelona",
      "countryCode": "ES"
    },
    "profiles": [
      {
        "network": "LinkedIn",
        "username": "imadelmalki",
        "url": "https://www.linkedin.com/in/imadelmalki/"
      },
      {
        "network": "GitHub",
        "username": "ImadElMalki",
        "url": "https://github.com/ImadElMalki"
      }
    ],
    "url": "https://imadelmalki.com/"
  },
  "work": [
    {
      "name": "VIEWNEXT",
      "position": "Angular Developer",
      "url": "https://www.viewnext.com/",
      "startDate": "2023-07-04",
      "summary": "Desarrollo aplicaciones Angular para el sector público con APIs y backends Java/Spring Boot.",
      "highlights": [
        "Contribuyo a CIRNM, un sistema municipal relacionado con la gestión ambiental.",
        "Desarrollo y mejoro SIVCA, integrado con MiNT para gestionar, validar y monitorizar los datos de calidad del aire de Madrid.",
        "Implemento componentes, pantallas y nuevas funciones, mantengo la aplicación e integro APIs con los equipos Java y QA."
      ],
      "description": "Subsidiaria de IBM"
    },
    {
      "name": "INETUM",
      "position": "Desarrollador web",
      "url": "https://www.inetum.com/es/es.html",
      "startDate": "2022-05-02",
      "summary": "Desarrollo de aplicaciones internas y web en Inetum Catalunya, con herramientas low-code y tecnologías web.",
      "highlights": [
        "Desarrollé aplicaciones empresariales con Microsoft Power Apps.",
        "Creé cuadros de mando e informes con Microsoft Power BI."
      ],
      "endDate": "2022-09-21"
    }
  ],
  "otherWork": [
    {
      "name": "Toende",
      "position": "Mozo especialista",
      "field": "Fabricación",
      "startDate": "2022-10-18",
      "endDate": "2023-06-30",
      "url": "https://resetbytoende.com"
    },
    {
      "name": "Laineblock",
      "position": "Operario de producción y almacén",
      "field": "Industria",
      "startDate": "2022-02-11",
      "endDate": "2022-03-12",
      "url": "https://www.laineblock.com"
    },
    {
      "name": "Kettal",
      "position": "Operario de fábrica",
      "field": "Mobiliario",
      "startDate": "2021-05-23",
      "endDate": "2021-09-30",
      "url": "https://www.kettal.com"
    },
    {
      "name": "Pere Ventura",
      "position": "Operario de degüelle (champagel)",
      "field": "Cava",
      "startDate": "2018-09-03",
      "endDate": "2020-03-13",
      "url": "https://www.pereventura.com"
    },
    {
      "name": "Pastisart",
      "position": "Operario de envasado",
      "field": "Alimentación",
      "startDate": "2018-06-07",
      "endDate": "2018-08-29",
      "url": "https://www.pastisart.com"
    },
    {
      "name": "Vacu Vin",
      "position": "Operario de envasado",
      "location": "Países Bajos",
      "field": "Fabricación",
      "startDate": "2017-07-01",
      "endDate": "2017-10-01",
      "url": "https://www.vacuvin.com"
    },
    {
      "name": "McDonald's",
      "position": "Empleado de cocina",
      "location": "Países Bajos",
      "field": "Hostelería",
      "startDate": "2017-01-02",
      "endDate": "2017-06-03",
      "url": "https://www.mcdonalds.nl"
    },
    {
      "name": "Leen Menken",
      "position": "Mozo de almacén",
      "location": "Países Bajos",
      "field": "Logística",
      "startDate": "2016-12-01",
      "endDate": "2017-06-01",
      "url": "https://www.leenmenken.nl"
    },
    {
      "name": "Reverté Productos Minerales",
      "position": "Operario de mantenimiento",
      "field": "Industria",
      "startDate": "2016-02-18",
      "endDate": "2016-02-26",
      "url": "https://reverteminerals.com"
    },
    {
      "name": "VD Holland",
      "position": "Operario agrícola",
      "location": "Países Bajos",
      "field": "Agricultura",
      "startDate": "2016-01-01",
      "endDate": "2016-02-01",
      "url": "https://www.vdholland.nl"
    },
    {
      "name": "Viticultura Planas 1916",
      "position": "Operario agrícola",
      "field": "Agricultura",
      "startDate": "2015-12-09",
      "endDate": "2015-12-18",
      "url": "https://www.viversplanas.com"
    },
    {
      "name": "Iberdrola",
      "position": "Agente de atención al cliente",
      "field": "Energía",
      "startDate": "2015-06-01",
      "endDate": "2015-07-01",
      "url": "https://www.iberdrola.es"
    }
  ],
  "otherSkills": [
    "Programas ofimáticos",
    "Reparación de equipos",
    "Carretilla elevadora"
  ],
  "education": [
    {
      "institution": "Institut Camí de Mar",
      "area": "Desarrollo de Aplicaciones Web (DAW)",
      "studyType": "Ciclo Formativo de Grado Superior",
      "startDate": "2021-09-01",
      "endDate": "2023-05-01"
    },
    {
      "institution": "Institut de l'Arboç · Institut Manuel de Cabanyes",
      "area": "Ciencias y Tecnología",
      "studyType": "Bachillerato",
      "startDate": "2017-09-01",
      "endDate": "2019-06-01"
    }
  ],
  "certificates": [
    {
      "name": "Angular: De cero a experto",
      "issuer": "DevTalles",
      "date": "2024-11-30",
      "hours": 34,
      "url": "https://cursos.devtalles.com/courses/angular"
    },
    {
      "name": "Astro: El framework para sitios web orientados al contenido",
      "issuer": "DevTalles",
      "date": "2025-06-30",
      "hours": 26,
      "url": "https://cursos.devtalles.com/courses/Astro"
    },
    {
      "name": "GIT+GitHub: Todo un sistema de control de versiones de cero",
      "issuer": "DevTalles",
      "date": "2026-08-24",
      "hours": 12,
      "url": "https://cursos.devtalles.com/courses/git-github-control-versiones"
    },
    {
      "name": "Claude Code: Guía completa para desarrolladores de software",
      "issuer": "DevTalles",
      "date": "2026-08-24",
      "hours": 18,
      "url": "https://cursos.devtalles.com/courses/claude-code-guia-completa"
    },
    {
      "name": "Model Context Protocol (MCP)",
      "issuer": "midu.dev",
      "date": "2026-08-24",
      "url": "https://midu.dev/curso/intensivo-mcp"
    },
    {
      "name": "GitHub Actions",
      "issuer": "midu.dev",
      "date": "2026-08-24",
      "url": "https://midu.dev/curso/curso-de-github-actions"
    },
    {
      "name": "Docker y DevOps",
      "issuer": "midu.dev",
      "date": "2026-08-24",
      "url": "https://midu.dev/curso/curso-docker-devops"
    },
    {
      "name": "Spring Boot Starters",
      "issuer": "Viewnext",
      "date": "2025-02-08",
      "hours": 12
    },
    {
      "name": "JPA (Java Persistence API)",
      "issuer": "Viewnext",
      "date": "2025-02-08",
      "hours": 12
    },
    {
      "name": "Java 8: novedades y buenas prácticas",
      "issuer": "Viewnext",
      "date": "2025-02-08",
      "hours": 8
    },
    {
      "name": "SQL avanzado",
      "issuer": "Viewnext",
      "date": "2025-02-08",
      "hours": 8
    },
    {
      "name": "JavaScript",
      "issuer": "Viewnext",
      "date": "2025-02-08",
      "hours": 8
    },
    {
      "name": "Diseño responsive con Bootstrap",
      "issuer": "Viewnext",
      "date": "2025-02-08",
      "hours": 12
    },
    {
      "name": "Buenas prácticas de rendimiento",
      "issuer": "Viewnext",
      "date": "2025-02-08",
      "hours": 8
    },
    {
      "name": "Seguridad y privacidad por diseño (técnico)",
      "issuer": "Viewnext",
      "date": "2025-02-08",
      "hours": 3
    },
    {
      "name": "Crypt0 · Ciberseguridad",
      "issuer": "IBM",
      "date": "2026-07-07",
      "hours": 3
    },
    {
      "name": "Test de nivel de inglés · MCER B2",
      "issuer": "goFLUENT",
      "date": "2024-09-02"
    }
  ],
  "languages": [
    {
      "language": "Español",
      "fluency": "Nativo",
      "level": "native"
    },
    {
      "language": "Catalán",
      "fluency": "Nativo",
      "level": "native"
    },
    {
      "language": "Árabe",
      "fluency": "Nativo",
      "level": "native"
    },
    {
      "language": "Bereber (amazig)",
      "fluency": "Nativo",
      "level": "native"
    },
    {
      "language": "Inglés",
      "fluency": "Intermedio alto",
      "level": "B2"
    }
  ],
  "projects": [
    {
      "id": "amazon-spending-tracker",
      "name": "Amazon Spending Tracker",
      "status": "published",
      "technologies": [
        "JavaScript",
        "Chrome Extensions",
        "Gmail API",
        "OAuth"
      ],
      "description": "Reconstruye tus compras desde los correos de Amazon, evita pedidos duplicados y calcula el gasto anual.",
      "overview": "Extensión Chrome MV3 que calcula y desglosa el gasto anual en Amazon desde las confirmaciones de Gmail, con OAuth de solo lectura, deduplicación y almacenamiento local.",
      "highlights": [
        "Deduplicación por número de pedido, para no contar dos veces los correos de una misma compra.",
        "Sincronización incremental cada hora y escaneo completo semanal.",
        "Exportación a .xlsx generada sin dependencias.",
        "Interfaz en español e inglés; los datos no salen del navegador."
      ],
      "links": [
        {
          "label": "Sitio web",
          "url": "https://amazonspendingtracker.com",
          "kind": "website"
        },
        {
          "label": "Chrome Web Store",
          "url": "https://chromewebstore.google.com/detail/amazon-spending-tracker/amejpfnehhohiffphbimdnilhjkpgfpb",
          "kind": "store"
        }
      ],
      "keywords": [
        "JavaScript",
        "Chrome Extensions",
        "Gmail API",
        "OAuth"
      ]
    },
    {
      "id": "100-cims",
      "name": "100 Cims",
      "status": "private",
      "technologies": [
        "Angular",
        "TypeScript",
        "Java",
        "Spring Boot",
        "PostgreSQL",
        "Python",
        "Docker"
      ],
      "description": "Reúne las cimas del reto 100 Cims en un catálogo con fichas, fotografías y datos preparados automáticamente.",
      "overview": "Aplicación sobre el reto de los 100 Cims de la FEEC. Usa Angular para consultar las cimas, una API REST con Spring Boot y PostgreSQL, y scripts en Python para recopilar y preparar los datos y las imágenes.",
      "highlights": [
        "API REST con Maven y PostgreSQL 17 en contenedor.",
        "Proceso en Python que recopila los datos de las cimas y los carga en la base de datos.",
        "Descarga y optimización de las imágenes a WebP.",
        "Restauración del conjunto de datos desde CSV."
      ],
      "featured": true,
      "keywords": [
        "Angular",
        "TypeScript",
        "Java",
        "Spring Boot",
        "PostgreSQL",
        "Python",
        "Docker"
      ]
    },
    {
      "id": "race-hub",
      "name": "Race Hub",
      "status": "in-development",
      "technologies": [
        "Capacitor",
        "Svelte",
        "TypeScript",
        "Kotlin",
        "Room",
        "WorkManager",
        "Supabase"
      ],
      "description": "Organiza tus carreras, calcula ritmos, splits y desnivel, y sincroniza recordatorios con Google Calendar.",
      "overview": "App Android con Capacitor y una interfaz en Svelte 5. La parte nativa en Kotlin se encarga de los datos, la sincronización y los cálculos de ritmos, splits y desnivel.",
      "highlights": [
        "Room como única fuente de datos y WorkManager como único motor de sincronización con Supabase.",
        "Ritmos, splits y desnivel calculados en Kotlin.",
        "Sesión nativa con Credential Manager y calendario de Google.",
        "Widget de inicio, recordatorios y alarmas nativas."
      ],
      "keywords": [
        "Capacitor",
        "Svelte",
        "TypeScript",
        "Kotlin",
        "Room",
        "WorkManager",
        "Supabase"
      ]
    },
    {
      "id": "strava-garmin-platform",
      "name": "Asistente Strava/Garmin",
      "status": "private",
      "technologies": [
        "Cloudflare Workers",
        "D1",
        "Queues",
        "R2",
        "React",
        "TypeScript",
        "Hono",
        "Vitest"
      ],
      "description": "Procesa actividades de Strava y Garmin, las cruza con el plan y el clima, y publica un título y un resumen generados con IA.",
      "overview": "Worker de Cloudflare que recibe los webhooks de Strava, compara la actividad principal del día con el plan de entrenamiento y añade el clima y los datos de carrera. Después genera con IA el título y el resumen que publica en Strava.",
      "highlights": [
        "Colas con reintentos y cola de mensajes fallidos, más cron horario y purga diaria.",
        "Tokens de Strava cifrados con AES-GCM antes de guardarse en D1.",
        "Panel de administración en React servido por el propio Worker.",
        "Importación de archivos FIT de Garmin y streams de actividad guardados en R2."
      ],
      "featured": true,
      "keywords": [
        "Cloudflare Workers",
        "D1",
        "Queues",
        "R2",
        "React",
        "TypeScript",
        "Hono",
        "Vitest"
      ]
    },
    {
      "id": "race-spending-tracker",
      "name": "Race Spending Tracker",
      "status": "private",
      "technologies": [
        "JavaScript",
        "Chrome Extensions",
        "Gmail API",
        "OAuth",
        "Playwright"
      ],
      "description": "Detecta inscripciones de nueve plataformas en tus correos y PDFs, recupera sus importes y controla el presupuesto anual.",
      "overview": "Extensión Chrome MV3 que calcula el gasto anual en inscripciones a carreras desde las confirmaciones de Gmail, con OAuth de solo lectura y almacenamiento local.",
      "highlights": [
        "Adaptadores para nueve plataformas de inscripción.",
        "Extracción acotada de texto de PDF para los importes que faltan en el correo.",
        "Sincronización con reintentos, checkpoints y reanudación.",
        "Presupuesto anual con aviso al acercarse al límite."
      ],
      "keywords": [
        "JavaScript",
        "Chrome Extensions",
        "Gmail API",
        "OAuth",
        "Playwright"
      ]
    },
    {
      "id": "caixabank-spending-tracker",
      "name": "CaixaBank Spending Tracker",
      "status": "private",
      "technologies": [
        "JavaScript",
        "Chrome Extensions",
        "Gmail API",
        "OAuth",
        "Playwright"
      ],
      "description": "Ordena y clasifica los movimientos a partir de los avisos del banco para mostrar tu gasto mensual con precisión.",
      "overview": "Extensión Chrome MV3 que calcula el gasto mensual leyendo los avisos de CaixaBank en Gmail. Reconstruye el orden real de los movimientos encadenando saldos.",
      "highlights": [
        "Orden real de los movimientos a partir de la cadena de saldos.",
        "Deduplicación por identificador de mensaje y por saldo.",
        "Reglas de categoría con aprendizaje local y promoción a código.",
        "Sincronización incremental con margen para los avisos tardíos."
      ],
      "keywords": [
        "JavaScript",
        "Chrome Extensions",
        "Gmail API",
        "OAuth",
        "Playwright"
      ]
    },
    {
      "id": "riolan-solutions",
      "name": "Riolan Solutions",
      "status": "published",
      "technologies": [
        "WordPress",
        "Elementor",
        "PHP",
        "HTML",
        "CSS"
      ],
      "description": "Presenta los servicios, trabajos y vías de contacto de una empresa de lampistería y reformas en una sola web.",
      "overview": "Sitio corporativo de una sola página para una empresa de lampistería y reformas. Está hecho con WordPress y Elementor Pro e incluye sus servicios, una galería de trabajos y un formulario de contacto.",
      "highlights": [
        "Identidad propia: paleta azul y morada, tipografías Poppins y Montserrat, e iconografía recortada a medida para los seis servicios.",
        "Página única con cabecera fija, navegación por anclas y secciones de nosotros, servicios, trabajos y contacto.",
        "Galería de 32 fotos de obra optimizadas a WebP.",
        "Bloque de contacto con teléfono, urgencias 24 h y horario, más formulario con validación de campos."
      ],
      "keywords": [
        "WordPress",
        "Elementor",
        "PHP",
        "HTML",
        "CSS"
      ]
    },
    {
      "id": "portfolio",
      "name": "Este portfolio",
      "status": "published",
      "technologies": [
        "Astro",
        "TypeScript",
        "Cloudflare Workers",
        "D1",
        "Playwright",
        "Vitest"
      ],
      "description": "El sitio que estás leyendo: un CV en JSON que genera la web, el PDF y los formatos para máquinas, con el build como control de calidad.",
      "overview": "Sitio estático en Astro sobre Cloudflare Pages, trilingüe y sin framework de interfaz. Un solo cv.json alimenta las páginas, el PDF de cada idioma, el JSON-LD y los endpoints para máquinas; lo dinámico son Pages Functions.",
      "highlights": [
        "CSP por hashes y sin unsafe-inline, recalculada desde el HTML en cada build.",
        "Presupuestos de HTML, DOM, CSS y JS que fallan el build; Lighthouse bloquea si el LCP pasa de 2,5 s.",
        "El PDF se genera y se comprueba en cada build: una hoja A4 y texto extraíble con dos motores.",
        "Límites de uso atómicos en D1, probados contra una base real."
      ],
      "links": [
        {
          "label": "Sitio web",
          "url": "https://imadelmalki.com",
          "kind": "website"
        }
      ],
      "featured": true,
      "keywords": [
        "Astro",
        "TypeScript",
        "Cloudflare Workers",
        "D1",
        "Playwright",
        "Vitest"
      ]
    }
  ],
  "skills": [
    {
      "name": "Angular",
      "level": "advanced",
      "featured": true
    },
    {
      "name": "TypeScript",
      "level": "advanced",
      "featured": true
    },
    {
      "name": "Java",
      "level": "advanced",
      "featured": true
    },
    {
      "name": "Spring Boot",
      "level": "advanced",
      "featured": true
    },
    {
      "name": "Astro",
      "level": "advanced",
      "featured": true
    },
    {
      "name": "Svelte",
      "level": "intermediate"
    },
    {
      "name": "Cloudflare Workers",
      "level": "intermediate"
    },
    {
      "name": "PostgreSQL",
      "level": "advanced"
    },
    {
      "name": "Supabase",
      "level": "advanced"
    },
    {
      "name": "Docker",
      "level": "intermediate"
    }
  ]
}