diff --git a/web/index.html b/web/index.html
index 1e84728aaba2d29b3cfb4cbca93098c7bc47f794..352f0b87d8a148a7661faecbec73f908b3888114 100644
--- a/web/index.html
+++ b/web/index.html
@@ -5,15 +5,15 @@
     <meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
     <title>Maunium sticker picker</title>
 
-    <link rel="modulepreload" href="./widget-api.js"/>
-    <link rel="modulepreload" href="./frequently-used.js"/>
-    <link rel="modulepreload" href="./spinner.js"/>
-    <link rel="modulepreload" href="./lib/htm/preact.js"/>
+    <link rel="modulepreload" href="src/widget-api.js"/>
+    <link rel="modulepreload" href="src/frequently-used.js"/>
+    <link rel="modulepreload" href="src/spinner.js"/>
+    <link rel="modulepreload" href="lib/htm/preact.js"/>
     <link rel="preload" href="packs/index.json" as="fetch" type="application/json" crossorigin/>
 
-    <link rel="stylesheet" href="index.css"/>
-    <link rel="stylesheet" href="spinner.css"/>
-    <script src="index.js" type="module"></script>
+    <link rel="stylesheet" href="style/index.css"/>
+    <link rel="stylesheet" href="style/spinner.css"/>
+    <script src="src/index.js" type="module"></script>
 </head>
 <body>
     <noscript>This sticker picker requires JavaScript</noscript>
diff --git a/web/package.json b/web/package.json
index 5926728a615b0f1141e25ab506dcc398015e3ba5..7f7f59262a148d8727f4617e7681565ca71c3826 100644
--- a/web/package.json
+++ b/web/package.json
@@ -8,7 +8,7 @@
   "private": true,
   "scripts": {
     "snowpack": "snowpack",
-    "sass": "node-sass -o . *.sass"
+    "sass": "node-sass -o style style/*.sass"
   },
   "snowpack": {
     "install": [
diff --git a/web/frequently-used.js b/web/src/frequently-used.js
similarity index 100%
rename from web/frequently-used.js
rename to web/src/frequently-used.js
diff --git a/web/index.js b/web/src/index.js
similarity index 99%
rename from web/index.js
rename to web/src/index.js
index 342f5242216ddcbf9ec95ddb96ac122253b5b70b..815f321507bad71f8f84c5e3754d1b9699ab938d 100644
--- a/web/index.js
+++ b/web/src/index.js
@@ -3,7 +3,7 @@
 // This Source Code Form is subject to the terms of the Mozilla Public
 // License, v. 2.0. If a copy of the MPL was not distributed with this
 // file, You can obtain one at http://mozilla.org/MPL/2.0/.
-import { html, render, Component } from "./lib/htm/preact.js"
+import { html, render, Component } from "../lib/htm/preact.js"
 import { Spinner } from "./spinner.js"
 import * as widgetAPI from "./widget-api.js"
 import * as frequent from "./frequently-used.js"
diff --git a/web/spinner.js b/web/src/spinner.js
similarity index 93%
rename from web/spinner.js
rename to web/src/spinner.js
index 6462cde2bff1ce8f71d691ad4c479b66c9d34e4e..b44740e614256b020800b322badd0aec09e4df8c 100644
--- a/web/spinner.js
+++ b/web/src/spinner.js
@@ -3,7 +3,7 @@
 // This Source Code Form is subject to the terms of the Mozilla Public
 // License, v. 2.0. If a copy of the MPL was not distributed with this
 // file, You can obtain one at http://mozilla.org/MPL/2.0/.
-import { html } from "https://unpkg.com/htm/preact/index.mjs?module"
+import { html } from "../lib/htm/preact.js"
 
 export const Spinner = ({ size = 40, noCenter = false, noMargin = false, green = false }) => {
 	let margin = 0
diff --git a/web/widget-api.js b/web/src/widget-api.js
similarity index 100%
rename from web/widget-api.js
rename to web/src/widget-api.js
diff --git a/web/index.css b/web/style/index.css
similarity index 100%
rename from web/index.css
rename to web/style/index.css
diff --git a/web/index.sass b/web/style/index.sass
similarity index 100%
rename from web/index.sass
rename to web/style/index.sass
diff --git a/web/spinner.css b/web/style/spinner.css
similarity index 100%
rename from web/spinner.css
rename to web/style/spinner.css