diff --git a/.gitignore b/.gitignore
index 948f460..4d64d41 100644
--- a/.gitignore
+++ b/.gitignore
@@ -7,6 +7,7 @@ npm-debug.*
 *.swp
 .DS_Store
 .vscode
+nohup.out
 *.code-workspace
 .sass-cache
 node_modules
diff --git a/README.md b/README.md
index 1d67c71..b2fcad0 100644
--- a/README.md
+++ b/README.md
@@ -131,3 +131,19 @@ Fill in the meta information :
 ### FAQ section
 
 Edit `_data/faq.json` file to add a new Q/A couple object. Plain html e.g. `<br>` or `<a href="">link</a>` is supported
+
+### Contact form
+
+Edit `partials/components/contact-form.html` file to modify the contact form and `src/form/contact-form-handler.php` to modify the form handler.
+
+To test it in a local environment, because there is PHP to execute, you will need to setup a apache vhost with the `dist` folder as the root and the phpmailer library installed.
+The captcha service is hCaptcha, you will need to create an account and get your own site key (change it in the contact form partial) and secret key.
+Add these lines to the vhost configuration file (here with mailtrap as smtp provider for testing purposes):
+
+```
+SetEnv ASTRO_SMTP_FROM test@astrolabe.test
+SetEnv ASTRO_SMTP_HOSTNAME sandbox.smtp.mailtrap.io
+SetEnv ASTRO_SMTP_USERNAME xxxxx
+SetEnv ASTRO_SMTP_PASSWORD xxxxx
+SetEnv HCAPTCHA_SECRET_KEY xxxxx
+```
diff --git a/src/_includes/partials/components/contact-form.njk b/src/_includes/partials/components/contact-form.njk
index 10c55c6..1a6fc1b 100644
--- a/src/_includes/partials/components/contact-form.njk
+++ b/src/_includes/partials/components/contact-form.njk
@@ -56,6 +56,9 @@
           <label class="ohnohoney" for="email"></label>
           <input tabindex="-1" class="ohnohoney" autocomplete="off" type="email" id="email" name="email" placeholder="Your e-mail here">
         </li>
+
+        <div class="h-captcha" data-sitekey="b07c49fe-50ee-4432-af0a-96d675c6326a"></div>
+        <script src="https://js.hcaptcha.com/1/api.js" async defer></script>
       </ol>
       {% if contactMember %}
         {{ hidden_field('contactTo', contactMember) }}
diff --git a/src/form/contact-form-handler.php b/src/form/contact-form-handler.php
index e609cfc..0a93287 100644
--- a/src/form/contact-form-handler.php
+++ b/src/form/contact-form-handler.php
@@ -22,12 +22,41 @@ $wantedContact = (
     || empty($domainFromMyEmail)
 ) ? $myEmail : "$wantedContact@$domainFromMyEmail" ;
 
+/* hCaptcha */
+$hcaptchaSecret = getenv('HCAPTCHA_SECRET_KEY');
+$hcaptchaVerifyUrl = "https://api.hcaptcha.com/siteverify";
+
 if(empty($_POST['namezzz']) || empty($_POST['emailzzz']) || empty($_POST['message'])) {
-    $errors .= "\n Error: all fields are required";
+    $errors .= "\n Erreur : champs obligatoires manquants.";
 }
 
 if(!empty($_POST['name']) && !empty($_POST['email'])) {
-    $errors .= "\n Error: spam";
+    $errors .= "\n Erreur : spam détecté.";
+}
+
+/* Captcha verification */
+if(!empty($_POST['h-captcha-response'])) {
+    $responseKey = $_POST['h-captcha-response'];
+    $data = array(
+        'secret' => $hcaptchaSecret,
+        'response' => $responseKey
+    );
+
+    $checkRequest = curl_init();
+    curl_setopt($checkRequest, CURLOPT_URL, $hcaptchaVerifyUrl);
+    curl_setopt($checkRequest, CURLOPT_POST, 1);
+    curl_setopt($checkRequest, CURLOPT_POSTFIELDS, http_build_query($data));
+    curl_setopt($checkRequest, CURLOPT_RETURNTRANSFER, true);
+    $response = curl_exec($checkRequest);
+    curl_close($checkRequest);
+
+    $responseData = json_decode($response, true);
+
+    if(!$responseData['success']) {
+        $errors .= "\n Erreur lors de la validation du captcha.";
+    }
+} else {
+    $errors .= "\n Erreur lors de la validation du captcha.";
 }
 
 $name = $_POST['namezzz'];
@@ -37,7 +66,7 @@ $message = $_POST['message'];
 $subscribe = $_POST['subscribe'];
 
 if (!filter_var($emailAddress, FILTER_VALIDATE_EMAIL)) {
-    $errors .= "\n Error: Invalid email address $emailAddress";
+    $errors .= "\n Erreur d'adresse e-mail invalide : $emailAddress";
 }
 
 if(empty($errors)) {
@@ -110,7 +139,8 @@ if(empty($errors)) {
 	<body>
 		<!-- This page is displayed only if there is some error -->
 		<?php
-        echo nl2br($errors);
-?>
+            echo nl2br($errors);
+        ?>
+        <a href="javascript:history.back()">Retour</a>
 	</body>
 </html>