diff --git a/.gitignore b/.gitignore
index 6cacd67..d94cae3 100644
--- a/.gitignore
+++ b/.gitignore
@@ -2,3 +2,4 @@ _site
result
.direnv
.envrc
+public/
\ No newline at end of file
diff --git a/Makefile b/Makefile
deleted file mode 100644
index 86fb008..0000000
--- a/Makefile
+++ /dev/null
@@ -1,27 +0,0 @@
-BUILD_DATE := $(shell date '+%H:%M %d.%m.%Y')
-
-serve:
- python ../shared-assets/makesite.py \
- -p params.json \
- -v page_assets=/assets \
- -v build_time="${BUILD_DATE}" \
- --assets ../shared-assets/assets \
- --assets ./assets \
- --copy-assets \
- --ignore ../shared-assets/assets/img \
- --include robots.txt
- # A workaround to making the fonts load without the CDN
- mv _site/assets/fonts _site/fonts
- cp -r well-known _site/.well-known
- cd _site/ && python -m http.server 8080
-
-build:
- python ../shared-assets/makesite.py \
- -p params.json \
- -v page_assets=https://cdn.polynom.me \
- -v build_time="${BUILD_DATE}" \
- --assets ./assets \
- --copy-assets \
- --include robots.txt
- cp -r well-known _site/.well-known
- tar -czf blog.tar.gz _site
diff --git a/config.toml b/config.toml
new file mode 100644
index 0000000..d8d176f
--- /dev/null
+++ b/config.toml
@@ -0,0 +1,46 @@
+base_url = "https://polynom.me"
+
+title = "PapaTutuWawa's Website"
+description = "The personal website of Alexander 'PapaTutuWawa'."
+
+[extra]
+# Code information
+gitea_url = "git.polynom.me"
+gitea_username = "PapaTutuWawa"
+github_username = "PapaTutuWawa"
+codeberg_username = "PapaTutuWawa"
+
+# Contact information
+email_user = "papatutuwawa"
+email_domain = "polynom.me"
+gpg_key_url = "pki.polynom.me/pubkeys/papatutuwawa.pub"
+fediverse_instance = "social.polynom.me"
+fediverse_username = "papatutuwawa"
+
+[[extra.projects]]
+title = "Moxxy"
+description = "A modern XMPP client written in Flutter. Licensed under GPLv3."
+screenshot = "img/moxxy.jpg"
+source_url = "codeberg.org/moxxy/moxxyv2"
+website = "moxxy.org"
+
+[[extra.projects]]
+title = "AniTrack"
+description = "A simple Anime and Manga tracker written in Flutter. Licensed under MIT."
+screenshot = "img/anitrack.jpg"
+source_url = "codeberg.org/PapaTutuWawa/anitrack"
+website = "codeberg.org/PapaTutuWawa/anitrack"
+
+[[extra.projects]]
+title = "xmpp-discord-bridge"
+description = "An XMPP to Discord bridge that attempts to feel as native as possible on each chat platform, written in Python. Licensed under GPLv3."
+screenshot = ""
+source_url = "codeberg.org/PapaTutuWawa/xmpp-discord-bridge.git"
+website = "codeberg.org/PapaTutuWawa/xmpp-discord-bridge.git"
+
+[[extra.projects]]
+title = "mira"
+description = "An XMPP bot framework for persistent subscription services, written in Python. Licensed under GPLv3."
+screenshot = ""
+source_url = "git.polynom.me/PapaTutuWawa/mira"
+website = "git.polynom.me/PapaTutuWawa/mira"
\ No newline at end of file
diff --git a/content/_index.md b/content/_index.md
new file mode 100644
index 0000000..6cf3fdd
--- /dev/null
+++ b/content/_index.md
@@ -0,0 +1,4 @@
++++
+title = "PapaTutuWawa's Website"
+template = "index.html"
++++
\ No newline at end of file
diff --git a/content/code.html b/content/code.html
deleted file mode 100644
index 6af730f..0000000
--- a/content/code.html
+++ /dev/null
@@ -1,30 +0,0 @@
-
-
-
-
-
-
- I keep my code mostly on my private Gitea instance here .
- For purposes of allowing other people to also contribute
- I try to mirror my code on GitHub and codeberg.
-
-
-
-
diff --git a/content/code.md b/content/code.md
new file mode 100644
index 0000000..6da6171
--- /dev/null
+++ b/content/code.md
@@ -0,0 +1,5 @@
++++
+title = "Code | polynom.me"
+description = "Alexander 'PapaTutuWawa' 's code repositories."
+template = "code.html"
++++
\ No newline at end of file
diff --git a/content/contact.md b/content/contact.md
new file mode 100644
index 0000000..2fd57b4
--- /dev/null
+++ b/content/contact.md
@@ -0,0 +1,5 @@
++++
+title = "Contact | polynom.me"
+description = "Contact details for getting in touch with Alexander 'PapaTutuWawa'."
+template = "contact.html"
++++
\ No newline at end of file
diff --git a/content/index.html b/content/index.html
deleted file mode 100644
index a8faa82..0000000
--- a/content/index.html
+++ /dev/null
@@ -1,19 +0,0 @@
-
-
-
-
-
-
- Hello! My online pseudonym is PapaTutuWawa and I am
- just some random person on the Internet who is passionate about
- topics like XMPP, federated Internet services and privacy. Linux system
- administration, Linux tinkering and programming are my favourite things to do.
-
-
-
Projects
-
This is a small selection of my projects. More are available here.
-
-{{ for_each projects layout/templates/project.html }}
-
-
diff --git a/layout/page.html b/layout/page.html
deleted file mode 100644
index fb022d4..0000000
--- a/layout/page.html
+++ /dev/null
@@ -1,34 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
- {{ title }}
-
-
-
-
-
-
-
-
-
- {{ content }}
-
-
-
diff --git a/layout/templates/empty.html b/layout/templates/empty.html
deleted file mode 100644
index e69de29..0000000
diff --git a/layout/templates/no_screenshot.html b/layout/templates/no_screenshot.html
deleted file mode 100644
index 250a075..0000000
--- a/layout/templates/no_screenshot.html
+++ /dev/null
@@ -1,7 +0,0 @@
-
\ No newline at end of file
diff --git a/layout/templates/project.html b/layout/templates/project.html
deleted file mode 100644
index a977420..0000000
--- a/layout/templates/project.html
+++ /dev/null
@@ -1,14 +0,0 @@
-
- {{ template_if_empty item.screenshot layout/templates/no_screenshot.html layout/templates/screenshot.html }}
-
-
{{ item.title }}
-
{{ item.description }}
-
-
-
- {{ template_if_empty item.website layout/templates/empty.html layout/templates/project_website.html }}
- Code
-
-
-
-
\ No newline at end of file
diff --git a/layout/templates/project_website.html b/layout/templates/project_website.html
deleted file mode 100644
index 5504509..0000000
--- a/layout/templates/project_website.html
+++ /dev/null
@@ -1 +0,0 @@
-Website
diff --git a/layout/templates/screenshot.html b/layout/templates/screenshot.html
deleted file mode 100644
index 290b4a2..0000000
--- a/layout/templates/screenshot.html
+++ /dev/null
@@ -1,5 +0,0 @@
-
diff --git a/params.json b/params.json
deleted file mode 100644
index 8917711..0000000
--- a/params.json
+++ /dev/null
@@ -1,42 +0,0 @@
-{
- "author_name": "Alexander \"PapaTutuWawa\"",
- "blog_url": "blog.polynom.me",
-
- "fediverse_instance": "social.polynom.me",
- "fediverse_username": "papatutuwawa",
-
- "email_domain": "polynom.me",
- "email_user": "papatutuwawa",
- "gpg_key_url": "pki.polynom.me/pubkeys/papatutuwawa.pub",
-
- "github_username": "PapaTutuWawa",
- "codeberg_username": "PapaTutuWawa",
- "gitea_username": "PapaTutuWawa",
- "gitea_url": "git.polynom.me",
-
- "projects": [{
- "title": "Moxxy",
- "description": "A modern XMPP client written in Flutter. Licensed under GPLv3.",
- "screenshot": "assets/img/moxxy.jpg",
- "source_url": "codeberg.org/moxxy/moxxyv2",
- "website": "codeberg.org/moxxy/moxxyv2"
- }, {
- "title": "AniTrack",
- "description": "A simple Anime and Manga tracker written in Flutter. Licensed under MIT.",
- "screenshot": "assets/img/anitrack.jpg",
- "source_url": "codeberg.org/PapaTutuWawa/anitrack",
- "website": "codeberg.org/PapaTutuWawa/anitrack"
- }, {
- "title": "xmpp-discord-bridge",
- "description": "An XMPP to Discord bridge that attempts to feel as native as possible on each chat platform, written in Python. Licensed under GPLv3.",
- "screenshot": "",
- "source_url": "codeberg.org/PapaTutuWawa/xmpp-discord-bridge.git",
- "website": "codeberg.org/PapaTutuWawa/xmpp-discord-bridge.git"
- }, {
- "title": "mira",
- "description": "An XMPP bot framework for persistent subscription services, written in Python. Licensed under GPLv3.",
- "screenshot": "",
- "source_url": "git.polynom.me/PapaTutuWawa/mira",
- "website": "git.polynom.me/PapaTutuWawa/mira"
- }]
-}
diff --git a/pkgs/website.nix b/pkgs/website.nix
deleted file mode 100644
index 3a7c5ca..0000000
--- a/pkgs/website.nix
+++ /dev/null
@@ -1,44 +0,0 @@
-{
- lib, stdenv
-, python3
-, shared-assets
-, tailwindWithTypography
-}: let
- pythonEnv = python3.withPackages (ps: with ps; [
- markdown pygments
- ]);
-in stdenv.mkDerivation {
- pname = "website";
- version = "20230722";
-
- src = ../.;
-
- buildInputs = [ shared-assets python3 ];
-
- buildPhase = ''
- ${pythonEnv}/bin/python ${shared-assets}/bin/makesite.py \
- -v page_assets=https://cdn.polynom.me \
- --assets ./assets \
- --copy-assets \
- --include robots.txt \
- -p params.json
-
- # Build Tailwind CSS data
- ${tailwindWithTypography}/bin/tailwindcss --input ./input.css --output _site/assets/css/index.css
- '';
-
- installPhase = ''
- mkdir -p $out/srv/www/website
- cp -vr _site/* $out/srv/www/website
- cp -vr well-known $out/srv/www/website/.well-known
- '';
-
- doCheck = false;
-
- meta = with lib; {
- description = "The website hosted at https://polynom.me";
- homepage = "https://git.polynom.me/polynom.me/website";
- maintainers = [];
- license = licenses.gpl3;
- };
-}
diff --git a/well-known/host-meta b/static/.well-known/host-meta
similarity index 100%
rename from well-known/host-meta
rename to static/.well-known/host-meta
diff --git a/well-known/host-meta.json b/static/.well-known/host-meta.json
similarity index 100%
rename from well-known/host-meta.json
rename to static/.well-known/host-meta.json
diff --git a/assets/css/index.css b/static/css/extra.css
similarity index 100%
rename from assets/css/index.css
rename to static/css/extra.css
diff --git a/static/css/index.css b/static/css/index.css
new file mode 100644
index 0000000..3cb45e7
--- /dev/null
+++ b/static/css/index.css
@@ -0,0 +1,1168 @@
+/*
+! tailwindcss v3.3.2 | MIT License | https://tailwindcss.com
+*/
+
+/*
+1. Prevent padding and border from affecting element width. (https://github.com/mozdevs/cssremedy/issues/4)
+2. Allow adding a border to an element by just adding a border-width. (https://github.com/tailwindcss/tailwindcss/pull/116)
+*/
+
+*,
+::before,
+::after {
+ box-sizing: border-box;
+ /* 1 */
+ border-width: 0;
+ /* 2 */
+ border-style: solid;
+ /* 2 */
+ border-color: #e5e7eb;
+ /* 2 */
+}
+
+::before,
+::after {
+ --tw-content: '';
+}
+
+/*
+1. Use a consistent sensible line-height in all browsers.
+2. Prevent adjustments of font size after orientation changes in iOS.
+3. Use a more readable tab size.
+4. Use the user's configured `sans` font-family by default.
+5. Use the user's configured `sans` font-feature-settings by default.
+6. Use the user's configured `sans` font-variation-settings by default.
+*/
+
+html {
+ line-height: 1.5;
+ /* 1 */
+ -webkit-text-size-adjust: 100%;
+ /* 2 */
+ -moz-tab-size: 4;
+ /* 3 */
+ -o-tab-size: 4;
+ tab-size: 4;
+ /* 3 */
+ font-family: ui-sans-serif, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, "Noto Sans", sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji";
+ /* 4 */
+ font-feature-settings: normal;
+ /* 5 */
+ font-variation-settings: normal;
+ /* 6 */
+}
+
+/*
+1. Remove the margin in all browsers.
+2. Inherit line-height from `html` so users can set them as a class directly on the `html` element.
+*/
+
+body {
+ margin: 0;
+ /* 1 */
+ line-height: inherit;
+ /* 2 */
+}
+
+/*
+1. Add the correct height in Firefox.
+2. Correct the inheritance of border color in Firefox. (https://bugzilla.mozilla.org/show_bug.cgi?id=190655)
+3. Ensure horizontal rules are visible by default.
+*/
+
+hr {
+ height: 0;
+ /* 1 */
+ color: inherit;
+ /* 2 */
+ border-top-width: 1px;
+ /* 3 */
+}
+
+/*
+Add the correct text decoration in Chrome, Edge, and Safari.
+*/
+
+abbr:where([title]) {
+ -webkit-text-decoration: underline dotted;
+ text-decoration: underline dotted;
+}
+
+/*
+Remove the default font size and weight for headings.
+*/
+
+h1,
+h2,
+h3,
+h4,
+h5,
+h6 {
+ font-size: inherit;
+ font-weight: inherit;
+}
+
+/*
+Reset links to optimize for opt-in styling instead of opt-out.
+*/
+
+a {
+ color: inherit;
+ text-decoration: inherit;
+}
+
+/*
+Add the correct font weight in Edge and Safari.
+*/
+
+b,
+strong {
+ font-weight: bolder;
+}
+
+/*
+1. Use the user's configured `mono` font family by default.
+2. Correct the odd `em` font sizing in all browsers.
+*/
+
+code,
+kbd,
+samp,
+pre {
+ font-family: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace;
+ /* 1 */
+ font-size: 1em;
+ /* 2 */
+}
+
+/*
+Add the correct font size in all browsers.
+*/
+
+small {
+ font-size: 80%;
+}
+
+/*
+Prevent `sub` and `sup` elements from affecting the line height in all browsers.
+*/
+
+sub,
+sup {
+ font-size: 75%;
+ line-height: 0;
+ position: relative;
+ vertical-align: baseline;
+}
+
+sub {
+ bottom: -0.25em;
+}
+
+sup {
+ top: -0.5em;
+}
+
+/*
+1. Remove text indentation from table contents in Chrome and Safari. (https://bugs.chromium.org/p/chromium/issues/detail?id=999088, https://bugs.webkit.org/show_bug.cgi?id=201297)
+2. Correct table border color inheritance in all Chrome and Safari. (https://bugs.chromium.org/p/chromium/issues/detail?id=935729, https://bugs.webkit.org/show_bug.cgi?id=195016)
+3. Remove gaps between table borders by default.
+*/
+
+table {
+ text-indent: 0;
+ /* 1 */
+ border-color: inherit;
+ /* 2 */
+ border-collapse: collapse;
+ /* 3 */
+}
+
+/*
+1. Change the font styles in all browsers.
+2. Remove the margin in Firefox and Safari.
+3. Remove default padding in all browsers.
+*/
+
+button,
+input,
+optgroup,
+select,
+textarea {
+ font-family: inherit;
+ /* 1 */
+ font-size: 100%;
+ /* 1 */
+ font-weight: inherit;
+ /* 1 */
+ line-height: inherit;
+ /* 1 */
+ color: inherit;
+ /* 1 */
+ margin: 0;
+ /* 2 */
+ padding: 0;
+ /* 3 */
+}
+
+/*
+Remove the inheritance of text transform in Edge and Firefox.
+*/
+
+button,
+select {
+ text-transform: none;
+}
+
+/*
+1. Correct the inability to style clickable types in iOS and Safari.
+2. Remove default button styles.
+*/
+
+button,
+[type='button'],
+[type='reset'],
+[type='submit'] {
+ -webkit-appearance: button;
+ /* 1 */
+ background-color: transparent;
+ /* 2 */
+ background-image: none;
+ /* 2 */
+}
+
+/*
+Use the modern Firefox focus style for all focusable elements.
+*/
+
+:-moz-focusring {
+ outline: auto;
+}
+
+/*
+Remove the additional `:invalid` styles in Firefox. (https://github.com/mozilla/gecko-dev/blob/2f9eacd9d3d995c937b4251a5557d95d494c9be1/layout/style/res/forms.css#L728-L737)
+*/
+
+:-moz-ui-invalid {
+ box-shadow: none;
+}
+
+/*
+Add the correct vertical alignment in Chrome and Firefox.
+*/
+
+progress {
+ vertical-align: baseline;
+}
+
+/*
+Correct the cursor style of increment and decrement buttons in Safari.
+*/
+
+::-webkit-inner-spin-button,
+::-webkit-outer-spin-button {
+ height: auto;
+}
+
+/*
+1. Correct the odd appearance in Chrome and Safari.
+2. Correct the outline style in Safari.
+*/
+
+[type='search'] {
+ -webkit-appearance: textfield;
+ /* 1 */
+ outline-offset: -2px;
+ /* 2 */
+}
+
+/*
+Remove the inner padding in Chrome and Safari on macOS.
+*/
+
+::-webkit-search-decoration {
+ -webkit-appearance: none;
+}
+
+/*
+1. Correct the inability to style clickable types in iOS and Safari.
+2. Change font properties to `inherit` in Safari.
+*/
+
+::-webkit-file-upload-button {
+ -webkit-appearance: button;
+ /* 1 */
+ font: inherit;
+ /* 2 */
+}
+
+/*
+Add the correct display in Chrome and Safari.
+*/
+
+summary {
+ display: list-item;
+}
+
+/*
+Removes the default spacing and border for appropriate elements.
+*/
+
+blockquote,
+dl,
+dd,
+h1,
+h2,
+h3,
+h4,
+h5,
+h6,
+hr,
+figure,
+p,
+pre {
+ margin: 0;
+}
+
+fieldset {
+ margin: 0;
+ padding: 0;
+}
+
+legend {
+ padding: 0;
+}
+
+ol,
+ul,
+menu {
+ list-style: none;
+ margin: 0;
+ padding: 0;
+}
+
+/*
+Prevent resizing textareas horizontally by default.
+*/
+
+textarea {
+ resize: vertical;
+}
+
+/*
+1. Reset the default placeholder opacity in Firefox. (https://github.com/tailwindlabs/tailwindcss/issues/3300)
+2. Set the default placeholder color to the user's configured gray 400 color.
+*/
+
+input::-moz-placeholder, textarea::-moz-placeholder {
+ opacity: 1;
+ /* 1 */
+ color: #9ca3af;
+ /* 2 */
+}
+
+input::placeholder,
+textarea::placeholder {
+ opacity: 1;
+ /* 1 */
+ color: #9ca3af;
+ /* 2 */
+}
+
+/*
+Set the default cursor for buttons.
+*/
+
+button,
+[role="button"] {
+ cursor: pointer;
+}
+
+/*
+Make sure disabled buttons don't get the pointer cursor.
+*/
+
+:disabled {
+ cursor: default;
+}
+
+/*
+1. Make replaced elements `display: block` by default. (https://github.com/mozdevs/cssremedy/issues/14)
+2. Add `vertical-align: middle` to align replaced elements more sensibly by default. (https://github.com/jensimmons/cssremedy/issues/14#issuecomment-634934210)
+ This can trigger a poorly considered lint error in some tools but is included by design.
+*/
+
+img,
+svg,
+video,
+canvas,
+audio,
+iframe,
+embed,
+object {
+ display: block;
+ /* 1 */
+ vertical-align: middle;
+ /* 2 */
+}
+
+/*
+Constrain images and videos to the parent width and preserve their intrinsic aspect ratio. (https://github.com/mozdevs/cssremedy/issues/14)
+*/
+
+img,
+video {
+ max-width: 100%;
+ height: auto;
+}
+
+/* Make elements with the HTML hidden attribute stay hidden by default */
+
+[hidden] {
+ display: none;
+}
+
+body {
+ background-color: #212121;
+}
+
+html {
+ --tw-text-opacity: 1;
+ color: rgb(255 255 255 / var(--tw-text-opacity));
+}
+
+a {
+ --tw-text-opacity: 1 !important;
+ color: rgb(129 140 248 / var(--tw-text-opacity)) !important;
+}
+
+*, ::before, ::after {
+ --tw-border-spacing-x: 0;
+ --tw-border-spacing-y: 0;
+ --tw-translate-x: 0;
+ --tw-translate-y: 0;
+ --tw-rotate: 0;
+ --tw-skew-x: 0;
+ --tw-skew-y: 0;
+ --tw-scale-x: 1;
+ --tw-scale-y: 1;
+ --tw-pan-x: ;
+ --tw-pan-y: ;
+ --tw-pinch-zoom: ;
+ --tw-scroll-snap-strictness: proximity;
+ --tw-gradient-from-position: ;
+ --tw-gradient-via-position: ;
+ --tw-gradient-to-position: ;
+ --tw-ordinal: ;
+ --tw-slashed-zero: ;
+ --tw-numeric-figure: ;
+ --tw-numeric-spacing: ;
+ --tw-numeric-fraction: ;
+ --tw-ring-inset: ;
+ --tw-ring-offset-width: 0px;
+ --tw-ring-offset-color: #fff;
+ --tw-ring-color: rgb(59 130 246 / 0.5);
+ --tw-ring-offset-shadow: 0 0 #0000;
+ --tw-ring-shadow: 0 0 #0000;
+ --tw-shadow: 0 0 #0000;
+ --tw-shadow-colored: 0 0 #0000;
+ --tw-blur: ;
+ --tw-brightness: ;
+ --tw-contrast: ;
+ --tw-grayscale: ;
+ --tw-hue-rotate: ;
+ --tw-invert: ;
+ --tw-saturate: ;
+ --tw-sepia: ;
+ --tw-drop-shadow: ;
+ --tw-backdrop-blur: ;
+ --tw-backdrop-brightness: ;
+ --tw-backdrop-contrast: ;
+ --tw-backdrop-grayscale: ;
+ --tw-backdrop-hue-rotate: ;
+ --tw-backdrop-invert: ;
+ --tw-backdrop-opacity: ;
+ --tw-backdrop-saturate: ;
+ --tw-backdrop-sepia: ;
+}
+
+::backdrop {
+ --tw-border-spacing-x: 0;
+ --tw-border-spacing-y: 0;
+ --tw-translate-x: 0;
+ --tw-translate-y: 0;
+ --tw-rotate: 0;
+ --tw-skew-x: 0;
+ --tw-skew-y: 0;
+ --tw-scale-x: 1;
+ --tw-scale-y: 1;
+ --tw-pan-x: ;
+ --tw-pan-y: ;
+ --tw-pinch-zoom: ;
+ --tw-scroll-snap-strictness: proximity;
+ --tw-gradient-from-position: ;
+ --tw-gradient-via-position: ;
+ --tw-gradient-to-position: ;
+ --tw-ordinal: ;
+ --tw-slashed-zero: ;
+ --tw-numeric-figure: ;
+ --tw-numeric-spacing: ;
+ --tw-numeric-fraction: ;
+ --tw-ring-inset: ;
+ --tw-ring-offset-width: 0px;
+ --tw-ring-offset-color: #fff;
+ --tw-ring-color: rgb(59 130 246 / 0.5);
+ --tw-ring-offset-shadow: 0 0 #0000;
+ --tw-ring-shadow: 0 0 #0000;
+ --tw-shadow: 0 0 #0000;
+ --tw-shadow-colored: 0 0 #0000;
+ --tw-blur: ;
+ --tw-brightness: ;
+ --tw-contrast: ;
+ --tw-grayscale: ;
+ --tw-hue-rotate: ;
+ --tw-invert: ;
+ --tw-saturate: ;
+ --tw-sepia: ;
+ --tw-drop-shadow: ;
+ --tw-backdrop-blur: ;
+ --tw-backdrop-brightness: ;
+ --tw-backdrop-contrast: ;
+ --tw-backdrop-grayscale: ;
+ --tw-backdrop-hue-rotate: ;
+ --tw-backdrop-invert: ;
+ --tw-backdrop-opacity: ;
+ --tw-backdrop-saturate: ;
+ --tw-backdrop-sepia: ;
+}
+
+.prose {
+ color: var(--tw-prose-body);
+ max-width: 65ch;
+}
+
+.prose :where(p):not(:where([class~="not-prose"] *)) {
+ margin-top: 1.25em;
+ margin-bottom: 1.25em;
+}
+
+.prose :where([class~="lead"]):not(:where([class~="not-prose"] *)) {
+ color: var(--tw-prose-lead);
+ font-size: 1.25em;
+ line-height: 1.6;
+ margin-top: 1.2em;
+ margin-bottom: 1.2em;
+}
+
+.prose :where(a):not(:where([class~="not-prose"] *)) {
+ color: var(--tw-prose-links);
+ text-decoration: underline;
+ font-weight: 500;
+}
+
+.prose :where(strong):not(:where([class~="not-prose"] *)) {
+ color: var(--tw-prose-bold);
+ font-weight: 600;
+}
+
+.prose :where(a strong):not(:where([class~="not-prose"] *)) {
+ color: inherit;
+}
+
+.prose :where(blockquote strong):not(:where([class~="not-prose"] *)) {
+ color: inherit;
+}
+
+.prose :where(thead th strong):not(:where([class~="not-prose"] *)) {
+ color: inherit;
+}
+
+.prose :where(ol):not(:where([class~="not-prose"] *)) {
+ list-style-type: decimal;
+ margin-top: 1.25em;
+ margin-bottom: 1.25em;
+ padding-left: 1.625em;
+}
+
+.prose :where(ol[type="A"]):not(:where([class~="not-prose"] *)) {
+ list-style-type: upper-alpha;
+}
+
+.prose :where(ol[type="a"]):not(:where([class~="not-prose"] *)) {
+ list-style-type: lower-alpha;
+}
+
+.prose :where(ol[type="A" s]):not(:where([class~="not-prose"] *)) {
+ list-style-type: upper-alpha;
+}
+
+.prose :where(ol[type="a" s]):not(:where([class~="not-prose"] *)) {
+ list-style-type: lower-alpha;
+}
+
+.prose :where(ol[type="I"]):not(:where([class~="not-prose"] *)) {
+ list-style-type: upper-roman;
+}
+
+.prose :where(ol[type="i"]):not(:where([class~="not-prose"] *)) {
+ list-style-type: lower-roman;
+}
+
+.prose :where(ol[type="I" s]):not(:where([class~="not-prose"] *)) {
+ list-style-type: upper-roman;
+}
+
+.prose :where(ol[type="i" s]):not(:where([class~="not-prose"] *)) {
+ list-style-type: lower-roman;
+}
+
+.prose :where(ol[type="1"]):not(:where([class~="not-prose"] *)) {
+ list-style-type: decimal;
+}
+
+.prose :where(ul):not(:where([class~="not-prose"] *)) {
+ list-style-type: disc;
+ margin-top: 1.25em;
+ margin-bottom: 1.25em;
+ padding-left: 1.625em;
+}
+
+.prose :where(ol > li):not(:where([class~="not-prose"] *))::marker {
+ font-weight: 400;
+ color: var(--tw-prose-counters);
+}
+
+.prose :where(ul > li):not(:where([class~="not-prose"] *))::marker {
+ color: var(--tw-prose-bullets);
+}
+
+.prose :where(hr):not(:where([class~="not-prose"] *)) {
+ border-color: var(--tw-prose-hr);
+ border-top-width: 1px;
+ margin-top: 3em;
+ margin-bottom: 3em;
+}
+
+.prose :where(blockquote):not(:where([class~="not-prose"] *)) {
+ font-weight: 500;
+ font-style: italic;
+ color: var(--tw-prose-quotes);
+ border-left-width: 0.25rem;
+ border-left-color: var(--tw-prose-quote-borders);
+ quotes: "\201C""\201D""\2018""\2019";
+ margin-top: 1.6em;
+ margin-bottom: 1.6em;
+ padding-left: 1em;
+}
+
+.prose :where(blockquote p:first-of-type):not(:where([class~="not-prose"] *))::before {
+ content: open-quote;
+}
+
+.prose :where(blockquote p:last-of-type):not(:where([class~="not-prose"] *))::after {
+ content: close-quote;
+}
+
+.prose :where(h1):not(:where([class~="not-prose"] *)) {
+ color: var(--tw-prose-headings);
+ font-weight: 800;
+ font-size: 2.25em;
+ margin-top: 0;
+ margin-bottom: 0.8888889em;
+ line-height: 1.1111111;
+}
+
+.prose :where(h1 strong):not(:where([class~="not-prose"] *)) {
+ font-weight: 900;
+ color: inherit;
+}
+
+.prose :where(h2):not(:where([class~="not-prose"] *)) {
+ color: var(--tw-prose-headings);
+ font-weight: 700;
+ font-size: 1.5em;
+ margin-top: 2em;
+ margin-bottom: 1em;
+ line-height: 1.3333333;
+}
+
+.prose :where(h2 strong):not(:where([class~="not-prose"] *)) {
+ font-weight: 800;
+ color: inherit;
+}
+
+.prose :where(h3):not(:where([class~="not-prose"] *)) {
+ color: var(--tw-prose-headings);
+ font-weight: 600;
+ font-size: 1.25em;
+ margin-top: 1.6em;
+ margin-bottom: 0.6em;
+ line-height: 1.6;
+}
+
+.prose :where(h3 strong):not(:where([class~="not-prose"] *)) {
+ font-weight: 700;
+ color: inherit;
+}
+
+.prose :where(h4):not(:where([class~="not-prose"] *)) {
+ color: var(--tw-prose-headings);
+ font-weight: 600;
+ margin-top: 1.5em;
+ margin-bottom: 0.5em;
+ line-height: 1.5;
+}
+
+.prose :where(h4 strong):not(:where([class~="not-prose"] *)) {
+ font-weight: 700;
+ color: inherit;
+}
+
+.prose :where(img):not(:where([class~="not-prose"] *)) {
+ margin-top: 2em;
+ margin-bottom: 2em;
+}
+
+.prose :where(figure > *):not(:where([class~="not-prose"] *)) {
+ margin-top: 0;
+ margin-bottom: 0;
+}
+
+.prose :where(figcaption):not(:where([class~="not-prose"] *)) {
+ color: var(--tw-prose-captions);
+ font-size: 0.875em;
+ line-height: 1.4285714;
+ margin-top: 0.8571429em;
+}
+
+.prose :where(code):not(:where([class~="not-prose"] *)) {
+ color: var(--tw-prose-code);
+ font-weight: 600;
+ font-size: 0.875em;
+}
+
+.prose :where(code):not(:where([class~="not-prose"] *))::before {
+ content: "`";
+}
+
+.prose :where(code):not(:where([class~="not-prose"] *))::after {
+ content: "`";
+}
+
+.prose :where(a code):not(:where([class~="not-prose"] *)) {
+ color: inherit;
+}
+
+.prose :where(h1 code):not(:where([class~="not-prose"] *)) {
+ color: inherit;
+}
+
+.prose :where(h2 code):not(:where([class~="not-prose"] *)) {
+ color: inherit;
+ font-size: 0.875em;
+}
+
+.prose :where(h3 code):not(:where([class~="not-prose"] *)) {
+ color: inherit;
+ font-size: 0.9em;
+}
+
+.prose :where(h4 code):not(:where([class~="not-prose"] *)) {
+ color: inherit;
+}
+
+.prose :where(blockquote code):not(:where([class~="not-prose"] *)) {
+ color: inherit;
+}
+
+.prose :where(thead th code):not(:where([class~="not-prose"] *)) {
+ color: inherit;
+}
+
+.prose :where(pre):not(:where([class~="not-prose"] *)) {
+ color: var(--tw-prose-pre-code);
+ background-color: var(--tw-prose-pre-bg);
+ overflow-x: auto;
+ font-weight: 400;
+ font-size: 0.875em;
+ line-height: 1.7142857;
+ margin-top: 1.7142857em;
+ margin-bottom: 1.7142857em;
+ border-radius: 0.375rem;
+ padding-top: 0.8571429em;
+ padding-right: 1.1428571em;
+ padding-bottom: 0.8571429em;
+ padding-left: 1.1428571em;
+}
+
+.prose :where(pre code):not(:where([class~="not-prose"] *)) {
+ background-color: transparent;
+ border-width: 0;
+ border-radius: 0;
+ padding: 0;
+ font-weight: inherit;
+ color: inherit;
+ font-size: inherit;
+ font-family: inherit;
+ line-height: inherit;
+}
+
+.prose :where(pre code):not(:where([class~="not-prose"] *))::before {
+ content: none;
+}
+
+.prose :where(pre code):not(:where([class~="not-prose"] *))::after {
+ content: none;
+}
+
+.prose :where(table):not(:where([class~="not-prose"] *)) {
+ width: 100%;
+ table-layout: auto;
+ text-align: left;
+ margin-top: 2em;
+ margin-bottom: 2em;
+ font-size: 0.875em;
+ line-height: 1.7142857;
+}
+
+.prose :where(thead):not(:where([class~="not-prose"] *)) {
+ border-bottom-width: 1px;
+ border-bottom-color: var(--tw-prose-th-borders);
+}
+
+.prose :where(thead th):not(:where([class~="not-prose"] *)) {
+ color: var(--tw-prose-headings);
+ font-weight: 600;
+ vertical-align: bottom;
+ padding-right: 0.5714286em;
+ padding-bottom: 0.5714286em;
+ padding-left: 0.5714286em;
+}
+
+.prose :where(tbody tr):not(:where([class~="not-prose"] *)) {
+ border-bottom-width: 1px;
+ border-bottom-color: var(--tw-prose-td-borders);
+}
+
+.prose :where(tbody tr:last-child):not(:where([class~="not-prose"] *)) {
+ border-bottom-width: 0;
+}
+
+.prose :where(tbody td):not(:where([class~="not-prose"] *)) {
+ vertical-align: baseline;
+}
+
+.prose :where(tfoot):not(:where([class~="not-prose"] *)) {
+ border-top-width: 1px;
+ border-top-color: var(--tw-prose-th-borders);
+}
+
+.prose :where(tfoot td):not(:where([class~="not-prose"] *)) {
+ vertical-align: top;
+}
+
+.prose {
+ --tw-prose-body: #374151;
+ --tw-prose-headings: #111827;
+ --tw-prose-lead: #4b5563;
+ --tw-prose-links: #111827;
+ --tw-prose-bold: #111827;
+ --tw-prose-counters: #6b7280;
+ --tw-prose-bullets: #d1d5db;
+ --tw-prose-hr: #e5e7eb;
+ --tw-prose-quotes: #111827;
+ --tw-prose-quote-borders: #e5e7eb;
+ --tw-prose-captions: #6b7280;
+ --tw-prose-code: #111827;
+ --tw-prose-pre-code: #e5e7eb;
+ --tw-prose-pre-bg: #1f2937;
+ --tw-prose-th-borders: #d1d5db;
+ --tw-prose-td-borders: #e5e7eb;
+ --tw-prose-invert-body: #d1d5db;
+ --tw-prose-invert-headings: #fff;
+ --tw-prose-invert-lead: #9ca3af;
+ --tw-prose-invert-links: #fff;
+ --tw-prose-invert-bold: #fff;
+ --tw-prose-invert-counters: #9ca3af;
+ --tw-prose-invert-bullets: #4b5563;
+ --tw-prose-invert-hr: #374151;
+ --tw-prose-invert-quotes: #f3f4f6;
+ --tw-prose-invert-quote-borders: #374151;
+ --tw-prose-invert-captions: #9ca3af;
+ --tw-prose-invert-code: #fff;
+ --tw-prose-invert-pre-code: #d1d5db;
+ --tw-prose-invert-pre-bg: rgb(0 0 0 / 50%);
+ --tw-prose-invert-th-borders: #4b5563;
+ --tw-prose-invert-td-borders: #374151;
+ font-size: 1rem;
+ line-height: 1.75;
+}
+
+.prose :where(video):not(:where([class~="not-prose"] *)) {
+ margin-top: 2em;
+ margin-bottom: 2em;
+}
+
+.prose :where(figure):not(:where([class~="not-prose"] *)) {
+ margin-top: 2em;
+ margin-bottom: 2em;
+}
+
+.prose :where(li):not(:where([class~="not-prose"] *)) {
+ margin-top: 0.5em;
+ margin-bottom: 0.5em;
+}
+
+.prose :where(ol > li):not(:where([class~="not-prose"] *)) {
+ padding-left: 0.375em;
+}
+
+.prose :where(ul > li):not(:where([class~="not-prose"] *)) {
+ padding-left: 0.375em;
+}
+
+.prose :where(.prose > ul > li p):not(:where([class~="not-prose"] *)) {
+ margin-top: 0.75em;
+ margin-bottom: 0.75em;
+}
+
+.prose :where(.prose > ul > li > *:first-child):not(:where([class~="not-prose"] *)) {
+ margin-top: 1.25em;
+}
+
+.prose :where(.prose > ul > li > *:last-child):not(:where([class~="not-prose"] *)) {
+ margin-bottom: 1.25em;
+}
+
+.prose :where(.prose > ol > li > *:first-child):not(:where([class~="not-prose"] *)) {
+ margin-top: 1.25em;
+}
+
+.prose :where(.prose > ol > li > *:last-child):not(:where([class~="not-prose"] *)) {
+ margin-bottom: 1.25em;
+}
+
+.prose :where(ul ul, ul ol, ol ul, ol ol):not(:where([class~="not-prose"] *)) {
+ margin-top: 0.75em;
+ margin-bottom: 0.75em;
+}
+
+.prose :where(hr + *):not(:where([class~="not-prose"] *)) {
+ margin-top: 0;
+}
+
+.prose :where(h2 + *):not(:where([class~="not-prose"] *)) {
+ margin-top: 0;
+}
+
+.prose :where(h3 + *):not(:where([class~="not-prose"] *)) {
+ margin-top: 0;
+}
+
+.prose :where(h4 + *):not(:where([class~="not-prose"] *)) {
+ margin-top: 0;
+}
+
+.prose :where(thead th:first-child):not(:where([class~="not-prose"] *)) {
+ padding-left: 0;
+}
+
+.prose :where(thead th:last-child):not(:where([class~="not-prose"] *)) {
+ padding-right: 0;
+}
+
+.prose :where(tbody td, tfoot td):not(:where([class~="not-prose"] *)) {
+ padding-top: 0.5714286em;
+ padding-right: 0.5714286em;
+ padding-bottom: 0.5714286em;
+ padding-left: 0.5714286em;
+}
+
+.prose :where(tbody td:first-child, tfoot td:first-child):not(:where([class~="not-prose"] *)) {
+ padding-left: 0;
+}
+
+.prose :where(tbody td:last-child, tfoot td:last-child):not(:where([class~="not-prose"] *)) {
+ padding-right: 0;
+}
+
+.prose :where(.prose > :first-child):not(:where([class~="not-prose"] *)) {
+ margin-top: 0;
+}
+
+.prose :where(.prose > :last-child):not(:where([class~="not-prose"] *)) {
+ margin-bottom: 0;
+}
+
+.mx-auto {
+ margin-left: auto;
+ margin-right: auto;
+}
+
+.ml-4 {
+ margin-left: 1rem;
+}
+
+.mr-8 {
+ margin-right: 2rem;
+}
+
+.block {
+ display: block;
+}
+
+.inline {
+ display: inline;
+}
+
+.flex {
+ display: flex;
+}
+
+.table {
+ display: table;
+}
+
+.h-12 {
+ height: 3rem;
+}
+
+.h-24 {
+ height: 6rem;
+}
+
+.w-12 {
+ width: 3rem;
+}
+
+.w-24 {
+ width: 6rem;
+}
+
+.w-full {
+ width: 100%;
+}
+
+.max-w-none {
+ max-width: none;
+}
+
+.list-none {
+ list-style-type: none;
+}
+
+.flex-row {
+ flex-direction: row;
+}
+
+.flex-col {
+ flex-direction: column;
+}
+
+.items-start {
+ align-items: flex-start;
+}
+
+.justify-center {
+ justify-content: center;
+}
+
+.self-start {
+ align-self: flex-start;
+}
+
+.self-center {
+ align-self: center;
+}
+
+.rounded-lg {
+ border-radius: 0.5rem;
+}
+
+.bg-indigo-950 {
+ --tw-bg-opacity: 1;
+ background-color: rgb(30 27 75 / var(--tw-bg-opacity));
+}
+
+.p-2 {
+ padding: 0.5rem;
+}
+
+.py-8 {
+ padding-top: 2rem;
+ padding-bottom: 2rem;
+}
+
+.pl-8 {
+ padding-left: 2rem;
+}
+
+.pt-4 {
+ padding-top: 1rem;
+}
+
+.pt-8 {
+ padding-top: 2rem;
+}
+
+.text-left {
+ text-align: left;
+}
+
+.text-center {
+ text-align: center;
+}
+
+.text-justify {
+ text-align: justify;
+}
+
+.text-2xl {
+ font-size: 1.5rem;
+ line-height: 2rem;
+}
+
+.text-5xl {
+ font-size: 3rem;
+ line-height: 1;
+}
+
+.font-bold {
+ font-weight: 700;
+}
+
+.text-indigo-400 {
+ --tw-text-opacity: 1;
+ color: rgb(129 140 248 / var(--tw-text-opacity));
+}
+
+.text-white {
+ --tw-text-opacity: 1;
+ color: rgb(255 255 255 / var(--tw-text-opacity));
+}
+
+@media (min-width: 768px) {
+ .md\:h-24 {
+ height: 6rem;
+ }
+
+ .md\:h-48 {
+ height: 12rem;
+ }
+
+ .md\:w-24 {
+ width: 6rem;
+ }
+
+ .md\:w-4\/5 {
+ width: 80%;
+ }
+
+ .md\:w-48 {
+ width: 12rem;
+ }
+
+ .md\:p-8 {
+ padding: 2rem;
+ }
+}
diff --git a/assets/img/anitrack.jpg b/static/img/anitrack.jpg
similarity index 100%
rename from assets/img/anitrack.jpg
rename to static/img/anitrack.jpg
diff --git a/static/img/avatar.jpg b/static/img/avatar.jpg
new file mode 100644
index 0000000..ab5d437
Binary files /dev/null and b/static/img/avatar.jpg differ
diff --git a/assets/img/moxxy.jpg b/static/img/moxxy.jpg
similarity index 100%
rename from assets/img/moxxy.jpg
rename to static/img/moxxy.jpg
diff --git a/robots.txt b/static/robots.txt
similarity index 100%
rename from robots.txt
rename to static/robots.txt
diff --git a/tailwind.config.js b/tailwind.config.js
index d8af9a4..412bf53 100644
--- a/tailwind.config.js
+++ b/tailwind.config.js
@@ -1,8 +1,6 @@
module.exports = {
content: [
- "./content/*.html",
- "./layout/*.html",
- "./layout/templates/*.html",
+ "./templates/*.html",
],
theme: {
},
diff --git a/templates/base.html b/templates/base.html
new file mode 100644
index 0000000..412ff7d
--- /dev/null
+++ b/templates/base.html
@@ -0,0 +1,42 @@
+
+
+
+
+
+
+
+
+ {% if page %}
+
+
+ {{ page.title }}
+ {% else %}
+
+
+ {{ config.title }}
+ {% endif %}
+
+
+
+
+
+
+
+
+
+ {% block content %}{% endblock %}
+
+
+
diff --git a/templates/code.html b/templates/code.html
new file mode 100644
index 0000000..e95bc1d
--- /dev/null
+++ b/templates/code.html
@@ -0,0 +1,30 @@
+{% extends "base.html" %}
+
+{% block content %}
+
+
+ I keep my code mostly on my private Gitea instance here .
+ For purposes of allowing other people to also contribute
+ I try to mirror my code on GitHub and codeberg.
+
+
+
+
+{% endblock %}
\ No newline at end of file
diff --git a/content/contact.html b/templates/contact.html
similarity index 50%
rename from content/contact.html
rename to templates/contact.html
index 9549188..ea52d63 100644
--- a/content/contact.html
+++ b/templates/contact.html
@@ -1,6 +1,6 @@
-
-
-
+{% extends "base.html" %}
+
+{% block content %}
If you have any questions about my projects or just want to talk, feel
@@ -11,33 +11,35 @@
+
+{% endblock %}
\ No newline at end of file
diff --git a/templates/index.html b/templates/index.html
new file mode 100644
index 0000000..f08531a
--- /dev/null
+++ b/templates/index.html
@@ -0,0 +1,57 @@
+{% extends "base.html" %}
+
+{% block content %}
+
+
+ Hello! My online pseudonym is PapaTutuWawa and I am
+ just some random person on the Internet who is passionate about
+ topics like XMPP, federated Internet services and privacy. Linux system
+ administration, Linux tinkering and programming are my favourite things to do.
+
+
+
Projects
+
This is a small selection of my projects. More are available here.
+
+{% for project in config.extra.projects %}
+
+ {% if project.screenshot != "" %}
+
+ {% else %}
+
+ {% endif %}
+
+
{{ project.title }}
+
{{ project.description }}
+
+
+
+ {% if project.website != "" %}
+
+ Website
+
+ {% endif %}
+
+ Code
+
+
+
+
+{% endfor %}
+
+
+{% endblock content %}
\ No newline at end of file