diff --git a/bin/svgs.js b/bin/svgs.js
index e4bd6a7..ec5e841 100644
--- a/bin/svgs.js
+++ b/bin/svgs.js
@@ -31,5 +31,6 @@ module.exports = [
   {id: 'fa-exclamation-triangle', src: 'node_modules/font-awesome-svg-png/white/svg/exclamation-triangle.svg', title: 'Content warning'},
   {id: 'fa-check', src: 'node_modules/font-awesome-svg-png/white/svg/check.svg', title: 'Check'},
   {id: 'fa-trash', src: 'node_modules/font-awesome-svg-png/white/svg/trash-o.svg', title: 'Delete'},
-  {id: 'fa-hourglass', src: 'node_modules/font-awesome-svg-png/white/svg/hourglass.svg', title: 'Follow requested'}
+  {id: 'fa-hourglass', src: 'node_modules/font-awesome-svg-png/white/svg/hourglass.svg', title: 'Follow requested'},
+  {id: 'fa-pencil', src: 'node_modules/font-awesome-svg-png/white/svg/pencil.svg', title: 'Compose'}
 ]
diff --git a/routes/_components/compose/ComposeBox.html b/routes/_components/compose/ComposeBox.html
index d02d107..5015833 100644
--- a/routes/_components/compose/ComposeBox.html
+++ b/routes/_components/compose/ComposeBox.html
@@ -1,4 +1,4 @@
-
+
   
   {{#if contentWarningShown}}
     
   
   
-  
  
+
+
+ 
+
+
 
 
\ No newline at end of file
diff --git a/routes/_components/dialog/ModalDialog.html b/routes/_components/dialog/ModalDialog.html
index aa8d2f1..0c6faaf 100644
--- a/routes/_components/dialog/ModalDialog.html
+++ b/routes/_components/dialog/ModalDialog.html
@@ -4,7 +4,7 @@
 >
 
 
   
@@ -41,7 +41,10 @@
     position: fixed;
     top: 50%;
     left: 50%;
+    -webkit-filter: blur(0);
+    will-change: transform;
     transform: translate(-50%, -50%);
+    -webkit-font-smoothing: antialiased; /* fix for transform:translate causing blurry text in Chrome/Safari */
     padding: 0;
     border: 1px solid var(--main-border);
     border-radius: 2px;
diff --git a/routes/_components/dialog/dialogs.js b/routes/_components/dialog/dialogs.js
index f919040..c26d99f 100644
--- a/routes/_components/dialog/dialogs.js
+++ b/routes/_components/dialog/dialogs.js
@@ -4,3 +4,4 @@ export * from './showVideoDialog'
 export * from './showEmojiDialog'
 export * from './showPostPrivacyDialog'
 export * from './showStatusOptionsDialog'
+export * from './showComposeDialog'
diff --git a/routes/_components/dialog/showComposeDialog.js b/routes/_components/dialog/showComposeDialog.js
new file mode 100644
index 0000000..86acde7
--- /dev/null
+++ b/routes/_components/dialog/showComposeDialog.js
@@ -0,0 +1,11 @@
+import ComposeDialog from './ComposeDialog.html'
+
+export function showComposeDialog () {
+  let dialog = new ComposeDialog({
+    target: document.getElementById('modal-dialog'),
+    data: {
+      label: 'Compose dialog'
+    }
+  })
+  dialog.show()
+}
diff --git a/scss/themes/_base.scss b/scss/themes/_base.scss
index 522db06..b5d9011 100644
--- a/scss/themes/_base.scss
+++ b/scss/themes/_base.scss
@@ -78,4 +78,6 @@
   --compose-autosuggest-item-hover: $compose-background;
   --compose-autosuggest-item-active: darken($compose-background, 5%);
   --compose-autosuggest-outline: lighten($focus-outline, 5%);
+
+  --compose-button-halo: rgba(255, 255, 255, 0.2);
 }
diff --git a/templates/2xx.html b/templates/2xx.html
index 75e26c5..2500ad1 100644
--- a/templates/2xx.html
+++ b/templates/2xx.html
@@ -16,9 +16,9 @@
 
   
 
@@ -109,6 +109,7 @@ body.offline,body.theme-hotpants.offline,body.theme-majesty.offline,body.theme-o
 
Check
 Delete
 Follow requested
+
Compose