diff --git a/index.html b/index.html
deleted file mode 100644
index 423e5d09c9e9184cd17ff63662934ad096886111..0000000000000000000000000000000000000000
--- a/index.html
+++ /dev/null
@@ -1,14 +0,0 @@
-<!doctype html>
-<html lang="de">
-    <head>
-        <meta charset="utf-8" />
-        <meta name="viewport" content="width=device-width, initial-scale=1.0" />
-        <title>Start · FS Coli Portal</title>
-        <link rel="stylesheet" href="/css/main.css" />
-        <link rel="icon" href="/img/portal.svg" />
-    </head>
-
-    <body class="blue"></body>
-
-    <script type="module" src="/js/portal.mjs"></script>
-</html>
diff --git a/css/main.css b/portal/static/css/main.css
similarity index 95%
rename from css/main.css
rename to portal/static/css/main.css
index 969a4292ca7407c368ff3a590d71f9ab2e83f3a2..f9e71be6a1eb0ce21258688a6196fe26b7b43a7c 100644
--- a/css/main.css
+++ b/portal/static/css/main.css
@@ -1,4 +1,4 @@
-@import url("/lib/fontawesome-free-6.5.2-web/css/all.min.css");
+@import url("/static/lib/fontawesome-free-6.5.2-web/css/all.min.css");
 
 /* ----------------------- Variables ----------------------- */
 
@@ -35,11 +35,11 @@ body {
 }
 
 body.blue {
-    background-image: url("/lib/nautilus/nautilus_blue.svg");
+    background-image: url("/static/lib/nautilus/nautilus_blue.svg");
 }
 
 body.green {
-    background-image: url("/lib/nautilus/nautilus_green.svg");
+    background-image: url("/static/lib/nautilus/nautilus_green.svg");
 }
 
 header {
diff --git a/img/portal.svg b/portal/static/img/portal.svg
similarity index 100%
rename from img/portal.svg
rename to portal/static/img/portal.svg
diff --git a/js/components/pages/AllServices.mjs b/portal/static/js/components/pages/AllServices.mjs
similarity index 100%
rename from js/components/pages/AllServices.mjs
rename to portal/static/js/components/pages/AllServices.mjs
diff --git a/js/components/pages/Base.mjs b/portal/static/js/components/pages/Base.mjs
similarity index 100%
rename from js/components/pages/Base.mjs
rename to portal/static/js/components/pages/Base.mjs
diff --git a/js/components/pages/Start.mjs b/portal/static/js/components/pages/Start.mjs
similarity index 100%
rename from js/components/pages/Start.mjs
rename to portal/static/js/components/pages/Start.mjs
diff --git a/js/components/pages/Unlock.mjs b/portal/static/js/components/pages/Unlock.mjs
similarity index 100%
rename from js/components/pages/Unlock.mjs
rename to portal/static/js/components/pages/Unlock.mjs
diff --git a/js/components/pieces/AccountRequired.mjs b/portal/static/js/components/pieces/AccountRequired.mjs
similarity index 100%
rename from js/components/pieces/AccountRequired.mjs
rename to portal/static/js/components/pieces/AccountRequired.mjs
diff --git a/js/components/pieces/Agenda.mjs b/portal/static/js/components/pieces/Agenda.mjs
similarity index 100%
rename from js/components/pieces/Agenda.mjs
rename to portal/static/js/components/pieces/Agenda.mjs
diff --git a/js/components/pieces/BoxedButton.mjs b/portal/static/js/components/pieces/BoxedButton.mjs
similarity index 100%
rename from js/components/pieces/BoxedButton.mjs
rename to portal/static/js/components/pieces/BoxedButton.mjs
diff --git a/js/components/pieces/Nav.mjs b/portal/static/js/components/pieces/Nav.mjs
similarity index 100%
rename from js/components/pieces/Nav.mjs
rename to portal/static/js/components/pieces/Nav.mjs
diff --git a/js/components/pieces/NavPageLink.mjs b/portal/static/js/components/pieces/NavPageLink.mjs
similarity index 100%
rename from js/components/pieces/NavPageLink.mjs
rename to portal/static/js/components/pieces/NavPageLink.mjs
diff --git a/js/components/pieces/PasswordInVault.mjs b/portal/static/js/components/pieces/PasswordInVault.mjs
similarity index 100%
rename from js/components/pieces/PasswordInVault.mjs
rename to portal/static/js/components/pieces/PasswordInVault.mjs
diff --git a/js/components/pieces/ServiceLink.mjs b/portal/static/js/components/pieces/ServiceLink.mjs
similarity index 100%
rename from js/components/pieces/ServiceLink.mjs
rename to portal/static/js/components/pieces/ServiceLink.mjs
diff --git a/js/components/pieces/UnlockRequired.mjs b/portal/static/js/components/pieces/UnlockRequired.mjs
similarity index 100%
rename from js/components/pieces/UnlockRequired.mjs
rename to portal/static/js/components/pieces/UnlockRequired.mjs
diff --git a/js/model/Service.mjs b/portal/static/js/model/Service.mjs
similarity index 100%
rename from js/model/Service.mjs
rename to portal/static/js/model/Service.mjs
diff --git a/js/model/services.mjs b/portal/static/js/model/services.mjs
similarity index 100%
rename from js/model/services.mjs
rename to portal/static/js/model/services.mjs
diff --git a/js/portal.mjs b/portal/static/js/portal.mjs
similarity index 68%
rename from js/portal.mjs
rename to portal/static/js/portal.mjs
index bf269de4d1c61caf05d889675d7590f7869e896f..c60f9a82710de49247dd7b455a89431eaa581142 100644
--- a/js/portal.mjs
+++ b/portal/static/js/portal.mjs
@@ -1,8 +1,10 @@
 import { All } from "./components/pages/AllServices.mjs"
 import { Start } from "./components/pages/Start.mjs"
 import { Unlock } from "./components/pages/Unlock.mjs"
-import "/lib/mithril/mithril.min.js"
+import "/static/lib/mithril/mithril.min.js"
 
+// See https://mithril.js.org/route.html#routing-strategies
+m.route.prefix = ""
 m.route(document.body, "/", {
     "/": Start,
     "/all-services": All,
diff --git a/lib/fontawesome-free-6.5.2-web/LICENSE.txt b/portal/static/lib/fontawesome-free-6.5.2-web/LICENSE.txt
similarity index 100%
rename from lib/fontawesome-free-6.5.2-web/LICENSE.txt
rename to portal/static/lib/fontawesome-free-6.5.2-web/LICENSE.txt
diff --git a/lib/fontawesome-free-6.5.2-web/css/all.min.css b/portal/static/lib/fontawesome-free-6.5.2-web/css/all.min.css
similarity index 100%
rename from lib/fontawesome-free-6.5.2-web/css/all.min.css
rename to portal/static/lib/fontawesome-free-6.5.2-web/css/all.min.css
diff --git a/lib/fontawesome-free-6.5.2-web/webfonts/fa-brands-400.ttf b/portal/static/lib/fontawesome-free-6.5.2-web/webfonts/fa-brands-400.ttf
similarity index 100%
rename from lib/fontawesome-free-6.5.2-web/webfonts/fa-brands-400.ttf
rename to portal/static/lib/fontawesome-free-6.5.2-web/webfonts/fa-brands-400.ttf
diff --git a/lib/fontawesome-free-6.5.2-web/webfonts/fa-brands-400.woff2 b/portal/static/lib/fontawesome-free-6.5.2-web/webfonts/fa-brands-400.woff2
similarity index 100%
rename from lib/fontawesome-free-6.5.2-web/webfonts/fa-brands-400.woff2
rename to portal/static/lib/fontawesome-free-6.5.2-web/webfonts/fa-brands-400.woff2
diff --git a/lib/fontawesome-free-6.5.2-web/webfonts/fa-regular-400.ttf b/portal/static/lib/fontawesome-free-6.5.2-web/webfonts/fa-regular-400.ttf
similarity index 100%
rename from lib/fontawesome-free-6.5.2-web/webfonts/fa-regular-400.ttf
rename to portal/static/lib/fontawesome-free-6.5.2-web/webfonts/fa-regular-400.ttf
diff --git a/lib/fontawesome-free-6.5.2-web/webfonts/fa-regular-400.woff2 b/portal/static/lib/fontawesome-free-6.5.2-web/webfonts/fa-regular-400.woff2
similarity index 100%
rename from lib/fontawesome-free-6.5.2-web/webfonts/fa-regular-400.woff2
rename to portal/static/lib/fontawesome-free-6.5.2-web/webfonts/fa-regular-400.woff2
diff --git a/lib/fontawesome-free-6.5.2-web/webfonts/fa-solid-900.ttf b/portal/static/lib/fontawesome-free-6.5.2-web/webfonts/fa-solid-900.ttf
similarity index 100%
rename from lib/fontawesome-free-6.5.2-web/webfonts/fa-solid-900.ttf
rename to portal/static/lib/fontawesome-free-6.5.2-web/webfonts/fa-solid-900.ttf
diff --git a/lib/fontawesome-free-6.5.2-web/webfonts/fa-solid-900.woff2 b/portal/static/lib/fontawesome-free-6.5.2-web/webfonts/fa-solid-900.woff2
similarity index 100%
rename from lib/fontawesome-free-6.5.2-web/webfonts/fa-solid-900.woff2
rename to portal/static/lib/fontawesome-free-6.5.2-web/webfonts/fa-solid-900.woff2
diff --git a/lib/fontawesome-free-6.5.2-web/webfonts/fa-v4compatibility.ttf b/portal/static/lib/fontawesome-free-6.5.2-web/webfonts/fa-v4compatibility.ttf
similarity index 100%
rename from lib/fontawesome-free-6.5.2-web/webfonts/fa-v4compatibility.ttf
rename to portal/static/lib/fontawesome-free-6.5.2-web/webfonts/fa-v4compatibility.ttf
diff --git a/lib/fontawesome-free-6.5.2-web/webfonts/fa-v4compatibility.woff2 b/portal/static/lib/fontawesome-free-6.5.2-web/webfonts/fa-v4compatibility.woff2
similarity index 100%
rename from lib/fontawesome-free-6.5.2-web/webfonts/fa-v4compatibility.woff2
rename to portal/static/lib/fontawesome-free-6.5.2-web/webfonts/fa-v4compatibility.woff2
diff --git a/lib/mithril/LICENSE b/portal/static/lib/mithril/LICENSE
similarity index 100%
rename from lib/mithril/LICENSE
rename to portal/static/lib/mithril/LICENSE
diff --git a/lib/mithril/mithril.min.js b/portal/static/lib/mithril/mithril.min.js
similarity index 100%
rename from lib/mithril/mithril.min.js
rename to portal/static/lib/mithril/mithril.min.js
diff --git a/lib/nautilus/nautilus_blue.svg b/portal/static/lib/nautilus/nautilus_blue.svg
similarity index 100%
rename from lib/nautilus/nautilus_blue.svg
rename to portal/static/lib/nautilus/nautilus_blue.svg
diff --git a/lib/nautilus/nautilus_green.svg b/portal/static/lib/nautilus/nautilus_green.svg
similarity index 100%
rename from lib/nautilus/nautilus_green.svg
rename to portal/static/lib/nautilus/nautilus_green.svg
diff --git a/portal/templates/index.html b/portal/templates/index.html
new file mode 100644
index 0000000000000000000000000000000000000000..641b9ae022a28aa0d41f14a8001053f6636d6a1c
--- /dev/null
+++ b/portal/templates/index.html
@@ -0,0 +1,14 @@
+<!doctype html>
+<html lang="de">
+    <head>
+        <meta charset="utf-8" />
+        <meta name="viewport" content="width=device-width, initial-scale=1.0" />
+        <title>Start · FS Coli Portal</title>
+        <link rel="stylesheet" href="{{ url_for('static', filename='css/main.css') }}" />
+        <link rel="icon" href="{{ url_for('static', filename='img/portal.svg') }}" />
+    </head>
+
+    <body class="blue"></body>
+
+    <script type="module" src="{{ url_for('static', filename='js/portal.mjs') }}"></script>
+</html>