diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000..b69c111
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1,3 @@
+public/
+.hugo_build.lock
+/resources/_gen
\ No newline at end of file
diff --git a/assets/fonts/Inter400-Latin.woff2 b/assets/fonts/Inter400-Latin.woff2
deleted file mode 100644
index 86f50d0..0000000
Binary files a/assets/fonts/Inter400-Latin.woff2 and /dev/null differ
diff --git a/assets/fonts/Inter500-Latin.woff2 b/assets/fonts/Inter500-Latin.woff2
deleted file mode 100644
index db55875..0000000
Binary files a/assets/fonts/Inter500-Latin.woff2 and /dev/null differ
diff --git a/contact.html b/contact.html
deleted file mode 100644
index cd2cbd9..0000000
--- a/contact.html
+++ /dev/null
@@ -1,35 +0,0 @@
-
-
-
-
-
-
-
Umbrella.haus is an experimental, privacy-centric project that aims to provide a curated selection of open-source services free of charge.
-
-
-
-
-
\ No newline at end of file
diff --git a/content/_index.md b/content/_index.md
new file mode 100644
index 0000000..bec1581
--- /dev/null
+++ b/content/_index.md
@@ -0,0 +1,5 @@
+---
+title: ""
+date: 2025-02-16T16:36:41+02:00
+draft: false
+---
diff --git a/hugo.yaml b/hugo.yaml
new file mode 100644
index 0000000..4038be6
--- /dev/null
+++ b/hugo.yaml
@@ -0,0 +1,19 @@
+baseURL: https://umbrella.haus
+title: Umbrella
+language: en-GB
+
+theme: nostyleplease
+
+params:
+ theme_config:
+ appearance: dark
+ back_home_text: <<
+ date_format: 2006-01-02
+ isListGroupByDate: false
+
+ assets:
+ favicon: /images/favicon.ico
+ faviconsvg: /images/favicon.svg
+ favicon96: /images/favicon-96x96.png
+ appleTouchIcon: /images/apple-touch-icon.png
+ manifest: /manifest.json
diff --git a/index.html b/index.html
deleted file mode 100644
index 114bf37..0000000
--- a/index.html
+++ /dev/null
@@ -1,56 +0,0 @@
-
-
-
-
-
-
-
Umbrella.haus is an experimental, privacy-centric project that aims to provide a curated selection of open-source services free of charge.
-
-
-
Services
-
- Gitea : Forge software package for hosting software version control using Git.
- 4get : Proxy search engine that doesn't suck. Features a JavaScript-free interface and supports searching for websites, images, videos, news, and music.
- EchoIP : Simple IP address lookup service with support for ASN, country, and city lookups powered by the MaxMind GeoIP database.
- LibreSpeed : Extremely lightweight speedtest implemented in JavaScript (telemetry disabled). Utilizes XMLHttpRequest and Web Workers.
-
-
-
-
-
Tor Relays
-
- Caspian 15CD 2C30 2869 2424 98AF EB23 69C0 E958 82DF CB6A
- Sargasso 625C C20F F07A F585 3EE4 A11F 9F0A DB02 3A22 9A24
- Vostok DF6B 339C F595 EE2E 23CA EDD6 1F2C 5103 0236 C5CE
-
-
-
-
-
Under Construction 🏗️
-
- New services:
-
- Mozhi : Frontend for multiple translation engines
- PrivateBin : Zero-knowledge pastebin
-
-
-
-
-
-
\ No newline at end of file
diff --git a/static/contact.txt b/static/contact.txt
new file mode 100644
index 0000000..3fd7198
--- /dev/null
+++ b/static/contact.txt
@@ -0,0 +1,19 @@
+-----BEGIN PGP SIGNED MESSAGE-----
+Hash: SHA512
+
+Clearweb: golfed.xyz, umbrella.haus
+Onion: golfed6fzytoktol4de4o4nerap3xuykhfm5makfzscib65df3khnpyd.onion
+PGP: 1530F5132A1228578D2B4168995EFD5C1B532B3E
+Email: hello@golfed.xyz
+Matrix: @ae:golfed.xyz
+Signal: @xmr.02
+
+Updated: 29/11/2024
+
+-----BEGIN PGP SIGNATURE-----
+
+iHUEARYKAB0WIQQVMPUTKhIoV40rQWiZXv1cG1MrPgUCZ0mHzQAKCRCZXv1cG1Mr
+Pl6yAQCjFkLnaCH9f3BQgAsCwpmjmxQzcOsVoptf4eB08ZJNbAD/RH2Suz1CJSWe
+LTusruFyxPEbzDsT+jNvebZRY91A5gQ=
+=UfKa
+-----END PGP SIGNATURE-----
diff --git a/assets/apple-touch-icon.png b/static/images/apple-touch-icon.png
similarity index 100%
rename from assets/apple-touch-icon.png
rename to static/images/apple-touch-icon.png
diff --git a/assets/favicon-96x96.png b/static/images/favicon-96x96.png
similarity index 100%
rename from assets/favicon-96x96.png
rename to static/images/favicon-96x96.png
diff --git a/assets/favicon.ico b/static/images/favicon.ico
similarity index 100%
rename from assets/favicon.ico
rename to static/images/favicon.ico
diff --git a/assets/favicon.svg b/static/images/favicon.svg
similarity index 100%
rename from assets/favicon.svg
rename to static/images/favicon.svg
diff --git a/assets/web-app-manifest-192x192.png b/static/images/web-app-manifest-192x192.png
similarity index 100%
rename from assets/web-app-manifest-192x192.png
rename to static/images/web-app-manifest-192x192.png
diff --git a/assets/web-app-manifest-512x512.png b/static/images/web-app-manifest-512x512.png
similarity index 100%
rename from assets/web-app-manifest-512x512.png
rename to static/images/web-app-manifest-512x512.png
diff --git a/assets/manifest.json b/static/manifest.json
similarity index 100%
rename from assets/manifest.json
rename to static/manifest.json
diff --git a/style-min.css b/style-min.css
deleted file mode 100644
index bebf4af..0000000
--- a/style-min.css
+++ /dev/null
@@ -1 +0,0 @@
-@font-face {font-family: 'Inter';font-style: normal;font-weight: 400;font-display: auto;src: url("/assets/fonts/Inter400-Latin.woff2") format("woff2");}@font-face {font-family: 'Inter';font-style: normal;font-weight: 500;font-display: auto;src: url("/assets/fonts/Inter500-Latin.woff2") format("woff2");}:root {font-family: "Inter", sans-serif;}body {background-color: #202124;color: #ccc;margin: 0;}.page {max-width: 800px;margin: auto;padding: 20px 40px;}.section {background-color: rgba(255, 255, 255, 0.05);margin-bottom: 20px;border-left: 4px solid #5e81ac;}.section h2 {font-size: 18px;font-weight: 600;color: #fff;padding: 8px 16px;margin: 0;background-color: transparent;border-left: none;}p {background-color: #49688e;padding: 16px 32px;color: #fff;text-align: center;}p > a {color: #fff;font-weight: 600 }h1 {font-size: 42px;color: #eee;font-weight: 600;margin-bottom: 8px;line-height: 32px;}h1 > a {font-size: 22px;color: #aaa }ul {padding: 8px 32px 16px;margin: 0;}li {font-size: 16px;font-weight: 400;margin-bottom: 8px;color: #ccc;}li > a {color: #5e81ac;font-weight: 600;}code {background-color: rgba(94, 129, 172, 0.2);color: #5e81ac;padding: 1px 6px;border-radius: 4px;font-family: "Courier New", monospace;}footer {text-align: center;padding: 20px;font-style: italic;}footer a {color: #ccc;}a {color: #5e81ac;text-decoration: none;transition: color 0.3s ease;}a:hover {color: #81a1c1;text-decoration: underline;}
\ No newline at end of file
diff --git a/style.css b/style.css
deleted file mode 100644
index cc9e1d4..0000000
--- a/style.css
+++ /dev/null
@@ -1,117 +0,0 @@
-@font-face {
- font-family: 'Inter';
- font-style: normal;
- font-weight: 400;
- font-display: auto;
- src: url("/assets/fonts/Inter400-Latin.woff2") format("woff2");
-}
-@font-face {
- font-family: 'Inter';
- font-style: normal;
- font-weight: 500;
- font-display: auto;
- src: url("/assets/fonts/Inter500-Latin.woff2") format("woff2");
-}
-
-:root {
- font-family: "Inter", sans-serif;
-}
-
-body {
- background-color: #202124;
- color: #ccc;
- margin: 0;
-}
-
-.page {
- max-width: 800px;
- margin: auto;
- padding: 20px 40px;
-}
-
-.section {
- background-color: rgba(255, 255, 255, 0.05);
- margin-bottom: 20px;
- border-left: 4px solid #5e81ac;
-}
-
-.section h2 {
- font-size: 18px;
- font-weight: 600;
- color: #fff;
- padding: 8px 16px;
- margin: 0;
- background-color: transparent;
- border-left: none;
-}
-
-p {
- background-color: #49688e;
- padding: 16px 32px;
- color: #fff;
- text-align: center;
-}
-
-p > a {
- color: #fff;
- font-weight: 600
-}
-
-h1 {
- font-size: 42px;
- color: #eee;
- font-weight: 600;
- margin-bottom: 8px;
- line-height: 32px;
-}
-
-h1 > a {
- font-size: 22px;
- color: #aaa
-}
-
-ul {
- padding: 8px 32px 16px;
- margin: 0;
-}
-
-li {
- font-size: 16px;
- font-weight: 400;
- margin-bottom: 8px;
- color: #ccc;
-}
-
-li > a {
- color: #5e81ac;
- font-weight: 600;
-}
-
-code {
- background-color: rgba(94, 129, 172, 0.2);
- color: #5e81ac;
- padding: 1px 6px;
- border-radius: 4px;
- font-family: "Courier New", monospace;
-}
-
-footer {
- text-align: center;
- padding: 20px;
- font-style: italic;
-}
-
-footer a {
- color: #ccc;
-}
-
-a {
- color: #5e81ac;
- text-decoration: none;
- transition: color 0.3s ease;
-}
-
-a:hover {
- color: #81a1c1;
- text-decoration: underline;
-}
diff --git a/themes/nostyleplease/assets/css/main.scss b/themes/nostyleplease/assets/css/main.scss
new file mode 100644
index 0000000..8c52c90
--- /dev/null
+++ b/themes/nostyleplease/assets/css/main.scss
@@ -0,0 +1,185 @@
+// -------------- THEME SWITCHER -------------- //
+@mixin theme($--bg-color, $--primary-text-color, $--secondary-text-color, $--link-color, $--visited-link-color, $--highlight) {
+ background-color: $--bg-color;
+
+ color: $--primary-text-color;
+
+ a {
+ color: $--link-color;
+ &:visited { color: $--visited-link-color; }
+ }
+
+ details {
+ border: thin solid $--primary-text-color;
+ }
+
+ details summary {
+ color: $--primary-text-color;
+ }
+
+ details[open] summary {
+ border-bottom: 1px solid $--primary-text-color;
+ }
+
+ pre {
+ background: $--bg-color;
+ }
+
+ code:not(pre > code) {
+ background-color: $--primary-text-color;
+ color: $--bg-color;
+ }
+
+ *:target {
+ background: $--highlight;
+ color: $--primary-text-color;
+ }
+
+ table, th, td {
+ border: thin solid $--primary-text-color;
+ }
+
+ .toc {
+ border: thin solid $--primary-text-color;
+ padding: 1rem;
+ }
+
+ figcaption { color: $--secondary-text-color; }
+
+ blockquote {
+ border: thin solid $--primary-text-color;
+ }
+}
+
+@mixin dark-appearance {
+ @include theme(#000300, #eff6ee, #000300, #33658a, #55dde0, #9197ae); // modus-vivendi
+}
+
+@mixin light-appearance {
+ @include theme(#ffffff, #000000, #595959, #3548cf, #8f0075, #dae5ec); // modus-operandi
+}
+
+body[a="dark"] { @include dark-appearance; }
+body[a="light"] { @include light-appearance; }
+
+@media (prefers-color-scheme: dark) {
+ body[a="auto"] { @include dark-appearance; }
+}
+
+@media (prefers-color-scheme: light) {
+ body[a="auto"] { @include light-appearance; }
+}
+
+// -------------------------------------------- //
+
+html { height: 100%; }
+
+body {
+ font-family: monospace;
+ font-size: 16px;
+ line-height: 1.4;
+ margin: 0;
+ min-height: 100%;
+ overflow-wrap: break-word;
+}
+
+h2, h3, h4, h5, h6 { margin-top: 1.5rem; }
+
+p { margin: 1rem 0; }
+
+li { margin: 0.4rem 0; }
+
+a {
+ text-decoration: none;
+ &:hover { text-decoration: underline; }
+}
+
+hr {
+ text-align: center;
+ border: 0;
+ margin: 2rem 0;
+
+ &:before { content: '/////' }
+ &:after { content: attr(data-content) '/////' }
+}
+
+pre {
+ padding: 1em;
+ overflow-x: auto; /* Fix pre content overflowing parent without scroll bar */
+}
+
+table { width: 100%; }
+
+table, th, td {
+ border-collapse: collapse;
+ padding: 0.4rem;
+}
+
+code {
+ text-size-adjust: 100%;
+ -ms-text-size-adjust: 100%;
+ -moz-text-size-adjust: 100%;
+ -webkit-text-size-adjust: 100%;
+}
+
+code:not(pre > code) {
+ padding: 0.1em 0.2em;
+ font-size: 90%;
+}
+
+code.has-jax {
+ -webkit-font-smoothing: antialiased;
+ background: inherit !important;
+ border: none !important;
+ font-size: 100%;
+}
+
+blockquote {
+ padding: 1rem;
+
+ p { margin: 0; }
+}
+
+img {
+ max-width: 100%;
+ display: block;
+ margin: 0 auto;
+}
+
+figcaption {
+ text-align: center;
+ opacity: 0.5;
+}
+
+details {
+ padding: 1rem;
+}
+
+details summary {
+ text-decoration: none;
+}
+
+details[open] summary {
+ margin-bottom: 0.5em;
+ padding-bottom: 0.5em;
+}
+
+.post-meta {
+ display: flex;
+ justify-content: space-between;
+ align-items: center;
+}
+
+.w {
+ max-width: 640px;
+ margin: 0 auto;
+ padding: 4rem 2rem;
+}
+
+.toc {
+ padding: 1rem;
+}
+
+.site-footer {
+ margin-top: 2em;
+}
diff --git a/themes/nostyleplease/data/menu.toml b/themes/nostyleplease/data/menu.toml
new file mode 100644
index 0000000..eec37cf
--- /dev/null
+++ b/themes/nostyleplease/data/menu.toml
@@ -0,0 +1,25 @@
+[[entries]]
+title = "services"
+entries = [
+ { title = "4get (proxy search engine)", url = "https://4.umbrella.haus/" },
+ { title = "gitea (git hosting)", url = "https://git.umbrella.haus/" },
+ { title = "echoip (ip lookup)", url = "https://ip.umbrella.haus/" },
+ { title = "librespeed (speedtest)", url = "https://speed.umbrella.haus/" },
+]
+
+[[entries]]
+title = "tor relays"
+entries = [
+ { title = "caspian (15CD2C...DFCB6A)", url = "https://metrics.torproject.org/rs.html#details/15CD2C302869242498AFEB2369C0E95882DFCB6A" },
+ { title = "sargasso (625CC2...229A24)", url = "https://metrics.torproject.org/rs.html#details/625CC20FF07AF5853EE4A11F9F0ADB023A229A24" },
+ { title = "vostok (DF6B33...36C5CE)", url = "https://metrics.torproject.org/rs.html#details/DF6B339CF595EE2E23CAEDD61F2C51030236C5CE" },
+]
+
+[[entries]]
+title = "contacts"
+entries = [
+ { title = "email (hello at golfed.xyz)", url = "mailto:hello@golfed.xyz" },
+ { title = "pgp (1530F5...532B3E)", url = "https://keyserver.ubuntu.com/pks/lookup?op=get&search=0x1530f5132a1228578d2b4168995efd5c1b532b3e" },
+ { title = "matrix (@ae:golfed.xyz)", url = "https://matrix.to/#/@ae:golfed.xyz" },
+ { title = "signal (xmr.02)", url = "https://signal.me/#eu/9aAt0tk36ErVZygWxf_dk81_r_2jTaxUxVCuvl_h6LONUyREI7hLm42Oa8RYJgoz" },
+]
diff --git a/themes/nostyleplease/layouts/404.html b/themes/nostyleplease/layouts/404.html
new file mode 100644
index 0000000..eb600b4
--- /dev/null
+++ b/themes/nostyleplease/layouts/404.html
@@ -0,0 +1,8 @@
+{{ define "main" }}
+
+{{- partial "back_link.html" . -}}
+
+
+
+ {{- block "main" . }}{{- end }}
+ {{ partial "footer.html" }}
+
+
+
+
diff --git a/themes/nostyleplease/layouts/_default/list.html b/themes/nostyleplease/layouts/_default/list.html
new file mode 100644
index 0000000..b561c10
--- /dev/null
+++ b/themes/nostyleplease/layouts/_default/list.html
@@ -0,0 +1,8 @@
+{{ define "main" }}
+{{ partial "back_link.html" .}}
+
+
+
+
+ {{ partial "back_link.html" .}}
+
+
+ {{ .Date | time.Format site.Params.theme_config.date_format }}
+
+
+
+ {{- block "main" . }}{{- end }}
+ {{ partial "footer.html" }}
+
+
+
+
diff --git a/themes/nostyleplease/layouts/posts/list.html b/themes/nostyleplease/layouts/posts/list.html
new file mode 100644
index 0000000..ab0482b
--- /dev/null
+++ b/themes/nostyleplease/layouts/posts/list.html
@@ -0,0 +1,21 @@
+{{ define "main" }}
+
+