{
  "$schema": "https://raw.githubusercontent.com/jsonresume/resume-schema/v1.2.1/schema.json",
  "basics": {
    "name": "Imad El Malki Jaddi",
    "label": "Software developer · Angular & Java",
    "image": "https://imadelmalki.com/portrait.webp",
    "email": "imadelmalkij@gmail.com",
    "phone": "+34641829721",
    "summary": "I am a software developer specialising in Angular and Java. Since 2023 I have been at VIEWNEXT, building web applications alongside Java and QA teams. Outside work I build my own projects end to end, database, deployment and product decisions included; several of them are published and in use.",
    "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/en/"
  },
  "work": [
    {
      "name": "VIEWNEXT",
      "position": "Angular Developer",
      "url": "https://www.viewnext.com/",
      "startDate": "2023-07-04",
      "summary": "I build Angular applications for the public sector with APIs and Java/Spring Boot backends.",
      "highlights": [
        "I contribute to CIRNM, a municipal system related to environmental management.",
        "I build and improve SIVCA, integrated with MiNT to manage, validate and monitor Madrid's air-quality data.",
        "I implement components, screens and new features, maintain the application and integrate APIs with Java and QA teams."
      ],
      "description": "An IBM subsidiary"
    },
    {
      "name": "INETUM",
      "position": "Web developer",
      "url": "https://www.inetum.com/es/es.html",
      "startDate": "2022-05-02",
      "summary": "Development of internal and web applications at Inetum Catalunya, with low-code tools and web technologies.",
      "highlights": [
        "I built enterprise applications with Microsoft Power Apps.",
        "I created dashboards and reports with Microsoft Power BI."
      ],
      "endDate": "2022-09-21"
    }
  ],
  "otherWork": [
    {
      "name": "Toende",
      "position": "Warehouse and production operative",
      "field": "Manufacturing",
      "startDate": "2022-10-18",
      "endDate": "2023-06-30",
      "url": "https://resetbytoende.com"
    },
    {
      "name": "Laineblock",
      "position": "Production and warehouse operative",
      "field": "Industry",
      "startDate": "2022-02-11",
      "endDate": "2022-03-12",
      "url": "https://www.laineblock.com"
    },
    {
      "name": "Kettal",
      "position": "Factory operative",
      "field": "Furniture",
      "startDate": "2021-05-23",
      "endDate": "2021-09-30",
      "url": "https://www.kettal.com"
    },
    {
      "name": "Pere Ventura",
      "position": "Disgorging line operator",
      "field": "Sparkling wine",
      "startDate": "2018-09-03",
      "endDate": "2020-03-13",
      "url": "https://www.pereventura.com"
    },
    {
      "name": "Pastisart",
      "position": "Packaging operator",
      "field": "Food production",
      "startDate": "2018-06-07",
      "endDate": "2018-08-29",
      "url": "https://www.pastisart.com"
    },
    {
      "name": "Vacu Vin",
      "position": "Packaging operator",
      "location": "Netherlands",
      "field": "Manufacturing",
      "startDate": "2017-07-01",
      "endDate": "2017-10-01",
      "url": "https://www.vacuvin.com"
    },
    {
      "name": "McDonald's",
      "position": "Kitchen crew member",
      "location": "Netherlands",
      "field": "Hospitality",
      "startDate": "2017-01-02",
      "endDate": "2017-06-03",
      "url": "https://www.mcdonalds.nl"
    },
    {
      "name": "Leen Menken",
      "position": "Warehouse operative",
      "location": "Netherlands",
      "field": "Logistics",
      "startDate": "2016-12-01",
      "endDate": "2017-06-01",
      "url": "https://www.leenmenken.nl"
    },
    {
      "name": "Reverté Productos Minerales",
      "position": "Maintenance operative",
      "field": "Industry",
      "startDate": "2016-02-18",
      "endDate": "2016-02-26",
      "url": "https://reverteminerals.com"
    },
    {
      "name": "VD Holland",
      "position": "Farm operative",
      "location": "Netherlands",
      "field": "Agriculture",
      "startDate": "2016-01-01",
      "endDate": "2016-02-01",
      "url": "https://www.vdholland.nl"
    },
    {
      "name": "Viticultura Planas 1916",
      "position": "Farm operative",
      "field": "Agriculture",
      "startDate": "2015-12-09",
      "endDate": "2015-12-18",
      "url": "https://www.viversplanas.com"
    },
    {
      "name": "Iberdrola",
      "position": "Customer service agent",
      "field": "Energy",
      "startDate": "2015-06-01",
      "endDate": "2015-07-01",
      "url": "https://www.iberdrola.es"
    }
  ],
  "otherSkills": [
    "Office software",
    "Equipment repair",
    "Forklift"
  ],
  "education": [
    {
      "institution": "Institut Camí de Mar",
      "area": "Web Application Development (DAW)",
      "studyType": "Advanced Vocational Training Diploma",
      "startDate": "2021-09-01",
      "endDate": "2023-05-01"
    },
    {
      "institution": "Institut de l'Arboç · Institut Manuel de Cabanyes",
      "area": "Science and Technology",
      "studyType": "Upper secondary education",
      "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: new features and best practices",
      "issuer": "Viewnext",
      "date": "2025-02-08",
      "hours": 8
    },
    {
      "name": "Advanced SQL",
      "issuer": "Viewnext",
      "date": "2025-02-08",
      "hours": 8
    },
    {
      "name": "JavaScript",
      "issuer": "Viewnext",
      "date": "2025-02-08",
      "hours": 8
    },
    {
      "name": "Responsive design with Bootstrap",
      "issuer": "Viewnext",
      "date": "2025-02-08",
      "hours": 12
    },
    {
      "name": "Performance best practices",
      "issuer": "Viewnext",
      "date": "2025-02-08",
      "hours": 8
    },
    {
      "name": "Security and privacy by design (technical)",
      "issuer": "Viewnext",
      "date": "2025-02-08",
      "hours": 3
    },
    {
      "name": "Crypt0 · Cybersecurity",
      "issuer": "IBM",
      "date": "2026-07-07",
      "hours": 3
    },
    {
      "name": "English proficiency test · CEFR B2",
      "issuer": "goFLUENT",
      "date": "2024-09-02"
    }
  ],
  "languages": [
    {
      "language": "Spanish",
      "fluency": "Native",
      "level": "native"
    },
    {
      "language": "Catalan",
      "fluency": "Native",
      "level": "native"
    },
    {
      "language": "Arabic",
      "fluency": "Native",
      "level": "native"
    },
    {
      "language": "Berber (Amazigh)",
      "fluency": "Native",
      "level": "native"
    },
    {
      "language": "English",
      "fluency": "Upper intermediate",
      "level": "B2"
    }
  ],
  "projects": [
    {
      "id": "amazon-spending-tracker",
      "name": "Amazon Spending Tracker",
      "status": "published",
      "technologies": [
        "JavaScript",
        "Chrome Extensions",
        "Gmail API",
        "OAuth"
      ],
      "description": "Rebuilds your purchase history from Amazon emails, avoids duplicate orders and calculates your yearly spending.",
      "overview": "Chrome MV3 extension that calculates and breaks down yearly Amazon spending from Gmail confirmations, with read-only OAuth, deduplication and local storage.",
      "highlights": [
        "Deduplication by order number, so emails from the same purchase are not counted twice.",
        "Hourly incremental sync plus a weekly full scan.",
        ".xlsx export generated with no dependencies.",
        "Spanish and English interface; data never leaves the browser."
      ],
      "links": [
        {
          "label": "Website",
          "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": "Brings the 100 Cims challenge together in a catalogue with individual peak pages, photographs and automatically prepared data.",
      "overview": "An application for the FEEC 100 Cims challenge. It uses Angular to browse the peaks, a Spring Boot and PostgreSQL REST API, and Python scripts to collect and prepare the data and images.",
      "highlights": [
        "REST API with Maven and PostgreSQL 17 in a container.",
        "Python pipeline that collects the peak data and loads it into the database.",
        "Image download and optimisation to WebP.",
        "Dataset restore from 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": "Organises your races, calculates paces, splits and elevation gain, and syncs reminders with Google Calendar.",
      "overview": "An Android app built with Capacitor and a Svelte 5 interface. Its native Kotlin layer handles data, synchronisation and pace, split and elevation calculations.",
      "highlights": [
        "Room as the single source of data and WorkManager as the sole sync engine against Supabase.",
        "Paces, splits and elevation gain computed in Kotlin.",
        "Native sign-in with Credential Manager and Google Calendar access.",
        "Home-screen widget, reminders and native alarms."
      ],
      "keywords": [
        "Capacitor",
        "Svelte",
        "TypeScript",
        "Kotlin",
        "Room",
        "WorkManager",
        "Supabase"
      ]
    },
    {
      "id": "strava-garmin-platform",
      "name": "Strava/Garmin Training Assistant",
      "status": "private",
      "technologies": [
        "Cloudflare Workers",
        "D1",
        "Queues",
        "R2",
        "React",
        "TypeScript",
        "Hono",
        "Vitest"
      ],
      "description": "Processes Strava and Garmin activities, matches them against the training plan and weather, and publishes an AI-generated title and summary.",
      "overview": "A Cloudflare Worker that receives Strava webhooks, compares the day's main activity with the training plan, and adds weather and race data. It then uses AI to generate the title and summary published to Strava.",
      "highlights": [
        "Queues with retries and a dead-letter queue, plus an hourly cron and a daily purge.",
        "Strava tokens encrypted with AES-GCM before being stored in D1.",
        "React admin dashboard served by the Worker itself.",
        "Garmin FIT file import and activity streams stored in 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": "Detects entries from nine platforms in emails and PDFs, recovers their costs and tracks the yearly budget.",
      "overview": "Chrome MV3 extension that calculates yearly race-registration spending from Gmail confirmations, with read-only OAuth and local storage.",
      "highlights": [
        "Adapters for nine race-registration platforms.",
        "Bounded PDF text extraction for amounts missing from the email.",
        "Sync with retries, checkpoints and resume.",
        "Yearly budget with a warning as the limit approaches."
      ],
      "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": "Orders and classifies transactions from bank alerts to give you an accurate view of your monthly spending.",
      "overview": "Chrome MV3 extension that calculates monthly spending by reading CaixaBank alerts in Gmail. It reconstructs the real transaction order by chaining balances.",
      "highlights": [
        "Real transaction order from the chain of balances.",
        "Deduplication by message id and by balance.",
        "Category rules with local learning and promotion into code.",
        "Incremental sync with a margin for late alerts."
      ],
      "keywords": [
        "JavaScript",
        "Chrome Extensions",
        "Gmail API",
        "OAuth",
        "Playwright"
      ]
    },
    {
      "id": "riolan-solutions",
      "name": "Riolan Solutions",
      "status": "published",
      "technologies": [
        "WordPress",
        "Elementor",
        "PHP",
        "HTML",
        "CSS"
      ],
      "description": "Presents the services, completed work and contact options of a plumbing and renovation company on a single website.",
      "overview": "A one-page company website for a plumbing and home-renovation business. Built with WordPress and Elementor Pro, it presents the services, a gallery of completed work and a contact form.",
      "highlights": [
        "Custom identity: blue and purple palette, Poppins and Montserrat, and cut-out iconography made for the six services.",
        "Single page with a sticky header, anchor navigation and about, services, work and contact sections.",
        "Gallery of 32 job-site photos optimised to WebP.",
        "Contact block with phone, 24h emergencies and opening hours, plus a form with field validation."
      ],
      "keywords": [
        "WordPress",
        "Elementor",
        "PHP",
        "HTML",
        "CSS"
      ]
    },
    {
      "id": "portfolio",
      "name": "This portfolio",
      "status": "published",
      "technologies": [
        "Astro",
        "TypeScript",
        "Cloudflare Workers",
        "D1",
        "Playwright",
        "Vitest"
      ],
      "description": "The site you are reading: one JSON CV that generates the pages, the PDF and the machine-readable formats, with the build as the quality gate.",
      "overview": "A static Astro site on Cloudflare Pages, trilingual and with no UI framework. A single cv.json feeds the pages, each language's PDF, the JSON-LD and the machine-readable endpoints; the dynamic parts are Pages Functions.",
      "highlights": [
        "A hash-based CSP with no unsafe-inline, recomputed from the HTML on every build.",
        "HTML, DOM, CSS and JS budgets that fail the build; Lighthouse blocks when LCP goes over 2.5 s.",
        "The PDF is generated and checked on every build: one A4 sheet, text extractable by two engines.",
        "Atomic rate limits in D1, tested against a real database."
      ],
      "links": [
        {
          "label": "Website",
          "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"
    }
  ]
}