diff --git a/package-lock.json b/package-lock.json
index c0035c1..785a17f 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -1859,6 +1859,17 @@
       "integrity": "sha512-GRMWDxpOB6Dgk2E5Uo+3eEBvtOOlimMmpbFiKuLFnQzYDavtLFY3K5ona41jgN/WdRZtG7utuVSVTL4HbZHGkw==",
       "dev": true
     },
+    "clipboard": {
+      "version": "2.0.6",
+      "resolved": "https://registry.npmjs.org/clipboard/-/clipboard-2.0.6.tgz",
+      "integrity": "sha512-g5zbiixBRk/wyKakSwCKd7vQXDjFnAMGHoEyBogG/bw9kTD9GvdAvaoRR1ALcEzt3pVKxZR0pViekPMIS0QyGg==",
+      "optional": true,
+      "requires": {
+        "good-listener": "^1.2.2",
+        "select": "^1.1.2",
+        "tiny-emitter": "^2.0.0"
+      }
+    },
     "cliui": {
       "version": "5.0.0",
       "resolved": "https://registry.npmjs.org/cliui/-/cliui-5.0.0.tgz",
@@ -2608,6 +2619,12 @@
       "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz",
       "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk="
     },
+    "delegate": {
+      "version": "3.2.0",
+      "resolved": "https://registry.npmjs.org/delegate/-/delegate-3.2.0.tgz",
+      "integrity": "sha512-IofjkYBZaZivn0V8nnsMJGBr4jVLxHDheKSW88PyxS5QC4Vo9ZbZVvhzlSxY87fVq3STR6r+4cGepyHkcWOQSw==",
+      "optional": true
+    },
     "depd": {
       "version": "1.1.2",
       "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz",
@@ -4165,6 +4182,15 @@
         }
       }
     },
+    "good-listener": {
+      "version": "1.2.2",
+      "resolved": "https://registry.npmjs.org/good-listener/-/good-listener-1.2.2.tgz",
+      "integrity": "sha1-1TswzfkxPf+33JoNR3CWqm0UXFA=",
+      "optional": true,
+      "requires": {
+        "delegate": "^3.1.2"
+      }
+    },
     "graceful-fs": {
       "version": "4.2.3",
       "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.3.tgz",
@@ -6407,6 +6433,14 @@
         "pretty-checkbox": "^3.0.3"
       }
     },
+    "prismjs": {
+      "version": "1.20.0",
+      "resolved": "https://registry.npmjs.org/prismjs/-/prismjs-1.20.0.tgz",
+      "integrity": "sha512-AEDjSrVNkynnw6A+B1DsFkd6AVdTnp+/WoUixFRULlCLZVRZlVQMVWio/16jv7G1FscUxQxOQhWwApgbnxr6kQ==",
+      "requires": {
+        "clipboard": "^2.0.0"
+      }
+    },
     "private": {
       "version": "0.1.8",
       "resolved": "https://registry.npmjs.org/private/-/private-0.1.8.tgz",
@@ -7427,6 +7461,12 @@
         "xmlchars": "^2.1.1"
       }
     },
+    "select": {
+      "version": "1.1.2",
+      "resolved": "https://registry.npmjs.org/select/-/select-1.1.2.tgz",
+      "integrity": "sha1-DnNQrN7ICxEIUoeG7B1EGNEbOW0=",
+      "optional": true
+    },
     "semver": {
       "version": "5.7.1",
       "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz",
@@ -8071,6 +8111,12 @@
       "resolved": "https://registry.npmjs.org/timsort/-/timsort-0.3.0.tgz",
       "integrity": "sha1-QFQRqOfmM5/mTbmiNN4R3DHgK9Q="
     },
+    "tiny-emitter": {
+      "version": "2.1.0",
+      "resolved": "https://registry.npmjs.org/tiny-emitter/-/tiny-emitter-2.1.0.tgz",
+      "integrity": "sha512-NB6Dk1A9xgQPMoGqC5CVXn123gWyte215ONT5Pp5a0yt4nlEoO1ZWeCwpncaekPHXO60i47ihFnZPiRPjRMq4Q==",
+      "optional": true
+    },
     "tiny-inflate": {
       "version": "1.0.3",
       "resolved": "https://registry.npmjs.org/tiny-inflate/-/tiny-inflate-1.0.3.tgz",
@@ -8564,6 +8610,11 @@
       "resolved": "https://registry.npmjs.org/vue-hot-reload-api/-/vue-hot-reload-api-2.3.4.tgz",
       "integrity": "sha512-BXq3jwIagosjgNVae6tkHzzIk6a8MHFtzAdwhnV5VlvPTFxDCvIttgSiHWjdGoTJvXtmRu5HacExfdarRcFhog=="
     },
+    "vue-prism-component": {
+      "version": "1.2.0",
+      "resolved": "https://registry.npmjs.org/vue-prism-component/-/vue-prism-component-1.2.0.tgz",
+      "integrity": "sha512-0N9CNuQu+36CJpdsZHrhdq7d18oBvjVMjawyKdIr8xuzFWLfdxECZQYbFaYoopPBg3SvkEEMtkhYqdgTQl5Y+A=="
+    },
     "vue-select": {
       "version": "3.10.3",
       "resolved": "https://registry.npmjs.org/vue-select/-/vue-select-3.10.3.tgz",
diff --git a/package.json b/package.json
index ddcb077..bcf03ef 100644
--- a/package.json
+++ b/package.json
@@ -40,9 +40,11 @@
     "do-vue": "git+https://github.com/do-community/do-vue.git",
     "parcel-bundler": "^1.12.4",
     "pretty-checkbox-vue": "^1.1.9",
+    "prismjs": "^1.20.0",
     "qs": "^6.9.4",
     "vue": "^2.6.11",
     "vue-hot-reload-api": "^2.3.3",
+    "vue-prism-component": "^1.2.0",
     "vue-select": "^3.10.3",
     "vuex": "^3.3.0"
   },
diff --git a/src/nginxconfig/scss/style.scss b/src/nginxconfig/scss/style.scss
index 36957ee..4704d08 100644
--- a/src/nginxconfig/scss/style.scss
+++ b/src/nginxconfig/scss/style.scss
@@ -14,6 +14,8 @@ See the License for the specific language governing permissions and
 limitations under the License.
 */
 
+@import url("https://assets.digitalocean.com/prism/prism.css");
+
 $header: #0071fe;
 $highlight: #f2c94c;
 @import "~do-bulma/src/style";
@@ -379,4 +381,32 @@ $highlight: #f2c94c;
       margin: 1rem 0;
     }
   }
+
+  pre {
+    &[class*="language-"] {
+      padding: .5rem 1rem;
+
+      code {
+        &[class*="language-"] {
+          .token {
+            font-weight: normal;
+
+            // Fix Bulma interfering with Prism
+            &.number,
+            &.tag {
+              background: transparent;
+              border-radius: initial;
+              color: inherit;
+              display: initial;
+              font-size: inherit;
+              margin: initial;
+              padding: initial;
+              text-align: initial;
+              vertical-align: initial;
+            }
+          }
+        }
+      }
+    }
+  }
 }
diff --git a/src/nginxconfig/templates/setup_sections/certbot.vue b/src/nginxconfig/templates/setup_sections/certbot.vue
index 7198a56..054e8b1 100644
--- a/src/nginxconfig/templates/setup_sections/certbot.vue
+++ b/src/nginxconfig/templates/setup_sections/certbot.vue
@@ -5,8 +5,7 @@
                 <p>
                     Comment out SSL related directives in the configuration:
                     <br />
-                    <code class="slim">sed -i -r 's/(listen .*443)/\1;#/g;
-                        s/(ssl_(certificate|certificate_key|trusted_certificate) )/#;#\1/g' {{ sitesAvailable }}</code>
+                    <Prism language="bash" :code="`sed -i -r 's/(listen .*443)/\\1;#/g; s/(ssl_(certificate|certificate_key|trusted_certificate) )/#;#\\1/g' ${sitesAvailable}`"></Prism>
                 </p>
             </li>
 
@@ -14,17 +13,15 @@
                 <p>
                     Reload your NGINX server:
                     <br />
-                    <code class="slim">sudo nginx -t && sudo systemctl reload nginx</code>
+                    <Prism language="bash" code="sudo nginx -t && sudo systemctl reload nginx"></Prism>
                 </p>
             </li>
 
             <li>
                 <p>
                     Obtain SSL certificates from Let's Encrypt using Certbot:
-                    <template v-for="cmd in certbotCmds">
-                        <br />
-                        <code class="slim">{{ cmd }}</code>
-                    </template>
+                    <br />
+                    <Prism language="bash" :code="certbotCmds"></Prism>
                 </p>
             </li>
 
@@ -32,7 +29,7 @@
                 <p>
                     Uncomment SSL related directives in the configuration:
                     <br />
-                    <code class="slim">sed -i -r 's/#?;#//g' {{ sitesAvailable }}</code>
+                    <Prism language="bash" :code="`sed -i -r 's/#?;#//g' ${sitesAvailable}`"></Prism>
                 </p>
             </li>
 
@@ -40,7 +37,7 @@
                 <p>
                     Reload your NGINX server:
                     <br />
-                    <code class="slim">sudo nginx -t && sudo systemctl reload nginx</code>
+                    <Prism language="bash" code="sudo nginx -t && sudo systemctl reload nginx"></Prism>
                 </p>
             </li>
 
@@ -48,9 +45,9 @@
                 <p>
                     Configure Certbot to reload NGINX when it successfully renews certificates:
                     <br />
-                    <code class="slim">echo -e '#!/bin/bash\nnginx -t && systemctl reload nginx' | sudo tee /etc/letsencrypt/renewal-hooks/post/nginx-reload.sh</code>
+                    <Prism language="bash" code="echo -e '#!/bin/bash\nnginx -t && systemctl reload nginx' | sudo tee /etc/letsencrypt/renewal-hooks/post/nginx-reload.sh"></Prism>
                     <br />
-                    <code class="slim">sudo chmod a+x /etc/letsencrypt/renewal-hooks/post/nginx-reload.sh</code>
+                    <Prism language="bash" code="sudo chmod a+x /etc/letsencrypt/renewal-hooks/post/nginx-reload.sh"></Prism>
                 </p>
             </li>
         </ol>
@@ -70,12 +67,17 @@
 </template>
 
 <script>
+    import Prism from 'vue-prism-component';
+    import 'prismjs/components/prism-bash';
     import i18n from '../../i18n';
 
     export default {
         name: 'SetupCertbot',
         display: 'Certbot',
         key: 'certbot',
+        components: {
+            Prism,
+        },
         props: {
             data: Object,
         },
@@ -121,7 +123,7 @@
                             `-w ${this.letsEncryptDir}`,
                             '-n --agree-tos --force-renewal',
                         ].filter(x => x !== null).join(' ')
-                    ));
+                    )).join('\n');
             },
         },
     };
diff --git a/src/nginxconfig/templates/setup_sections/download.vue b/src/nginxconfig/templates/setup_sections/download.vue
index cfbcd7a..2dccecb 100644
--- a/src/nginxconfig/templates/setup_sections/download.vue
+++ b/src/nginxconfig/templates/setup_sections/download.vue
@@ -17,7 +17,7 @@
                 <p>
                     Check that you have <b>unzip</b> installed, or install it, on your server by running this command:
                     <br />
-                    <code class="slim">(unzip -v >/dev/null 2>&1 && echo 'unzip already installed') || sudo apt-get install unzip</code>
+                    <Prism language="bash" code="(unzip -v >/dev/null 2>&1 && echo 'unzip already installed') || sudo apt-get install unzip"></Prism>
                 </p>
             </li>
 
@@ -25,7 +25,7 @@
                 <p>
                     Navigate to your NGINX <b>configuration directory</b> on your server:
                     <br />
-                    <code class="slim">cd {{ $parent.nginxDir }}</code>
+                    <Prism language="bash" :code="`cd ${$parent.nginxDir}`"></Prism>
                 </p>
             </li>
 
@@ -33,7 +33,7 @@
                 <p>
                     Create a <b>backup</b> of your current NGINX configuration:
                     <br />
-                    <code class="slim">tar -czvf nginx_$(date +'%F_%H-%M-%S').tar.gz nginx.conf sites-available/ sites-enabled/ nginxconfig.io/</code>
+                    <Prism language="bash" code="tar -czvf nginx_$(date +'%F_%H-%M-%S').tar.gz nginx.conf sites-available/ sites-enabled/ nginxconfig.io/"></Prism>
                 </p>
             </li>
 
@@ -41,7 +41,7 @@
                 <p>
                     <b>Unzip</b> the new compressed configuration archive:
                     <br />
-                    <code class="slim">unzip -o {{ $parent.zipName }}</code>
+                    <Prism language="bash" :code="`unzip -o ${$parent.nginxDir}`"></Prism>
                 </p>
             </li>
         </ol>
@@ -49,12 +49,17 @@
 </template>
 
 <script>
+    import Prism from 'vue-prism-component';
+    import 'prismjs/components/prism-bash';
     import i18n from '../../i18n';
 
     export default {
         name: 'SetupDownload',
         display: 'Download',
         key: 'download',
+        components: {
+            Prism,
+        },
         props: {
             data: Object,
         },
diff --git a/src/nginxconfig/templates/setup_sections/go_live.vue b/src/nginxconfig/templates/setup_sections/go_live.vue
index 30c81d5..8ad85c4 100644
--- a/src/nginxconfig/templates/setup_sections/go_live.vue
+++ b/src/nginxconfig/templates/setup_sections/go_live.vue
@@ -6,18 +6,23 @@
         <p>
             Reload NGINX to load in your new configuration:
             <br />
-            <code class="slim">sudo nginx -t && sudo systemctl reload nginx</code>
+            <Prism language="bash" code="sudo nginx -t && sudo systemctl reload nginx"></Prism>
         </p>
     </div>
 </template>
 
 <script>
+    import Prism from 'vue-prism-component';
+    import 'prismjs/components/prism-bash';
     import i18n from '../../i18n';
 
     export default {
         name: 'SetupGoLive',
         display: 'Go live!',
         key: 'goLive',
+        components: {
+            Prism,
+        },
         props: {
             data: Object,
         },
diff --git a/src/nginxconfig/templates/setup_sections/ssl.vue b/src/nginxconfig/templates/setup_sections/ssl.vue
index cdd1cde..4b3cf45 100644
--- a/src/nginxconfig/templates/setup_sections/ssl.vue
+++ b/src/nginxconfig/templates/setup_sections/ssl.vue
@@ -5,7 +5,7 @@
                 <p>
                     Generate <b>Diffie-Hellman keys</b> by running this command on your server:
                     <br />
-                    <code class="slim">openssl dhparam -out {{ nginxDir }}/dhparam.pem {{ diffieHellmanValue }}</code>
+                    <Prism language="bash" :code="`openssl dhparam -out ${nginxDir}/dhparam.pem ${diffieHellmanValue}`"></Prism>
                 </p>
             </li>
 
@@ -13,9 +13,9 @@
                 <p>
                     Create a common <b>ACME-challenge</b> directory (for <b>Let's Encrypt</b>):
                     <br />
-                    <code class="slim">mkdir -p {{ letsEncryptDir }}</code>
+                    <Prism language="bash" :code="`mkdir -p ${letsEncryptDir}`"></Prism>
                     <br />
-                    <code class="slim">chown {{ nginxUser }} {{ letsEncryptDir }}</code>
+                    <Prism language="bash" :code="`chown ${nginxUser} ${letsEncryptDir}`"></Prism>
                 </p>
             </li>
         </ol>
@@ -35,12 +35,17 @@
 </template>
 
 <script>
+    import Prism from 'vue-prism-component';
+    import 'prismjs/components/prism-bash';
     import i18n from '../../i18n';
 
     export default {
         name: 'SetupSSL',
         display: 'SSL init',
         key: 'ssl',
+        components: {
+            Prism,
+        },
         props: {
             data: Object,
         },