Nader Ghanem

Backend Software Engineer | Apeldoorn, Netherlands

I build the parts of a product nobody sees: the queues, APIs and data flows that have to keep running.

About

Backend engineer on systems where failure is expensive, a European SaaS platform, a high-volume logistics operation. PHP and Symfony are where I've gone deepest, with production work in Python and JavaScript alongside it. The problems that take the time are the same in any language: queues that recover, queries that hold up under load, and enough observability that someone other than me can find the fault.

I care about clean code and practical solutions over clever ones. I'm a PSM II certified Scrum Master, so I'm comfortable leading technical decisions and unblocking the people around me.

Skills

Languages

  • PHP
  • SQL
  • JavaScript
  • Python

Frameworks

  • Symfony
  • Laravel
  • Doctrine ORM

Frontend

  • Vue.js
  • Inertia.js
  • Angular

Data

  • MySQL
  • PostgreSQL
  • Redis

Messaging

  • RabbitMQ
  • Symfony Messenger

Infrastructure

  • Docker
  • Kubernetes
  • CircleCI
  • AWS Lambda

Observability

  • Grafana
  • Loki
  • Mimir
  • CloudWatch

Storage

  • MinIO
  • S3

Testing

  • Pest
  • PHPUnit
  • Zenstruck Foundry

AI

  • OpenAI API
  • LangChain
  • Prompt engineering

Experience

Awaretrain

Sep 2023 — present

Software Engineer, Nijmegen

SaaS platform for security awareness training and phishing simulation, used by companies across Europe.

CEVA Logistics

Jul 2021 — Jul 2023

Software Engineer, Waalwijk

High-volume logistics platform where a slow query is a delayed shipment.

GIMtransfer

Jan 2020 — Jan 2021

Web Developer, Arnhem

Web platforms glued to a set of older internal services.

DATABIZ

Aug 2019 — Dec 2019

Python Developer, Tunisia

Data collection at scale from public sources.

CIEG+

Jun 2016 — Jul 2019

Full-stack Web Developer, Tunisia

Where the PHP and Symfony started.

Case notes

A chat assistant that refuses most questions

This site

AstroCloudflare PagesWorkers AITypeScript

The hard part of a chat box on a portfolio is not answering questions about my CV. It is declining everything else: writing a visitor’s code, judging their hiring process, inventing experience I do not have.

Everything it knows is my CV and these write-ups, assembled at build time from the same files this page renders, so its answers cannot drift from what you are reading. The whole corpus is about two thousand tokens, small enough to hand over whole, so there is no retrieval step and no vector store to keep in sync. It answers from a Cloudflare Pages Function on a model binding, so no API key reaches the browser, under caps on message length, turn count and reply length.

Visitor text is treated as a question, never as an instruction. The scope rule is written as what the assistant is for rather than as a list of banned topics, because a blocklist invites people to go looking for the gap.

Retries that know when to give up

Awaretrain

Symfony MessengerSMTPPHP

A mailbox that no longer exists and a mail server having a bad minute fail the same way at the transport level. Treat them identically and permanent rejections ride the full backoff schedule, crowding out the transient failures a retry would actually fix.

I designed a retry strategy for the mail queue that reads the SMTP response and splits the two: permanent rejections stop after the first attempt and are recorded, transient ones back off and try again. Not much code, and it decides whether the retry queue is reporting problems worth acting on or just talking to itself.

Campaign reporting people can hand upward

Awaretrain

PHPPDF generationObject storage

A phishing campaign produces a lot of events. What a security officer needs from it is one document they can forward to management without editing it first.

I led that summary export end to end: scoping with product, designing the aggregation, building the rendering pipeline, and taking it through release. Deciding what a reader who was never in the tool needs to see is most of the work. The PDF is the easy half.

Failure visibility for the support team

Awaretrain

GrafanaLokiCloudWatch

Support could tell that something had broken for a customer, but not what, so every question became an engineering interrupt.

I built dashboards over the platform’s logs and metrics so the team could trace a failed action themselves: which service, which error, and when. Engineering stopped being the first stop for triage.

Backend components for time-sensitive logistics

CEVA Logistics

SymfonyMySQLDoctrine

Shipment data passes through many hands, and every stage has a deadline.

I built modular backend components handling that flow. A good share of the work was on the database side, reworking queries and access patterns where the latency was showing up in daily operations rather than in a profiler. Shipped in a Scrum team on a frequent release cadence, with QA involved early enough to catch edge cases before customers did.

Bridges between older services and newer platforms

GIMtransfer

PythonREST APIsSQL

Older Java-based internal services held data the newer web platforms needed, and moving it between them was a manual job.

I wrote Python services to carry that data across, and integrated third-party APIs into the platforms themselves. Routine integration work that took a recurring manual step out of the week.

Data collection pipelines

DATABIZ

ScrapySeleniumPostgreSQL

Extraction pipelines against public web sources, handling the usual realities: pagination, rate limits, markup that changes without warning, and pages that only render under a real browser.

Collected data landed in a schema designed for querying rather than just storing, so the people who asked for it could use it without a second pass.

Certification

Professional Scrum Master II

Scrum.org

PSM II, advanced Scrum Master certification covering servant leadership, team dynamics and evidence-based delivery.

View Badge

Education

MSc, Big Data Science2019 — 2021Central University, Tunis
BSc, Computer Science2011 — 2014University of Tunis El Manar
< Built with passion by Nader Ghanem />💻 ☕ 🎮© 2026 All rights reserved

Ask about my experience