Compare commits
1 commit
Author | SHA1 | Date | |
---|---|---|---|
![]() |
d400466ad6 |
2
.gitignore
vendored
|
@ -6,4 +6,4 @@
|
|||
_gen
|
||||
|
||||
# downloaded by nix
|
||||
themes
|
||||
themes/poison
|
||||
|
|
Before Width: | Height: | Size: 1.5 MiB |
Before Width: | Height: | Size: 691 KiB |
Before Width: | Height: | Size: 831 KiB |
Before Width: | Height: | Size: 899 KiB |
Before Width: | Height: | Size: 977 KiB |
|
@ -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
|
||||
|
||||

|
||||
|
||||
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.
|
||||
|
||||

|
||||
|
||||
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.
|
||||
|
||||

|
||||
|
||||
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).
|
||||
|
||||

|
||||
|
||||
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.
|
||||
|
||||

|
||||
|
||||
### 😱🍾💸
|
||||
|
||||
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.
|
||||
|
||||

|
||||
|
||||
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.
|
||||
|
||||

|
||||
|
||||
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.
|
||||
|
||||

|
||||
|
||||
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.
|
||||
|
||||

|
||||
|
||||
### 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:
|
||||
|
||||

|
||||
|
||||
### 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.
|
||||
|
||||

|
||||
|
||||
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.
|
||||
|
||||

|
Before Width: | Height: | Size: 950 KiB |
Before Width: | Height: | Size: 935 KiB |
Before Width: | Height: | Size: 1.2 MiB |
Before Width: | Height: | Size: 1 MiB |
Before Width: | Height: | Size: 443 KiB |
Before Width: | Height: | Size: 607 KiB |
Before Width: | Height: | Size: 1.1 MiB |
Before Width: | Height: | Size: 875 KiB |
|
@ -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.
|
||||
|
||||

|
||||
|
||||
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?".
|
||||
|
||||

|
||||
|
||||
### 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.
|
||||
|
||||

|
||||
|
||||
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.
|
||||
|
||||

|
||||
|
||||
After turning of the fog machines at milliways, it cleared up quicky around us.
|
||||
It looked unreal even in person.
|
||||
|
||||

|
||||
|
||||
The rest of the night I played PolyGen, which will be described [in a future blog post](/posts/why-2025/polygen/).
|
Before Width: | Height: | Size: 622 KiB |
Before Width: | Height: | Size: 905 KiB |
Before Width: | Height: | Size: 833 KiB |
Before Width: | Height: | Size: 481 KiB |
|
@ -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.
|
|
@ -1,5 +0,0 @@
|
|||
+++
|
||||
date = '2025-04-06T12:24:08+02:00'
|
||||
draft = true
|
||||
title = 'servicepoint'
|
||||
+++
|
6
flake.lock
generated
|
@ -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": {
|
||||
|
|
|
@ -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/"
|
||||
'';
|
||||
};
|
||||
}
|
||||
|
|
53
hugo.toml
|
@ -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
|
||||
|
|
|
@ -1,3 +0,0 @@
|
|||
{{ with .Page.Resources.Get (.Get "src") }}
|
||||
<video loop src="{{ .RelPermalink }}" width="100%" autoplay muted></video>
|
||||
{{ end }}
|
5
themes/own-theme/archetypes/default.md
Normal file
|
@ -0,0 +1,5 @@
|
|||
+++
|
||||
title = '{{ replace .File.ContentBaseName "-" " " | title }}'
|
||||
date = {{ .Date }}
|
||||
draft = true
|
||||
+++
|
19
themes/own-theme/assets/css/main.css
Normal 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;
|
||||
}
|
1
themes/own-theme/assets/js/main.js
Normal file
|
@ -0,0 +1 @@
|
|||
console.log('This site was generated by Hugo.');
|
23
themes/own-theme/hugo.toml
Normal 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"
|
17
themes/own-theme/layouts/_default/baseof.html
Normal 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>
|
7
themes/own-theme/layouts/_default/home.html
Normal file
|
@ -0,0 +1,7 @@
|
|||
{{ define "main" }}
|
||||
{{ .Content }}
|
||||
{{ range site.RegularPages }}
|
||||
<h2><a href="{{ .RelPermalink }}">{{ .LinkTitle }}</a></h2>
|
||||
{{ .Summary }}
|
||||
{{ end }}
|
||||
{{ end }}
|
8
themes/own-theme/layouts/_default/list.html
Normal file
|
@ -0,0 +1,8 @@
|
|||
{{ define "main" }}
|
||||
<h1>{{ .Title }}</h1>
|
||||
{{ .Content }}
|
||||
{{ range .Pages }}
|
||||
<h2><a href="{{ .RelPermalink }}">{{ .LinkTitle }}</a></h2>
|
||||
{{ .Summary }}
|
||||
{{ end }}
|
||||
{{ end }}
|
10
themes/own-theme/layouts/_default/single.html
Normal 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 }}
|
0
themes/own-theme/layouts/partials/footer.html
Normal file
6
themes/own-theme/layouts/partials/head.html
Normal 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">
|
9
themes/own-theme/layouts/partials/head/css.html
Normal 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 }}
|
12
themes/own-theme/layouts/partials/head/js.html
Normal 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 }}
|
3
themes/own-theme/layouts/partials/header.html
Normal file
|
@ -0,0 +1,3 @@
|
|||
<h1>{{ site.Title }}</h1>
|
||||
{{ partial "menu.html" (dict "menuID" "main" "page" .) }}
|
||||
{{ partial "socials.html" . }}
|
51
themes/own-theme/layouts/partials/menu.html
Normal 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 }}
|
23
themes/own-theme/layouts/partials/terms.html
Normal 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 }}
|
BIN
themes/own-theme/static/favicon.ico
Normal file
After Width: | Height: | Size: 15 KiB |
31
themes/own-theme/theme.toml
Normal 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'
|