Compare commits

..

1 commit

Author SHA1 Message Date
Vinzenz Schroeter
d400466ad6 wip own theme 2025-06-01 13:44:31 +02:00
47 changed files with 257 additions and 360 deletions

2
.gitignore vendored
View file

@ -6,4 +6,4 @@
_gen
# downloaded by nix
themes
themes/poison

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.5 MiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 691 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 831 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 899 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 977 KiB

View file

@ -1,154 +0,0 @@
+++
date = '2025-08-07T18:00:00+02:00'
draft = false
title = 'WHY 2025 - Day 0'
tags = ['travel', 'WHY 2025']
+++
I am trying to write more, so I am experimenting with a series of travel-log style post.
The resulting text is boring to read, the contained conclusions are obvious for anyone with two or more brain cells and you will just waste your time reading it.
This is the second part, covering everything happening on day 0 after arriving on the site.
I may update previous days, so you may want to wait until after the event is over to read a more polished version.
This post contains some photos, so I should probably tell you about the photo policy of events like this.
People are allowed to take pictures, but only after asking every single person in the photo individually.
In practice this means you cannot really take good pictures to capture the vibe of the place -
you are either photographing an object or a mostly empty space.
### Entrance
![Map of the area](map.png)
The shuttle dropped us off on a parking lot next to the event area.
To my surprise, there was also a team you could pass your luggage to that were driving everything to the info tent.
I wondered what would happen if there were issues with your ticket in that case.
Also, I did not want to have to search where I could get my tent back in case time mattered to get a good spot,
and I wanted my tent near the border between the cyan and red fields, which meant I did not have to walk _as_ far.
The ticket checking was very fast without any queue.
This year's ribbon is dark blue with star patterns on it - pretty!
I also liked the fact you only had to show your ID in case you wanted an additional "18+" ribbon to be able to buy alcohol and so on (and you did not need an ID later to get drinks).
I felt kind of flattered by the fact I had to show mine, as I started getting self conscious about my age when someone guessed 10y too high a year ago.
![Entrance and 18+ ribbons](ribbons.jpg)
People were handed a paper goodie bag which were supposed to also include stickers, but ended up mostly containing ads for the sponsors of the event.
I usually _really_ dislike ads, but in this case I liked the organisations beaing advertised for (e.g. NIST and Support for Ukraine), so I did not mind.
It also contained _one_ sticket and a paper map as well as guidance for muggles that did not read the wiki.
### Tent
I found a good spot exactly where I wanted one. It ended up right next to a power station, which meant my short extension/splitter was enough to reach it. Being able to charge laptop and phone overnight in your tent is a _must_ on a hacker camp.
![White power distrubution box next to tent](power-station.jpg)
At CCCamp, I did bring a router and long ethernet cable, but did not end up using it much because there was great WiFi coverage.
This time I did not, and because life is hard and unfair, neither my laptop nor phone were able to keep a connection while in the tent.
That meant I sadly did not use a _Datenklo_ (data toilet).
![Datenklo in it's natural environment](datenklo.jpg)
While I got my home base ready, the sound check on the stages started, as stated on signs at the entrance earlier. The next half hour was filled with an instrumental version of "Never gonna give you up" with different equalizer settings and volumes.
### Buildup
With events like this, the days are literally numbered, with day one being the day of the opening.
A big team consisting of mostly unpaid volunteers had already spent a week on site building up the infrastructure.
As with the German camp, the existing fixed infrastructure is not enough for the thousands of people going to the toilet, expecting cooled mate, playing on [arcade machines](https://wiki.why2025.org/Project:Arcade) or running [pop-up data centers](https://wiki.why2025.org/Village:Yolocation). On Day 0 (also sometimes called Day -0), heavy machinery was still driving around when I started exploring.
![real unicorns](unicorns.jpg)
### 😱🍾💸
Being near the food court had the advantage that the first thing I found was a bar, so I wanted to get a mate.
I was shocked (_shocked!_) twice.
The first thing was the mate itself.
I was used to choosing between brands, Flora Power being my favorite, but here it was all the different flavors of Club-Mate.
// FIXME: ask at the bar to take a photo of the fridge and put it here
The other thing was that they did not acccept any cash.
The German hacker events I went to were very proud about _not_ accepting digital payments (_Jede Kartenzahlung wird überwacht_), and here it was the other way around!
There was a way to pay pseudonymously though, and that was to charge an event payment card with cash at the info desk.
According to the sticker on the card, you can reprogram them to do something else afterwards, which is nice.
![Payment card](payment-card.jpg)
What this prepaid card did not solve though was that you cannot pay if power is down.
Later in the evening one of the bars had to close early due to exactly this issue.
Whenever power was cut, the switch that provided PoE and internet to the payment terminals had to reboot, which took a while.
Because they were frequent enough, that process repeated mutliple times without them being able to sell anything.
![The problematic switch](switch.jpg)
As with the mate, I think there would be a good middle ground somewhere in between.
Maybe there could have been one cash register per bar at WHY and one accepting cards at C3.
But I am not an organizer of things like this, so what do I know.
I continued exploring properly caffeinated.
### Light and sound installation
// FIXME: ask V what it is called
Near the entrance of the event, there was a hill with a huge sign on it.
A colorful contruction caught my eye, so I wanted to take a closer look.
![isopod](isopod.jpg)
I got to know the artist, let's call them V here, who was still setting it up.
They built a tent out of foamy, semi-translucent packing material, with RDB light strips adding movement.
It looked like a giant isopod crawling up the hill.
The installation noticed when someone was outside and made an old rotary dial phone inside ring, which prompted the visitor to go inside and listen to the voice on the other end.
![inside the isopod](future.jpg)
### Angel badge
As I was already exhausted, I did not feel like volunteering that day, but I still got my angel status set to arrived and got the very pretty badge:
![angel badge](angel-badge.jpg)
### Milliways
I also checked Milliways, the restaurant at the end of the universe.
They have a village or assembly at many hacker events and seem to have grown a lot over the years.
Hacking area, bar, kitchen and midnight snacks all in one.
As usual, they brought their geodesic dome, this time decorated to feel jungle-like inside.
The dome was one of the places playing techno most day and night.
![Looking up in the dome](dome.jpg)
What I did not know was that they usually get [challenge coins](https://wiki.milliways.info/index.php?title=Challenge_coins) made to finance the material costs.
They were very pretty, but only payable in cash.
As I hoped to not have to go to the next ATM in Alkmaar because of the cashless bars and food court, so I made a mental note to come back at the end of the event.
### Need a pillow?
I found V at one of the other bars and we talked for a while.
As this was their first hacker event, it was a great opportunity to share some great experiences I had at other events while drinking our first [Tschunk](https://entropia.de/Tschunk).
When I told him that when someone needs anything, it can usually be found, they asked for advice regarding camping gear.
V did not know this was a camp before coming here, which was also why the installation was tent-shaped.
I told them to ask at the info desk, which apparently worked great as they just got handed a blanket and pillow there for free.
I was yearning for exploration, so we went our separate ways.
Even though the opening was still more than half a day in the future, the camp was already glowing in all colors of the rainbow.
Parties and hackers everywhere, I had a great time finding orientation in the big area.
My phone said I walked around 13,5k steps before 12 am.
### Going to sleep
The sanitary conditions were _great_ for a festival, and would still have been okay for a conference.
After such a long day, I was not going to sleep without a proper shower.
Without control over the temperature, I did not expect it to be super comfortable, but I really struggled cleaning myself because the water was _freezing_.
Maybe it was my tiredness at 3:30 am after being awake for 21h, but I did not take a shower as cold in a decade.
The next day the water was heated and maybe even too warm, so I do not know what happened there.
UPDATE: As it turned out, the gas for the water heater was just empty.
They later put up a sign.
![Laminated sign stating that the gas may have run out if the water is cold, with a QR code to get in touch with people able to fix it.](cold-shower.jpg)

Binary file not shown.

Before

Width:  |  Height:  |  Size: 950 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 935 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.2 MiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1 MiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 443 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 607 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.1 MiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 875 KiB

View file

@ -1,99 +0,0 @@
+++
date = '2025-08-08T12:00:00+02:00'
title = 'WHY 2025 - Day 1'
tags = ['travel', 'WHY 2025']
+++
Please note the disclaimer from [Day 0](../day0/) still applies.
At day 1 I woke up in a warm tent to ABBAs "Gimme Gimme", making further sleep impossible.
The weather service now predicted hotter weather than originally planned for, so I had to ration my cooler clothing for the hottest days, which had yet to come.
I got a pancake in the food court and continued writing.
After saturation settled in, the next level in the pyramid of needs was social connections, so I walked around a bit.
### Angry Nerds
After a while I came across a village by the "Angry Nerds" podcast, which is sadly in Dutch so I was not familiar with it.
One of the creators of it was there and we talked for a while about differences between the German and Dutch hacker events.
WHY20205 feels less political than the events by CCC.
This may seem weird given that there is a big support for Ukraine tent, but at Congress there is a bunch of talks and assemblies about civil rights and climate action, by e.g. Netzpolitik.org or Bits&Bäume.
He also pointed out the preparations of the firewall (marked by big flames on the map) and showed me a sneak peek.
Without being told, I could not have guessed what those grey boxes do.
![Suspicius grey boxes on a hill](firewall_off.jpg)
As we can time travel here, you can also see the firewall at night already:
{{< gif src="./firewall_on.webm" >}}
After a while, I did not want to bother my captive audience anymore so I continued exploring.
### Anderstorps
I walked past a bar at one of the villages playing very loud music to something you could describe as art.
I had just found Anderstorps, right next to BornHack.
// FIXME: add picture of intact art piece
As it seems like I do not have a picture of the art piece intact, here is a short description.
There was a pavillion with a white table in the middle.
On the table there was a black iron cage containing an accordeon.
In front of the table there was a huge "accordeons forbidden" sign.
When asked about it, the inhabitants told me to come back later as they were too hung over from the night of Day 0, when different music will be playing.
As I wanted to sit down and write some more, I used the provided shade here.
Not much later, I noticed they were _literally_ playing the same music, as in looping a single track.
🎵 Faxe Kondi by Klumben & Raske Penge
On Day 3 or so, the cage including the instrument were gone, which may or may not have been planned beforehands.
They did not provide any further context apart from "have you heard what they sound like?".
![Installation without cage and instrument](stolen_instrument.jpg)
### First talk
Next up was a talk that made me realize more stuff that was different from CCCamp.
It expected a talk about either cloud security in general, or one about finding vulnerabilities in a deployment.
Instead, this talk was about securing _proprietary_ Microsoft Azure services (a company still rightiously considered evil in many parts of the chaos) using other proprietary Microsoft Azure services.
Whenever there was a security issue, the solution was to use more Azure services.
There was barely enough context to figure out how to generalize what was said for other products, so it was not really helpfull for me.
The following questions were also about specific products and services.
I am pretty sure this would not have been on the Fahrplan in Germany, and as stated by others this would also have raised eyebrows in the Dutch hacker community one or two decades ago.
### Power issues
I wanted to get a new mate, but had to walk to a different bar because of issues with the payment system again.
As Heaven announced, the power outage was not on site and affected all of North Holland.
This meant that everything that was attached to the regional power grid, which was meant to be more stable than the on-site generators, did not work.
Because of this, all talks for the rest of the day were cancelled and mostly rescheduled in the following days.
At least bar payments were possible again shortly thereafter.
When the sun started to settle, the soundcheck of a Metallica tribute band fittingly called _Sad but Tribute_ started.
From then on, the evening was filled with surprisingly close covers.
The castle-shaped stage ("party area") and the flamethrowers attached to the towers were visible from all over the camping grounds.
### What the fog
In the nights, it got really foggy, and I mean _really_ foggy.
This made all the lights everywhere stand out even more.
![A projector running at the party bar, producing rays of colorful lights in the fog](projector.jpg)
Combine this with a bunch of very strong fog machines and you could maybe see two meters into the distance.
<blockquote class="mastodon-embed" data-embed-url="https://chaos.social/@vinzenz/115001634006324155/embed" style="background: #FCF8FF; border-radius: 8px; border: 1px solid #C9C4DA; margin: 0; max-width: 540px; min-width: 270px; overflow: hidden; padding: 0;"> <a href="https://chaos.social/@vinzenz/115001634006324155" target="_blank" style="align-items: center; color: #1C1A25; display: flex; flex-direction: column; font-family: system-ui, -apple-system, BlinkMacSystemFont, 'Segoe UI', Oxygen, Ubuntu, Cantarell, 'Fira Sans', 'Droid Sans', 'Helvetica Neue', Roboto, sans-serif; font-size: 14px; justify-content: center; letter-spacing: 0.25px; line-height: 20px; padding: 24px; text-decoration: none;"> <svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="32" height="32" viewBox="0 0 79 75"><path d="M63 45.3v-20c0-4.1-1-7.3-3.2-9.7-2.1-2.4-5-3.7-8.5-3.7-4.1 0-7.2 1.6-9.3 4.7l-2 3.3-2-3.3c-2-3.1-5.1-4.7-9.2-4.7-3.5 0-6.4 1.3-8.6 3.7-2.1 2.4-3.1 5.6-3.1 9.7v20h8V25.9c0-4.1 1.7-6.2 5.2-6.2 3.8 0 5.8 2.5 5.8 7.4V37.7H44V27.1c0-4.9 1.9-7.4 5.8-7.4 3.5 0 5.2 2.1 5.2 6.2V45.3h8ZM74.7 16.6c.6 6 .1 15.7.1 17.3 0 .5-.1 4.8-.1 5.3-.7 11.5-8 16-15.6 17.5-.1 0-.2 0-.3 0-4.9 1-10 1.2-14.9 1.4-1.2 0-2.4 0-3.6 0-4.8 0-9.7-.6-14.4-1.7-.1 0-.1 0-.1 0s-.1 0-.1 0 0 .1 0 .1 0 0 0 0c.1 1.6.4 3.1 1 4.5.6 1.7 2.9 5.7 11.4 5.7 5 0 9.9-.6 14.8-1.7 0 0 0 0 0 0 .1 0 .1 0 .1 0 0 .1 0 .1 0 .1.1 0 .1 0 .1.1v5.6s0 .1-.1.1c0 0 0 0 0 .1-1.6 1.1-3.7 1.7-5.6 2.3-.8.3-1.6.5-2.4.7-7.5 1.7-15.4 1.3-22.7-1.2-6.8-2.4-13.8-8.2-15.5-15.2-.9-3.8-1.6-7.6-1.9-11.5-.6-5.8-.6-11.7-.8-17.5C3.9 24.5 4 20 4.9 16 6.7 7.9 14.1 2.2 22.3 1c1.4-.2 4.1-1 16.5-1h.1C51.4 0 56.7.8 58.1 1c8.4 1.2 15.5 7.5 16.6 15.6Z" fill="currentColor"/></svg> <div style="color: #787588; margin-top: 16px;">Post by @vinzenz@chaos.social</div> <div style="font-weight: 500;">View on Mastodon</div> </a> </blockquote> <script data-allowed-prefixes="https://chaos.social/" async src="https://chaos.social/embed.js"></script>
<br />
Someone described their shift as customers popping into existance in front of the bar, ordering, and returning into nothingness after receiving their drinks.
![Fog so thick you can only see general shapes and big diffused spots of light](thick_fog.jpg)
After turning of the fog machines at milliways, it cleared up quicky around us.
It looked unreal even in person.
![Fog on the hills with lights peeking through it, but no fog in the foreground](less_fog.jpg)
The rest of the night I played PolyGen, which will be described [in a future blog post](/posts/why-2025/polygen/).

Binary file not shown.

Before

Width:  |  Height:  |  Size: 622 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 905 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 833 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 481 KiB

View file

@ -1,66 +0,0 @@
+++
date = '2025-08-07T06:00:00+02:00'
draft = false
title = 'WHY 2025 - Preparations'
tags = ['travel', 'WHY 2025']
aliases = ["why-2025/why-2025-prep/"]
+++
I am trying to write more, so I am experimenting with a series of travel-log style post.
The resulting text is boring to read, the contained conclusions are obvious for anyone with two or more brain cells and you will just waste your time reading it.
This is the first part, covering everything happening before arriving on site.
I may update previous days, so you may want to wait until after the event is over to read a more polished version.
### Expectations
What Hackers Yearn 2025 is a so-called hackercamp. From the wiki:
> At its core, a hackercamp is a self-organized space where hackers, makers, artists, activists, and technology enthusiasts come together to learn, create, and celebrate technology. The landscape comes alive with colorful LED installations, interactive art, hand-built sculptures, and high-tech experiments happening in every corner.
>
> [wiki.why2025.org/Newcomers_Guide](https://wiki.why2025.org/Newcomers_Guide#The_essence_of_a_hacker_camp)
As is tradition with the CCCamp, the event takes place every four years, which means overall there is one "big" hackercamp every two years.
It's one of those events where your do not have to worry about stuff being stolen from your rent as much, but where you should install any available security patches beforehand.
While much of the infrastructure is semi-centrally managed, part of the fun is exploring the assemblies, villages and self organized sessions.
As many of the talks are recorded and can be watched on [media.ccc.de](https://media.ccc.de/c/WHY2025) afterwards, I was mostly interested workshops and the social aspects of the event.
For me, this was the first hacker event in the Netherlands, the second hacker *camp*, and the sixth hacker event overall.
### Tickets
Compared to the Chaos Communication Camp 2023, where it felt like getting a ticket required a good internet connection and solving a captcha quick enough, you could just go to their website and complete your purchase. The tickets did sell out in the end, but according to the public stats that happened over the span of days, not seconds.
By planning ahead, I was able to convince myself that taking a train very early in the morning was a good idea as the arrival time was more manageable.
While I did say I "planned ahead", that did not mean I committed to this early.
I booked my train ticket only a few days in advance, which meant that the FlexPreis (a ticket that is valid for any connection instead of a specific one) seemed like a good idea. I later noticed that when traveling over the border, seat reservations are required, defeating the whole purpose of buying the more expensive ticket for that part of the journey. Booking late also meant no bike tickets were left for the good connections, so I left that at home (I would have had to fix a flat first anyways).
Because I have a *Deutschlandticket* I can ride any regional trains for free. What that also means though is that your rights regarding connections are limited. Because of that, I usually take a train earlier so I do not miss my inter city train. In that case it meant getting up even earlier just so I could wait at Ostbahnhof for an hour.
### Packing
As usual with events like this, I pushed any packing and so on to the last hours of the day before. Of course work also took longer than expected.
Luckily just the weekend before, I was at the wonderful Brimborium, a tiny festival near the border to Poland, so I did not bother to store away my camping gear. That meant the basics were still scatered around on the living room floor and just had to be put back into (or attached to) the backpack.
I packed both way too much stuff and not enough. Whenever I thought I was done, I remembered something essential that was missing.
Because I had to carry all of this, I weighed what I wanted to take with me. Overall I had over 35kg of stuff. Though I did know that was too much, it was too late to send anything by mail or re-pack everything. This was now a problem for future me. Do you notice a theme yet?
### Getting there
Boy did I regret all my decisions when my alarm rang. Going to bed at the usual time and just waking up really early did not get me started in a good mood.
Apart from some last-minute adjustments, I still had no cash, nothing to eat and nothing to do in the 10 hours of train travel I was going to do.
At the *Späti* (kiosk that never closes), I had the idea of buying some cheap headphones, as my five year old ones gave up only half a year ago and I did not get around to compare the gazillion options till now. I always wondered who buys stuff like that, now I know. First I was surprised they only cost 10€, but I found out why after getting them out of the package. They weighed nothing, which meant the badly fitting ear pieces were pulled out by the cables all the time. Before even boarding the first train, one of them fell apart because of a manufacturing defect in the molded plastic, revealing one of the two cables inside was not isolated at all. The sound was even worse than expected, producing a loud hiss while audio was playing. That made listening to podcasts especially annoying as after each sentence, the noise would stop for half a second, only to start again when someone continued to talk. The good news is that I did not have to endure that for long, as both earpieces fell apart while boarding my first connection and I was not able to fix them while on the train. 0/10 stars, worse than not having anything. Samsung, you should do better or not sell this crap at all.
As I did have a longer wait at Ostbahnhof, I was finally able to get some food and coffee. You should have seen me juggle my giant backpack, the big duffel bag, the food and a hot cup of black coffee. What had to happen did happen, and so the rest of the day I walked around with a big stain on my shirt and a slightly burned chest.
Update from more than a week later: the burned area is still clearly visible.
The strap chafing on my chest all day probably did not help.
The actual train ride was comfortable and had a delay of only 30m, which is *fine* for a days worth of travel. My biggest complaint is that none of the toilets I checked had soap. If I had not packed as much stuff, it would say it was a better experience than getting there by car. I think it was funny that there Dutch crew stressed the point that you do not have to take a specific train in the Netherlands, even with the SparPreis, eliminating the last possible reason to have bought the expensive ticket.
From the train station, the event provided a free shuttle service to the camping ground.

View file

@ -1,5 +0,0 @@
+++
date = '2025-04-06T12:24:08+02:00'
draft = true
title = 'servicepoint'
+++

6
flake.lock generated
View file

@ -2,11 +2,11 @@
"nodes": {
"nixpkgs": {
"locked": {
"lastModified": 1754292888,
"narHash": "sha256-1ziydHSiDuSnaiPzCQh1mRFBsM2d2yRX9I+5OPGEmIE=",
"lastModified": 1748437600,
"narHash": "sha256-hYKMs3ilp09anGO7xzfGs3JqEgUqFMnZ8GMAqI6/k04=",
"owner": "nixos",
"repo": "nixpkgs",
"rev": "ce01daebf8489ba97bd1609d185ea276efdeb121",
"rev": "7282cb574e0607e65224d33be8241eae7cfe0979",
"type": "github"
},
"original": {

View file

@ -28,12 +28,14 @@
devShells = forAllSystems (
{ pkgs, system, ... }:
{
default = pkgs.mkShellNoCC rec {
default = pkgs.mkShellNoCC {
inputsFrom = [ self.packages.${system}.default ];
shellHook = ''
mkdir -p themes
ln -snf "${self.packages.${system}.hugo-theme-poison}" themes/poison
alias hugo="hugo --baseURL=http://localhost/"
'';
};
}

View file

@ -2,44 +2,41 @@
baseURL = '/'
#languageCode = 'en-us'
title = 'zerforschen+'
theme = 'poison'
theme = 'own-theme'
pluralizelisttitles = false
[params]
brand = "zerforschen+"
description = ""
dark_mode = true
front_page_content = ["posts", "projects"]
menu = [
# Dict keys:
# Name: The name to display on the menu.
# URL: The directory relative to the content directory.
# HasChildren: If the directory's files should be listed. Default is true.
# Limit: If the files should be listed, how many should be shown.
brand = "zerforschen+"
description = ""
dark_mode = true
front_page_content = ["posts", "projects"]
menu = [
# Dict keys:
# Name: The name to display on the menu.
# URL: The directory relative to the content directory.
# HasChildren: If the directory's files should be listed. Default is true.
# Limit: If the files should be listed, how many should be shown.
{Name = "About", URL = "/about/", HasChildren = false},
{ Name = "About", URL = "/about/", HasChildren = false },
{Name = "Posts", URL = "/posts/", HasChildren = true, Limit = 99},
{ Name = "Posts", URL = "/posts/", HasChildren = true, Limit = 99 },
# {Name = "Projects", URL = "/projects/"},
]
# {Name = "Projects", URL = "/projects/"},
]
#email_url = "mailto://user@domain"
github_url = "https://github.com/kaesaecracker"
mastodon_url = "https://chaos.social/@vinzenz"
matrix_url = "https://matrix.org"
forgejo_url = "https://git.berlin.ccc.de/vinzenz"
rss_icon = true
#email_url = "mailto://user@domain"
github_url = "https://github.com/kaesaecracker"
mastodon_url = "https://chaos.social/@vinzenz"
matrix_url = "https://matrix.org"
forgejo_url = "https://git.berlin.ccc.de/vinzenz"
rss_icon = true
[taxonomies]
series = 'series'
tags = 'tags'
series = 'series'
tags = 'tags'
[params.meta]
favicon = true
favicon = true
[pagination]
pagerSize = 10
[markup.goldmark]
renderer.unsafe = true
pagerSize = 10

View file

@ -1,3 +0,0 @@
{{ with .Page.Resources.Get (.Get "src") }}
<video loop src="{{ .RelPermalink }}" width="100%" autoplay muted></video>
{{ end }}

View file

@ -0,0 +1,5 @@
+++
title = '{{ replace .File.ContentBaseName "-" " " | title }}'
date = {{ .Date }}
draft = true
+++

View file

@ -0,0 +1,19 @@
body {
font-family: sans-serif;
line-height: 1.5;
margin: 1rem;
}
header {
border-bottom: 1px solid;
margin-bottom: 1rem;
}
footer {
border-top: 1px solid;
margin-top: 1rem;
}
a {
text-decoration: none;
}

View file

@ -0,0 +1 @@
console.log('This site was generated by Hugo.');

View file

@ -0,0 +1,23 @@
baseURL = 'https://example.org/'
languageCode = 'en-US'
title = 'My New Hugo Site'
[[menus.main]]
name = 'Home'
pageRef = '/'
weight = 10
[[menus.main]]
name = 'Posts'
pageRef = '/posts'
weight = 20
[[menus.main]]
name = 'Tags'
pageRef = '/tags'
weight = 30
[module]
[module.hugoVersion]
extended = false
min = "0.116.0"

View file

@ -0,0 +1,17 @@
<!DOCTYPE html>
<html lang="{{ site.Language.LanguageCode }}" dir="{{ or site.Language.LanguageDirection `ltr` }}">
<head>
{{ partial "head.html" . }}
</head>
<body>
<header>
{{ partial "header.html" . }}
</header>
<main>
{{ block "main" . }}{{ end }}
</main>
<footer>
{{ partial "footer.html" . }}
</footer>
</body>
</html>

View file

@ -0,0 +1,7 @@
{{ define "main" }}
{{ .Content }}
{{ range site.RegularPages }}
<h2><a href="{{ .RelPermalink }}">{{ .LinkTitle }}</a></h2>
{{ .Summary }}
{{ end }}
{{ end }}

View file

@ -0,0 +1,8 @@
{{ define "main" }}
<h1>{{ .Title }}</h1>
{{ .Content }}
{{ range .Pages }}
<h2><a href="{{ .RelPermalink }}">{{ .LinkTitle }}</a></h2>
{{ .Summary }}
{{ end }}
{{ end }}

View file

@ -0,0 +1,10 @@
{{ define "main" }}
<h1>{{ .Title }}</h1>
{{ $dateMachine := .Date | time.Format "2006-01-02T15:04:05-07:00" }}
{{ $dateHuman := .Date | time.Format ":date_long" }}
<time datetime="{{ $dateMachine }}">{{ $dateHuman }}</time>
{{ .Content }}
{{ partial "terms.html" (dict "taxonomy" "tags" "page" .) }}
{{ end }}

View file

@ -0,0 +1,6 @@
<meta charset="utf-8">
<meta name="viewport" content="width=device-width">
<title>{{ if .IsHome }}{{ site.Title }}{{ else }}{{ printf "%s | %s" .Title site.Title }}{{ end }}</title>
{{ partialCached "head/css.html" . }}
{{ partialCached "head/js.html" . }}
<meta name="color-scheme" content="light dark">

View file

@ -0,0 +1,9 @@
{{- with resources.Get "css/main.css" }}
{{- if eq hugo.Environment "development" }}
<link rel="stylesheet" href="{{ .RelPermalink }}">
{{- else }}
{{- with . | minify | fingerprint }}
<link rel="stylesheet" href="{{ .RelPermalink }}" integrity="{{ .Data.Integrity }}" crossorigin="anonymous">
{{- end }}
{{- end }}
{{- end }}

View file

@ -0,0 +1,12 @@
{{- with resources.Get "js/main.js" }}
{{- if eq hugo.Environment "development" }}
{{- with . | js.Build }}
<script src="{{ .RelPermalink }}"></script>
{{- end }}
{{- else }}
{{- $opts := dict "minify" true }}
{{- with . | js.Build $opts | fingerprint }}
<script src="{{ .RelPermalink }}" integrity="{{- .Data.Integrity }}" crossorigin="anonymous"></script>
{{- end }}
{{- end }}
{{- end }}

View file

@ -0,0 +1,3 @@
<h1>{{ site.Title }}</h1>
{{ partial "menu.html" (dict "menuID" "main" "page" .) }}
{{ partial "socials.html" . }}

View file

@ -0,0 +1,51 @@
{{- /*
Renders a menu for the given menu ID.
@context {page} page The current page.
@context {string} menuID The menu ID.
@example: {{ partial "menu.html" (dict "menuID" "main" "page" .) }}
*/}}
{{- $page := .page }}
{{- $menuID := .menuID }}
{{- with index site.Menus $menuID }}
<nav>
<ul>
{{- partial "inline/menu/walk.html" (dict "page" $page "menuEntries" .) }}
</ul>
</nav>
{{- end }}
{{- define "partials/inline/menu/walk.html" }}
{{- $page := .page }}
{{- range .menuEntries }}
{{- $attrs := dict "href" .URL }}
{{- if $page.IsMenuCurrent .Menu . }}
{{- $attrs = merge $attrs (dict "class" "active" "aria-current" "page") }}
{{- else if $page.HasMenuCurrent .Menu .}}
{{- $attrs = merge $attrs (dict "class" "ancestor" "aria-current" "true") }}
{{- end }}
{{- $name := .Name }}
{{- with .Identifier }}
{{- with T . }}
{{- $name = . }}
{{- end }}
{{- end }}
<li>
<a
{{- range $k, $v := $attrs }}
{{- with $v }}
{{- printf " %s=%q" $k $v | safeHTMLAttr }}
{{- end }}
{{- end -}}
>{{ $name }}</a>
{{- with .Children }}
<ul>
{{- partial "inline/menu/walk.html" (dict "page" $page "menuEntries" .) }}
</ul>
{{- end }}
</li>
{{- end }}
{{- end }}

View file

@ -0,0 +1,23 @@
{{- /*
For a given taxonomy, renders a list of terms assigned to the page.
@context {page} page The current page.
@context {string} taxonomy The taxonomy.
@example: {{ partial "terms.html" (dict "taxonomy" "tags" "page" .) }}
*/}}
{{- $page := .page }}
{{- $taxonomy := .taxonomy }}
{{- with $page.GetTerms $taxonomy }}
{{- $label := (index . 0).Parent.LinkTitle }}
<div>
<div>{{ $label }}:</div>
<ul>
{{- range . }}
<li><a href="{{ .RelPermalink }}">{{ .LinkTitle }}</a></li>
{{- end }}
</ul>
</div>
{{- end }}

Binary file not shown.

After

Width:  |  Height:  |  Size: 15 KiB

View file

@ -0,0 +1,31 @@
name = 'the theme'
# license = ''
# licenselink = 'https://github.com/owner/repo/LICENSE'
# description = 'Theme description'
#
# # The home page of the theme, where the source can be found
# homepage = 'https://github.com/owner/repo'
#
# # If you have a running demo of the theme
# demosite = 'https://owner.github.io/repo'
#
# # Taxonomy terms
# tags = ['blog', 'company']
# features = ['some', 'awesome', 'features']
#
# # If the theme has multiple authors
# authors = [
# {name = 'Name of author', homepage = 'Website of author'},
# {name = 'Name of author', homepage = 'Website of author'}
# ]
#
# # If the theme has a single author
# [author]
# name = 'Your name'
# homepage = 'Your website'
#
# # If porting an existing theme
# [original]
# author = 'Name of original author'
# homepage = 'Website of original author'
# repo = 'https://github.com/owner/repo'