diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml
index 9b2611c6f2ece5740089676886a899744f1adf18..04c39087f7809a575662163b68da9283fa4dffb9 100644
--- a/.gitlab-ci.yml
+++ b/.gitlab-ci.yml
@@ -48,6 +48,10 @@ pages:
     - git checkout dev
     - git pull
 
+    # Check for favicon updates
+    - npm install -g cli-real-favicon
+    - real-favicon check-for-update --fail-on-update faviconData.json
+
     # Build for GitLab Pages
     - npm run build-gitlab
     - cp -a dist/. public/
diff --git a/css/main.css b/css/main.css
index 57f548b397795fc57b5a1b8e66fb2e6901b1d164..bc78357add4bbd4312da6eaddfc74f40a33e438e 100644
--- a/css/main.css
+++ b/css/main.css
@@ -1,50 +1,73 @@
+:root {
+  --main-accent-color: #97010e;
+  --sub-accent-color: #f34c3f;
+  --main-highlight-color: #b8caba;
+  --sub-highlight-color: #5a6b5d;
+  --100-color: #e1e1e1;
+  --200-color: #adadad;
+  --300-color: #949494;
+  --400-color: #474747;
+}
+
 body {
   display: flex;
   flex-flow: column wrap;
-  font-family: ui-sans-serif, sans-serif;
+  font-family: "Roboto Mono", ui-monospace, monospace, ui-sans-serif, sans-serif;
   -webkit-user-select: none; /* still needed for Safari 16 */
   user-select: none;
 }
 
+#viewer-settings-knob {
+  position: fixed;
+  background: var(--100-color);
+  margin: 0.5rem;
+  padding: 0.5rem;
+  border-radius: 0.75rem;
+  display: none;
+}
+
 menu {
-  display: inline-block;
+  display: inline-flex;
   list-style-type: none;
   padding: 0;
   margin: 0;
 }
 
-header {
-  display: none;
-}
-
-#tailorbirdLogo {
-  --logosize-scalefactor: 1.5;
-  height: calc(102px / var(--logosize-scalefactor));
-  width: calc(334px / var(--logosize-scalefactor));
-}
-
-menu > li {
-  display: inline-block;
-}
-
 menu button {
   border-radius: 0.25rem;
-  background-color: #ccc;
+  background-color: var(--200-color);
   padding: 0.25rem 0.75rem;
   margin: 0 0.5rem;
-  border: 1.5px solid #ccc;
-  transition: 0.3s;
+  border: 1.5px solid var(--300-color);
   cursor: pointer;
 }
+menu button#zoomIntoViewButton {
+  cursor: zoom-in;
+}
+menu button#zoomOutViewButton {
+  cursor: zoom-out;
+}
+menu button.buttonRightFlat {
+  margin-right: 0;
+  border-right: none;
+  border-top-right-radius: 0;
+  border-bottom-right-radius: 0;
+}
+menu button.buttonLeftFlat {
+  margin-left: 0;
+  border-left: none;
+  border-top-left-radius: 0;
+  border-bottom-left-radius: 0;
+}
 menu button:hover {
-  background-color: #bbb;
-  border-color: #7a7a7a;
+  background-color: var(--300-color);
+  border-color: var(--400-color);
 }
 menu button:active {
-  background-color: #999;
+  background-color: var(--400-color);
 }
 menu button:disabled {
-  color: #aaa;
+  color: var(--100-color);
 }
 menu.menu-impressum {
   padding-left: 1rem;
@@ -56,7 +79,7 @@ menu.menu-impressum li:not(:last-child)::after {
 }
 menu.menu-impressum a {
   text-decoration: none;
-  color: #000;
+  color: black;
 }
 menu.menu-right {
   float: right;
@@ -69,7 +92,7 @@ main {
 }
 
 section {
-  outline: 2px solid black;
+  outline: 2px solid var(--400-color);
   display: flex;
   flex-direction: column;
   height: 100vh;
@@ -80,13 +103,16 @@ section#viewer {
 }
 
 article#viewer-settings {
-  background-color: #eee;
-  padding: 0.5rem 0 0 0.5rem;
-  outline: 2px solid black;
+  position: fixed;
+  background: no-repeat url("/icon.svg") var(--100-color);
+  margin: 0 1vw;
+  padding: 0.75rem 0 0 3rem;
+  outline: 2px solid var(--400-color);
+  transition: 0.3s;
 }
 
 section#tools {
-  background-color: #eee;
+  background-color: var(--100-color);
   flex: none; /* Equivalent to flex: 0 0 auto; */
 }
 
@@ -120,15 +146,15 @@ article#tools-list {
 }
 
 #list-commands {
-  background-color: #eee;
+  background-color: var(--100-color);
 }
 
 #list-commands > ul {
-  background-color: #bbb;
+  background-color: var(--200-color);
 }
 
 #list-commands > ul > ul {
-  background-color: #999;
+  background-color: var(--400-color);
 }
 
 #list-commands li {
@@ -139,17 +165,16 @@ article#tools-list {
 
 #list-commands li.selected {
   color: white;
-  background-color: darkslategray;
+  background-color: var(--sub-highlight-color);
 }
 
 #list-commands li:hover {
-  color: white;
-  background-color: darkgray;
+  background-color: var(--main-highlight-color);
 }
 
 #list-commands li.selected:hover {
   color: white;
-  background-color: darkslategray;
+  background-color: var(--sub-highlight-color);
 }
 
 article#tools-list-buttons {
@@ -161,59 +186,26 @@ article#tools-list-buttons {
   padding: 0;
 }
 
-#helpDialog ul > li > span.helpControlText {
+#helpDialog span.helpControlText {
   position: absolute;
   left: 3rem;
 }
 
-/* Zdog */
-
-.zdog-canvas {
-  display: block;
-  width: 100%;
-  height: calc(100vh - 3rem); /* 3rem is height of footer incl. margin */
-}
-
-/*ul {
-  padding-left: 0;
-  margin-bottom: 0;
-}
-
-#command-area {
-  height: 400px;
-}
-
-#list-commands-wrapper {
-  margin: 1rem 0;
-  width: 300px;
-  float: left;
-  background-color: slategray;
-  outline-radius: 10px;
+#helpDialog a {
+  text-decoration: none;
+  color: black;
 }
 
-#list-commands > li {
-  width: 200px;
-  margin: 1rem auto;
-  padding: 0.5rem 1rem;
-  background-color: lightgray;
-  outline-radius: 10px;
+#helpLogo {
+  width: 75px;
+  height: 75px;
+  float: right;
 }
 
-#list-commands .command-active {
-  background-color: white;
-}
+/* Zdog */
 
-#popup-edit {
-  margin: 1rem 0;
-  width: 300px;
-  display: none;
-  float: right;
-  background-color: white;
-  padding: 2rem 3rem;
-  height: 300px;
-  outline-radius: 10px;
+.zdog-canvas {
+  display: block;
+  width: 100%;
+  height: 100vh;
 }
-
-#popup-edit-parameters {
-  list-style: none;
-}*/
diff --git a/faviconData.json b/faviconData.json
new file mode 100644
index 0000000000000000000000000000000000000000..94ba3a652e2ee680a1e0f706c5395254e35f311d
--- /dev/null
+++ b/faviconData.json
@@ -0,0 +1 @@
+{"result":{"status":"success"},"favicon":{"package_url":"https://realfavicongenerator.net/files/99cf5207dde3f7619c6fb5a9800c66ae90c92df3/favicon_package_v0.16.zip","files_urls":["https://realfavicongenerator.net/files/99cf5207dde3f7619c6fb5a9800c66ae90c92df3/package_files/android-chrome-192x192.png","https://realfavicongenerator.net/files/99cf5207dde3f7619c6fb5a9800c66ae90c92df3/package_files/android-chrome-512x512.png","https://realfavicongenerator.net/files/99cf5207dde3f7619c6fb5a9800c66ae90c92df3/package_files/apple-touch-icon.png","https://realfavicongenerator.net/files/99cf5207dde3f7619c6fb5a9800c66ae90c92df3/package_files/browserconfig.xml","https://realfavicongenerator.net/files/99cf5207dde3f7619c6fb5a9800c66ae90c92df3/package_files/favicon-16x16.png","https://realfavicongenerator.net/files/99cf5207dde3f7619c6fb5a9800c66ae90c92df3/package_files/favicon-32x32.png","https://realfavicongenerator.net/files/99cf5207dde3f7619c6fb5a9800c66ae90c92df3/package_files/favicon.ico","https://realfavicongenerator.net/files/99cf5207dde3f7619c6fb5a9800c66ae90c92df3/package_files/mstile-144x144.png","https://realfavicongenerator.net/files/99cf5207dde3f7619c6fb5a9800c66ae90c92df3/package_files/mstile-150x150.png","https://realfavicongenerator.net/files/99cf5207dde3f7619c6fb5a9800c66ae90c92df3/package_files/mstile-310x150.png","https://realfavicongenerator.net/files/99cf5207dde3f7619c6fb5a9800c66ae90c92df3/package_files/mstile-310x310.png","https://realfavicongenerator.net/files/99cf5207dde3f7619c6fb5a9800c66ae90c92df3/package_files/mstile-70x70.png","https://realfavicongenerator.net/files/99cf5207dde3f7619c6fb5a9800c66ae90c92df3/package_files/safari-pinned-tab.svg","https://realfavicongenerator.net/files/99cf5207dde3f7619c6fb5a9800c66ae90c92df3/package_files/site.webmanifest"],"html_code":"<link rel=\"apple-touch-icon\" sizes=\"180x180\" href=\"/apple-touch-icon.png\">\n<link rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"/favicon-32x32.png\">\n<link rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"/favicon-16x16.png\">\n<link rel=\"manifest\" href=\"/site.webmanifest\">\n<link rel=\"mask-icon\" href=\"/safari-pinned-tab.svg\" color=\"#5a6b5d\">\n<meta name=\"apple-mobile-web-app-title\" content=\"Tailorbird\">\n<meta name=\"application-name\" content=\"Tailorbird\">\n<meta name=\"msapplication-TileColor\" content=\"#e1e1e1\">\n<meta name=\"theme-color\" content=\"#e1e1e1\">","compression":"false","overlapping_markups":["link[rel=\"apple-touch-icon\"]","meta[name=\"apple-mobile-web-app-title\"]","link[rel=\"shortcut\"]","link[rel=\"shortcut icon\"]","link[rel=\"icon\",sizes=\"16x16\"]","link[rel=\"icon\",sizes=\"32x32\"]","meta[name=\"msapplication-TileColor\"]","meta[name=\"application-name\"]","link[rel=\"manifest\"]","meta[name=\"theme-color\"]","link[rel=\"mask-icon\"]"]},"files_location":{"type":"path","path":"/"},"preview_picture_url":"https://realfavicongenerator.net/files/99cf5207dde3f7619c6fb5a9800c66ae90c92df3/favicon_preview.png","version":"0.16"}
\ No newline at end of file
diff --git a/faviconDescription.json b/faviconDescription.json
new file mode 100644
index 0000000000000000000000000000000000000000..7b8af8907023b833beb81d16785aecf0409848d2
--- /dev/null
+++ b/faviconDescription.json
@@ -0,0 +1,64 @@
+{
+  "masterPicture": "img/icon.svg",
+  "iconsPath": "/",
+  "design": {
+    "ios": {
+      "pictureAspect": "backgroundAndMargin",
+      "backgroundColor": "#e1e1e1",
+      "margin": "0%",
+      "assets": {
+        "ios6AndPriorIcons": false,
+        "ios7AndLaterIcons": false,
+        "precomposedIcons": false,
+        "declareOnlyDefaultIcon": true
+      },
+      "appName": "Tailorbird"
+    },
+    "desktopBrowser": {
+      "design": "raw"
+    },
+    "windows": {
+      "pictureAspect": "noChange",
+      "backgroundColor": "#e1e1e1",
+      "onConflict": "override",
+      "assets": {
+        "windows80Ie10Tile": false,
+        "windows10Ie11EdgeTiles": {
+          "small": false,
+          "medium": true,
+          "big": false,
+          "rectangle": false
+        }
+      },
+      "appName": "Tailorbird"
+    },
+    "androidChrome": {
+      "pictureAspect": "noChange",
+      "themeColor": "#e1e1e1",
+      "manifest": {
+        "name": "Tailorbird",
+        "startUrl": "https://tailorbird3d.rwth-aachen.de/",
+        "display": "standalone",
+        "orientation": "notSet",
+        "onConflict": "override",
+        "declared": true
+      },
+      "assets": {
+        "legacyIcon": false,
+        "lowResolutionIcons": false
+      }
+    },
+    "safariPinnedTab": {
+      "pictureAspect": "blackAndWhite",
+      "threshold": 77.96875,
+      "themeColor": "#5a6b5d"
+    }
+  },
+  "settings": {
+    "scalingAlgorithm": "Mitchell",
+    "errorOnImageTooSmall": false,
+    "readmeFile": false,
+    "htmlCodeFile": false,
+    "usePathAsIs": false
+  }
+}
diff --git a/img/logo-big.png b/img/logo-big.png
deleted file mode 100644
index 35100594bc4c7ae493259a6c5eedf552abbef2f0..0000000000000000000000000000000000000000
Binary files a/img/logo-big.png and /dev/null differ
diff --git a/img/logo-new.jpg b/img/logo-new.jpg
deleted file mode 100644
index d929ff3c0504cd7d4227e5917a0fc8384ea73749..0000000000000000000000000000000000000000
Binary files a/img/logo-new.jpg and /dev/null differ
diff --git a/img/logo.png b/img/logo.png
deleted file mode 100644
index 60ec9ec1d14ce473f34b41e3a8f9c54a3d39869b..0000000000000000000000000000000000000000
Binary files a/img/logo.png and /dev/null differ
diff --git a/index.html b/index.html
index 64172c48d0f454018e866b309b7c8fd2aa30aefc..9b64b8e465a8bd056d64b78b4a168637c53bc04d 100644
--- a/index.html
+++ b/index.html
@@ -4,6 +4,21 @@
     <meta charset="UTF-8" />
     <meta name="viewport" content="width=device-width, initial-scale=1.0" />
     <title>Tailorbird</title>
+    <link rel="apple-touch-icon" sizes="180x180" href="/apple-touch-icon.png" />
+    <link rel="icon" type="image/png" sizes="32x32" href="/favicon-32x32.png" />
+    <link rel="icon" type="image/png" sizes="16x16" href="/favicon-16x16.png" />
+    <link rel="manifest" href="/site.webmanifest" />
+    <link rel="mask-icon" href="/safari-pinned-tab.svg" color="#5a6b5d" />
+    <meta name="apple-mobile-web-app-title" content="Tailorbird" />
+    <meta name="application-name" content="Tailorbird" />
+    <meta name="msapplication-TileColor" content="#e1e1e1" />
+    <meta name="theme-color" content="#e1e1e1" />
+    <link rel="preconnect" href="https://fonts.googleapis.com" />
+    <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin />
+    <link
+      href="https://fonts.googleapis.com/css2?family=Roboto+Mono&display=swap"
+      rel="stylesheet"
+    />
   </head>
   <body>
     <div id="app"></div>
diff --git a/js/project.js b/js/project.js
index 5edcd3f9be82e6e83a0fab68b75fc833f6ed895c..1badb1d0023e42fe40bbd97cf565b26794a7fec0 100644
--- a/js/project.js
+++ b/js/project.js
@@ -81,7 +81,7 @@ class Project {
     }
 
     // Vertical center line
-    new Zdog.Shape({
+    /*new Zdog.Shape({
       addTo: window.illoGridGroup,
       path: [
         {
@@ -97,7 +97,7 @@ class Project {
       ],
       stroke: 0.5,
       color: "#111111",
-    });
+    });*/
   }
 
   addLine(flow, speed, toX, toY, toZ) {
@@ -175,7 +175,13 @@ class Project {
           }
           break;
       }
-      var newMove = new Move(prevCoords.e + flowStep * i, speed, newX, newY, newZ);
+      var newMove = new Move(
+        prevCoords.e + flowStep * i,
+        speed,
+        newX,
+        newY,
+        newZ
+      );
       this.model.append(newMove);
     }
   }
diff --git a/main.js b/main.js
index 44d2fae8789ceb84541bcc81c233fff11cd3c7cb..5b73ee4c9a4b4b0916846c8c128b0fdcc2e6b4cb 100644
--- a/main.js
+++ b/main.js
@@ -1,6 +1,5 @@
 import "normalize.css";
 import "./css/main.css";
-import tailorbirdLogo from "./img/logo-new.jpg";
 
 // Zdog
 import * as Zdog from "zdog";
@@ -16,7 +15,7 @@ var aboutText = `
 `;
 if (import.meta.env.VITE_APP_BRANCH == "dev") {
   aboutText = `
-  <i class="fa-solid fa-kiwi-bird fa-bounce"></i> TESTING</h1>
+  <i class="fa-solid fa-kiwi-bird fa-bounce"></i></h1>
   <p>Version: ${import.meta.env.VITE_APP_DATE}
   (${import.meta.env.VITE_APP_BRANCH}
   ${import.meta.env.VITE_APP_HASH})</p>
@@ -26,46 +25,35 @@ if (import.meta.env.VITE_APP_BRANCH == "dev") {
 document.querySelector("#app").innerHTML = `
 <main>
   <section id="viewer">
-    <article id="viewer-main">
-      <canvas class="zdog-canvas"></canvas>
+    <article id="viewer-settings-knob">
+      <i class="fa-solid fa-bars"></i>
     </article>
     <article id="viewer-settings">
       <menu>
-        <li>
-          <button id="zoomIntoViewButton">
+        <!-- <li>
+          <button id="zoomIntoViewButton" class="buttonRightFlat">
             <i class="fa-solid fa-magnifying-glass-plus"></i>
           </button>
         </li>
         <li>
-          <button id="zoomOutViewButton">
+          <button id="zoomOutViewButton" class="buttonLeftFlat">
             <i class="fa-solid fa-magnifying-glass-minus"></i>
           </button>
-        </li>
+        </li> -->
         <li>
           <button id="playViewButton">
             <i class="fa-solid fa-play"></i> Simulate
           </button>
         </li>
       </menu>
-      <menu class="menu-impressum">
-        <li>
-          <a href="#" id="helpLink">About</a>
-        </li>
-        <li>
-          <a href="mailto:yanagibashi@kg.rwth-aachen.de">Contact</a>
-        </li>
-        <li>
-          <a href="https://www.kg.rwth-aachen.de/cms/KG/Footer/Service/~vcyq/Impressum/">Impressum</a>
-        </li>
-      </menu>
       <menu class="menu-right">
       <li>
-        <button id="saveProjectMenuButton">
+        <button id="saveProjectMenuButton" class="buttonRightFlat">
           <i class="fa-solid fa-floppy-disk"></i> Save
         </button>
       </li>
       <li>
-        <button id="loadProjectMenuButton">
+        <button id="loadProjectMenuButton" class="buttonLeftFlat">
           <i class="fa-solid fa-folder-open"></i> Load
         </button>
       </li>
@@ -81,19 +69,21 @@ document.querySelector("#app").innerHTML = `
         </li>
       </menu>
     </article>
+    <article id="viewer-main">
+      <canvas class="zdog-canvas"></canvas>
+    </article>
   </section>
   <section id="tools">
-    <img id="tailorbirdLogo" src="${tailorbirdLogo}" />
     <article id="tools-edit">
       <menu>
         <li>
           <button id="addLineEditButton">
-            <i class="fa-solid fa-lines-leaning"></i> Add line
+            <i class="fa-solid fa-lines-leaning"></i> New line
           </button>
         </li>
         <li>
           <button id="addArcEditButton">
-            <i class="fa-solid fa-bezier-curve"></i> Add arc
+            <i class="fa-solid fa-bezier-curve"></i> New arc
           </button>
         </li>
       </menu>
@@ -114,12 +104,18 @@ document.querySelector("#app").innerHTML = `
           </button>
         </li>
       </menu>
+      <menu class="menu-impressum">
+        <li>
+          <a href="#" id="helpLink">About Tailorbird</a>
+        </li>
+      </menu>
     </article>
   </section>
 </main>
 
 <!-- Dialogs -->
 <dialog id="helpDialog">
+  <img src="./icon.svg" width="75" height="75" id="helpLogo">
   <h1>Tailorbird 3D ${aboutText}
   <h2><i class="fa-solid fa-keyboard"></i> Controls</h2>
   <p>
@@ -131,11 +127,22 @@ document.querySelector("#app").innerHTML = `
     <li><i class="fa-solid fa-share fa-rotate-90"></i> <span class="helpControlText">Jump to: O</span></li>
    </ul>
   </p>
+  <h2><i class="fa-solid fa-address-card"></i></i> Help</h2>
+  <p>
+  <ul>
+    <li>
+      <a href="mailto:yanagibashi@kg.rwth-aachen.de"><i class="fa-solid fa-envelope"></i> <span class="helpControlText">Contact</span></a>
+    </li>
+    <li>
+      <a href="https://www.kg.rwth-aachen.de/cms/KG/Footer/Service/~vcyq/Impressum/"><i class="fa-solid fa-circle-info"></i> <span class="helpControlText">Impressum</span></a>
+    </li>
+    </ul>
+  </p>
   <form method="dialog">
     <menu>
-      <button value="example1">Load example 1</button>
-      <button value="example2">Load example 2</button>
-      <button value="cancel">Close</button>
+      <li><button value="example1">Load example 1</button></li>
+      <li><button value="example2">Load example 2</button></li>
+      <li><button value="cancel">Close</button></li>
     </menu>
   </form>
 </dialog>
@@ -176,7 +183,7 @@ document.querySelector("#app").innerHTML = `
 <!-- Dialogs Edit menu -->
 <dialog id="addLineDialog">
   <form method="dialog" id="addLineForm">
-    <h3>Add line</h3>
+    <h3>New line</h3>
     <fieldset>
       <legend>Position</legend>
       <input
@@ -239,7 +246,7 @@ document.querySelector("#app").innerHTML = `
 
 <dialog id="addArcDialog">
   <form method="dialog" id="addArcForm">
-    <h3>Add arc</h3>
+    <h3>New arc</h3>
     <fieldset>
       <legend>Properties</legend>
       Size: <input type="text" id="addArcInputSize" /><br />
@@ -786,6 +793,24 @@ function initEditEventListeners() {
 
 function initViewEventListeners() {
   document
+    .getElementById("viewer-settings")
+    .addEventListener("click", function (e) {
+      if (e.eventPhase !== 2) return; /* make sure not triggered by bubbling */
+      if (e.offsetX > 50) return; /* only react for clicks on logo */
+      // Hide viewer settings
+      this.style.visibility = "hidden";
+      this.style.opacity = "0";
+      document.getElementById("viewer-settings-knob").style.display = "block";
+    });
+  document
+    .getElementById("viewer-settings-knob")
+    .addEventListener("click", function (e) {
+      // Hide viewer settings
+      document.getElementById("viewer-settings").style.visibility = "visible";
+      document.getElementById("viewer-settings").style.opacity = "1";
+      this.style.display = "none";
+    });
+  /*document
     .getElementById("zoomIntoViewButton")
     .addEventListener("click", function (e) {
       // Zoom into
@@ -796,7 +821,7 @@ function initViewEventListeners() {
     .addEventListener("click", function (e) {
       // Zoom out
       window.illo.scale.multiply(1 / 1.1);
-    });
+    });*/
   document
     .getElementById("playViewButton")
     .addEventListener("click", function (e) {
diff --git a/package-lock.json b/package-lock.json
index c439eecf49bad3a3f9a2aa5e22e25e1efa69b470..c9526f393538a6626c025e876a08e0dd057da438 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -15,7 +15,8 @@
         "zdog": "^1.1.3"
       },
       "devDependencies": {
-        "vite": "^4.0.0"
+        "vite": "^4.0.0",
+        "vite-plugin-webfont-dl": "^3.7.4"
       }
     },
     "node_modules/@esbuild/android-arm": {
@@ -384,6 +385,78 @@
       "resolved": "https://registry.npmjs.org/ajon/-/ajon-2.1.4.tgz",
       "integrity": "sha512-1ps1cw66hwwm3K9OkF+7T6nZX9V3KKAgpzKqqlRXW7G7mheBYjW8eea0T3kc9rleyqcilcvpJwhNwTMkCqN8CA=="
     },
+    "node_modules/asynckit": {
+      "version": "0.4.0",
+      "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz",
+      "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==",
+      "dev": true
+    },
+    "node_modules/axios": {
+      "version": "1.4.0",
+      "resolved": "https://registry.npmjs.org/axios/-/axios-1.4.0.tgz",
+      "integrity": "sha512-S4XCWMEmzvo64T9GfvQDOXgYRDJ/wsSZc7Jvdgx5u1sd0JwsuPLqb3SYmusag+edF6ziyMensPVqLTSc1PiSEA==",
+      "dev": true,
+      "dependencies": {
+        "follow-redirects": "^1.15.0",
+        "form-data": "^4.0.0",
+        "proxy-from-env": "^1.1.0"
+      }
+    },
+    "node_modules/balanced-match": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz",
+      "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==",
+      "dev": true
+    },
+    "node_modules/brace-expansion": {
+      "version": "1.1.11",
+      "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
+      "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
+      "dev": true,
+      "dependencies": {
+        "balanced-match": "^1.0.0",
+        "concat-map": "0.0.1"
+      }
+    },
+    "node_modules/clean-css": {
+      "version": "5.3.2",
+      "resolved": "https://registry.npmjs.org/clean-css/-/clean-css-5.3.2.tgz",
+      "integrity": "sha512-JVJbM+f3d3Q704rF4bqQ5UUyTtuJ0JRKNbTKVEeujCCBoMdkEi+V+e8oktO9qGQNSvHrFTM6JZRXrUvGR1czww==",
+      "dev": true,
+      "dependencies": {
+        "source-map": "~0.6.0"
+      },
+      "engines": {
+        "node": ">= 10.0"
+      }
+    },
+    "node_modules/combined-stream": {
+      "version": "1.0.8",
+      "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz",
+      "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==",
+      "dev": true,
+      "dependencies": {
+        "delayed-stream": "~1.0.0"
+      },
+      "engines": {
+        "node": ">= 0.8"
+      }
+    },
+    "node_modules/concat-map": {
+      "version": "0.0.1",
+      "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
+      "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==",
+      "dev": true
+    },
+    "node_modules/delayed-stream": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz",
+      "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==",
+      "dev": true,
+      "engines": {
+        "node": ">=0.4.0"
+      }
+    },
     "node_modules/esbuild": {
       "version": "0.17.18",
       "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.17.18.tgz",
@@ -421,6 +494,65 @@
         "@esbuild/win32-x64": "0.17.18"
       }
     },
+    "node_modules/flat-cache": {
+      "version": "3.0.4",
+      "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.0.4.tgz",
+      "integrity": "sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==",
+      "dev": true,
+      "dependencies": {
+        "flatted": "^3.1.0",
+        "rimraf": "^3.0.2"
+      },
+      "engines": {
+        "node": "^10.12.0 || >=12.0.0"
+      }
+    },
+    "node_modules/flatted": {
+      "version": "3.2.7",
+      "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.7.tgz",
+      "integrity": "sha512-5nqDSxl8nn5BSNxyR3n4I6eDmbolI6WT+QqR547RwxQapgjQBmtktdP+HTBb/a/zLsbzERTONyUB5pefh5TtjQ==",
+      "dev": true
+    },
+    "node_modules/follow-redirects": {
+      "version": "1.15.2",
+      "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.2.tgz",
+      "integrity": "sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA==",
+      "dev": true,
+      "funding": [
+        {
+          "type": "individual",
+          "url": "https://github.com/sponsors/RubenVerborgh"
+        }
+      ],
+      "engines": {
+        "node": ">=4.0"
+      },
+      "peerDependenciesMeta": {
+        "debug": {
+          "optional": true
+        }
+      }
+    },
+    "node_modules/form-data": {
+      "version": "4.0.0",
+      "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz",
+      "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==",
+      "dev": true,
+      "dependencies": {
+        "asynckit": "^0.4.0",
+        "combined-stream": "^1.0.8",
+        "mime-types": "^2.1.12"
+      },
+      "engines": {
+        "node": ">= 6"
+      }
+    },
+    "node_modules/fs.realpath": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz",
+      "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==",
+      "dev": true
+    },
     "node_modules/fsevents": {
       "version": "2.3.2",
       "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz",
@@ -435,6 +567,75 @@
         "node": "^8.16.0 || ^10.6.0 || >=11.0.0"
       }
     },
+    "node_modules/glob": {
+      "version": "7.2.3",
+      "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz",
+      "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==",
+      "dev": true,
+      "dependencies": {
+        "fs.realpath": "^1.0.0",
+        "inflight": "^1.0.4",
+        "inherits": "2",
+        "minimatch": "^3.1.1",
+        "once": "^1.3.0",
+        "path-is-absolute": "^1.0.0"
+      },
+      "engines": {
+        "node": "*"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/isaacs"
+      }
+    },
+    "node_modules/inflight": {
+      "version": "1.0.6",
+      "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz",
+      "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==",
+      "dev": true,
+      "dependencies": {
+        "once": "^1.3.0",
+        "wrappy": "1"
+      }
+    },
+    "node_modules/inherits": {
+      "version": "2.0.4",
+      "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz",
+      "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==",
+      "dev": true
+    },
+    "node_modules/mime-db": {
+      "version": "1.52.0",
+      "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz",
+      "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==",
+      "dev": true,
+      "engines": {
+        "node": ">= 0.6"
+      }
+    },
+    "node_modules/mime-types": {
+      "version": "2.1.35",
+      "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz",
+      "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==",
+      "dev": true,
+      "dependencies": {
+        "mime-db": "1.52.0"
+      },
+      "engines": {
+        "node": ">= 0.6"
+      }
+    },
+    "node_modules/minimatch": {
+      "version": "3.1.2",
+      "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz",
+      "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==",
+      "dev": true,
+      "dependencies": {
+        "brace-expansion": "^1.1.7"
+      },
+      "engines": {
+        "node": "*"
+      }
+    },
     "node_modules/nanoid": {
       "version": "3.3.6",
       "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.6.tgz",
@@ -458,6 +659,24 @@
       "resolved": "https://registry.npmjs.org/normalize.css/-/normalize.css-8.0.1.tgz",
       "integrity": "sha512-qizSNPO93t1YUuUhP22btGOo3chcvDFqFaj2TRybP0DMxkHOCTYwp3n34fel4a31ORXy4m1Xq0Gyqpb5m33qIg=="
     },
+    "node_modules/once": {
+      "version": "1.4.0",
+      "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz",
+      "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==",
+      "dev": true,
+      "dependencies": {
+        "wrappy": "1"
+      }
+    },
+    "node_modules/path-is-absolute": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz",
+      "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==",
+      "dev": true,
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
     "node_modules/picocolors": {
       "version": "1.0.0",
       "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz",
@@ -492,6 +711,12 @@
         "node": "^10 || ^12 || >=14"
       }
     },
+    "node_modules/proxy-from-env": {
+      "version": "1.1.0",
+      "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz",
+      "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==",
+      "dev": true
+    },
     "node_modules/rhaboo": {
       "version": "3.2.2",
       "resolved": "https://registry.npmjs.org/rhaboo/-/rhaboo-3.2.2.tgz",
@@ -500,10 +725,25 @@
         "ajon": "^2.0.0"
       }
     },
+    "node_modules/rimraf": {
+      "version": "3.0.2",
+      "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz",
+      "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==",
+      "dev": true,
+      "dependencies": {
+        "glob": "^7.1.3"
+      },
+      "bin": {
+        "rimraf": "bin.js"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/isaacs"
+      }
+    },
     "node_modules/rollup": {
-      "version": "3.21.3",
-      "resolved": "https://registry.npmjs.org/rollup/-/rollup-3.21.3.tgz",
-      "integrity": "sha512-VnPfEG51nIv2xPLnZaekkuN06q9ZbnyDcLkaBdJa/W7UddyhOfMP2yOPziYQfeY7k++fZM8FdQIummFN5y14kA==",
+      "version": "3.21.5",
+      "resolved": "https://registry.npmjs.org/rollup/-/rollup-3.21.5.tgz",
+      "integrity": "sha512-a4NTKS4u9PusbUJcfF4IMxuqjFzjm6ifj76P54a7cKnvVzJaG12BLVR+hgU2YDGHzyMMQNxLAZWuALsn8q2oQg==",
       "dev": true,
       "bin": {
         "rollup": "dist/bin/rollup"
@@ -516,6 +756,15 @@
         "fsevents": "~2.3.2"
       }
     },
+    "node_modules/source-map": {
+      "version": "0.6.1",
+      "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
+      "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
+      "dev": true,
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
     "node_modules/source-map-js": {
       "version": "1.0.2",
       "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz",
@@ -526,9 +775,9 @@
       }
     },
     "node_modules/vite": {
-      "version": "4.3.4",
-      "resolved": "https://registry.npmjs.org/vite/-/vite-4.3.4.tgz",
-      "integrity": "sha512-f90aqGBoxSFxWph2b39ae2uHAxm5jFBBdnfueNxZAT1FTpM13ccFQExCaKbR2xFW5atowjleRniQ7onjJ22QEg==",
+      "version": "4.3.5",
+      "resolved": "https://registry.npmjs.org/vite/-/vite-4.3.5.tgz",
+      "integrity": "sha512-0gEnL9wiRFxgz40o/i/eTBwm+NEbpUeTWhzKrZDSdKm6nplj+z4lKz8ANDgildxHm47Vg8EUia0aicKbawUVVA==",
       "dev": true,
       "dependencies": {
         "esbuild": "^0.17.5",
@@ -573,6 +822,27 @@
         }
       }
     },
+    "node_modules/vite-plugin-webfont-dl": {
+      "version": "3.7.4",
+      "resolved": "https://registry.npmjs.org/vite-plugin-webfont-dl/-/vite-plugin-webfont-dl-3.7.4.tgz",
+      "integrity": "sha512-cCvP4aMHevcug0KAPd8v0ll8eA7NqWOI7SQ/qKTshpb4Di18zsdo2Z/ECgZSrVd9UpJhCFVso52WgO+zM0sQeQ==",
+      "dev": true,
+      "dependencies": {
+        "axios": "^1.2",
+        "clean-css": "^5.3",
+        "flat-cache": "^3.0",
+        "picocolors": "^1.0"
+      },
+      "peerDependencies": {
+        "vite": "^2 || ^3 || ^4"
+      }
+    },
+    "node_modules/wrappy": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz",
+      "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==",
+      "dev": true
+    },
     "node_modules/zdog": {
       "version": "1.1.3",
       "resolved": "https://registry.npmjs.org/zdog/-/zdog-1.1.3.tgz",
diff --git a/package.json b/package.json
index 8776bb8fb20360746751c34ee58b8a6a62a47aae..ad288a990ddc7c8eda81cffd8f2011abb9e219ba 100644
--- a/package.json
+++ b/package.json
@@ -30,6 +30,7 @@
     "zdog": "^1.1.3"
   },
   "devDependencies": {
-    "vite": "^4.0.0"
+    "vite": "^4.0.0",
+    "vite-plugin-webfont-dl": "^3.7.4"
   }
 }
diff --git a/public/android-chrome-192x192.png b/public/android-chrome-192x192.png
new file mode 100644
index 0000000000000000000000000000000000000000..d7d67ddbbac034298537356fec27f49549181ca6
Binary files /dev/null and b/public/android-chrome-192x192.png differ
diff --git a/public/android-chrome-512x512.png b/public/android-chrome-512x512.png
new file mode 100644
index 0000000000000000000000000000000000000000..071f36d7f5e03cb0bff9a257e0e6bf8df3a149af
Binary files /dev/null and b/public/android-chrome-512x512.png differ
diff --git a/public/apple-touch-icon.png b/public/apple-touch-icon.png
new file mode 100644
index 0000000000000000000000000000000000000000..1e61eb47acff4f7d46bba03d937d6b4e9a35e541
Binary files /dev/null and b/public/apple-touch-icon.png differ
diff --git a/public/browserconfig.xml b/public/browserconfig.xml
new file mode 100644
index 0000000000000000000000000000000000000000..c465f9cbce87fcce7890d667a88bcb7233a24271
--- /dev/null
+++ b/public/browserconfig.xml
@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="utf-8"?>
+<browserconfig>
+    <msapplication>
+        <tile>
+            <square150x150logo src="/mstile-150x150.png"/>
+            <TileColor>#e1e1e1</TileColor>
+        </tile>
+    </msapplication>
+</browserconfig>
diff --git a/public/favicon-16x16.png b/public/favicon-16x16.png
new file mode 100644
index 0000000000000000000000000000000000000000..c1abebfc289500006b15e7b37e0e86f0b210461a
Binary files /dev/null and b/public/favicon-16x16.png differ
diff --git a/public/favicon-32x32.png b/public/favicon-32x32.png
new file mode 100644
index 0000000000000000000000000000000000000000..a7ba8336c7cec0cd0d3ccccee34340157ab53dc3
Binary files /dev/null and b/public/favicon-32x32.png differ
diff --git a/public/favicon.ico b/public/favicon.ico
new file mode 100644
index 0000000000000000000000000000000000000000..16e5516378ad474607897b8a9615c14c30801a97
Binary files /dev/null and b/public/favicon.ico differ
diff --git a/public/icon.svg b/public/icon.svg
new file mode 100644
index 0000000000000000000000000000000000000000..b7e5c1ad20ddff042b29dfb9df138c7b0ef9a38e
--- /dev/null
+++ b/public/icon.svg
@@ -0,0 +1,38 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<svg id="b" data-name="FAVICON HELL" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 500 500">
+  <defs>
+    <style>
+      .g {
+        fill: #e1e1e1;
+      }
+
+      .h {
+        fill: #474747;
+      }
+
+      .i {
+        fill: #5a6b5d;
+      }
+
+      .j {
+        fill: none;
+        stroke: #5a6b5d;
+        stroke-linecap: round;
+        stroke-miterlimit: 10;
+        stroke-width: 19px;
+      }
+    </style>
+  </defs>
+  <circle class="g" cx="250" cy="250" r="250"/>
+  <path class="h" d="m319.17,217.96c-.31-8.89-.77-17.68-2.36-26.24-1.55-8.59-4.12-16.93-7.14-25.12-5.96-16.14-13.76-32.01-24.68-45.3-8.1-10-17.94-18.14-28.55-25.43-1.99-1.32-6.16-4.34-8.06-5.56-11.59-7.25-24.73-13.04-37.59-18.11-4.87-1.78-9.69-3.73-14.39-4.51,0,0-.05,0,.03.01.07,0,.06,0,.27.02,1.91-.08,3.28-.61,5.09-2.18,2.49-2.2,3.37-6.56,1.93-9.32-.03-.06-.06-.12-.09-.18-.1-.16-.04-.1-.07-.14-.02-.04,0-.02.03.02,1.55,1.9,10.22,10.04,12.12,11.95,3.03,2.94,6.19,6.27,9.07,9.4,3.82,4.32,6.8,8.94,9.35,13.61,1.87,3.54,3.6,7.02,4.84,11.04.72,2.56,1.34,5.56.43,8.63-1.65,6.05-8.07,9.2-13.83,7.78-4.88-1.16-9.36-3.72-13.72-5.73-15.58-7.46-30.72-14.94-47.23-19.68-13.15-3.54-26.85-5.68-40.07-3.14-2.11.5-3.93.96-5.39,1.93-.03.02-.07.04-.02.03.14-.08.28-.18.39-.31.16-.13.31-.3.44-.46.79-1.39-1.63,2.93,1.79-3.16,2.66-6.03-.86-12.87-2.56-14.06-2.01-2.03-2.54-2.17-4-2.95-.3-.13-.35-.16-.54-.23l-.35-.14c-.08-.03.04,0,.17.03,0,0,2.75.58,2.75.58,11.3,2.25,23.01,5.26,34,9.08,2.59.85,5.56,2.1,7.9,3.31,9.5,5.04,23.05,12.71,27.75,22.81,4.22,9,.23,18.77-7.83,23.91-3.44,2.23-7.49,3.54-11.45,4.24-10.41,1.69-21.1.77-31.21,1.47-7.64.43-14.45,1.58-21.46,4.05-16.05,5.23-33.11,17.51-37.55,33.15-.51-3.75-3.25-7.07-6.47-9.12-2.88-1.81-6.48-2.85-9.84-2.26,0,0,.2-.04.2-.04.2-.03.91-.18,1.16-.23,12.19-2.88,24.61-3.88,37.03-3.63,7.24.28,13.77.55,21.15,2.65,9.51,2.67,16.11,11.37,13.56,21.41-1.35,5.27-5.4,9.44-10.06,11.57-6.15,2.71-11.76,3.72-17.77,5.78-11.61,3.69-22.59,8.61-32.82,15.25-7.16,4.68-14.79,10.26-20.14,16.56-.04-.03-.05-.06.02-.66.03-.4.03-.88-.02-1.3-.25-3.3-3.19-6.57-6.29-7.08-.27-.02-.13.02-.14.04l.37.1c2.34.4,4.72.44,7.34.56,6.54.14,13.25.33,19.84.31,1.68.04,3.85.02,5.69.26,6.13.52,9.09,7.25,4.86,11.75-1.74,1.84-4.1,3-6.18,4.12-8.14,4.13-16.03,7.78-24.08,11.92-.87.44-1.94.09-2.38-.79-.35-.71-.19-1.54.35-2.07,3.25-3.14,6.66-6.11,10.06-9.09,4.39-3.94,9.33-7.32,13.26-11.5,0,0,.06-.12.06-.12.02-.04-.04-.01-.05-.01-.03.01-.16.14-.21.22-1.32,1.59-.9,4.97.81,6.43.7.73,1.67,1.18,2.49,1.42,0,0-.1.04-.1.04-.01,0-.11.03-.2.04-10.08,1.95-20.04,4.18-30.42,5.12-1.92.12-3.76.21-5.76-.22-5.42-1.03-9.16-6.46-8.78-11.98.7-9.1,8.61-17.61,14.15-23.77,10.05-10.67,21.74-19.68,34.59-26.74,6.35-3.53,12.96-6.52,19.62-9.2,2.59-1.1,5.67-2.16,7.72-3.32-.65.17-1.65.99-2.29,1.57-7.34,6.7-5.41,19.79,3.82,23.82.75.3-.08.09-.89.06-7.26-.45-15.34.22-22.67,1.13-6.29.81-12.08,2.23-18.07,3.9-7.63,2.17-15.57,1.12-21.4-4.65-8.42-8.19-8.05-21.8-4.67-31.92,9.1-27.81,35.34-46.75,62.59-53.8,16.26-4.74,34.06-3.59,49.66-2.62,2.73.11,4.67.17,6.98,0,.26,0,.25-.03.37-.01.01,0-.04.02-.05.04-.03.06-.12.06-.18.1-5.43,2.97-7.31,11.27-4.15,16.57.07.08.26.4.33.42-.04-.22-.5-.65-.97-1.17-4.28-4.13-10.07-8.17-15.4-10.85-6.33-2.66-12.95-4.98-19.56-6.99-5.71-1.78-11.47-2.97-17.49-4.74-.65-.2-1.37-.5-2.06-.81-1.74-.88-2.5-1.19-4.7-3.39-1.79-1.29-5.38-8.27-2.66-14.43,3.48-6.22,1.17-1.98,2.04-3.49,0,0,.37-.44.37-.44.88-1.05,1.95-2.09,3.01-2.96,7.36-5.77,16.98-7.46,25.83-7.99,21.19-.93,41.71,4.75,60.72,13.22,14.36,6.3,28.03,14.51,41.76,21.59,0,0,.11.05.11.05.04.02-.03,0-.04,0,0,0-.04,0-.04,0l-.19-.04c-2.17-.41-4.84.15-6.76,1.45-.81.48-2.42,1.9-3.12,3.2-.96,1.54-1.35,3.12-1.41,4.59,0,.75.05.93.07,1.04.05.19,0-.1-.05-.34-1.7-6.03-5.21-12.7-8.91-17.52-.88-1.11-2.63-3.14-3.56-4.24-2.79-3.32-10.34-11.33-13.38-14.64-1.83-2.05-3.89-4.28-5.22-6.91-2.92-5.45-.14-12.47,6-13.97,3.43-.95,7.22.2,10.3,1.16,9.2,3.17,17.1,7.08,25.57,11.34,9.62,5.01,19.43,10.36,28.3,17.09,5.62,4.51,11.78,9.09,17.13,14.01,21.03,18.28,34.09,43.98,41.67,70.39,2.5,8.71,4.55,17.62,5.49,26.66,1,9.07.8,18.13.46,27.02-.22,2.21-3.32,2.25-3.5,0h0Z"/>
+  <rect class="h" x="102.69" y="216.05" width="56.96" height="97.77" rx="21.81" ry="21.81"/>
+  <path class="h" d="m300.7,314.35c-7.61-11.47-18.81-20.47-33.61-26.99,11.54-6.24,20.27-14.19,26.17-23.83,5.91-9.64,8.86-20.84,8.86-33.61,0-24.17-8.63-43.39-25.87-57.64-10.8-8.93-23.94-15.06-39.42-18.39-15.24-3.28-29.57,8.53-29.57,24.12h0c0,9.94,6.02,18.81,15.16,22.72,3.73,1.6,7.04,3.76,9.94,6.49,6.99,6.59,10.49,15.51,10.49,26.79,0,13.58-4.11,23.66-12.32,30.25-8.22,6.59-16.01,9.88-32.84,9.88h-5.69c-.2,0-.4-.03-.6-.03-11.14,0-20.17,9.03-20.17,20.17s9.02,20.16,20.15,20.17v.02h6.72c19.69,0,29.45,3.53,38.75,10.59,9.3,7.06,13.95,18,13.95,32.79s-4.01,25.77-12.02,33.3c-8.01,7.54-19.83,11.3-35.44,11.3-14.26,0-25.19-4.24-32.79-12.73-7.58-8.46-11.38-20.53-11.4-36.21,0-.06,0-.11,0-.17,0-15.58-12.63-28.21-28.21-28.21s-28.21,12.63-28.21,28.21c0,0,0,.01,0,.02h0v.81c0,30.83,8.89,54.59,26.68,71.29,17.79,16.7,42.98,25.05,75.57,25.05s58.93-8.55,78.22-25.66c19.28-17.11,28.92-40.26,28.92-69.46,0-15.89-3.8-29.57-11.41-41.04Z"/>
+  <path class="h" d="m274.81,265.55c4.94,7.52,17.1,4.68,36.73,7.35.73.1,16.03,3.75,32.4,8.6,31.53,9.35,60.64,26.34,63.09,26.54.25.02.41-.02.48-.12,1.09-1.54-21.48-17.63-24.3-19.64-29.79-21.24-95.78-53.25-108.35-37.77-3.28,4.04-2.69,11.03-.05,15.04Z"/>
+  <g>
+    <path class="j" d="m448.33,351.41c-11.12,0-24.2,0-35.41,0-49.29,0-89.3,39.62-89.98,88.75"/>
+    <path class="j" d="m435.72,373.6c-6.26,0-15.9,0-22.8,0-36.91,0-66.86,29.74-67.23,66.56"/>
+    <path class="j" d="m418.2,395.78c-1.68,0-3.72,0-5.28,0-23.94,0-44.7,19.21-44.7,44.38"/>
+    <path class="i" d="m399.19,216.92c-13.82,7.74-23.44,20.86-31.19,34.29-6.86,12.31-14.34,27.89-9.58,41.77,11.66,29.3,49.64,27.85,76.29,26.89,5.25-.25,9.7,3.8,9.95,9.05.3,5.57-4.41,10.25-9.97,9.95-24.31-1.54-52.83-3.28-71.83-20.64-6.56-6.12-11.84-13.81-13.83-22.68-3.01-12.89,1.69-26,8.26-36.82,10.32-16.83,23.48-33.64,41.9-41.81h0Z"/>
+  </g>
+  <path class="h" d="m287.59,226c18.67-9.54,41.95.8,65.19,11.12,2.49,1.11,9.89,4.58,20.57,10.59,40.14,22.58,56.27,42.63,55.53,43.47-.49.56-12-5.31-36.96-17.63-14.07-6.95-33.12-14.55-55.46-18.95-38.57-7.6-62.11,1.31-65.35-7.32-2.28-6.05,7.05-16.47,16.47-21.28Z"/>
+</svg>
\ No newline at end of file
diff --git a/public/mstile-144x144.png b/public/mstile-144x144.png
new file mode 100644
index 0000000000000000000000000000000000000000..9e19ddce816abc73df0dc97bdf9e97eccfc230f0
Binary files /dev/null and b/public/mstile-144x144.png differ
diff --git a/public/mstile-150x150.png b/public/mstile-150x150.png
new file mode 100644
index 0000000000000000000000000000000000000000..6b7d269591e2bd0a9d5910205a9766ab244fffd7
Binary files /dev/null and b/public/mstile-150x150.png differ
diff --git a/public/mstile-310x150.png b/public/mstile-310x150.png
new file mode 100644
index 0000000000000000000000000000000000000000..6625b450c287501b0b4c5c7abb8688100084cb56
Binary files /dev/null and b/public/mstile-310x150.png differ
diff --git a/public/mstile-310x310.png b/public/mstile-310x310.png
new file mode 100644
index 0000000000000000000000000000000000000000..125382f0a9c49fc6d944ad78bc571b42c069180b
Binary files /dev/null and b/public/mstile-310x310.png differ
diff --git a/public/mstile-70x70.png b/public/mstile-70x70.png
new file mode 100644
index 0000000000000000000000000000000000000000..f33ec8589cdaac202db17e55bdfff0be37103d8f
Binary files /dev/null and b/public/mstile-70x70.png differ
diff --git a/public/safari-pinned-tab.svg b/public/safari-pinned-tab.svg
new file mode 100644
index 0000000000000000000000000000000000000000..ff1c63ecca700d56c922f1a2c6eb90fe03863150
--- /dev/null
+++ b/public/safari-pinned-tab.svg
@@ -0,0 +1,67 @@
+<?xml version="1.0" standalone="no"?>
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 20010904//EN"
+ "http://www.w3.org/TR/2001/REC-SVG-20010904/DTD/svg10.dtd">
+<svg version="1.0" xmlns="http://www.w3.org/2000/svg"
+ width="700.000000pt" height="700.000000pt" viewBox="0 0 700.000000 700.000000"
+ preserveAspectRatio="xMidYMid meet">
+<metadata>
+Created by potrace 1.14, written by Peter Selinger 2001-2017
+</metadata>
+<g transform="translate(0.000000,700.000000) scale(0.100000,-0.100000)"
+fill="#000000" stroke="none">
+<path d="M2672 6280 c-35 -22 -62 -72 -62 -117 0 -47 37 -105 135 -211 52 -56
+95 -104 95 -106 0 -3 -60 24 -132 59 -223 106 -436 174 -637 204 -106 16 -342
+14 -425 -4 -85 -18 -180 -61 -230 -105 -98 -87 -106 -226 -16 -302 44 -38 61
+-45 230 -89 119 -32 123 -34 85 -40 -390 -67 -611 -169 -830 -380 -279 -270
+-380 -609 -245 -822 25 -40 91 -94 134 -110 6 -3 -23 -40 -65 -83 -151 -156
+-225 -270 -235 -362 -7 -59 25 -126 76 -161 33 -22 41 -23 145 -17 61 4 125 9
+144 13 32 5 32 4 -35 -58 -70 -64 -87 -95 -61 -105 22 -8 417 191 450 226 37
+42 37 89 -2 132 l-29 33 -144 5 -143 5 65 46 c181 129 340 208 565 280 276 88
+303 102 352 186 35 59 39 156 10 214 -64 130 -202 179 -501 179 l-151 1 58 54
+c69 66 182 134 292 176 136 53 235 68 510 79 268 10 330 20 418 68 54 29 108
+89 132 145 31 75 11 201 -42 259 -9 10 -14 20 -11 23 6 6 62 -18 338 -148 184
+-86 224 -102 275 -105 45 -2 69 1 95 16 45 24 80 85 80 138 0 70 -52 197 -129
+314 -20 30 -40 61 -44 68 -16 25 233 -108 346 -184 396 -270 597 -518 770
+-954 99 -248 144 -441 154 -663 6 -133 16 -163 47 -151 17 7 18 20 13 233 -5
+246 -21 349 -88 566 -133 436 -324 747 -613 994 -235 201 -391 302 -687 445
+-278 134 -383 161 -457 116z"/>
+<path d="M3181 4849 c-107 -21 -195 -88 -243 -187 -30 -61 -33 -75 -33 -157 0
+-74 5 -99 24 -137 37 -77 92 -130 182 -178 202 -109 280 -239 282 -465 1 -235
+-82 -388 -261 -483 -101 -54 -143 -63 -339 -71 -169 -8 -186 -10 -237 -35
+-102 -50 -159 -142 -159 -258 0 -116 64 -213 172 -261 36 -16 79 -21 240 -28
+255 -11 326 -28 457 -110 116 -73 190 -179 225 -319 20 -79 17 -288 -4 -370
+-77 -292 -313 -436 -686 -418 -257 13 -433 133 -516 351 -30 82 -44 157 -55
+311 -7 108 -13 133 -39 189 -37 78 -118 157 -198 195 -51 23 -71 27 -158 27
+-88 0 -107 -3 -157 -27 -77 -36 -121 -70 -164 -129 -60 -82 -75 -143 -75 -292
+3 -448 165 -808 470 -1037 230 -174 574 -270 958 -270 502 1 893 145 1169 431
+130 135 214 276 272 459 76 238 83 576 15 785 -79 245 -250 443 -496 571 l-78
+41 79 51 c44 28 108 79 143 113 l63 61 116 -7 c63 -4 144 -11 180 -16 60 -8
+308 -71 470 -119 l70 -21 0 -57 c1 -137 63 -282 170 -396 176 -186 423 -281
+825 -316 256 -22 248 -21 284 -3 70 36 97 111 65 178 -33 70 -44 72 -337 78
+-280 5 -382 17 -510 62 -150 52 -262 145 -321 267 -38 79 -54 138 -38 138 21
+0 322 -130 497 -214 99 -48 186 -85 194 -84 37 7 -312 271 -541 409 l-136 82
+26 73 c14 41 31 74 38 74 35 0 261 -98 554 -240 179 -86 336 -160 348 -165 21
+-6 22 -5 14 12 -59 110 -385 368 -704 558 -54 31 -98 60 -98 62 0 3 24 40 54
+82 72 102 170 206 244 261 34 24 60 46 58 48 -6 5 -104 -56 -166 -104 -53 -40
+-166 -154 -223 -223 l-28 -34 -137 66 c-330 157 -571 237 -716 237 -54 0 -55
+0 -60 33 -21 128 -29 163 -50 224 -116 340 -404 586 -807 687 -109 28 -120 29
+-188 15z m1416 -1399 c112 -16 361 -72 383 -85 4 -2 -7 -33 -24 -68 l-31 -64
+-120 60 c-66 33 -183 86 -260 118 -158 66 -153 70 52 39z"/>
+<path d="M1660 3967 c-94 -26 -177 -107 -212 -206 -10 -27 -13 -144 -13 -476
+l0 -440 26 -56 c34 -71 87 -125 158 -157 49 -23 72 -27 186 -30 206 -7 305 30
+381 141 52 75 55 111 52 579 l-3 423 -28 57 c-32 65 -90 121 -156 151 -39 18
+-69 22 -196 24 -99 2 -165 -2 -195 -10z"/>
+<path d="M5649 2209 c-194 -17 -419 -92 -592 -196 -385 -232 -647 -663 -664
+-1093 -4 -112 -2 -128 15 -156 39 -61 127 -79 188 -39 44 29 56 59 65 172 23
+285 136 530 336 724 132 128 262 209 430 265 138 47 204 53 538 54 172 0 326
+5 346 10 19 5 48 24 65 41 25 26 29 38 29 89 0 51 -4 63 -29 89 -17 17 -46 36
+-65 41 -43 12 -525 11 -662 -1z"/>
+<path d="M5685 1900 c-256 -22 -490 -134 -672 -321 -91 -94 -138 -161 -198
+-284 -62 -125 -90 -227 -105 -368 -9 -89 -8 -103 9 -142 33 -75 113 -104 181
+-67 53 29 70 67 81 184 33 347 275 627 614 709 66 16 118 19 300 19 194 0 225
+3 262 19 97 44 102 181 9 237 -27 17 -54 19 -211 20 -99 1 -220 -2 -270 -6z"/>
+<path d="M5595 1570 c-286 -75 -501 -300 -559 -582 -33 -158 -14 -232 67 -272
+50 -24 98 -15 144 27 32 30 35 39 43 109 18 154 52 232 144 324 100 99 209
+144 355 144 100 0 143 17 178 69 41 61 23 143 -40 181 -44 27 -230 27 -332 0z"/>
+</g>
+</svg>
diff --git a/public/site.webmanifest b/public/site.webmanifest
new file mode 100644
index 0000000000000000000000000000000000000000..2024d5566cb56a351740650ce0736e2001366b4e
--- /dev/null
+++ b/public/site.webmanifest
@@ -0,0 +1,20 @@
+{
+    "name": "Tailorbird",
+    "short_name": "Tailorbird",
+    "icons": [
+        {
+            "src": "/android-chrome-192x192.png",
+            "sizes": "192x192",
+            "type": "image/png"
+        },
+        {
+            "src": "/android-chrome-512x512.png",
+            "sizes": "512x512",
+            "type": "image/png"
+        }
+    ],
+    "theme_color": "#e1e1e1",
+    "background_color": "#e1e1e1",
+    "start_url": "https://tailorbird3d.rwth-aachen.de/",
+    "display": "standalone"
+}
diff --git a/vite.config.js b/vite.config.js
index 431d05d09a376068f129faee8109233134d7c4ad..a31b1655b8a6a77d57a84e36e7c114a270397d28 100644
--- a/vite.config.js
+++ b/vite.config.js
@@ -1,14 +1,24 @@
-import { defineConfig } from 'vite'
+import { defineConfig } from "vite";
 import * as child from "child_process";
+import webfontDownload from "vite-plugin-webfont-dl";
 
-const commitDate = new Date(child.execSync('git log -1 --format=%cI').toString().trimEnd()).toDateString();
-const branchName = child.execSync('git rev-parse --abbrev-ref HEAD').toString().trimEnd();
-const commitHash = child.execSync('git rev-parse --short HEAD').toString().trimEnd();
+const commitDate = new Date(
+  child.execSync("git log -1 --format=%cI").toString().trimEnd()
+).toDateString();
+const branchName = child
+  .execSync("git rev-parse --abbrev-ref HEAD")
+  .toString()
+  .trimEnd();
+const commitHash = child
+  .execSync("git rev-parse --short HEAD")
+  .toString()
+  .trimEnd();
 
 export default defineConfig({
-    define: {
-        'import.meta.env.VITE_APP_DATE': JSON.stringify(commitDate),
-        'import.meta.env.VITE_APP_BRANCH': JSON.stringify(branchName),
-        'import.meta.env.VITE_APP_HASH': JSON.stringify(commitHash),
-    }
-});
\ No newline at end of file
+  define: {
+    "import.meta.env.VITE_APP_DATE": JSON.stringify(commitDate),
+    "import.meta.env.VITE_APP_BRANCH": JSON.stringify(branchName),
+    "import.meta.env.VITE_APP_HASH": JSON.stringify(commitHash),
+  },
+  plugins: [webfontDownload()],
+});