diff --git a/web/src/routes/settings/+layout.server.ts b/web/src/routes/settings/+layout.server.ts
new file mode 100644
index 00000000..b774a0e8
--- /dev/null
+++ b/web/src/routes/settings/+layout.server.ts
@@ -0,0 +1,6 @@
+import { requireAuth } from "$lib/auth/guards";
+import type { LayoutServerLoad } from "./$types";
+
+export const load: LayoutServerLoad = (event) => {
+ requireAuth(event);
+};
diff --git a/web/src/routes/settings/+layout.svelte b/web/src/routes/settings/+layout.svelte
new file mode 100644
index 00000000..331d4b08
--- /dev/null
+++ b/web/src/routes/settings/+layout.svelte
@@ -0,0 +1,52 @@
+
+
+
+ Settings · Tangled
+
+
+
+
+
Settings
+
+
+
+
+
+
+
+
+
+ {@render children()}
+
+
+
+
diff --git a/web/src/routes/settings/+page.svelte b/web/src/routes/settings/+page.svelte
new file mode 100644
index 00000000..7512a58b
--- /dev/null
+++ b/web/src/routes/settings/+page.svelte
@@ -0,0 +1,5 @@
+
+
+
diff --git a/web/src/routes/settings/emails/+page.svelte b/web/src/routes/settings/emails/+page.svelte
new file mode 100644
index 00000000..b6757685
--- /dev/null
+++ b/web/src/routes/settings/emails/+page.svelte
@@ -0,0 +1,5 @@
+
+
+
diff --git a/web/src/routes/settings/notifications/+page.svelte b/web/src/routes/settings/notifications/+page.svelte
new file mode 100644
index 00000000..b4e84cef
--- /dev/null
+++ b/web/src/routes/settings/notifications/+page.svelte
@@ -0,0 +1,5 @@
+
+
+
diff --git a/web/src/routes/settings/sites/+page.svelte b/web/src/routes/settings/sites/+page.svelte
new file mode 100644
index 00000000..a4b5f916
--- /dev/null
+++ b/web/src/routes/settings/sites/+page.svelte
@@ -0,0 +1,5 @@
+
+
+