diff --git a/assets/index.html b/assets/index.html
index 03d5e73c..8f173ac0 100644
--- a/assets/index.html
+++ b/assets/index.html
@@ -25,6 +25,8 @@
   <meta name="msapplication-TileImage" content="{{ .BaseURL }}/static/img/icons/msapplication-icon-144x144.png">
   <meta name="msapplication-TileColor" content="#2979ff">
 
+  <script>CSS = "{{ .CSS }}"</script>
+
   <% for (var chunk of webpack.chunks) {
     for (var file of chunk.files) {
       if (file.match(/\.(js|css)$/)) { %>
@@ -92,7 +94,6 @@
     }
   }
   </style>
-  <style title="global-css" type="text/css">{{ .CSS }}</style>
 </head>
 <body>
   <div id="app"></div>
diff --git a/assets/src/App.vue b/assets/src/App.vue
index 8baf0567..88916ace 100644
--- a/assets/src/App.vue
+++ b/assets/src/App.vue
@@ -1,11 +1,11 @@
 <template>
-  <router-view></router-view>
+  <router-view @update:css="updateCSS" @clean:css="cleanCSS"></router-view>
 </template>
 
 <script>
 export default {
   name: 'app',
-  mounted: function () {
+  mounted () {
     // Remove loading animation.
     let loading = document.getElementById('loading')
     loading.classList.add('done')
@@ -13,6 +13,36 @@ export default {
     setTimeout(function () {
       loading.parentNode.removeChild(loading)
     }, 200)
+
+    this.updateCSS()
+  },
+  methods: {
+    updateCSS (global = false) {
+      let css = this.$store.state.css
+
+      if (typeof this.$store.state.user.css === 'string' && !global) {
+        css += '\n' + this.$store.state.user.css
+      }
+
+      this.removeCSS()
+
+      let style = document.createElement('style')
+      style.title = 'custom-css'
+      style.type = 'text/css'
+      style.appendChild(document.createTextNode(css))
+      document.head.appendChild(style)
+    },
+    removeCSS () {
+      let style = document.querySelector('style[title="custom-css"]')
+      if (style === undefined || style === null) {
+        return
+      }
+
+      style.parentElement.removeChild(style)
+    },
+    cleanCSS () {
+      this.updateCSS(true)
+    }
   }
 }
 </script>
diff --git a/assets/src/css/dashboard.css b/assets/src/css/dashboard.css
index 1b93e780..ee747279 100644
--- a/assets/src/css/dashboard.css
+++ b/assets/src/css/dashboard.css
@@ -94,7 +94,7 @@ p code {
 .dashboard #nav li {
   width: 100%;
   padding: 0 0 1em;
-  border-bottom: 1px solid rgba(0, 0, 0, 0.05);
+  border-bottom: 2px solid rgba(0, 0, 0, 0.05);
 }
 
 .dashboard #nav li.active {
@@ -358,3 +358,62 @@ table tr>*:last-child {
     opacity: 1;
   }
 }
+
+.collapsible {
+  border-top: 1px solid rgba(0,0,0,0.1);
+}
+
+.collapsible:last-of-type {
+  border-bottom: 1px solid rgba(0,0,0,0.1);
+}
+
+.collapsible > input {
+  display: none;
+}
+
+.collapsible > label {
+  padding: 1em 0;
+  cursor: pointer;
+  border-right: 0;
+  border-left: 0;
+  display: flex;
+  justify-content: space-between;
+}
+
+.collapsible > label * {
+  margin: 0;
+  color: rgba(0,0,0,0.57);
+}
+
+.collapsible > label i {
+  transition: .2s ease transform
+}
+
+.collapsible .collapse {
+  max-height: 0;
+  overflow: hidden;
+  transition: .2s ease all;
+}
+
+.collapsible > input:checked ~ .collapse {
+  padding-top: 1em;
+  padding-bottom: 1em;
+  max-height: 20em;
+}
+
+.collapsible > input:checked ~ label i {
+  transform: rotate(180deg)
+}
+
+.card .collapsible {
+  width: calc(100% + 2em);
+  margin: 0 -1em;
+}
+
+.card .collapsible > label {
+  padding: 1em;
+}
+
+.card .collapsible .collapse {
+  padding: 0 1em;
+}
diff --git a/assets/src/css/listing.css b/assets/src/css/listing.css
index 1d24370e..02bd8d9c 100644
--- a/assets/src/css/listing.css
+++ b/assets/src/css/listing.css
@@ -159,7 +159,7 @@
 
 #listing.list .item.header {
   display: flex !important;
-  background: #f8f8f8;
+  background: #fafafa;
   position: fixed;
   width: calc(100% - 19em);
   top: 7em;
diff --git a/assets/src/i18n/en.yaml b/assets/src/i18n/en.yaml
index 5b078c2b..d988141b 100644
--- a/assets/src/i18n/en.yaml
+++ b/assets/src/i18n/en.yaml
@@ -117,7 +117,7 @@ settings:
   commandsHelp: >
     Here you can set commands that are executed in the named events. You
     write one command per line. If the event is related to files, such as before and
-    after saving, the environment variable "file" will be available with the path
+    after saving, the environment variable "FILE" will be available with the path
     of the file.
   commandsUpdated: Commands updated!
   customStylesheet: Custom Stylesheet
diff --git a/assets/src/i18n/fr.yaml b/assets/src/i18n/fr.yaml
index b1eafdc6..8c2a501c 100644
--- a/assets/src/i18n/fr.yaml
+++ b/assets/src/i18n/fr.yaml
@@ -115,7 +115,7 @@ settings:
   commandsHelp: >
     Ici vous pouvez définir des commandes qui seront exécutées lors de l'évènement correspondant.
     Vous devez indiquer une commande par ligne. Si l'évènement est en rapport avec des fichiers,
-    par exemple avant et après enregistrement, la variable d'environement "file" sera disponible
+    par exemple avant et après enregistrement, la variable d'environement "FILE" sera disponible
     et contiendra le chemin d'accès vers le fichier.
   commandsUpdated: Commandes mises à jour !
   customStylesheet: Feuille de style personnalisée
diff --git a/assets/src/i18n/ja.yaml b/assets/src/i18n/ja.yaml
index fd1f130b..843f5d99 100644
--- a/assets/src/i18n/ja.yaml
+++ b/assets/src/i18n/ja.yaml
@@ -118,7 +118,7 @@ settings:
     ここで、名前付きイベントに実行するコマンドを設定することができます。\
     一行にコマンド一つを入力してください。\
     イベントはファイルに関連する場合、例えばファイル保存の前にまたは後で、\
-    環境変数 file はファイルのパスに割り当てられます。"
+    環境変数 FILE はファイルのパスに割り当てられます。"
   commandsUpdated: コマンドは更新されました!
   customStylesheet: カスタムスタイルシ ート
   examples: 例
diff --git a/assets/src/i18n/pt.yaml b/assets/src/i18n/pt.yaml
index 20872831..626ca509 100644
--- a/assets/src/i18n/pt.yaml
+++ b/assets/src/i18n/pt.yaml
@@ -139,7 +139,7 @@ settings:
     Pode definir um conjunto de comandos a executar em determiandos eventos.
     Deve escrever um comando por linha. Se o evento estiver relacionado com ficheiros,
     como antes e depois de guardar, irá existir uma variável de ambiente denominada
-    "file" com o caminho do ficheiro.
+    "FILE" com o caminho do ficheiro.
   commandsUpdated: Comandos atualizados!
   customStylesheet: Estilos Personalizados
   examples: Exemplos
diff --git a/assets/src/i18n/zh-cn.yaml b/assets/src/i18n/zh-cn.yaml
index ef15298a..784735f7 100644
--- a/assets/src/i18n/zh-cn.yaml
+++ b/assets/src/i18n/zh-cn.yaml
@@ -117,7 +117,7 @@ settings:
   commandsHelp: "\
     在这里,您可以设置在指定事件下执行的命令,一行一条。\
     若事件与文件相关,如“在保存文件前”,\
-    则文件的路径会被赋值给环境变量 \"file\"。"
+    则文件的路径会被赋值给环境变量 \"FILE\"。"
   commandsUpdated: 命令已更新!
   customStylesheet: 自定义样式表
   examples: 例子
diff --git a/assets/src/i18n/zh-tw.yaml b/assets/src/i18n/zh-tw.yaml
index 62d88fc6..2f8f40de 100644
--- a/assets/src/i18n/zh-tw.yaml
+++ b/assets/src/i18n/zh-tw.yaml
@@ -117,7 +117,7 @@ settings:
   commandsHelp: "\
     在這裡,您可以設定在指定事件下執行的命令,一行一條。\
     若事件與檔案相關,如“在保存檔案前”,\
-    則檔案的路徑會被賦值給環境變數 \"file\"。"
+    則檔案的路徑會被賦值給環境變數 \"FILE\"。"
   commandsUpdated: 命令已更新!
   customStylesheet: 自定義樣式表
   examples: 範例
diff --git a/assets/src/store/index.js b/assets/src/store/index.js
index 0a479147..6069838c 100644
--- a/assets/src/store/index.js
+++ b/assets/src/store/index.js
@@ -12,6 +12,11 @@ const state = {
     key: '',
     items: []
   },
+  css: (() => {
+    let css = window.CSS
+    window.CSS = null
+    return css
+  })(),
   staticGen: document.querySelector('meta[name="staticgen"]').getAttribute('content'),
   baseURL: document.querySelector('meta[name="base"]').getAttribute('content'),
   noAuth: (document.querySelector('meta[name="noauth"]').getAttribute('content') === 'true'),
diff --git a/assets/src/store/mutations.js b/assets/src/store/mutations.js
index b8bf3fd9..36251041 100644
--- a/assets/src/store/mutations.js
+++ b/assets/src/store/mutations.js
@@ -31,6 +31,7 @@ const mutations = {
     i18n.locale = value.locale
     state.user = value
   },
+  setCSS: (state, value) => (state.css = value),
   setJWT: (state, value) => (state.jwt = value),
   multiple: (state, value) => (state.multiple = value),
   addSelected: (state, value) => (state.selected.push(value)),
diff --git a/assets/src/views/Layout.vue b/assets/src/views/Layout.vue
index 6120fe56..d2bc6b9d 100644
--- a/assets/src/views/Layout.vue
+++ b/assets/src/views/Layout.vue
@@ -6,7 +6,7 @@
     <site-header></site-header>
     <sidebar></sidebar>
     <main>
-      <router-view v-on:css-updated="updateCSS"></router-view>
+      <router-view @css="$emit('update:css')"></router-view>
     </main>
     <prompts></prompts>
   </div>
@@ -34,23 +34,10 @@ export default {
     }
   },
   mounted () {
-    this.updateCSS()
+    this.$emit('update:css')
   },
-  methods: {
-    updateCSS () {
-      let css = this.$store.state.user.css
-
-      let style = document.querySelector('style[title="user-css"]')
-      if (style !== undefined && style !== null) {
-        style.parentElement.removeChild(style)
-      }
-
-      style = document.createElement('style')
-      style.title = 'user-css'
-      style.type = 'text/css'
-      style.appendChild(document.createTextNode(css))
-      document.head.appendChild(style)
-    }
+  beforeDestroy () {
+    this.$emit('clean:css')
   }
 }
 </script>
diff --git a/assets/src/views/Settings.vue b/assets/src/views/Settings.vue
index 20aeaa1a..39db5de2 100644
--- a/assets/src/views/Settings.vue
+++ b/assets/src/views/Settings.vue
@@ -6,7 +6,7 @@
       <li :class="{ active: $route.path === '/settings/users' }"><router-link to="/settings/users">{{ $t('settings.userManagement') }}</router-link></li>
     </ul>
 
-    <router-view></router-view>
+    <router-view @css="$emit('css')"></router-view>
   </div>
 </template>
 
diff --git a/assets/src/views/settings/Global.vue b/assets/src/views/settings/Global.vue
index 424afde8..a87a2871 100644
--- a/assets/src/views/settings/Global.vue
+++ b/assets/src/views/settings/Global.vue
@@ -40,10 +40,17 @@
 
       <div class="card-content">
         <p class="small">{{ $t('settings.commandsHelp') }}</p>
-        <template v-for="command in commands">
-          <h3>{{ capitalize(command.name) }}</h3>
-          <textarea v-model.trim="command.value"></textarea>
-        </template>
+
+        <div v-for="command in commands" :key="command.name" class="collapsible">
+          <input :id="command.name" type="checkbox">
+          <label :for="command.name">
+            <p>{{ capitalize(command.name) }}</p>
+            <i class="material-icons">arrow_drop_down</i>
+          </label>
+          <div class="collapse">
+            <textarea v-model.trim="command.value"></textarea>
+          </div>
+        </div>
       </div>
 
       <div class="card-action">
@@ -73,6 +80,7 @@ export default {
   created () {
     getSettings()
       .then(settings => {
+        console.log(settings)
         if (this.$store.state.staticGen.length > 0) {
           this.parseStaticGen(settings.staticGen)
         }
@@ -120,9 +128,8 @@ export default {
       updateSettings(this.css, 'css')
         .then(() => {
           this.$showSuccess(this.$t('settings.settingsUpdated'))
-          let style = document.querySelector('style[title="global-css"]')
-          style.innerHTML = ''
-          style.appendChild(document.createTextNode(this.css))
+          this.$store.commit('setCSS', this.css)
+          this.$emit('css')
         })
         .catch(this.$showError)
     },
diff --git a/assets/src/views/settings/Profile.vue b/assets/src/views/settings/Profile.vue
index dcae8f0e..bcf11738 100644
--- a/assets/src/views/settings/Profile.vue
+++ b/assets/src/views/settings/Profile.vue
@@ -98,7 +98,7 @@ export default {
 
       updateUser(user, 'partial').then(location => {
         this.$store.commit('setUser', user)
-        this.$emit('css-updated')
+        this.$emit('css')
         this.$showSuccess(this.$t('settings.settingsUpdated'))
       }).catch(e => {
         this.$showError(e)
diff --git a/filemanager.go b/filemanager.go
index e38e9d71..3fa91863 100644
--- a/filemanager.go
+++ b/filemanager.go
@@ -128,6 +128,11 @@ func (m *FileManager) Setup() error {
 	// Tries to get the event commands from the database.
 	// If they don't exist, initialize them.
 	err = m.Store.Config.Get("commands", &m.Commands)
+
+	if err == nil {
+		// ADD handlers to commands if dont exist
+	}
+
 	if err != nil && err == ErrNotExist {
 		m.Commands = map[string][]string{
 			"before_save":    {},
diff --git a/rice-box.go.REMOVED.git-id b/rice-box.go.REMOVED.git-id
index c8bf61bb..a4649500 100644
--- a/rice-box.go.REMOVED.git-id
+++ b/rice-box.go.REMOVED.git-id
@@ -1 +1 @@
-b8d6da7ded27e9573a9a2bcd23f93528610b6f9a
\ No newline at end of file
+c249fdbec733fcd4aefc255262596bee379c471a
\ No newline at end of file