
Passenger
Ayoub Hammoudi
Software engineer, full-stack and AI platforms
From
Tunis · ESPRIT
To
Your team
Boarding
Feb 2027
Gate
Paris · EU
Carry-on
11 PRs merged upstream
github.com/Ayoubhm07

Paris · open to full-time roles, February 2027
Software engineer, full-stack and AI platforms. I build data and LLM systems end to end, and my fixes land in Apache and Microsoft codebases.

Passenger
Ayoub Hammoudi
Software engineer, full-stack and AI platforms
From
Tunis · ESPRIT
To
Your team
Boarding
Feb 2027
Gate
Paris · EU
Carry-on
11 PRs merged upstream
github.com/Ayoubhm07
Code merged into
Built with and for
02Work
Each chapter is a system I built alone, with the figure that proves it and the file that proves the figure. Open the book.


Field Notes
Four systems built alone
Ayoub Hammoudi
Vol. I · 2026
Drag a page, use the arrow keys, or pull a ribbon. Or read every chapter as plain text.
03Lab
No screenshots. The chain, the earthquakes and the molecules below are the ones the projects produced, pinned to a commit.
lab://taintrace · real data, pinned to a commit
Running04Skills
Read from the fifteen projects on my LinkedIn profile. Six domains orbit a core, the projects ride the ring outside. Point at a skill to see where it was used, or at a project to see what it was built with.
Sealed until you jump
43 skills · 15 projects · 6 domains
Drag to turn the galaxy. Point at a skill or a project to light its threads.

05Open source
Apache, Microsoft, Prefect, SQLGlot, Agno. Each one started with a defect I traced to its line and ended with a maintainer pressing merge.
Fifteen pull requests had fixed one identifier bug, component by component. One registry-wide test now catches it the day a converter lands Read the story
Non-streamed Gemini calls could report the client default instead of the model the caller requested
Redis keyword search ignored its limit, hidden by two defaults of 10 that happened to agree. Ask for 50, get 10
Six character-level selection strategies reported no settings, so converters selecting different text shared one hash
Duplicate test dependencies, removed with the dependency graph proven identical Read the story
Streamed Gemini calls lost their model name, so token metrics belonged to no model Read the story
Two scorers with different settings shared one identity, so cached results crossed over Read the story
Score categories came out mangled in the printed score
A debug log printed in production for five years, removed Read the story
DuckDB output dropped the UNIFORM seed, so every seed gave the same SQL
The configured Mattermost botname was silently ignored
apache/beam #40430
A debug log printed in production for five years. Five years to the day.
@@ -1149,7 +1149,6 @@ def _setup_temporary_dataset(self, bq): return location = bq.get_query_location( self._get_parent_project(), self.query.get(), self.use_legacy_sql)- _LOGGER.warning("### Labels: %s", str(self.bigquery_dataset_labels)) bq.create_temporary_dataset( self._get_parent_project(), location,

06Journey · Paris, open to relocation in Europe
Internships, work-study, freelance missions and a company of my own, newest first.
Sep 2026 - present · Remote
Full-stack developer · Freelance
Jan 2026 - present · Paris
Founder and software engineer · Founder
May 2026 - Sep 2026 · Remote
Full-stack engineer · Freelance
Jan 2026 - Aug 2026 · Paris
Full-stack developer, work-study · Work-study
Dec 2025 - Feb 2026 · Remote
Full-stack engineer · Freelance
Aug 2025 - Jan 2026 · Paris
Full-stack developer intern · Internship
Jun 2024 - Nov 2024 · Dubai, remote
Full-stack developer · Freelance
Jun 2023 - Sep 2023 · Tunis
Software engineer intern · Internship
Jun 2022 - Jul 2022 · Tunis
Software engineer intern · Internship
IPSSI
Master's programme, AI and Big Data development
Paris · Feb 2026 - Mar 2027
ESPRIT
Engineering degree, software engineering
Tunis · Sep 2019 - Jun 2025
07From the blog
Short write-ups of fixes merged upstream: the defect, what review found, and what I took from it.

· 2 min read
In Microsoft PyRIT, a setting could change what a converter produces without changing its identifier. One registry-wide test now catches that the day a converter lands, and a maintainer broke it twice before it merged.
Read
· 2 min read
Streamed Gemini calls in Microsoft Agent Framework lost their model name, so token metrics belonged to no model. The merged fix is stream-scoped, and it took review to get there.
Read
08Contact
Available for full-time roles from February 2027, in Paris or anywhere in Europe.
ayoub.hammoudi05@gmail.com