Compare commits

..

27 Commits

Author SHA1 Message Date
Jonas Tobias Hopusch c681d85479
feat(profiles): add signal 2024-03-21 17:07:01 +01:00
Jonas Tobias Hopusch 1942add0c4
No media upscaling 2024-02-26 16:12:01 +01:00
Jonas Tobias Hopusch d78211da9e
profiles/: link experimental self-hosted profile 2024-02-22 14:41:34 +01:00
Jonas Tobias Hopusch 50954a1ad1
matrix: add client connection information 2024-02-22 01:10:38 +01:00
Jonas Tobias Hopusch bb18189349
Change matrix server FQDN 2024-02-21 23:53:06 +01:00
Jonas Tobias Hopusch b5b1af6645
Add tchncs matrix profile to list 2024-02-20 14:24:51 +01:00
Jonas Tobias Hopusch 23720f3650
Add redirect link for FHSWF Virt CI/CD presentation 2024-01-14 22:41:00 +01:00
Jonas Tobias Hopusch e25df060ae
Overhaul CSS for details mechanism 2024-01-13 00:36:30 +01:00
Jonas Tobias Hopusch 722f5cb03a
Tweak article proportions CSS 2023-11-06 10:48:41 +01:00
Jonas Tobias Hopusch 9cdb751d85
Add webfinger mastodon support
continuous-integration/drone/push Build is passing Details
2023-06-13 17:04:51 +02:00
Jonas Tobias Hopusch e1ee8902f8
Remove decommissioned vaultwarden instance from server list
continuous-integration/drone/push Build was killed Details
2023-05-20 12:09:04 +02:00
Jonas Tobias Hopusch 93af6cf603
Invert QR code when in dark mode
continuous-integration/drone Build is passing Details
2023-03-26 22:04:41 +02:00
Jonas Tobias Hopusch c1d53ce188
Lazy loading Threema QR-Code 2023-03-26 12:36:24 +02:00
Jonas Tobias Hopusch d0d700f8f6
Replace threema QR code with SVG version 2023-03-26 12:17:57 +02:00
Jonas Tobias Hopusch 678d2773d3
correct last updated timestamp of profiles/ 2023-03-19 18:58:43 +01:00
Jonas Tobias Hopusch b248452599
Add Threema entry to profiles list incl QR-Code 2023-03-19 18:55:36 +01:00
Jonas Tobias Hopusch af44e3dac4
Change text alignment of articles 2023-03-16 00:17:58 +01:00
Jonas Tobias Hopusch ac428b0f6c
Only process dates with valid dateTime attributes 2023-03-11 16:02:59 +01:00
Jonas Tobias Hopusch 1647746a20
Change dark and light themes 2023-03-10 17:12:35 +01:00
Jonas Tobias Hopusch 07b85f19ec
Auto-adjust publish and update timestamps via JS 2023-03-10 16:24:44 +01:00
Jonas Tobias Hopusch 4bdbf2a598
Tweaks and formatting with prettier 2023-03-10 15:08:43 +01:00
Jonas Tobias Hopusch ef81b60aae
Update public list of hosted services 2023-03-02 16:57:54 +01:00
Jonas Tobias Hopusch b9ef05f53d
Merge branch 'about-page' into master 2023-03-02 02:54:24 +01:00
Jonas Tobias Hopusch 931ac00e22
Reworking some things and progress on the about me page 2023-03-02 02:53:19 +01:00
Jonas Tobias Hopusch 3da57e78e8
Update and OpenPGP-sign security.txt
continuous-integration/drone/push Build was killed Details
2022-09-17 15:49:32 +02:00
Jonas Tobias Hopusch f620e10470
Make OpenPGP download link on /profiles/ larger for SEO 2022-04-03 22:42:25 +02:00
Jonas Tobias Hopusch 8536ef00a4
Host license image with website instead of hotlinking and use svg instead of png
This fixes an issue where the CORS headers for the website would not allow the image to be loaded
from the Creative Commons servers.

The switch to svg also makes sure that the icon will always be perfectly rendered, regardless of
screen size or page zooming.
2022-04-02 16:26:30 +02:00
20 changed files with 9567 additions and 305 deletions

View File

@ -2,32 +2,32 @@ variables:
GIT_SUBMODULE_STRATEGY: recursive
pages:
image: archlinux:latest
interruptible: true
timeout: 5m
rules:
- if: '$CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH || $CI_COMMIT_REF_NAME == $CI_DEFAULT_BRANCH'
when: always
before_script:
- pacman --needed --noconfirm --sync --refresh --sysupgrade zola
script:
- zola --version
- zola build
artifacts:
paths:
- public
exclude:
- public/404.html
image: archlinux:latest
interruptible: true
timeout: 5m
rules:
- if: "$CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH || $CI_COMMIT_REF_NAME == $CI_DEFAULT_BRANCH"
when: always
before_script:
- pacman --needed --noconfirm --sync --refresh --sysupgrade zola
script:
- zola --version
- zola build
artifacts:
paths:
- public
exclude:
- public/404.html
merge-request-testing:
image: archlinux:latest
interruptible: true
timeout: 5m
rules:
- if: '$CI_PIPELINE_SOURCE == "merge_request_event"'
when: always
before_script:
- pacman --needed --noconfirm --sync --refresh --sysupgrade zola
script:
- zola --version
- zola build
image: archlinux:latest
interruptible: true
timeout: 5m
rules:
- if: '$CI_PIPELINE_SOURCE == "merge_request_event"'
when: always
before_script:
- pacman --needed --noconfirm --sync --refresh --sysupgrade zola
script:
- zola --version
- zola build

View File

@ -1,19 +1,44 @@
+++
title = "About me / Über mich"
description = "Here's where I introduce myself. Hier stelle ich mich selbst vor."
title = "About me"
description = "Here's where I introduce myself."
date = "2022-02-06 00:00:00+01:00"
updated = "2023-03-01T23:10:47+01:00"
draft = true
+++
### Über mich
Hello visitor,
Hallo,
I am Jonas (Tobias) Hopusch, usually known online as by my username "jotoho".
mein Name ist Jonas Hopusch, im Internet normalerweise bekannt als "jotoho".
Ich bin <span class="age-display">x</span> Jahre alt.
I am male, German, currently <span id="age-display">_javascript failed_</span> years old
and a student of computer science at the [South Westphalia University of Applied
Sciences](https://fh-swf.de) working towards earning a Bachelor degree.
-----
### Why I chose to work with computers
### About me
### My Hobbies
<script style="display: none;" src="/scripts/calcage.js" async></script>
In my free time I usually watch videos on the Internet,
read fiction stories online or on my eReader,
play some videogames or
learn about topics that interest me.
When I don't need my ears for something else, I usually
have music playing or listen to something else.
I like to listen to multiple kinds of music
that are very different to each other, so I have
trouble concretely defining the genres I listen to.
### My Desktop-PC
| PC Part | Installed Component |
| :------------ | :--------------------------------------------------------------------------------------------------------------------------------: |
| CPU | [AMD Ryzen 7 5800X (8 cores, 16 threads)](https://www.amd.com/en/products/cpu/amd-ryzen-7-5800x) |
| Motherboard | [ASRock X570M Pro4](https://www.asrock.com/MB/AMD/X570M%20Pro4/) |
| Graphics Card | [ASUS Dual Radeon RX 6750XT 12GB OC Edition](https://www.asus.com/motherboards-components/graphics-cards/dual/dual-rx6750xt-o12g/) |
| Memory | 20GiB (2\*8G+4G) DDR4 2133MHz |
| Monitors | 2 1920x1080 32" 60Hz screens |
| Storage | 1TB SATA-SSD + 1TB SATA-HDD |
<script style="display: none;" src="/scripts/calcage.js" defer></script>

View File

@ -2,7 +2,7 @@
title = "My online profiles and different communication channels"
description = "On this page I list a selection of different online accounts owned by me and communication services that can be used to talk with me."
date = "2021-08-17 10:21:34+02:00"
updated = "2021-11-02 19:00:03+01:00"
updated = "2024-02-20T14:24:15+01:00"
+++
I have recently heard of the practice of listing available communication channels and online profiles on the internet to
@ -12,9 +12,12 @@ but hopefully even a list with only the less sensitive profiles and contact info
The following list is probably not complete and will change over time.
| Service/Protocol | Hyperlink | Notes |
|-|-|-|
| E-Mail | [contact@jotoho.de](mailto:contact@jotoho.de) | OpenPGP keys [here](https://downloads.jotoho.de/openpgp/) and [via WKD](https://datatracker.ietf.org/doc/draft-koch-openpgp-webkey-service/) |
| Mastodon/Fediverse | [@jotoho@ruhr.social](https://ruhr.social/@jotoho) | |
| GitLab | [@jotoho](https://gitlab.com/jotoho) | Preferred Git hosting platform |
| GitHub | [@jotoho](https://github.com/jotoho) | |
| Service/Protocol | Hyperlink | Notes |
| ------------------ | ---------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| E-Mail | [contact@jotoho.de](mailto:contact@jotoho.de) | [OpenPGP keys here](https://downloads.jotoho.de/openpgp/) and [via WKD](https://datatracker.ietf.org/doc/draft-koch-openpgp-webkey-service/) |
| Mastodon/Fediverse | [@jotoho@ruhr.social](https://ruhr.social/@jotoho) | |
| GitLab | [@jotoho](https://gitlab.com/jotoho) | Preferred Git hosting platform |
| GitHub | [@jotoho](https://github.com/jotoho) | |
| Threema | [8WEESJ8K](https://threema.id/8WEESJ8K) | <details><summary>QR-Code containing Threema-ID</summary><img src="threema-scanid-8weesj8k.svg" alt="Scannable QR-Code" width="1000px" height="1000px" loading="lazy" class="black-white-svg" /></details> |
| Matrix | [@jotoho:tchncs.de](https://matrix.to/#/@jotoho:tchncs.de) <br/> [@jotoho:jotoho.de (experimental)](https://matrix.to/#/@jotoho:jotoho.de) | |
| Signal | [jotoho.68](https://signal.me/#eu/u_D8b5Ha39JGdbEJ5d4ULShg4VOx80uMc7q2-2ST0Pnx9UDsASZAqaJWL6DRFu59) | |

File diff suppressed because it is too large Load Diff

After

Width:  |  Height:  |  Size: 171 KiB

View File

@ -2,45 +2,44 @@
title = "Services hosted on jotoho.de"
description = "This page lists the various servers running under the jotoho.de domain name and by who and how they may be accessed."
date = "2021-06-29 22:14:11+02:00"
updated = "2022-01-06 21:52:00+01:00"
updated = "2023-03-02T16:57:24+01:00"
+++
Besides this website, my domain also has a number of other services/servers running that are set up for learning purposes or for personal use by myself, family and acquaintances. The list only contains services available from the public internet.
-----
---
### Publicly accessible services
* [**Personal Nextcloud**](https://nextcloud.jotoho.de): This Nextcloud instance is set up for use by myself and those I have invited to store, conveniently access and exchange files and other information.
* [**Gitea**](https://gitea.jotoho.de): I'm currently experimenting with the Git Server software Gitea as a lightweight alternative or addon to GitLab.
Account Registration is limited to whitelisted email domains and accounts need to manually be confirmed by me before becoming active.
* [**Vaultwarden**](https://bitwarden.jotoho.de): Bitwarden Fork for storing and synchronizing my access credentials and other secrets on my own infrastructure.
* [**Caddy Fileserver**](https://downloads.jotoho.de): For holding and serving public files directly without needing to go through Nextcloud.
Has increased compatibility for use-cases like embedding images or media on this website.
* [**This website**](https://www.jotoho.de): www.jotoho.de is currently being self-hosted using
[a customized Caddy docker image](https://gitea.jotoho.de/jotoho/site-deployer)
- [**This website**](https://www.jotoho.de): www.jotoho.de is currently being self-hosted using
[a customized Caddy docker image](https://gitea.jotoho.de/jotoho/site-deployer)
- [**Personal Nextcloud**](https://nextcloud.jotoho.de): This Nextcloud instance is set up for use by myself and those I have invited to store, conveniently access and exchange files and other information.
- [**Forgejo**](https://gitea.jotoho.de): This git server was migrated from Gitea to Forgejo on 2023-01-17 as an emergency measure due to the potentially hostile takeover
of the Gitea project.
Account Registration is limited to whitelisted email domains and accounts need to manually be confirmed by me before becoming active.
- [**Caddy public fileserver**](https://downloads.jotoho.de): For holding and serving public files directly via HTTPS without needing to go through Nextcloud.
Has increased compatibility for use-cases like embedding images or media on this website.
- [**Vikunja Task Management**](https://tasks.jotoho.de): Online To-Do list and Tasks management. Family and Friends can request accounts to be created for them
in order to be able to share to-do lists.
It supports CalDAV synchronization with client devices.
-----
### Restricted/Internal Services
---
These services/servers are only available from whilelisted IP addresses and are exclusively meant for use by myself or family.
* [Pi-Hole](https://pihole.jotoho.de) (including Webinterface)
* PHPMyAdmin
-----
### Special Purpose Subdomains
* **lab.jotoho.de**: Delegated to DigitalOcean Nameservers for quick configuration of droplets and other testing projects hosted there.
Do not expect anything hosted under this subdomain or one of it's subdomains to live for more than a few hours or days.
Security issues, Anomalies or detected abuse of this subdomain [should be immediately reported to me via email](mailto:security@jotoho.de), so I can investigate and implement corrective measures, if necessary.
- **lab.jotoho.de**: Delegated to DigitalOcean Nameservers for quick configuration of droplets and other testing projects hosted there.
Do not expect anything hosted under this subdomain or one of it's subdomains to live for more than a few hours or days.
Security issues, Anomalies or detected abuse of this subdomain [should be immediately reported to me via email](mailto:security@jotoho.de),
so I can investigate and implement corrective measures, if necessary.
---
-----
### Potential future additions or experiments
When I bought this domain, it became clear to me how very versatile and useful it can be to have a publicly listed internet namespace so I am always trying to find and learn new ways to put the domain to good use and try out new technologies & server-side software that I view as interesting or useful.
Things I may set up and play with in the future:
* personal mastodon or activitypub-compatible server
* outgoing SMTP server for service notifications
* Apache Guacamole for remote control of devices
- personal mastodon or activitypub-compatible server
- outgoing SMTP server for service notifications
- Apache Guacamole for remote control of devices

View File

@ -0,0 +1,5 @@
{
"m.homeserver": {
"base_url": "https://matrix.jotoho.de:8448"
}
}

View File

@ -1,3 +1,3 @@
{
"m.server": "dendrite2.jotoho.de:8448"
"m.server": "matrix.jotoho.de:8448"
}

View File

@ -1,5 +1,25 @@
-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA512
Contact: mailto:security@jotoho.de
Expires: Sat, 27 Jan 2024 00:00 +0100
Expires: 2025-09-17T00:00:00.000Z
Encryption: https://keys.openpgp.org/vks/v1/by-fingerprint/1F42EF02BE3E6FE8F624C8BC612F3350DB59D359
Encryption: https://downloads.jotoho.de/openpgp/1F42EF02BE3E6FE8F624C8BC612F3350DB59D359.asc
Preferred-Languages: de, en
Canonical: https://jotoho.de/.well-known/security.txt
Canonical: https://www.jotoho.de/.well-known/security.txt
-----BEGIN PGP SIGNATURE-----
iQI5BAEBCgAjFiEETvwvjG0vxDxbX2QpFQE63pZQIWQFAmMlz+YFgxLMAwAACgkQ
FQE63pZQIWTKxRAAvS2CLpKosuwzuklXI5/gjulSgqy4KMM3QX3lmgzogV6nK0L2
YpEvH4e89kldGyDjVKNHWBFRca3eI8OXNlWGTgX5BZ7t7tz7qFccxhsiZBpUiRq3
EVRJEwdLj2QLHqIAd8RIA/JGsb7AaEeoTcY/BNmTUWwOYZ6uYzq+XhHKnIOjrQDv
iWr+LYa+Pc/w8s5C6No1rmAEWOA1ZbTNduu6eZiwPjytjn/APs1/1WKn6Mee18oY
YHdOdfeSJSaIxvMzSCpdFvQdF0HWdJ5yCsE83Un8WA3yI3sRB+YMdVgFDXhEDQaD
F9b6VtaQzA805XpbwEaLYPBJjE7jVfKVPXokMMHF0+k9003T34aw9JTLw4YZztIH
JwMBUmOkfBiWCXC2cX1d00WMmJd8MVRwcU5SVh6ENjbAOxkpUitS+cFs67YkrtcX
AOGDYRnMIAVuV9/SmooJUd+lV/XPjztxmMS9yBmZffwO/DmOvkMEinjhrIV/0tNh
Wqjs6GSXbkDdQ33FInPr6bb1AXG2u8IJK8vwi4jTl/ojS8G6zAIoUzCqm1QuGbuA
+2YpmZdnHlMFsTUp4zfUDVuGzS6udqcFFsrUsSgit1XkTVjyq44CZbJVXJFp1+w6
QjbFVi7KCp89TU0dQ+n7QUZn3USeINGBB4yxglGwajZusxif6pIF5VRuB0g=
=lQ4n
-----END PGP SIGNATURE-----

View File

@ -0,0 +1 @@
{"subject":"acct:jotoho@ruhr.social","aliases":["https://ruhr.social/@jotoho","https://ruhr.social/users/jotoho"],"links":[{"rel":"http://webfinger.net/rel/profile-page","type":"text/html","href":"https://ruhr.social/@jotoho"},{"rel":"self","type":"application/activity+json","href":"https://ruhr.social/users/jotoho"},{"rel":"http://ostatus.org/schema/1.0/subscribe","template":"https://ruhr.social/authorize_interaction?uri={uri}"}]}

View File

@ -1,167 +1,284 @@
* {
padding: 0;
margin: 0;
border: none;
border-collapse: collapse;
box-sizing: border-box;
padding: 0;
margin: 0;
border: none;
border-collapse: collapse;
box-sizing: border-box !important;
overflow-wrap: anywhere;
object-fit: scale-down;
}
html,
body {
font-family: monospace;
max-width: 100vw;
max-width: 100%;
overflow-x: clip;
}
header, footer {
text-align: center;
#root {
font-family: monospace;
display: flex;
flex-direction: column;
flex-wrap: nowrap;
min-height: 100vh;
}
header {
padding-bottom: 1rem;
#root > * {
flex-grow: 0;
flex-shrink: 0;
}
header,
footer {
text-align: center;
}
#header-title {
display: block;
padding-top: 0.5rem;
padding-bottom: 0.5rem;
}
footer {
padding-top: 1rem;
padding-top: 0.5rem;
}
.globalnav{
display: flex;
flex-wrap: wrap;
flex-direction: row;
text-align: center;
gap: max(1px, 0.1rem);
#header-delimiter {
padding-top: 0;
margin-top: 0;
}
#footer-delimiter {
padding-bottom: 0;
margin-bottom: 0;
}
.globalnav {
display: flex;
flex-wrap: wrap;
flex-direction: row;
text-align: center;
gap: 2px;
height: max-content;
}
.globalnav-element {
display: block;
background-color: #ddd;
text-align: center;
flex-basis: 0;
flex-grow: 1;
min-width: fit-content;
min-height: fit-content;
padding: 0.5rem 0;
display: block;
background-color: rgb(90% 90% 90%);
text-align: center;
flex-basis: 0;
flex-grow: 1;
min-width: fit-content;
padding-top: 0.5rem;
padding-bottom: 0.5rem;
}
/* Code Blocks */
pre {
padding: 0.75rem;
margin-top: 1.5rem;
margin-bottom: 1.5rem;
margin-left: auto;
margin-right: auto;
width: 100%;
max-width: max-content;
overflow-y: auto;
line-break: strict;
display: block;
padding: 0.75rem;
margin-top: 1.5rem;
margin-bottom: 1.5rem;
margin-left: auto;
margin-right: auto;
width: fit-content;
max-width: 100%;
overflow-x: auto;
line-break: strict;
}
/* Inline keywords/code */
code {
display: inline-block;
color: green;
line-break: strict;
display: inline-block;
color: green;
line-break: strict;
}
p {
padding: 0.5rem;
}
article {
padding: 0.5rem;
margin-top: 0.5rem;
margin-bottom: 0.5rem;
}
h2 {
margin-bottom: 1rem;
text-align: center;
margin-bottom: 1rem;
text-align: center;
}
#mainarticle {
width: max-content;
max-width: min(80rem, 100%);
margin: 0 auto;
width: fit-content;
max-width: min(100%, 72rem);
margin-left: auto;
margin-right: auto;
flex-grow: 1;
text-align: justify;
}
li, ul, ol {
margin: 1rem;
#mainarticle h3 {
margin-top: 1rem;
margin-bottom: 1rem;
}
ul > li,
ol > li {
margin-top: 0.5rem;
margin-bottom: 0.5rem;
}
li::marker {
width: 1rem;
max-width: 100%;
padding: 0;
margin: 0;
border: none;
}
li {
margin-inline-start: 1rem;
}
hr {
border-style: inset;
border-width: 1px;
margin: 0.5rem 0;
border-style: inset;
border-width: 1px;
margin-top: 0.5rem;
margin-bottom: 0.5rem;
}
table {
display: block;
border-collapse: collapse;
margin: 1rem auto;
width: max-content;
max-width: 100%;
overflow-y: auto;
display: block;
border-collapse: collapse;
margin: 1rem auto;
width: fit-content;
max-width: 100%;
overflow-x: auto;
}
td, th {
border-style: solid;
border-color: black;
border-collapse: collapse;
padding: 0.5rem;
tr {
width: fit-content;
}
td,
th {
border-style: solid;
border-color: black;
border-collapse: collapse;
padding: 0.5rem;
}
img {
display: block;
min-height: unset;
min-width: unset;
height: auto;
width: auto;
max-width: 100%;
max-height: unset;
margin-left: auto;
margin-right: auto;
object-fit: scale-down;
object-position: center;
}
details {
backdrop-filter: invert(100%);
padding: max(1mm, 1px);
width: min-content;
max-width: fit-content;
min-width: unset;
display: block;
color: black;
}
details > summary {
max-width: fit-content;
width: max-content;
display: block;
}
details:not([open]) > summary::after {
content: "Click to expand";
display: block;
max-width: fit-content;
font-weight: bold;
}
details[open] > summary {
margin-bottom: max(1mm, 1px);
}
#licenseimg {
vertical-align: middle;
height: inherit;
width: auto;
display: inline;
vertical-align: middle;
height: inherit;
width: auto;
display: inline;
}
#last-article-metadata {
margin-bottom: 1rem;
margin-bottom: 1rem;
}
@media (max-width: 20rem), (max-width: 300px) {
* {
word-wrap: break-word;
}
.visible-article-metadata {
display: contents;
font-size: small;
font-style: italic;
}
.article-metadata-label {
font-weight: bold;
}
.article-missinglicense {
font-size: xx-small;
}
@media (prefers-color-scheme: dark) {
html {
background-color: #111;
color: white;
}
html {
background-color: black;
color: white;
}
.globalnav-element {
background-color: #222;
}
.globalnav-element {
background-color: rgb(10% 10% 10%);
}
code {
color: lawngreen;
}
code {
color: lawngreen;
}
a {
color: lightskyblue;
}
a {
color: lightskyblue;
}
table, td, th {
border-color: white;
}
table,
td,
th {
border-color: white;
}
details {
color: black;
}
}
@media (prefers-color-scheme: light) {
html {
background-color: white;
color: black;
}
html {
background-color: white;
color: black;
}
.globalnav-element {
background-color: #ddd;
}
.globalnav-element {
background-color: rgb(90% 90% 90%);
}
code {
color: green;
}
code {
color: green;
}
table, td, th {
border-color: black;
}
table,
td,
th {
border-color: black;
}
details {
color: white;
}
}

View File

@ -0,0 +1,121 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://web.resource.org/cc/"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
width="80"
height="15"
id="svg2279"
sodipodi:version="0.32"
inkscape:version="0.45+devel"
version="1.0"
sodipodi:docname="by-nc-nd.svg"
inkscape:output_extension="org.inkscape.output.svg.inkscape">
<defs
id="defs2281">
<clipPath
clipPathUnits="userSpaceOnUse"
id="clipPath3442">
<rect
style="fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.92243534;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
id="rect3444"
width="20.614058"
height="12.483703"
x="171.99832"
y="239.1203" />
</clipPath>
</defs>
<sodipodi:namedview
id="base"
pagecolor="#ffffff"
bordercolor="#999999"
borderopacity="1"
gridtolerance="10000"
guidetolerance="10"
objecttolerance="10"
inkscape:pageopacity="0.0"
inkscape:pageshadow="2"
inkscape:zoom="10.5125"
inkscape:cx="40"
inkscape:cy="7.5"
inkscape:document-units="px"
inkscape:current-layer="layer1"
width="80px"
height="15px"
showborder="true"
inkscape:showpageshadow="false"
inkscape:window-width="935"
inkscape:window-height="624"
inkscape:window-x="50"
inkscape:window-y="160" />
<metadata
id="metadata2284">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
</cc:Work>
</rdf:RDF>
</metadata>
<g
inkscape:label="Layer 1"
inkscape:groupmode="layer"
id="layer1">
<g
id="BY-NC-ND"
transform="matrix(0.9875019,0,0,0.9333518,-323.90064,-411.87964)">
<g
id="g3783"
transform="translate(158,204)">
<rect
style="fill:#ffffff;fill-opacity:1;stroke:#000000;stroke-width:1.04161763;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
id="rect3785"
width="80"
height="15"
x="170.5"
y="237.86218" />
<rect
y="239.36218"
x="172"
height="12"
width="77"
id="rect3787"
style="fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.92243534;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
<path
style="fill:#abb1aa;fill-opacity:1;stroke:none;stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:0.46913578"
d="M 171.99996,239.37505 L 171.99996,251.37505 L 192.33474,251.37505 C 193.64339,249.62474 194.52652,247.59057 194.52652,245.37505 C 194.52652,243.17431 193.65859,241.1179 192.36599,239.37505 L 171.99996,239.37505 z"
id="path3789"
sodipodi:nodetypes="cccscc" />
<g
id="g3791"
transform="matrix(0.9612533,0,0,0.9612533,6.8341566,9.5069994)"
clip-path="url(#clipPath3442)">
<path
id="path3793"
cx="296.35416"
ry="22.939548"
cy="264.3577"
type="arc"
rx="22.939548"
d="M 190.06417,245.36206 C 190.06667,249.25405 186.91326,252.41072 183.02153,252.41323 C 179.12979,252.41572 175.97262,249.26256 175.97036,245.3706 C 175.97036,245.36783 175.97036,245.36507 175.97036,245.36206 C 175.9681,241.47007 179.12126,238.3134 183.013,238.31113 C 186.90524,238.30864 190.06191,241.46181 190.06417,245.3538 C 190.06417,245.35628 190.06417,245.35929 190.06417,245.36206 z"
style="opacity:1;fill:#ffffff" />
<path
d="M 188.74576,239.62226 C 190.30843,241.18492 191.08988,243.09869 191.08988,245.36206 C 191.08988,247.62592 190.32197,249.51913 188.78615,251.04165 C 187.15627,252.64521 185.22995,253.44672 183.00722,253.44672 C 180.81132,253.44672 178.91837,252.65172 177.32887,251.06174 C 175.73912,249.47198 174.94436,247.57226 174.94436,245.36206 C 174.94436,243.15235 175.73912,241.23908 177.32887,239.62226 C 178.87799,238.0591 180.77094,237.27764 183.00722,237.27764 C 185.2706,237.27764 187.18312,238.05909 188.74576,239.62226 z M 178.38093,240.67355 C 177.05978,242.008 176.39945,243.57116 176.39945,245.36429 C 176.39945,247.15694 177.05326,248.70682 178.36062,250.01393 C 179.66822,251.32153 181.22487,251.97509 183.03105,251.97509 C 184.83724,251.97509 186.40716,251.31502 187.74161,249.99412 C 189.0086,248.76725 189.64234,247.22467 189.64234,245.36429 C 189.64234,243.51799 188.99831,241.95084 187.71101,240.66354 C 186.42396,239.37649 184.86406,238.7327 183.03105,238.7327 C 181.19804,238.73271 179.64767,239.37975 178.38093,240.67355 z M 181.85761,244.57559 C 181.65573,244.13545 181.35354,243.91525 180.95051,243.91525 C 180.23802,243.91525 179.8819,244.39501 179.8819,245.35404 C 179.8819,246.31328 180.23802,246.79255 180.95051,246.79255 C 181.421,246.79255 181.75705,246.55908 181.95869,246.09111 L 182.94629,246.61701 C 182.47555,247.45339 181.76934,247.87168 180.82763,247.87168 C 180.10136,247.87168 179.51953,247.64899 179.08265,247.20409 C 178.64502,246.7587 178.42684,246.14477 178.42684,245.36206 C 178.42684,244.59313 178.65204,243.98271 179.10271,243.53056 C 179.55338,243.07838 180.11463,242.8524 180.7875,242.8524 C 181.78288,242.8524 182.49561,243.24465 182.92647,244.02835 L 181.85761,244.57559 z M 186.50398,244.57559 C 186.30184,244.13545 186.00567,243.91525 185.61517,243.91525 C 184.88839,243.91525 184.52474,244.39501 184.52474,245.35404 C 184.52474,246.31328 184.88839,246.79255 185.61517,246.79255 C 186.08642,246.79255 186.41644,246.55908 186.6048,246.09111 L 187.61447,246.61701 C 187.14448,247.45339 186.43926,247.87168 185.49931,247.87168 C 184.77403,247.87168 184.19346,247.64899 183.75683,247.20409 C 183.32096,246.7587 183.10254,246.14477 183.10254,245.36206 C 183.10254,244.59313 183.32422,243.98271 183.76737,243.53056 C 184.21026,243.07838 184.77404,242.8524 185.4592,242.8524 C 186.45282,242.8524 187.16455,243.24465 187.5939,244.02835 L 186.50398,244.57559 z"
id="path3795"
style="opacity:1" />
</g>
</g>
<path
id="text3797"
d="M 357.4197,448.68503 C 357.66518,448.68504 357.85131,448.63146 357.9781,448.52428 C 358.10488,448.41712 358.16827,448.25905 358.16828,448.05008 C 358.16827,447.84378 358.10488,447.68705 357.9781,447.57988 C 357.85131,447.47004 357.66518,447.41512 357.4197,447.41511 L 356.55784,447.41511 L 356.55784,448.68503 L 357.4197,448.68503 M 357.4723,451.30929 C 357.78522,451.30929 358.0199,451.24364 358.17637,451.11236 C 358.33552,450.98109 358.4151,450.78283 358.4151,450.51759 C 358.4151,450.25771 358.33686,450.06347 358.18041,449.93488 C 358.02396,449.80359 357.78792,449.73796 357.4723,449.73795 L 356.55784,449.73795 L 356.55784,451.30929 L 357.4723,451.30929 M 358.92089,449.15122 C 359.25538,449.24767 359.51434,449.42583 359.69779,449.68571 C 359.88121,449.94559 359.97293,450.26441 359.97294,450.64217 C 359.97293,451.22087 359.776,451.65222 359.38217,451.93621 C 358.98833,452.2202 358.38947,452.36219 357.5856,452.36219 L 355.00001,452.36219 L 355.00001,446.3622 L 357.33878,446.3622 C 358.17771,446.36221 358.78466,446.48813 359.15962,446.73996 C 359.53727,446.99181 359.7261,447.39502 359.7261,447.9496 C 359.7261,448.24164 359.65732,448.4908 359.51975,448.69709 C 359.38217,448.90072 359.18255,449.05209 358.92089,449.15122 M 359.83746,446.3622 L 361.54096,446.3622 L 362.91671,448.50018 L 364.29245,446.3622 L 366,446.3622 L 363.69764,449.8344 L 363.69764,452.36219 L 362.13982,452.36219 L 362.13982,449.8344 L 359.83746,446.3622 M 365.15837,449.40842 L 367.69946,449.40842 L 367.69946,450.57787 L 365.15837,450.57787 L 365.15837,449.40842 M 368.9174,446.3622 L 370.65732,446.3622 L 372.85447,450.47741 L 372.85447,446.3622 L 374.33138,446.3622 L 374.33138,452.36219 L 372.59146,452.36219 L 370.3943,448.24699 L 370.3943,452.36219 L 368.9174,452.36219 L 368.9174,446.3622 M 380.65173,452.03266 C 380.36579,452.18002 380.0677,452.2912 379.75749,452.36622 C 379.44727,452.44123 379.12357,452.47875 378.78638,452.47875 C 377.78019,452.47875 376.98307,452.20011 376.395,451.64284 C 375.80693,451.08289 375.5129,450.32469 375.5129,449.36823 C 375.5129,448.40909 375.80693,447.65089 376.395,447.09361 C 376.98307,446.53367 377.78019,446.2537 378.78638,446.25369 C 379.12357,446.2537 379.44727,446.29121 379.75749,446.36621 C 380.0677,446.44124 380.36579,446.55243 380.65173,446.69977 L 380.65173,447.94157 C 380.36309,447.746 380.0785,447.60266 379.79796,447.51156 C 379.5174,447.42047 379.22203,447.37493 378.91181,447.37493 C 378.35611,447.37493 377.91911,447.55175 377.6008,447.9054 C 377.28249,448.25905 377.12333,448.74666 377.12333,449.36823 C 377.12333,449.98712 377.28249,450.47339 377.6008,450.82703 C 377.91911,451.18069 378.35611,451.35751 378.91181,451.35751 C 379.22203,451.35751 379.5174,451.31197 379.79796,451.22087 C 380.0785,451.12978 380.36309,450.98644 380.65173,450.79086 L 380.65173,452.03266 M 381.82921,449.40842 L 384.3703,449.40842 L 384.3703,450.57787 L 381.82921,450.57787 L 381.82921,449.40842 M 385.58824,446.3622 L 387.32815,446.3622 L 389.52531,450.47741 L 389.52531,446.3622 L 391.00222,446.3622 L 391.00222,452.36219 L 389.26229,452.36219 L 387.06515,448.24699 L 387.06515,452.36219 L 385.58824,452.36219 L 385.58824,446.3622 M 394.08956,447.53165 L 394.08956,451.19274 L 394.64795,451.19274 C 395.28456,451.19274 395.77013,451.03602 396.10462,450.72255 C 396.44181,450.40909 396.61041,449.95363 396.61042,449.35617 C 396.61041,448.7614 396.44317,448.30862 396.10867,447.99783 C 395.77417,447.68705 395.28726,447.53166 394.64795,447.53165 L 394.08956,447.53165 M 392.53172,446.3622 L 394.17453,446.3622 C 395.09169,446.36221 395.77417,446.42784 396.22197,446.55912 C 396.67245,446.68772 397.0582,446.90742 397.37922,447.2182 C 397.66246,447.48879 397.87286,447.80092 398.01044,448.15456 C 398.14801,448.50822 398.2168,448.90875 398.21681,449.35617 C 398.2168,449.80896 398.14801,450.21351 398.01044,450.56983 C 397.87286,450.92349 397.66246,451.23561 397.37922,451.50621 C 397.05551,451.81699 396.66706,452.03802 396.21387,452.1693 C 395.76069,452.29789 395.0809,452.36219 394.17453,452.36219 L 392.53172,452.36219 L 392.53172,446.3622"
style="font-size:8.25858784px;font-style:normal;font-weight:bold;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:'Bitstream Vera Sans'" />
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 11 KiB

View File

@ -0,0 +1,11 @@
<!doctype html>
<html>
<head>
<title>CI/CD Presentation redirect</title>
<meta name="robots" content="noindex, nofollow" />
<meta http-equiv="Refresh" content="0; url='https://docs.google.com/presentation/d/1NwD6r3W2T0cprsixUUWzM7nKkDZX1GuGmrlK32QpOmo/edit?usp=sharing'" />
</head>
<body>
<p>You should be automatically redirected now...</p>
</body>
</html>

View File

@ -1,9 +1,9 @@
{
"homepage": "https://gitlab.com/jotoho/mc-testingmod",
"1.16.5": {
"prealpha": "This 'version' has no changelog"
},
"promos": {
"1.16.5-latest": "prealpha"
}
"homepage": "https://gitlab.com/jotoho/mc-testingmod",
"1.16.5": {
"prealpha": "This 'version' has no changelog"
},
"promos": {
"1.16.5-latest": "prealpha"
}
}

View File

@ -1,9 +1,19 @@
(() => {
"use strict";
let ageElements = document.getElementsByClassName("age-display")
for (let i = 0; i < ageElements.length; i++) {
ageElements[i].innerText = (Math.floor(((new Date()).getTime() - (new Date(2001, 3, 29)).getTime())
/ 1000 / 60 / 60 / 24 / 365))
.toString()
}
})()
"use strict";
{
// Month index must be two because counting begins at 0 (for January)
const myBirthDate = new Date(2001, 2, 29);
const today = new Date();
let yearsSinceBirth = today.getFullYear() - myBirthDate.getFullYear();
// Correct yearsSinceBirth if between New Year and my birthday
if (today.getMonth() < myBirthDate.getMonth()) yearsSinceBirth--;
else if (
today.getMonth() == myBirthDate.getMonth() &&
today.getDate() < myBirthDate.getDate()
)
yearsSinceBirth--;
document.getElementById("age-display").innerText = yearsSinceBirth.toString();
}

View File

@ -0,0 +1,12 @@
"use strict";
Array.from(document.getElementsByClassName("relative-timestamp")).forEach(
function (timestamp) {
if (timestamp?.dateTime) {
timestamp.innerText = new Intl.DateTimeFormat(undefined, {
dateStyle: "long",
timeStyle: "short",
}).format(new Date(timestamp.dateTime));
}
}
);

View File

@ -0,0 +1,15 @@
"use strict";
{
const copyrightYearElement = document.getElementById("footer-copyrightyear");
if (copyrightYearElement) {
const currentYearAsStr = new Date().getFullYear().toString();
copyrightYearElement.innerText = currentYearAsStr;
copyrightYearElement.dateTime = currentYearAsStr;
} else
console.error(
"Could not find the footer entry for the year of the copyright notice."
);
}

View File

@ -1,68 +1,66 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1" />
<link
type="text/css"
rel="stylesheet"
href="{{ get_url(path='css/general.css') }}"
/>
<meta name="color-scheme" content="dark light" />
<meta name="author" content="Jonas Tobias Hopusch" />
<meta name="referrer" content="no-referrer" />
<meta name="robots" content="all, index, follow" />
<link rel="canonical" href="{{ current_url }}" />
<link
rel="alternate"
type="application/atom+xml"
href="{{ get_url(path='atom.xml') }}"
/>
<!--Mastodon account ownership verification-->
<link rel="me" href="https://ruhr.social/@jotoho" />
<title>jotoho.de - A personal website</title>
{% block metadata %} {% endblock %}
</head>
<body>
<header>
<div>
<a href="{{ config.base_url }}"
><h1>jotoho.de - My personal website</h1></a
>
</div>
</header>
<nav class="globalnav">
<!--<a class="globalnav-element" href="{{ get_url(path='@/blog/_index.md') }}"> Blog </a>-->
<a
class="globalnav-element"
href="{{ get_url(path='@/servers/index.md') }}"
>
Servers
</a>
<a
class="globalnav-element"
href="{{ get_url(path='@/profiles/index.md') }}"
>
Profiles
</a>
</nav>
<hr />
<head>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1" />
<link
type="text/css"
rel="stylesheet"
href="{{ get_url(path='css/general.css') }}"
/>
<meta name="color-scheme" content="dark light" />
<meta name="author" content="Jonas Tobias Hopusch" />
<meta name="referrer" content="no-referrer" />
<meta name="robots" content="all, index, follow" />
<link rel="canonical" href="{{ current_url }}" />
<link
rel="alternate"
type="application/atom+xml"
href="{{ get_url(path='atom.xml') }}"
/>
<!--Mastodon account ownership verification-->
<link rel="me" href="https://ruhr.social/@jotoho" />
<script defer src="/scripts/updatecopyrightyear.js"></script>
<title>jotoho.de - A personal website</title>
{% block metadata %} {% endblock %}
</head>
<body id="root">
<header>
<a id="header-title" href="{{ config.base_url }}">
<h1>jotoho.de - My personal website</h1>
</a>
<nav class="globalnav">
<!--<a class="globalnav-element" href="{{ get_url(path='@/blog/_index.md') }}"> Blog </a>-->
<a
class="globalnav-element"
href="{{ get_url(path='@/servers/index.md') }}"
>
Servers
</a>
<a
class="globalnav-element"
href="{{ get_url(path='@/profiles/index.md') }}"
>
Profiles
</a>
</nav>
</header>
<hr id="header-delimiter" />
<article id="mainarticle">{% block content %} {% endblock %}</article>
<article id="mainarticle">{% block content %} {% endblock %}</article>
<hr />
<footer>
<p>
<!--{% set current_year = now() | date(format="%Y",
<hr id="footer-delimiter" />
<footer>
<p>
<!--{% set current_year = now() | date(format="%Y",
timezone="Europe/Berlin") %} -->
Copyright
<time datetime="{{ current_year }}">{{ current_year }}</time>
Jonas Tobias Hopusch (<a
rel="noreferer"
href="https://gitlab.com/jotoho"
>@jotoho</a
>)
Copyright
<time id="footer-copyrightyear" datetime="{{ current_year }}">
{{ current_year }}
</time>
Jonas Tobias Hopusch (@jotoho)
<!--
<br />
Licensed under
<a href="https://creativecommons.org/licenses/by-nc-nd/4.0/"
@ -70,28 +68,28 @@
id="licenseimg"
alt="CC BY-NC-ND 4.0"
title="CC BY-NC-ND 4.0"
src="https://licensebuttons.net/l/by-nc-nd/4.0/80x15.png"
src="/images/copyright/cc-by-nc-nd-4.0-small.svg"
/></a>
(unless otherwise specified)
</p>
<p>
<a href="https://gitea.jotoho.de/jotoho/my-website"
>This page</a
>
is being served using
<a rel="noreferer" href="https://caddyserver.com/">Caddy</a>
and was generated using
<a rel="noreferer" href="https://www.getzola.org/">Zola</a>. You
may contact me via
<a href="mailto:webmaster@jotoho.de">email</a>
regarding any issues with this website.
</p>
<p>
You can
<a href="https://downloads.jotoho.de/openpgp/"
>download my OpenPGP public keys here</a
>.
</p>
</footer>
</body>
-->
</p>
<p>
<a href="https://gitea.jotoho.de/jotoho/my-website">This page</a>
is being served using
<a rel="noreferer" href="https://caddyserver.com/">Caddy</a>
and was generated using
<a rel="noreferer" href="https://www.getzola.org/">Zola</a>.
<br />
You may contact me via
<a href="mailto:webmaster@jotoho.de">email</a>
regarding any issues with this website.
</p>
<p>
You can
<a href="https://downloads.jotoho.de/openpgp/"
>download my OpenPGP public keys here</a
>.
</p>
</footer>
</body>
</html>

View File

@ -1,11 +1,8 @@
{% extends "base.html" %}
{% block metadata %}
<meta name="description" content="This is the personal website of Jonas Tobias Hopusch (@jotoho)" />
{% endblock metadata %}
{% block content %}
<p>
This is some placeholder text because I don't know what to put here, yet.
</p>
{% extends "base.html" %} {% block metadata %}
<meta
name="description"
content="This is the personal website of Jonas Tobias Hopusch (@jotoho)"
/>
{% endblock metadata %} {% block content %}
<p>This is some placeholder text because I don't know what to put here, yet.</p>
{% endblock content %}

View File

@ -1,30 +1,47 @@
{% extends "base.html" %} {% block metadata %}
<meta name="description" content="{{ page.description }}" />
<script defer src="/scripts/relativetime.js"></script>
{% endblock %} {% block content %}
<h2>{{ page.title }}</h2>
{% if page.date and page.date is defined %}
<p>
<em
><strong>Published on</strong>:
<time datetime="{{page.date}}"
>{{ page.date | date(format="%A, %e %B %Y %R %Z",
timezone="Europe/Berlin") }}</time
></em
<div class="visible-article-metadata">
{% if page.date and page.date is defined %}
<p>
<span class="article-metadata-label">First published</span>:
<time class="relative-timestamp" datetime="{{page.date}}"
>{{ page.date | date(format="%F %R (%Z)", timezone="Europe/Berlin")
}}</time
>
</p>
{% endif %} {% if page.updated and page.updated != page.date %}
<p>
<em
><strong>Last updated on</strong>:
<time datetime="{{page.updated}}"
>{{ page.updated | date(format="%A, %e %B %Y %R %Z",
timezone="Europe/Berlin") }}</time
></em
</p>
{% endif %} {% if page.updated and page.updated != page.date %}
<p>
<span class="article-metadata-label">Last updated on</span>:
<time class="relative-timestamp" datetime="{{page.updated}}"
>{{ page.updated | date(format="%F %R (%Z)", timezone="Europe/Berlin")
}}</time
>
</p>
{% endif %}
</p>
{% endif %} {% if page.extra.author and page.extra.author != "" %}
<p>
<span class="article-metadata-label">Author(s)</span>: {{page.extra.author}}
</p>
{% else %}
<p>
<span class="article-metadata-label">Author</span>: Jonas Tobias Hopusch
</p>
{% endif %} {% if page.extra.license and page.extra.license != "" %}
<p id="article-license">
<span class="article-metadata-label"
>Article is provided under the following license</span
>: {{page.extra.license}}
</p>
{% else %}
<p class="article-missinglicense">
No license is granted for this article. All rights reserved.
</p>
{% endif %}
</div>
<hr id="last-article-metadata" />
<div>{{ page.content | safe }}</div>
{% endblock content %}

View File

@ -1,11 +1,9 @@
{% extends "base.html" %} {% block content %}
<h2>{{ section.title }}</h2>
<ul>
{% for page in section.pages %}
<li><a href="{{ page.permalink | safe }}">{{ page.title }}</a></li>
{% endfor %}
{% for page in section.pages %}
<li><a href="{{ page.permalink | safe }}">{{ page.title }}</a></li>
{% endfor %}
</ul>
<div>
{{ section.content | safe }}
</div>
<div>{{ section.content | safe }}</div>
{% endblock content %}