From 1004d9d2e40c96d6fe8061d09145898ba1782245 Mon Sep 17 00:00:00 2001
From: Proxynth
Date: Sun, 23 Aug 2026 16:52:49 +0200
Subject: [PATCH 01/21] feat: build portfolio homepage
---
src/pages/index.astro | 10 +++++-----
1 file changed, 5 insertions(+), 5 deletions(-)
diff --git a/src/pages/index.astro b/src/pages/index.astro
index c04f360..8599dee 100644
--- a/src/pages/index.astro
+++ b/src/pages/index.astro
@@ -1,11 +1,11 @@
---
import Welcome from '../components/Welcome.astro';
import Layout from '../layouts/Layout.astro';
-
-// Welcome to Astro! Wondering what to do next? Check out the Astro documentation at https://docs.astro.build
-// Don't want to use any of this? Delete everything in this file, the `assets`, `components`, and `layouts` directories, and start fresh.
---
-
-
+
+
From 1e300fd6e77361a3ffd20a6b7b04b57d234e3352 Mon Sep 17 00:00:00 2001
From: Proxynth
Date: Sun, 23 Aug 2026 16:52:52 +0200
Subject: [PATCH 02/21] feat: add portfolio metadata
---
src/layouts/Layout.astro | 55 ++++++++++++++++++++++++++--------------
1 file changed, 36 insertions(+), 19 deletions(-)
diff --git a/src/layouts/Layout.astro b/src/layouts/Layout.astro
index 21bfe59..05de5d0 100644
--- a/src/layouts/Layout.astro
+++ b/src/layouts/Layout.astro
@@ -1,23 +1,40 @@
+---
+interface Props {
+ title?: string;
+ description?: string;
+}
+
+const {
+ title = 'Thibaud Willm — Senior Backend Engineer',
+ description = 'Senior Backend Engineer spécialisé dans les systèmes complexes, les paiements et la fiabilité.',
+} = Astro.props;
+---
+
-
-
-
-
-
-
-
- Astro Basics
-
-
-
-
+
+
+
+
+
+
+ {title}
+
+
+
+
-
From 8dabe380123f32cc4ffa03edc8d6a9419d24fbe7 Mon Sep 17 00:00:00 2001
From: Proxynth
Date: Sun, 23 Aug 2026 16:52:57 +0200
Subject: [PATCH 03/21] feat: add backend engineer portfolio content
---
src/components/Welcome.astro | 338 ++++++++++++++---------------------
1 file changed, 131 insertions(+), 207 deletions(-)
diff --git a/src/components/Welcome.astro b/src/components/Welcome.astro
index 6652a75..3964f18 100644
--- a/src/components/Welcome.astro
+++ b/src/components/Welcome.astro
@@ -1,210 +1,134 @@
----
-import astroLogo from '../assets/astro.svg';
-import background from '../assets/background.svg';
----
-
-
+
+
+ TW.
+
+
+
+
+ Senior Backend Engineer · PHP/Laravel · Go
+ Je construis des systèmes backend que l’on peut comprendre, tester et exploiter sereinement.
+
+ Dix ans d’expérience sur des plateformes SaaS, des systèmes de paiement et des services distribués.
+ J’aime les problèmes complexes, les frontières explicites et les compromis qui tiennent en production.
+
+
+
+
+
+ 10 ans de développement logiciel
+ Go + PHP backend de production
+ Paiements intégrations et fiabilité
+ IC ownership sans management
+
+
+
+
+
Sélection de travaux
+
Des projets qui montrent comment je pense.
+
+
+
+
+ 01 Go · Payments · Open source
+ Payment Sandbox
+
+ Simulateur de systèmes de paiement conçu pour tester les intégrations face aux retries,
+ aux réponses perdues, aux webhooks dupliqués ou désordonnés et aux courses concurrentes.
+
+ Scénarios déterministes et reproductibles Événements asynchrones, idempotence et replay Modular monolith, DDD et architecture hexagonale ciblée
+ Voir le dépôt ↗
+
+
+
+ 02 Go · Production · Distributed systems
+ Session Keeper
+
+ Microservice Go conçu de bout en bout pour sortir la gestion des sessions d’une plateforme
+ de paiement multi-SaaS et réduire le coût et la latence du système.
+
+ Architecture DDD/hexagonale Environ 150 ms de latence moyenne Coûts du périmètre divisés environ par trois
+ Voir le dépôt ↗
+
+
+
+ 03 PHP · Laravel · Payments
+ LaraWebhook
+
+ Package Laravel conçu seul pour traiter des webhooks multi-services avec signatures,
+ idempotence, retries, replay, audit trail et stockage configurable des payloads.
+
+ Tests unitaires, fonctionnels et d’architecture CI, documentation et qualité statique Projet réalisé en environ 80 heures
+ Voir le dépôt ↗
+
+
+
+
+
+ Ma manière de travailler
La complexité mérite de la structure. Pas de la cérémonie.
+
+
Comprendre avant d’abstraire Je cherche le problème réel, les invariants et les frontières avant de choisir une architecture.
+
Rendre les échecs testables Retries, timeouts, concurrence et incohérences ne doivent pas rester des accidents impossibles à reproduire.
+
Rester hands-on Je prends l’ownership des sujets complexes, j’aide les autres à gagner en autonomie et je reste dans le code.
+
+
+
+
+
From ba7d989dc9ae34e1948735c28848035a97d99351 Mon Sep 17 00:00:00 2001
From: Proxynth
Date: Sun, 23 Aug 2026 16:54:00 +0200
Subject: [PATCH 04/21] fix: mark Session Keeper as private project
---
src/components/Welcome.astro | 3 ++-
1 file changed, 2 insertions(+), 1 deletion(-)
diff --git a/src/components/Welcome.astro b/src/components/Welcome.astro
index 3964f18..a360129 100644
--- a/src/components/Welcome.astro
+++ b/src/components/Welcome.astro
@@ -54,7 +54,7 @@
de paiement multi-SaaS et réduire le coût et la latence du système.
Architecture DDD/hexagonale Environ 150 ms de latence moyenne Coûts du périmètre divisés environ par trois
- Voir le dépôt ↗
+ Projet professionnel · dépôt privé
@@ -118,6 +118,7 @@
.project p, .principles p { color:#aeb8c4; line-height:1.65; }
.project ul { padding-left:20px; color:#c4ccd5; line-height:1.8; }
.project-link { display:inline-block; margin-top:14px; color:#63e6be; font-weight:700; }
+ .project-link.muted { color:#71808f; font-weight:500; }
.principles { display:grid; grid-template-columns:repeat(3,1fr); gap:16px; }
.principles > div { padding:24px 0; border-top:1px solid #33404c; }
.principles strong { font-size:1.1rem; }
From 8f47cc9b616b7fd0b7f03eb169323cf18c50bdd5 Mon Sep 17 00:00:00 2001
From: Proxynth
Date: Sun, 23 Aug 2026 17:01:04 +0200
Subject: [PATCH 05/21] fix: remove proprietary Session Keeper from public
portfolio
---
src/components/Welcome.astro | 14 +-------------
1 file changed, 1 insertion(+), 13 deletions(-)
diff --git a/src/components/Welcome.astro b/src/components/Welcome.astro
index a360129..8f04ebf 100644
--- a/src/components/Welcome.astro
+++ b/src/components/Welcome.astro
@@ -47,18 +47,7 @@
- 02 Go · Production · Distributed systems
- Session Keeper
-
- Microservice Go conçu de bout en bout pour sortir la gestion des sessions d’une plateforme
- de paiement multi-SaaS et réduire le coût et la latence du système.
-
- Architecture DDD/hexagonale Environ 150 ms de latence moyenne Coûts du périmètre divisés environ par trois
- Projet professionnel · dépôt privé
-
-
-
- 03 PHP · Laravel · Payments
+ 02 PHP · Laravel · Payments
LaraWebhook
Package Laravel conçu seul pour traiter des webhooks multi-services avec signatures,
@@ -118,7 +107,6 @@
.project p, .principles p { color:#aeb8c4; line-height:1.65; }
.project ul { padding-left:20px; color:#c4ccd5; line-height:1.8; }
.project-link { display:inline-block; margin-top:14px; color:#63e6be; font-weight:700; }
- .project-link.muted { color:#71808f; font-weight:500; }
.principles { display:grid; grid-template-columns:repeat(3,1fr); gap:16px; }
.principles > div { padding:24px 0; border-top:1px solid #33404c; }
.principles strong { font-size:1.1rem; }
From 7dbfb5184fbc82157a7034f7800ea971a76a3656 Mon Sep 17 00:00:00 2001
From: Proxynth
Date: Sun, 23 Aug 2026 17:04:51 +0200
Subject: [PATCH 06/21] feat: add LaraWebhook case study
---
src/pages/projects/larawebhook.astro | 50 ++++++++++++++++++++++++++++
1 file changed, 50 insertions(+)
create mode 100644 src/pages/projects/larawebhook.astro
diff --git a/src/pages/projects/larawebhook.astro b/src/pages/projects/larawebhook.astro
new file mode 100644
index 0000000..7dfea0b
--- /dev/null
+++ b/src/pages/projects/larawebhook.astro
@@ -0,0 +1,50 @@
+---
+import Layout from '../../layouts/Layout.astro';
+---
+
+
+
+ ← Retour au portfolio
+ Projet open source · PHP · Laravel
+ LaraWebhook
+ Un package Laravel conçu pour traiter les webhooks comme des messages potentiellement retardés, dupliqués ou rejoués.
+
+
+ Le problème
+ Les intégrations webhook doivent gérer les signatures, les retries, les doublons, les erreurs transitoires et la nécessité d’enquêter sur ce qui s’est réellement passé.
+
+
+
+ Ce que le package propose
+
+ validation de signatures multi-services ;
+ idempotence protégée contre les courses concurrentes ;
+ retries synchrones et asynchrones ;
+ replay et audit trail séparés de la déduplication ;
+ stockage none, redacted ou full des payloads ;
+ dashboard, API, notifications et documentation.
+
+
+
+
+ Ce que le projet démontre
+ Le projet a été conçu et implémenté seul en environ 80 heures, avec des tests unitaires, fonctionnels et d’architecture, PHPStan, Pint, Pest, CI et automatisation des releases.
+ Il s’agit d’une démonstration technique personnelle, sans adoption externe connue.
+ Voir le dépôt GitHub ↗
+
+
+
+
+
From a3b9384915c4e13b49075cb61189ed4a94cc7109 Mon Sep 17 00:00:00 2001
From: Proxynth
Date: Sun, 23 Aug 2026 17:04:55 +0200
Subject: [PATCH 07/21] feat: add Payment Sandbox case study
---
src/pages/projects/payment-sandbox.astro | 53 ++++++++++++++++++++++++
1 file changed, 53 insertions(+)
create mode 100644 src/pages/projects/payment-sandbox.astro
diff --git a/src/pages/projects/payment-sandbox.astro b/src/pages/projects/payment-sandbox.astro
new file mode 100644
index 0000000..7086491
--- /dev/null
+++ b/src/pages/projects/payment-sandbox.astro
@@ -0,0 +1,53 @@
+---
+import Layout from '../../layouts/Layout.astro';
+---
+
+
+
+ ← Retour au portfolio
+ Projet open source · Go · Payments
+ Payment Sandbox
+ Tester une intégration de paiement, ce n’est pas seulement vérifier des statuts HTTP.
+
+
+ Le problème
+ Un paiement peut réussir alors que la réponse HTTP est perdue. Un webhook peut arriver deux fois, en retard ou dans le désordre. Deux captures concurrentes peuvent entrer en collision. Ces situations sont difficiles à reproduire avec un mock HTTP classique.
+
+
+
+ La réponse
+ Payment Sandbox modélise les workflows métier du paiement et les comportements asynchrones qui les entourent. Les scénarios sont déterministes, observables et reproductibles, afin de tester les intégrations sans dépendre d’un prestataire réel.
+
+ réponses perdues et retries avec idempotency key ;
+ webhooks retardés, dupliqués, invalides ou désordonnés ;
+ courses concurrentes sur capture et remboursement ;
+ états temporairement incohérents et replay déterministe.
+
+
+
+
+ Choix d’architecture
+ Le projet utilise un modular monolith, du DDD et une architecture hexagonale ciblée. L’objectif n’est pas de distribuer artificiellement le système, mais d’isoler les frontières qui apportent une vraie valeur : domaine, persistance, horloge, génération d’aléas, jobs durables et livraison HTTP.
+
+
+
+ État du projet
+ Le projet est en phase de conception et d’implémentation précoce. Les contrats publics et le format des scénarios ne sont pas encore stabilisés.
+ Voir le dépôt GitHub ↗
+
+
+
+
+
From 5a521b2c6b43ac0f7db1f794cbef7759f6536f0b Mon Sep 17 00:00:00 2001
From: Proxynth
Date: Sun, 23 Aug 2026 17:04:59 +0200
Subject: [PATCH 08/21] ci: validate pull requests
---
.github/workflows/validate.yml | 35 ++++++++++++++++++++++++++++++++++
1 file changed, 35 insertions(+)
create mode 100644 .github/workflows/validate.yml
diff --git a/.github/workflows/validate.yml b/.github/workflows/validate.yml
new file mode 100644
index 0000000..d3e2e6e
--- /dev/null
+++ b/.github/workflows/validate.yml
@@ -0,0 +1,35 @@
+name: Validate Pull Request
+
+on:
+ pull_request:
+ branches:
+ - main
+
+permissions:
+ contents: read
+
+jobs:
+ build:
+ name: Build Astro site
+ runs-on: ubuntu-latest
+
+ steps:
+ - name: Checkout
+ uses: actions/checkout@v5
+
+ - name: Setup pnpm
+ uses: pnpm/action-setup@v4
+ with:
+ version: 10
+
+ - name: Setup Node.js
+ uses: actions/setup-node@v5
+ with:
+ node-version: 22
+ cache: pnpm
+
+ - name: Install dependencies
+ run: pnpm install --frozen-lockfile
+
+ - name: Build
+ run: pnpm build
From 18b62366d4206fda4253099f85019d1065def592 Mon Sep 17 00:00:00 2001
From: Proxynth
Date: Sun, 23 Aug 2026 17:05:11 +0200
Subject: [PATCH 09/21] feat: link project case studies
---
src/components/Welcome.astro | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/src/components/Welcome.astro b/src/components/Welcome.astro
index 8f04ebf..a879e61 100644
--- a/src/components/Welcome.astro
+++ b/src/components/Welcome.astro
@@ -43,7 +43,7 @@
aux réponses perdues, aux webhooks dupliqués ou désordonnés et aux courses concurrentes.
Scénarios déterministes et reproductibles Événements asynchrones, idempotence et replay Modular monolith, DDD et architecture hexagonale ciblée
- Voir le dépôt ↗
+ Lire le case study ↗
@@ -54,7 +54,7 @@
idempotence, retries, replay, audit trail et stockage configurable des payloads.
Tests unitaires, fonctionnels et d’architecture CI, documentation et qualité statique Projet réalisé en environ 80 heures
- Voir le dépôt ↗
+ Lire le case study ↗
From c7c6e9b6f6591a2d7c0ac3a235b9bb6fd6b12c20 Mon Sep 17 00:00:00 2001
From: Proxynth
Date: Sun, 23 Aug 2026 17:05:29 +0200
Subject: [PATCH 10/21] feat: add target role and work preferences
---
src/components/Welcome.astro | 15 ++++++++++++---
1 file changed, 12 insertions(+), 3 deletions(-)
diff --git a/src/components/Welcome.astro b/src/components/Welcome.astro
index a879e61..29b5df1 100644
--- a/src/components/Welcome.astro
+++ b/src/components/Welcome.astro
@@ -3,7 +3,7 @@
TW.
@@ -59,6 +59,15 @@
+
+ Ce que je cherche
Un rôle d’IC backend dans une équipe qui croit à son produit.
+
+
Cible Senior Backend Engineer ou Senior Software Engineer à dominante backend, avec un ownership technique réel.
+
Environnement Produit utile, SaaS B2B, fintech, sécurité, conformité ou systèmes critiques. Remote réel depuis Strasbourg.
+
Ce que je ne cherche pas Management hiérarchique, coordination permanente, feature factory ou rôle principalement frontend.
+
+
+
Ma manière de travailler
La complexité mérite de la structure. Pas de la cérémonie.
@@ -107,7 +116,7 @@
.project p, .principles p { color:#aeb8c4; line-height:1.65; }
.project ul { padding-left:20px; color:#c4ccd5; line-height:1.8; }
.project-link { display:inline-block; margin-top:14px; color:#63e6be; font-weight:700; }
- .principles { display:grid; grid-template-columns:repeat(3,1fr); gap:16px; }
+ .profile-grid, .principles { display:grid; grid-template-columns:repeat(3,1fr); gap:16px; }\n .profile-grid > div { padding:24px 0; border-top:1px solid #33404c; }\n .profile-grid strong { font-size:1.1rem; }\n .profile-grid p { color:#aeb8c4; line-height:1.65; }
.principles > div { padding:24px 0; border-top:1px solid #33404c; }
.principles strong { font-size:1.1rem; }
footer { display:flex; justify-content:space-between; gap:20px; margin:110px 0 28px; padding-top:24px; border-top:1px solid #202832; color:#7f8b98; font-size:.85rem; }
@@ -115,7 +124,7 @@
.page { padding:0 18px; }
.nav-links { gap:12px; font-size:.8rem; }
.hero { padding:76px 0 60px; }
- .signal-grid, .projects, .principles { grid-template-columns:1fr; }
+ .signal-grid, .projects, .profile-grid, .principles { grid-template-columns:1fr; }
.signal-grid article { border-right:0; border-bottom:1px solid #202832; }
.featured { grid-column:auto; }
footer { flex-direction:column; margin-top:76px; }
From 0a2c4a5e71dc32164a0155863f150736212cb108 Mon Sep 17 00:00:00 2001
From: Proxynth
Date: Sun, 23 Aug 2026 17:12:16 +0200
Subject: [PATCH 11/21] i18n: translate layout metadata to English
---
src/layouts/Layout.astro | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/src/layouts/Layout.astro b/src/layouts/Layout.astro
index 05de5d0..8045603 100644
--- a/src/layouts/Layout.astro
+++ b/src/layouts/Layout.astro
@@ -6,12 +6,12 @@ interface Props {
const {
title = 'Thibaud Willm — Senior Backend Engineer',
- description = 'Senior Backend Engineer spécialisé dans les systèmes complexes, les paiements et la fiabilité.',
+ description = 'Senior Backend Engineer focused on complex systems, payments and reliability.',
} = Astro.props;
---
-
+
From 78fea9a1010bba7e9b3132e8ffd52caf6db63de6 Mon Sep 17 00:00:00 2001
From: Proxynth
Date: Sun, 23 Aug 2026 17:12:19 +0200
Subject: [PATCH 12/21] i18n: translate homepage metadata to English
---
src/pages/index.astro | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/src/pages/index.astro b/src/pages/index.astro
index 8599dee..63cb442 100644
--- a/src/pages/index.astro
+++ b/src/pages/index.astro
@@ -5,7 +5,7 @@ import Layout from '../layouts/Layout.astro';
From b5e66de7417aa4867a296edfc3140fbe5675a079 Mon Sep 17 00:00:00 2001
From: Proxynth
Date: Sun, 23 Aug 2026 17:12:23 +0200
Subject: [PATCH 13/21] i18n: translate portfolio homepage to English
---
src/components/Welcome.astro | 73 ++++++++++++++++++------------------
1 file changed, 37 insertions(+), 36 deletions(-)
diff --git a/src/components/Welcome.astro b/src/components/Welcome.astro
index 29b5df1..5b218eb 100644
--- a/src/components/Welcome.astro
+++ b/src/components/Welcome.astro
@@ -1,37 +1,38 @@
-
+
TW.
Senior Backend Engineer · PHP/Laravel · Go
- Je construis des systèmes backend que l’on peut comprendre, tester et exploiter sereinement.
+ I build backend systems that can be understood, tested and operated with confidence.
- Dix ans d’expérience sur des plateformes SaaS, des systèmes de paiement et des services distribués.
- J’aime les problèmes complexes, les frontières explicites et les compromis qui tiennent en production.
+ Ten years of experience building SaaS platforms, payment systems and distributed services.
+ I enjoy complex problems, explicit boundaries and trade-offs that hold up in production.
-
- 10 ans de développement logiciel
- Go + PHP backend de production
- Paiements intégrations et fiabilité
- IC ownership sans management
+
+ 10 years of software development
+ Go + PHP production backend
+ Payments integrations and reliability
+ IC ownership without management
-
Sélection de travaux
-
Des projets qui montrent comment je pense.
+
Selected work
+
Projects that show how I think.
@@ -39,41 +40,41 @@
01 Go · Payments · Open source
Payment Sandbox
- Simulateur de systèmes de paiement conçu pour tester les intégrations face aux retries,
- aux réponses perdues, aux webhooks dupliqués ou désordonnés et aux courses concurrentes.
+ A payment systems simulator designed to test integrations against retries, lost responses,
+ duplicated or out-of-order webhooks and concurrent operations.
-
Scénarios déterministes et reproductibles Événements asynchrones, idempotence et replay Modular monolith, DDD et architecture hexagonale ciblée
-
Lire le case study ↗
+
Deterministic and reproducible scenarios Asynchronous events, idempotency and replay Modular monolith, DDD and targeted hexagonal architecture
+
Read the case study ↗
02 PHP · Laravel · Payments
LaraWebhook
- Package Laravel conçu seul pour traiter des webhooks multi-services avec signatures,
- idempotence, retries, replay, audit trail et stockage configurable des payloads.
+ A Laravel package built from scratch to process multi-service webhooks with signatures,
+ idempotency, retries, replay, audit trails and configurable payload storage.
- Tests unitaires, fonctionnels et d’architecture CI, documentation et qualité statique Projet réalisé en environ 80 heures
- Lire le case study ↗
+ Unit, functional and architecture tests CI, documentation and static analysis Built independently in approximately 80 hours
+ Read the case study ↗
-
- Ce que je cherche
Un rôle d’IC backend dans une équipe qui croit à son produit.
+
+ What I am looking for
An individual contributor backend role in a team that believes in its product.
-
Cible Senior Backend Engineer ou Senior Software Engineer à dominante backend, avec un ownership technique réel.
-
Environnement Produit utile, SaaS B2B, fintech, sécurité, conformité ou systèmes critiques. Remote réel depuis Strasbourg.
-
Ce que je ne cherche pas Management hiérarchique, coordination permanente, feature factory ou rôle principalement frontend.
+
Target Senior Backend Engineer or backend-focused Senior Software Engineer, with real technical ownership.
+
Environment A useful product, B2B SaaS, fintech, security, compliance or critical systems. Genuine remote work from Strasbourg.
+
Not looking for People management, permanent coordination, feature factories or primarily frontend roles.
- Ma manière de travailler
La complexité mérite de la structure. Pas de la cérémonie.
+ How I work
Complexity deserves structure. Not ceremony.
-
Comprendre avant d’abstraire Je cherche le problème réel, les invariants et les frontières avant de choisir une architecture.
-
Rendre les échecs testables Retries, timeouts, concurrence et incohérences ne doivent pas rester des accidents impossibles à reproduire.
-
Rester hands-on Je prends l’ownership des sujets complexes, j’aide les autres à gagner en autonomie et je reste dans le code.
+
Understand before abstracting I look for the real problem, invariants and boundaries before choosing an architecture.
+
Make failure testable Retries, timeouts, concurrency and inconsistencies should not remain impossible-to-reproduce accidents.
+
Stay hands-on I take ownership of complex topics, help others become more autonomous and stay close to the code.
@@ -113,12 +114,12 @@
.featured { grid-column:span 2; background:linear-gradient(135deg,#13251f,#10161d 60%); border-color:#315e50; }
.project-top { display:flex; justify-content:space-between; color:#71808f; font-size:.72rem; text-transform:uppercase; letter-spacing:.1em; }
h3 { font-size:1.8rem; margin:28px 0 12px; letter-spacing:-.04em; }
- .project p, .principles p { color:#aeb8c4; line-height:1.65; }
+ .project p, .principles p, .profile-grid p { color:#aeb8c4; line-height:1.65; }
.project ul { padding-left:20px; color:#c4ccd5; line-height:1.8; }
.project-link { display:inline-block; margin-top:14px; color:#63e6be; font-weight:700; }
- .profile-grid, .principles { display:grid; grid-template-columns:repeat(3,1fr); gap:16px; }\n .profile-grid > div { padding:24px 0; border-top:1px solid #33404c; }\n .profile-grid strong { font-size:1.1rem; }\n .profile-grid p { color:#aeb8c4; line-height:1.65; }
- .principles > div { padding:24px 0; border-top:1px solid #33404c; }
- .principles strong { font-size:1.1rem; }
+ .profile-grid, .principles { display:grid; grid-template-columns:repeat(3,1fr); gap:16px; }
+ .profile-grid > div, .principles > div { padding:24px 0; border-top:1px solid #33404c; }
+ .profile-grid strong, .principles strong { font-size:1.1rem; }
footer { display:flex; justify-content:space-between; gap:20px; margin:110px 0 28px; padding-top:24px; border-top:1px solid #202832; color:#7f8b98; font-size:.85rem; }
@media (max-width: 700px) {
.page { padding:0 18px; }
From f86f102f2481f83149e20e471c09e56e914fad72 Mon Sep 17 00:00:00 2001
From: Proxynth
Date: Sun, 23 Aug 2026 17:12:26 +0200
Subject: [PATCH 14/21] i18n: translate Payment Sandbox case study
---
src/pages/projects/payment-sandbox.astro | 41 ++++++------------------
1 file changed, 9 insertions(+), 32 deletions(-)
diff --git a/src/pages/projects/payment-sandbox.astro b/src/pages/projects/payment-sandbox.astro
index 7086491..4f6ae7c 100644
--- a/src/pages/projects/payment-sandbox.astro
+++ b/src/pages/projects/payment-sandbox.astro
@@ -2,44 +2,21 @@
import Layout from '../../layouts/Layout.astro';
---
-
+
- ← Retour au portfolio
- Projet open source · Go · Payments
+ ← Back to the portfolio
+ Open source project · Go · Payments
Payment Sandbox
- Tester une intégration de paiement, ce n’est pas seulement vérifier des statuts HTTP.
-
-
- Le problème
- Un paiement peut réussir alors que la réponse HTTP est perdue. Un webhook peut arriver deux fois, en retard ou dans le désordre. Deux captures concurrentes peuvent entrer en collision. Ces situations sont difficiles à reproduire avec un mock HTTP classique.
-
-
-
- La réponse
- Payment Sandbox modélise les workflows métier du paiement et les comportements asynchrones qui les entourent. Les scénarios sont déterministes, observables et reproductibles, afin de tester les intégrations sans dépendre d’un prestataire réel.
-
- réponses perdues et retries avec idempotency key ;
- webhooks retardés, dupliqués, invalides ou désordonnés ;
- courses concurrentes sur capture et remboursement ;
- états temporairement incohérents et replay déterministe.
-
-
-
-
- Choix d’architecture
- Le projet utilise un modular monolith, du DDD et une architecture hexagonale ciblée. L’objectif n’est pas de distribuer artificiellement le système, mais d’isoler les frontières qui apportent une vraie valeur : domaine, persistance, horloge, génération d’aléas, jobs durables et livraison HTTP.
-
-
-
- État du projet
- Le projet est en phase de conception et d’implémentation précoce. Les contrats publics et le format des scénarios ne sont pas encore stabilisés.
- Voir le dépôt GitHub ↗
-
+ Testing a payment integration means more than checking HTTP status codes.
+ The problem A payment may succeed while the HTTP response is lost. A webhook may arrive twice, late or out of order. Two concurrent capture requests may race. These situations are difficult to reproduce with a traditional HTTP mock.
+ The approach Payment Sandbox models payment workflows and the asynchronous behaviours around them. Scenarios are deterministic, observable and reproducible, making it possible to test integrations without depending on a real provider.
lost responses and retries with idempotency keys; delayed, duplicated, invalid or out-of-order webhooks; concurrent capture and refund races; temporarily inconsistent states and deterministic replay.
+ Architecture choices The project uses a modular monolith, domain-driven design and targeted hexagonal architecture. The goal is not to distribute the system artificially, but to isolate boundaries that provide real value: domain, persistence, clock, randomness, durable jobs and HTTP delivery.
+ Project status The project is currently in an early design and implementation phase. Public contracts and the scenario format are not stable yet.
View the GitHub repository ↗