diff --git a/front/src/App.vue b/front/src/App.vue
index d1d63e65143df782703d035a14c8ca0f21da78e1..fb1c27a899fb8b39d65118969688ca1805a91f13 100644
--- a/front/src/App.vue
+++ b/front/src/App.vue
@@ -48,7 +48,9 @@ export default {
   -moz-osx-font-smoothing: grayscale;
 }
 .main.pusher, .footer {
-  margin-left: 350px !important;
+  @include media(">desktop") {
+    margin-left: 350px !important;
+  }
   transform: none !important;
 }
 .main-pusher {
diff --git a/front/src/components/Sidebar.vue b/front/src/components/Sidebar.vue
index a315aab199c341a24db3baed09cdad32a813975b..76fd8abacb530b169b652f64a18f15a5e32f1851 100644
--- a/front/src/components/Sidebar.vue
+++ b/front/src/components/Sidebar.vue
@@ -1,13 +1,17 @@
 <template>
-<div class="ui vertical left visible wide sidebar">
+<div :class="['ui', 'vertical', 'left', 'visible', 'wide', {'collapsed': isCollapsed}, 'sidebar',]">
   <div class="ui inverted segment header-wrapper">
-    <search-bar>
+    <search-bar @search="isCollapsed = false">
       <router-link :title="'Funkwhale'" :to="{name: 'index'}">
         <i class="logo bordered inverted orange big icon">
           <logo class="logo"></logo>
         </i>
       </router-link>
-
+      <span
+        slot="after"
+        @click="isCollapsed = !isCollapsed"
+        :class="['ui', 'basic', 'big', {'inverted': isCollapsed}, 'orange', 'icon', 'collapse', 'button']">
+          <i class="sidebar icon"></i></span>
     </search-bar>
   </div>
 
@@ -111,7 +115,8 @@ export default {
   },
   data () {
     return {
-      backend: backend
+      backend: backend,
+      isCollapsed: true
     }
   },
   mounted () {
@@ -119,7 +124,8 @@ export default {
   },
   computed: {
     ...mapState({
-      queue: state => state.queue
+      queue: state => state.queue,
+      url: state => state.route.path
     })
   },
   methods: {
@@ -129,19 +135,41 @@ export default {
     reorder: function (oldValue, newValue) {
       this.$store.commit('queue/reorder', {oldValue, newValue})
     }
+  },
+  watch: {
+    url: function () {
+      this.isCollapsed = true
+    }
   }
 }
 </script>
 
 <!-- Add "scoped" attribute to limit CSS to this component only -->
 <style scoped lang="scss">
+@import '../style/vendor/media';
 
 $sidebar-color: #1B1C1D;
 
 .sidebar {
-  display:flex;
-  flex-direction:column;
-  justify-content: space-between;
+  @include media(">tablet") {
+    display:flex;
+    flex-direction:column;
+    justify-content: space-between;
+  }
+  @include media(">desktop") {
+    .collapse.button {
+      display: none;
+    }
+  }
+  @include media("<desktop") {
+    position: static !important;
+    width: 100% !important;
+    &.collapsed {
+      .menu-area, .player-wrapper, .tabs {
+        display: none;
+      }
+    }
+  }
 
   > div {
     margin: 0;
@@ -160,7 +188,12 @@ $sidebar-color: #1B1C1D;
 }
 .tabs {
   overflow-y: auto;
-  height: 0px;
+  @include media(">tablet") {
+    height: 0px;
+  }
+  @include media("<desktop") {
+    max-height: 400px;
+  }
 }
 .tab[data-tab="queue"] {
   tr {
@@ -174,7 +207,6 @@ $sidebar-color: #1B1C1D;
 
 .ui.inverted.segment.header-wrapper {
   padding: 0;
-  padding-bottom: 1rem;
 }
 .tabs {
   flex: 1;
@@ -191,9 +223,14 @@ $sidebar-color: #1B1C1D;
 }
 
 .ui.search {
-  display: inline-block;
+  display: block;
   > a {
     margin-right: 1.5rem;
   }
+  .collapse.button {
+    margin-right: 0.5rem;
+    margin-top: 0.5rem;
+    float: right;
+  }
 }
 </style>
diff --git a/front/src/components/audio/SearchBar.vue b/front/src/components/audio/SearchBar.vue
index 9d8b39f870cac19021fc56d9df3368d8f05f6ddf..56a8e77be1f1719b66c1c72cc3d1e07d45a71853 100644
--- a/front/src/components/audio/SearchBar.vue
+++ b/front/src/components/audio/SearchBar.vue
@@ -6,6 +6,7 @@
       <i class="search icon"></i>
     </div>
     <div class="results"></div>
+    <slot name="after"></slot>
   </div>
 </template>
 
@@ -25,6 +26,9 @@ export default {
       onSelect (result, response) {
         router.push(result.routerUrl)
       },
+      onSearchQuery (query) {
+        self.$emit('search')
+      },
       apiSettings: {
         beforeXHR: function (xhrObject) {
           xhrObject.setRequestHeader('Authorization', self.$store.getters['auth/header'])