diff --git a/components/layout/LayoutHeader.vue b/components/layout/LayoutHeader.vue
index f1041879318a055ec7a4a0b9d60514ccda143da8..bf5877ae4fbe9cd1816d0eb68989d9ef6d06e4bb 100644
--- a/components/layout/LayoutHeader.vue
+++ b/components/layout/LayoutHeader.vue
@@ -16,14 +16,18 @@
     :class="{ '-translate-y-20': scrolled }"
   >
     <nav class="container flex justify-between items-center mx-auto h-16">
+      <LayoutHeaderMenuHamburger class="mr-3 flex lg:hidden">
+        <LayoutHeaderMenu class="flex-col space-y-4" />
+      </LayoutHeaderMenuHamburger>
+
       <LayoutHeaderLogo :show-title="!searchFocus" />
 
       <div class="flex justify-end items-center relative">
         <LayoutHeaderMenuSearch @search-focus="searchFocus = $event" />
 
-        <LayoutHeaderMenu />
+        <LayoutHeaderMenu class="hidden lg:flex" />
 
-        <AppDarkModeToggle class="hidden lg:inline-flex ml-3" />
+        <AppDarkModeToggle class="hidden xl:inline-flex ml-3" />
 
         <LayoutHeaderMenuAvatar />
       </div>
@@ -75,13 +79,4 @@ export default {
   /* Copied from discourse */
   box-shadow: 0 2px 4px -1px rgb(0 0 0 / 25%);
 }
-.menu-hamburger {
-  display: block;
-  fill: none;
-  height: 16px;
-  width: 16px;
-  stroke: currentcolor;
-  stroke-width: 3;
-  overflow: visible;
-}
 </style>
diff --git a/components/layout/LayoutHeaderMenuAvatar.vue b/components/layout/LayoutHeaderMenuAvatar.vue
index 5e9879a3435948a5de538b66d40cd33157800001..9e4ad92b0a96452c0bb225a78ef4673306f947cd 100644
--- a/components/layout/LayoutHeaderMenuAvatar.vue
+++ b/components/layout/LayoutHeaderMenuAvatar.vue
@@ -69,15 +69,39 @@
           </div>
           <div v-if="git">
             <span
-              class="bg-purple-200 text-purple-800 font-medium py-0.5 px-1 text-sm rounded"
+              class="
+                bg-purple-200
+                text-purple-800
+                font-medium
+                py-0.5
+                px-1
+                text-sm
+                rounded
+              "
               v-text="git.draft.count"
             />
             <span
-              class="bg-yellow-200 text-yellow-800 font-medium py-0.5 px-1 text-sm rounded"
+              class="
+                bg-yellow-200
+                text-yellow-800
+                font-medium
+                py-0.5
+                px-1
+                text-sm
+                rounded
+              "
               v-text="git.pending_review.count"
             />
             <span
-              class="bg-green-200 text-green-800 font-medium py-0.5 px-1 text-sm rounded"
+              class="
+                bg-green-200
+                text-green-800
+                font-medium
+                py-0.5
+                px-1
+                text-sm
+                rounded
+              "
               v-text="git.pending_publish.count"
             />
           </div>
@@ -123,7 +147,15 @@
           >
             <div>Mes tickets</div>
             <div
-              class="bg-gray-200 text-gray-800 font-medium w-5 h-5 text-center text-sm rounded-full"
+              class="
+                bg-gray-200
+                text-gray-800
+                font-medium
+                w-5
+                h-5
+                text-center text-sm
+                rounded-full
+              "
               v-text="git.my_issues.count"
             />
           </a>
@@ -134,7 +166,15 @@
           >
             <div>Mes demandes de fusion</div>
             <div
-              class="bg-gray-200 text-gray-800 font-medium w-5 h-5 text-center text-sm rounded-full"
+              class="
+                bg-gray-200
+                text-gray-800
+                font-medium
+                w-5
+                h-5
+                text-center text-sm
+                rounded-full
+              "
               v-text="git.my_merge_requests.count"
             />
           </a>
@@ -167,7 +207,7 @@
           <span>Aide</span>
         </nuxt-link>
 
-        <div><AppDarkModeToggle class="lg:hidden ml-2" /></div>
+        <AppDarkModeToggle class="xl:hidden ml-2" />
 
         <AppA11y class="ml-2" />
       </div>
diff --git a/components/layout/LayoutHeaderMenuForum.vue b/components/layout/LayoutHeaderMenuForum.vue
index e6ba7cae2baeb994a7ec7120cc26a37768684063..ce69af33043aeb3a2cc08d8752f20fbf7321daed 100644
--- a/components/layout/LayoutHeaderMenuForum.vue
+++ b/components/layout/LayoutHeaderMenuForum.vue
@@ -1,5 +1,5 @@
 <template>
-  <div v-if="!loading" class="flex items-center">
+  <div v-if="!loading" class="menu-forum flex items-center">
     <MiniMap class="mx-4" style="min-width: 440px" />
 
     <div class="text-left text-xs py-1 w-80 border-l dark:border-gray-500">
@@ -58,4 +58,7 @@ export default {
   margin-right: 5px;
   display: inline-block;
 }
+.hamburger-menu .menu-forum {
+  display: none;
+}
 </style>
diff --git a/components/layout/LayoutHeaderMenuHamburger.vue b/components/layout/LayoutHeaderMenuHamburger.vue
new file mode 100644
index 0000000000000000000000000000000000000000..61163022c745e09844c5431cf9d9752684b1ef32
--- /dev/null
+++ b/components/layout/LayoutHeaderMenuHamburger.vue
@@ -0,0 +1,78 @@
+<script>
+export default {
+  name: 'LayoutHeaderMenuHamburger',
+  data() {
+    return {
+      isOpen: false,
+    }
+  },
+}
+</script>
+
+<template>
+  <div>
+    <div
+      class="hamburger flex flex-col space-between space-y-1.5"
+      :class="isOpen ? 'is-open' : ''"
+      @click="isOpen = !isOpen"
+    >
+      <span class="hamburger-item" />
+      <span class="hamburger-item" />
+      <span class="hamburger-item" />
+    </div>
+
+    <transition :name="isOpen ? 'slideback' : 'slide'">
+      <div
+        v-show="isOpen"
+        class="hamburger-menu fixed bg-white left-0 top-0 w-min z-10 shadow p-8"
+      >
+        <slot />
+      </div>
+    </transition>
+  </div>
+</template>
+
+<style lang="postcss" scoped>
+.hamburger-item {
+  @apply block w-8 h-1 bg-gray-800 dark:bg-gray-300 transition;
+}
+
+.is-open.hamburger > span:nth-child(1) {
+  transform: translate(0, 0.625rem) rotate(-45deg);
+}
+
+.is-open.hamburger > span:nth-child(2) {
+  opacity: 0;
+}
+
+.is-open.hamburger > span:nth-child(3) {
+  transform: translate(0, -0.625rem) rotate(45deg);
+}
+
+.hamburger-menu {
+  top: 65px;
+  height: calc(100vh - 65px);
+}
+
+.slide-leave-active,
+.slide-enter-active {
+  transition: 0.5s;
+}
+.slide-enter {
+  transform: translate(100%, 0);
+}
+.slide-leave-to {
+  transform: translate(-100%, 0);
+}
+
+.slideback-leave-active,
+.slideback-enter-active {
+  transition: 0.5s;
+}
+.slideback-enter {
+  transform: translate(-100%, 0);
+}
+.slideback-leave-to {
+  transform: translate(100%, 0);
+}
+</style>