{
  "$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 y productos full-stack",
    "image": "https://imadelmalki.com/portrait.webp",
    "email": "imadelmalkij@gmail.com",
    "summary": "Desarrollador de software con experiencia profesional en Angular y colaboración con backends Java/Spring Boot. En proyectos propios construyo productos de extremo a extremo con TypeScript, Kotlin, React, Svelte y servicios cloud. Me interesa transformar problemas reales —incluidos el running y la productividad personal— en aplicaciones útiles, mantenibles y bien probadas.",
    "location": {
      "city": "La Gornal",
      "region": "Cataluña",
      "countryCode": "ES"
    },
    "profiles": [
      {
        "network": "LinkedIn",
        "username": "imad-el-malki-jaddi-a0585a284",
        "url": "https://www.linkedin.com/in/imad-el-malki-jaddi-a0585a284/"
      },
      {
        "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": "2024-02-01",
      "summary": "Desarrollo y evolución de aplicaciones web para el sector público con Angular, integradas con APIs y backends Java/Spring Boot.",
      "highlights": [
        "Participación en CIRNM, sistema municipal relacionado con la gestión ambiental.",
        "Desarrollo y evolución de SIVCA, sistema municipal integrado con MiNT para gestionar, validar y monitorizar datos de calidad del aire de Madrid.",
        "Implementación de componentes, pantallas y nuevas funcionalidades, mantenimiento evolutivo e integración con APIs en colaboración con equipos backend Java y QA."
      ]
    },
    {
      "name": "INETUM",
      "position": "Desarrollador web en prácticas",
      "url": "https://www.inetum.com/es",
      "startDate": "2022-05-01",
      "summary": "Desarrollo web y de soluciones empresariales low-code durante el periodo de prácticas.",
      "highlights": [
        "Desarrollo de aplicaciones empresariales con Microsoft Power Apps.",
        "Creación de cuadros de mando e informes con Microsoft Power BI.",
        "Desarrollo web con JavaScript, Laravel, HTML, CSS, jQuery y Bootstrap."
      ],
      "endDate": "2023-05-01"
    }
  ],
  "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"
    }
  ],
  "languages": [
    {
      "language": "Español",
      "fluency": "Nativo"
    },
    {
      "language": "Catalán",
      "fluency": "Nativo"
    },
    {
      "language": "Árabe",
      "fluency": "Nativo"
    },
    {
      "language": "Bereber (amazig)",
      "fluency": "Nativo"
    },
    {
      "language": "Inglés",
      "fluency": "Intermedio"
    }
  ],
  "projects": [
    {
      "id": "amazon-spending-tracker",
      "name": "Amazon Spending Tracker",
      "status": "published",
      "technologies": [
        "JavaScript",
        "Chrome Extensions",
        "Gmail API",
        "OAuth"
      ],
      "description": "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 que los varios correos de una misma compra no se sumen dos veces.",
        "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": "Aplicación full-stack sobre el reto de los 100 cims de la FEEC: Angular para consultar las cimas, API REST en Spring Boot con PostgreSQL sobre Docker, y scripts en Python que recopilan, insertan y optimizan 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."
      ],
      "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": "App Android construida con Capacitor: la interfaz es Svelte 5 en un WebView y un motor nativo en Kotlin posee los datos, la sincronización, la red y el cálculo. Planifica carreras, calcula ritmos y splits, consulta clima y rutas y sincroniza el calendario entre dispositivos.",
      "highlights": [
        "Room como única fuente de datos y WorkManager como único motor de sincronización con Supabase.",
        "Predicciones de ritmo, splits y desnivel calculados en Kotlin.",
        "Inicio de sesión nativo con Credential Manager y calendario mediante la API de autorización de Google.",
        "Widget de pantalla de inicio, recordatorios y alarmas nativas."
      ],
      "keywords": [
        "Capacitor",
        "Svelte",
        "TypeScript",
        "Kotlin",
        "Room",
        "WorkManager",
        "Supabase"
      ]
    },
    {
      "id": "strava-garmin-platform",
      "name": "Plataforma Strava/Garmin",
      "status": "private",
      "technologies": [
        "Cloudflare Workers",
        "D1",
        "Queues",
        "R2",
        "React",
        "TypeScript",
        "Hono",
        "Vitest"
      ],
      "description": "Worker de Cloudflare que escucha los webhooks de Strava, clasifica la actividad principal del día contra un plan de entrenamiento, la enriquece con clima y datos de carrera, y genera con IA el título y la entradilla que republica 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."
      ],
      "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": "Extensión Chrome MV3 que calcula el gasto anual en inscripciones a carreras desde las confirmaciones de Gmail, con OAuth de solo lectura, clasificación conservadora por plataforma y almacenamiento local.",
      "highlights": [
        "Adaptadores para nueve plataformas de inscripción.",
        "Extracción acotada de texto de PDF para recuperar los importes que faltan en el correo.",
        "Sincronización con reintentos, checkpoints y reanudación tras una parada.",
        "Presupuesto por año 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": "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, en vez de fiarse de la hora de llegada del correo.",
      "highlights": [
        "Orden real de los movimientos reconstruido a partir de la cadena de saldos.",
        "Deduplicación por identificador de mensaje y por saldo, para no perder dos compras iguales el mismo día.",
        "Reglas de categoría con aprendizaje local y promoción a código.",
        "Sincronización incremental con margen para los avisos que llegan con retraso."
      ],
      "keywords": [
        "JavaScript",
        "Chrome Extensions",
        "Gmail API",
        "OAuth",
        "Playwright"
      ]
    }
  ],
  "skills": [
    {
      "name": "Angular"
    },
    {
      "name": "TypeScript"
    },
    {
      "name": "JavaScript"
    },
    {
      "name": "Java"
    },
    {
      "name": "Spring Boot"
    },
    {
      "name": "Power Apps"
    },
    {
      "name": "Power BI"
    },
    {
      "name": "HTML"
    },
    {
      "name": "CSS"
    },
    {
      "name": "React"
    },
    {
      "name": "Svelte"
    },
    {
      "name": "Kotlin"
    },
    {
      "name": "Cloudflare Workers"
    },
    {
      "name": "Astro"
    },
    {
      "name": "PostgreSQL"
    },
    {
      "name": "MySQL"
    },
    {
      "name": "Supabase"
    },
    {
      "name": "Docker"
    },
    {
      "name": "Git"
    },
    {
      "name": "GitHub"
    }
  ]
}