Awaretrain
Sep 2023 — presentSoftware Engineer, Nijmegen
SaaS platform for security awareness training and phishing simulation, used by companies across Europe.
Backend Software Engineer | Apeldoorn, Netherlands
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.
Software Engineer, Nijmegen
SaaS platform for security awareness training and phishing simulation, used by companies across Europe.
Software Engineer, Waalwijk
High-volume logistics platform where a slow query is a delayed shipment.
Web Developer, Arnhem
Web platforms glued to a set of older internal services.
Python Developer, Tunisia
Data collection at scale from public sources.
Full-stack Web Developer, Tunisia
Where the PHP and Symfony started.
This site
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.
Awaretrain
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.
Awaretrain
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.
Awaretrain
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.
CEVA Logistics
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.
GIMtransfer
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.
DATABIZ
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.
Scrum.org
PSM II, advanced Scrum Master certification covering servant leadership, team dynamics and evidence-based delivery.
View Badge