{
  "$schema": "https://raw.githubusercontent.com/jsonresume/resume-schema/v1.2.1/schema.json",
  "basics": {
    "name": "Imad El Malki Jaddi",
    "label": "Desenvolupador de programari | Angular, Java i productes full-stack",
    "image": "https://imadelmalki.com/portrait.webp",
    "email": "imadelmalkij@gmail.com",
    "summary": "Desenvolupador de programari amb experiència professional en Angular i col·laboració amb backends Java/Spring Boot. En projectes propis construeixo productes d'extrem a extrem amb TypeScript, Kotlin, React, Svelte i serveis al núvol. M'interessa transformar problemes reals —inclosos el running i la productivitat personal— en aplicacions útils, mantenibles i ben provades.",
    "location": {
      "city": "La Gornal",
      "region": "Catalunya",
      "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/ca/"
  },
  "work": [
    {
      "name": "VIEWNEXT",
      "position": "Angular Developer",
      "url": "https://www.viewnext.com/",
      "startDate": "2024-02-01",
      "summary": "Desenvolupament i evolució d'aplicacions web per al sector públic amb Angular, integrades amb APIs i backends Java/Spring Boot.",
      "highlights": [
        "Participació en CIRNM, sistema municipal relacionat amb la gestió ambiental.",
        "Desenvolupament i evolució de SIVCA, sistema municipal integrat amb MiNT per gestionar, validar i monitorar dades de qualitat de l'aire de Madrid.",
        "Implementació de components, pantalles i noves funcionalitats, manteniment evolutiu i integració amb APIs en col·laboració amb equips backend Java i QA."
      ]
    },
    {
      "name": "INETUM",
      "position": "Desenvolupador web en pràctiques",
      "url": "https://www.inetum.com/es",
      "startDate": "2022-05-01",
      "summary": "Desenvolupament web i de solucions empresarials low-code durant el període de pràctiques.",
      "highlights": [
        "Desenvolupament d'aplicacions empresarials amb Microsoft Power Apps.",
        "Creació de quadres de comandament i informes amb Microsoft Power BI.",
        "Desenvolupament web amb JavaScript, Laravel, HTML, CSS, jQuery i Bootstrap."
      ],
      "endDate": "2023-05-01"
    }
  ],
  "education": [
    {
      "institution": "Institut Camí de Mar",
      "area": "Desenvolupament d'Aplicacions Web (DAW)",
      "studyType": "Cicle Formatiu de Grau Superior",
      "startDate": "2021-09-01",
      "endDate": "2023-05-01"
    }
  ],
  "languages": [
    {
      "language": "Castellà",
      "fluency": "Natiu"
    },
    {
      "language": "Català",
      "fluency": "Natiu"
    },
    {
      "language": "Àrab",
      "fluency": "Natiu"
    },
    {
      "language": "Berber (amazic)",
      "fluency": "Natiu"
    },
    {
      "language": "Anglès",
      "fluency": "Intermedi"
    }
  ],
  "projects": [
    {
      "id": "amazon-spending-tracker",
      "name": "Amazon Spending Tracker",
      "status": "published",
      "technologies": [
        "JavaScript",
        "Chrome Extensions",
        "Gmail API",
        "OAuth"
      ],
      "description": "Extensió Chrome MV3 que calcula i desglossa la despesa anual a Amazon a partir de les confirmacions de Gmail, amb OAuth de només lectura, deduplicació i emmagatzematge local.",
      "highlights": [
        "Deduplicació per número de comanda, perquè els diversos correus d'una mateixa compra no se sumin dues vegades.",
        "Sincronització incremental cada hora i escaneig complet setmanal.",
        "Exportació a .xlsx generada sense dependències.",
        "Interfície en castellà i anglès; les dades no surten del navegador."
      ],
      "links": [
        {
          "label": "Lloc 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ó full-stack sobre el repte dels 100 cims de la FEEC: Angular per consultar els cims, API REST en Spring Boot amb PostgreSQL sobre Docker, i scripts en Python que recopilen, insereixen i optimitzen les dades i les imatges.",
      "highlights": [
        "API REST amb Maven i PostgreSQL 17 en contenidor.",
        "Procés en Python que recopila les dades dels cims i les carrega a la base de dades.",
        "Descàrrega i optimització de les imatges a WebP.",
        "Restauració del conjunt de dades des de 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 construïda amb Capacitor: la interfície és Svelte 5 en un WebView i un motor natiu en Kotlin posseeix les dades, la sincronització, la xarxa i el càlcul. Planifica curses, calcula ritmes i splits, consulta el temps i les rutes i sincronitza el calendari entre dispositius.",
      "highlights": [
        "Room com a única font de dades i WorkManager com a únic motor de sincronització amb Supabase.",
        "Prediccions de ritme, splits i desnivell calculats en Kotlin.",
        "Inici de sessió natiu amb Credential Manager i calendari mitjançant l'API d'autorització de Google.",
        "Widget de pantalla d'inici, recordatoris i alarmes natives."
      ],
      "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 escolta els webhooks de Strava, classifica l'activitat principal del dia contra un pla d'entrenament, l'enriqueix amb el temps i dades de cursa, i genera amb IA el títol i l'entradeta que republica a Strava.",
      "highlights": [
        "Cues amb reintents i cua de missatges fallits, més cron horari i purga diària.",
        "Tokens de Strava xifrats amb AES-GCM abans de desar-los a D1.",
        "Tauler d'administració en React servit pel mateix Worker.",
        "Importació d'arxius FIT de Garmin i streams d'activitat desats a 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ó Chrome MV3 que calcula la despesa anual en inscripcions a curses a partir de les confirmacions de Gmail, amb OAuth de només lectura, classificació conservadora per plataforma i emmagatzematge local.",
      "highlights": [
        "Adaptadors per a nou plataformes d'inscripció.",
        "Extracció acotada de text de PDF per recuperar els imports que falten al correu.",
        "Sincronització amb reintents, checkpoints i represa després d'una aturada.",
        "Pressupost per any amb avís en acostar-se al límit."
      ],
      "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ó Chrome MV3 que calcula la despesa mensual llegint els avisos de CaixaBank a Gmail. Reconstrueix l'ordre real dels moviments encadenant saldos, en comptes de refiar-se de l'hora d'arribada del correu.",
      "highlights": [
        "Ordre real dels moviments reconstruït a partir de la cadena de saldos.",
        "Deduplicació per identificador de missatge i per saldo, per no perdre dues compres iguals el mateix dia.",
        "Regles de categoria amb aprenentatge local i promoció a codi.",
        "Sincronització incremental amb marge per als avisos que arriben amb retard."
      ],
      "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"
    }
  ]
}