Compare commits

...

10 Commits

Author SHA1 Message Date
9a5c90dc16 feat: simple buttons to show links for media
All checks were successful
Website build and deploy / build (pull_request) Successful in 45s
2026-02-13 00:39:08 +01:00
8e8f38c8b5 fix: margin if not header text is present 2026-02-13 00:11:43 +01:00
c203c8e9ef feat: handle missing header images 2026-02-12 23:59:54 +01:00
b45c29b83b chore: reduce image size 2026-02-12 23:51:39 +01:00
9253bcbe80 feat: make types and languages selectable 2026-02-12 23:48:38 +01:00
6405f8dd3b feat: update meta image and tags 2026-02-12 23:26:11 +01:00
889e7047ac feat: add image processing, improvements 2026-02-12 22:57:49 +01:00
3cb1797091 feat: support leaf bundles for blog posts, refactor header images 2026-02-12 21:39:21 +01:00
74ac93d349 feat: add three different media as blog types as testing objects, with infos on list 2026-02-12 20:55:29 +01:00
d99b4821d9 add OpenRail Day moderation to links
All checks were successful
Website build and deploy / build (push) Successful in 1m31s
2026-01-20 15:43:50 +01:00
62 changed files with 564 additions and 220 deletions

View File

@@ -2,6 +2,7 @@
title: "{{ replace (replaceRE "^[0-9]{4}-[0-9]{2}-" "" .Name) "-" " " | title }}" title: "{{ replace (replaceRE "^[0-9]{4}-[0-9]{2}-" "" .Name) "-" " " | title }}"
date: {{ now.Format "2006-01-02" }} date: {{ now.Format "2006-01-02" }}
categories: categories:
- blog
- english - english
- deutsch - deutsch
tags: tags:

View File

@@ -75,3 +75,9 @@ style = "emacs"
[privacy.youtube] [privacy.youtube]
disable = false disable = false
privacyEnhanced = true privacyEnhanced = true
# Modules
[[module.mounts]]
# Make static images available as image assets by default
source = "static/img/"
target = "assets/images/"

View File

@@ -3,6 +3,7 @@ title: Organising micro task emails in Thunderbird
date: 2013-10-27T23:12:55+00:00 date: 2013-10-27T23:12:55+00:00
aliases: organising-micro-task-emails-in-thunderbird aliases: organising-micro-task-emails-in-thunderbird
categories: categories:
- blog
- english - english
tags: tags:
- email - email

View File

@@ -3,6 +3,7 @@ title: Mounting a SFTP storage in GNU/Linux
date: 2014-01-13T14:42:01+00:00 date: 2014-01-13T14:42:01+00:00
aliases: /blog/2014/mounting-a-sftp-storage-in-gnu-linux aliases: /blog/2014/mounting-a-sftp-storage-in-gnu-linux
categories: categories:
- blog
- english - english
tags: tags:
- bash - bash

View File

@@ -3,6 +3,7 @@ title: Why free choice of routers is a must
date: 2014-01-14T17:47:43+00:00 date: 2014-01-14T17:47:43+00:00
aliases: why-free-choice-of-routers-is-an-unnegotiable-must aliases: why-free-choice-of-routers-is-an-unnegotiable-must
categories: categories:
- blog
- english - english
tags: tags:
- routerfreedom - routerfreedom

View File

@@ -3,6 +3,7 @@ title: 'I love ZNC because #ilovefs'
date: 2014-02-14T05:00:14+00:00 date: 2014-02-14T05:00:14+00:00
url: /blog/2014/i-love-znc-because-ilovefs url: /blog/2014/i-love-znc-because-ilovefs
categories: categories:
- blog
- english - english
tags: tags:
- chat - chat

View File

@@ -3,6 +3,7 @@ title: Wirklich sichere WhatsApp Alternativen
date: 2014-02-21T09:41:54+00:00 date: 2014-02-21T09:41:54+00:00
aliases: wirklich-sichere-whatsapp-alternativen aliases: wirklich-sichere-whatsapp-alternativen
categories: categories:
- blog
- deutsch - deutsch
tags: tags:
- chat - chat

View File

@@ -3,6 +3,7 @@ title: Guter E-Mail-Stil
date: 2014-05-19T12:56:12+00:00 date: 2014-05-19T12:56:12+00:00
aliases: guter-e-mail-stil aliases: guter-e-mail-stil
categories: categories:
- blog
- deutsch - deutsch
tags: tags:
- chat - chat

View File

@@ -3,6 +3,7 @@ title: Birthday Calendar with ownCloud via CalDAV
date: 2014-09-17T22:56:46+00:00 date: 2014-09-17T22:56:46+00:00
aliases: birthday-calendar-with-owncloud-via-caldav aliases: birthday-calendar-with-owncloud-via-caldav
categories: categories:
- blog
- english - english
tags: tags:
- email - email

View File

@@ -3,6 +3,7 @@ title: Setting Openstreetmap as default in Thunderbirds contacts
date: 2014-09-28T10:40:42+00:00 date: 2014-09-28T10:40:42+00:00
aliases: setting-openstreetmap-as-default-in-thunderbird-contacts aliases: setting-openstreetmap-as-default-in-thunderbird-contacts
categories: categories:
- blog
- english - english
tags: tags:
- email - email

View File

@@ -3,6 +3,7 @@ title: My internship at FSFE
date: 2014-10-24T10:39:54+00:00 date: 2014-10-24T10:39:54+00:00
aliases: my-internship-at-fsfe aliases: my-internship-at-fsfe
categories: categories:
- blog
- english - english
tags: tags:
- routerfreedom - routerfreedom

View File

@@ -3,6 +3,7 @@ title: Freie Kommunikation ist die Essenz des Menschseins
date: 2014-11-10T13:15:19+00:00 date: 2014-11-10T13:15:19+00:00
aliases: freie-kommunikation-ist-essenz-des-lebens aliases: freie-kommunikation-ist-essenz-des-lebens
categories: categories:
- blog
- deutsch - deutsch
tags: tags:
- chat - chat

View File

@@ -3,6 +3,7 @@ title: Sharing is caring my Git instance
date: 2014-11-28T17:16:50+00:00 date: 2014-11-28T17:16:50+00:00
aliases: sharing-is-caring-my-git-instance aliases: sharing-is-caring-my-git-instance
categories: categories:
- blog
- english - english
tags: tags:
- server - server

View File

@@ -5,6 +5,7 @@ aliases:
- next-station-tanzania - next-station-tanzania
- naechste-station-tansania - naechste-station-tansania
categories: categories:
- blog
- english - english
tags: tags:
- tanzania - tanzania

View File

@@ -3,6 +3,7 @@ title: Yourls URL Shortener for Turpial
date: 2015-01-24T01:58:32+00:00 date: 2015-01-24T01:58:32+00:00
aliases: yourls-url-shortener-for-turpial aliases: yourls-url-shortener-for-turpial
categories: categories:
- blog
- english - english
tags: tags:
- chat - chat

View File

@@ -3,6 +3,7 @@ title: I love Taskwarrior, therefore I love Free Software
date: 2015-02-14T12:05:42+00:00 date: 2015-02-14T12:05:42+00:00
aliases: i-love-taskwarrior-therefore-i-love-free-software aliases: i-love-taskwarrior-therefore-i-love-free-software
categories: categories:
- blog
- english - english
tags: tags:
- bash - bash

View File

@@ -3,6 +3,7 @@ title: In The End Freedom Is What Matters
date: 2015-02-25T02:03:04+00:00 date: 2015-02-25T02:03:04+00:00
aliases: in-the-end-freedom-is-what-matters aliases: in-the-end-freedom-is-what-matters
categories: categories:
- blog
- english - english
tags: tags:
- routerfreedom - routerfreedom

View File

@@ -3,6 +3,7 @@ title: Erste Eindrücke aus Tansania
date: 2015-04-14T08:05:07+00:00 date: 2015-04-14T08:05:07+00:00
aliases: erste-eindruecke-aus-tansania aliases: erste-eindruecke-aus-tansania
categories: categories:
- blog
- deutsch - deutsch
tags: tags:
- tanzania - tanzania

View File

@@ -3,12 +3,14 @@ title: 'Nächster Halt: Endstation.'
date: 2015-05-20T08:04:10+00:00 date: 2015-05-20T08:04:10+00:00
aliases: naechster-halt-endstation aliases: naechster-halt-endstation
categories: categories:
- blog
- deutsch - deutsch
tags: tags:
- germany - germany
- policy - policy
- tanzania - tanzania
headerimage: /blog/weselsky-putin.jpg headerimage:
src: /blog/weselsky-putin.jpg
--- ---

View File

@@ -3,6 +3,7 @@ title: Technology and Free Software in Tanzania
date: 2015-05-08T07:34:19+00:00 date: 2015-05-08T07:34:19+00:00
aliases: technology-and-free-software-in-tz aliases: technology-and-free-software-in-tz
categories: categories:
- blog
- english - english
tags: tags:
- tanzania - tanzania

View File

@@ -3,6 +3,7 @@ title: splitDL Downloading huge files from slow and unstable internet connec
date: 2015-06-26T15:59:03+00:00 date: 2015-06-26T15:59:03+00:00
aliases: splitdl-downloading-huge-files-from-slow-and-unstable-internet-connections aliases: splitdl-downloading-huge-files-from-slow-and-unstable-internet-connections
categories: categories:
- blog
- english - english
tags: tags:
- bash - bash

View File

@@ -3,6 +3,7 @@ title: Weiterer Teilerfolg beim Routerzwang
date: 2015-07-22T06:48:01+00:00 date: 2015-07-22T06:48:01+00:00
aliases: weiterer-teilerfolg-beim-routerzwang aliases: weiterer-teilerfolg-beim-routerzwang
categories: categories:
- blog
- deutsch - deutsch
tags: tags:
- routerfreedom - routerfreedom

View File

@@ -3,6 +3,7 @@ title: German Government wants authorities to advertise PDFreaders
date: 2015-09-19T17:27:20+00:00 date: 2015-09-19T17:27:20+00:00
aliases: german-government-wants-authorities-to-advertise-pdfreaders aliases: german-government-wants-authorities-to-advertise-pdfreaders
categories: categories:
- blog
- english - english
tags: tags:
- fsfe - fsfe

View File

@@ -3,6 +3,7 @@ title: I love Free Software (Apps)
date: 2016-02-14T09:00:18+00:00 date: 2016-02-14T09:00:18+00:00
aliases: i-love-free-software-apps aliases: i-love-free-software-apps
categories: categories:
- blog
- english - english
tags: tags:
- chat - chat

View File

@@ -3,6 +3,7 @@ title: Switching my code from gitweb to Gogs
date: 2016-02-26T17:05:18+00:00 date: 2016-02-26T17:05:18+00:00
aliases: switching-my-code-from-gitweb-to-gogs aliases: switching-my-code-from-gitweb-to-gogs
categories: categories:
- blog
- english - english
tags: tags:
- tools - tools

View File

@@ -3,6 +3,7 @@ title: 'Getting oldschool, oder: Wie ich uncool wurde'
date: 2016-03-28T13:39:45+00:00 date: 2016-03-28T13:39:45+00:00
aliases: getting-oldschool-oder-wie-ich-uncool-wurde aliases: getting-oldschool-oder-wie-ich-uncool-wurde
categories: categories:
- blog
- deutsch - deutsch
tags: tags:
- chat - chat

View File

@@ -3,6 +3,7 @@ title: Der Routerzwang fällt Und was bringt mir das?
date: 2016-07-30T11:02:38+00:00 date: 2016-07-30T11:02:38+00:00
aliases: der-routerzwang-faellt-was-bringt-mir-das aliases: der-routerzwang-faellt-was-bringt-mir-das
categories: categories:
- blog
- deutsch - deutsch
tags: tags:
- routerfreedom - routerfreedom

View File

@@ -3,6 +3,7 @@ title: Erste Testgeräte für Routerfreiheit versendet
date: 2016-08-08T09:11:51+00:00 date: 2016-08-08T09:11:51+00:00
aliases: erste-testgeraete-fuer-routerfreiheit-versendet aliases: erste-testgeraete-fuer-routerfreiheit-versendet
categories: categories:
- blog
- deutsch - deutsch
tags: tags:
- routerfreedom - routerfreedom

View File

@@ -3,6 +3,7 @@ title: FrOSCon 2016 Ein Rückblick
date: 2016-08-26T13:57:48+00:00 date: 2016-08-26T13:57:48+00:00
aliases: froscon-2016-ein-rueckblick aliases: froscon-2016-ein-rueckblick
categories: categories:
- blog
- deutsch - deutsch
tags: tags:
- routerfreedom - routerfreedom

View File

@@ -3,6 +3,7 @@ title: Endgerätefreiheit testen Es sind wieder Router verfügbar!
date: 2016-09-23T09:23:09+00:00 date: 2016-09-23T09:23:09+00:00
aliases: endgeraetefreiheit-testen-es-sind-wieder-router-verfuegbar aliases: endgeraetefreiheit-testen-es-sind-wieder-router-verfuegbar
categories: categories:
- blog
- deutsch - deutsch
tags: tags:
- routerfreedom - routerfreedom

View File

@@ -3,6 +3,7 @@ title: „Schluss mit dem Routerzwang“ Radiosendung im Deutschlandfunk
date: 2016-09-01T16:44:26+00:00 date: 2016-09-01T16:44:26+00:00
aliases: schluss-mit-dem-routerzwang-radiosendung-im-deutschlandfunk aliases: schluss-mit-dem-routerzwang-radiosendung-im-deutschlandfunk
categories: categories:
- blog
- deutsch - deutsch
tags: tags:
- routerfreedom - routerfreedom

View File

@@ -3,6 +3,7 @@ title: Freie Software Definition in Dortmund
date: 2016-10-13T17:22:16+00:00 date: 2016-10-13T17:22:16+00:00
aliases: freie-software-definition-in-dortmund aliases: freie-software-definition-in-dortmund
categories: categories:
- blog
- deutsch - deutsch
tags: tags:
- fsfe - fsfe

View File

@@ -3,6 +3,7 @@ title: Build FSFE websites locally
date: 2016-11-13T23:00:44+00:00 date: 2016-11-13T23:00:44+00:00
aliases: build-fsfe-websites-locally aliases: build-fsfe-websites-locally
categories: categories:
- blog
- english - english
tags: tags:
- bash - bash

View File

@@ -3,6 +3,7 @@ title: OpenRheinRuhr 2016 A report of iron and freedom
date: 2016-11-09T21:55:53+00:00 date: 2016-11-09T21:55:53+00:00
aliases: openrheinruhr-2016-a-report-of-iron-and-freedom aliases: openrheinruhr-2016-a-report-of-iron-and-freedom
categories: categories:
- blog
- english - english
tags: tags:
- report - report

View File

@@ -5,6 +5,7 @@ type: post
date: 2017-02-14T07:30:51+00:00 date: 2017-02-14T07:30:51+00:00
url: /blog/2017/i-love-astroid-ilovefs url: /blog/2017/i-love-astroid-ilovefs
categories: categories:
- blog
- english - english
tags: tags:
- email - email

View File

@@ -3,11 +3,13 @@ title: 'Idee: Wiki zu gesellschaftspolitischen Positionen von Prominenten'
date: 2017-05-29T10:15:45+00:00 date: 2017-05-29T10:15:45+00:00
aliases: idee-wiki-zu-gesellschaftspolitischen-positionen-von-prominenten aliases: idee-wiki-zu-gesellschaftspolitischen-positionen-von-prominenten
categories: categories:
- blog
- deutsch - deutsch
tags: tags:
- policy - policy
headerimage: /blog/maiziere-lehmann.jpg headerimage:
headercredits: CC-BY-SA 3.0 Sandro Halank / CC-BY 2.0 Ronnie Macdonald src: /blog/maiziere-lehmann.jpg
text: CC-BY-SA 3.0 Sandro Halank / CC-BY 2.0 Ronnie Macdonald
--- ---
_Alles begann, als mein Mitbewohner Lars und ich uns eines morgens fragten: „Mit wem würden wir lieber ein Bier trinken gehen, Thomas de Maizière oder Jens Lehmann?“._ _Alles begann, als mein Mitbewohner Lars und ich uns eines morgens fragten: „Mit wem würden wir lieber ein Bier trinken gehen, Thomas de Maizière oder Jens Lehmann?“._

View File

@@ -3,6 +3,7 @@ title: FSFE Planet has been refurbished
date: 2019-02-11T10:33:11+00:00 date: 2019-02-11T10:33:11+00:00
aliases: fsfe-planet-has-been-refurbished aliases: fsfe-planet-has-been-refurbished
categories: categories:
- blog
- english - english
tags: tags:
- fsfe - fsfe

View File

@@ -3,6 +3,7 @@ title: 'Protect freedom on radio devices: raise your voice today!'
date: 2019-03-01T15:09:56+00:00 date: 2019-03-01T15:09:56+00:00
aliases: protect-freedom-on-radio-devices-raise-your-voice-today aliases: protect-freedom-on-radio-devices-raise-your-voice-today
categories: categories:
- blog
- english - english
tags: tags:
- fsfe - fsfe

View File

@@ -2,13 +2,15 @@
title: The 3rd FSFE System Hackers hackathon title: The 3rd FSFE System Hackers hackathon
date: 2019-10-22 date: 2019-10-22
categories: categories:
- blog
- english - english
tags: tags:
- fsfe - fsfe
- report - report
- server - server
headerimage: /blog/system-chaos.jpg headerimage:
headercredits: Fortunately not how the FSFE's infrastructure looks like src: /blog/system-chaos.jpg
text: Fortunately not how the FSFE's infrastructure looks like
--- ---

View File

@@ -2,13 +2,15 @@
title: I love the hidden champions title: I love the hidden champions
date: 2020-02-14 date: 2020-02-14
categories: categories:
- blog
- english - english
tags: tags:
- ilovefs - ilovefs
- fsfe - fsfe
- bash - bash
headerimage: /blog/hidden-street.jpg headerimage:
headercredits: The unknown Free Software contributors. Photo by Kaique Rocha src: /blog/hidden-street.jpg
text: The unknown Free Software contributors. Photo by Kaique Rocha
--- ---

View File

@@ -2,13 +2,15 @@
title: System Hackers meeting - Lyon edition title: System Hackers meeting - Lyon edition
date: 2020-03-31 date: 2020-03-31
categories: categories:
- blog
- english - english
tags: tags:
- fsfe - fsfe
- report - report
- server - server
headerimage: /blog/syshackers-group-hacking.jpg headerimage:
headercredits: Hackers in their natural working environment. For the picture we took off the black ski masks and gloves. src: /blog/syshackers-group-hacking.jpg
text: Hackers in their natural working environment. For the picture we took off the black ski masks and gloves.
--- ---

View File

@@ -2,13 +2,15 @@
title: "The power of git-sed" title: "The power of git-sed"
date: 2020-07-28 date: 2020-07-28
categories: categories:
- blog
- english - english
tags: tags:
- tools - tools
- bash - bash
- fsfe - fsfe
headerimage: /blog/git-sed.png headerimage:
headercredits: Replacing content in thousands of files? No problem! src: /blog/git-sed.png
text: Replacing content in thousands of files? No problem!
--- ---
In the recent weeks and months, the [FSFE Web Team](https://fsfe.org/contribute/web/) has been doing some heavy work on the [FSFE website](https://fsfe.org). We moved and replaced thousands of files and their respective links to improve the structure of a historically grown website (19+ years, 23243 files, almost 39k commits). But how to do that most efficiently in a version controlled system like Git? In the recent weeks and months, the [FSFE Web Team](https://fsfe.org/contribute/web/) has been doing some heavy work on the [FSFE website](https://fsfe.org). We moved and replaced thousands of files and their respective links to improve the structure of a historically grown website (19+ years, 23243 files, almost 39k commits). But how to do that most efficiently in a version controlled system like Git?

View File

@@ -2,14 +2,16 @@
title: "Docker2Caddy - An automatic Reverse Proxy for Docker containers" title: "Docker2Caddy - An automatic Reverse Proxy for Docker containers"
date: 2022-04-25 date: 2022-04-25
categories: categories:
- blog
- english - english
tags: tags:
- tools - tools
- fsfe - fsfe
- server - server
- python - python
headerimage: /blog/docker.jpg headerimage:
headercredits: Shipping a load of containers requires a reliable infrastructure src: /blog/docker.jpg
text: Shipping a load of containers requires a reliable infrastructure
--- ---
So you have a number of Docker containers running web services which you would So you have a number of Docker containers running web services which you would

View File

@@ -2,13 +2,15 @@
title: "Seafile Mirror - Simple automatic backup of your Seafile libraries" title: "Seafile Mirror - Simple automatic backup of your Seafile libraries"
date: 2023-09-22 date: 2023-09-22
categories: categories:
- blog
- english - english
tags: tags:
- python - python
- server - server
- tools - tools
headerimage: /blog/library.jpg headerimage:
headercredits: Wouldn't it be a shame if your library were to be destroyed? src: /blog/library.jpg
text: Wouldn't it be a shame if your library were to be destroyed?
--- ---
I have been using [Seafile](https://www.seafile.com/) for years to host and I have been using [Seafile](https://www.seafile.com/) for years to host and

View File

@@ -0,0 +1,20 @@
---
title: "The Growing Importance of Software Bills of Materials (SBOM)"
date: 2023-11-15
categories:
- english
- podcast
tags:
- SupplyChain
- OSPO
- Security
headerimage:
src: /blog/file-cabinet.jpg
text: Neatly organise your records
audio: https://podcasts.apple.com/us/podcast/the-growing-importance-of-software-bills-of-materials-sbom/id1535460646?i=1000636913792
podcast:
name: SAP's Open Source Way Podcast
href: https://podcasts.apple.com/us/podcast/the-growing-importance-of-software-bills-of-materials-sbom/id1535460646?i=1000636913792
---
I had the pleasure to moderate the OpenRail Day 2025 in Paris, organised by the [OpenRail Association](https://openrailassociation.org) to share knowledge and experiences about open source software in the railway industry. The event featured several talks and panel discussions with experts from different companies and organisations involved in open source projects related to railways.

View File

@@ -2,12 +2,14 @@
title: "INWX DNS Recordmaster - Manage your DNS nameserver records via files in Git" title: "INWX DNS Recordmaster - Manage your DNS nameserver records via files in Git"
date: 2024-11-07 date: 2024-11-07
categories: categories:
- blog
- english - english
tags: tags:
- python - python
- tools - tools
headerimage: /blog/file-cabinet.jpg headerimage:
headercredits: Neatly organise your records src: /blog/file-cabinet.jpg
text: Neatly organise your records
--- ---
I own and manage 30+ domains at [INWX](https://www.inwx.com/), a large and professional domain registrar. Although INWX has a somewhat decent web interface, it became a burden for me to keep an overview of each domain's sometimes dozens of records. Especially when e.g. changing an IP address for more than one domain, it caused multiple error-prone clicks and copy/pastes that couldn't be reverted in the worst case. This is why I created [**INWX DNS Recordmaster**](https://github.com/mxmehl/inwx-dns-recordmaster) which I will shortly present here. I own and manage 30+ domains at [INWX](https://www.inwx.com/), a large and professional domain registrar. Although INWX has a somewhat decent web interface, it became a burden for me to keep an overview of each domain's sometimes dozens of records. Especially when e.g. changing an IP address for more than one domain, it caused multiple error-prone clicks and copy/pastes that couldn't be reverted in the worst case. This is why I created [**INWX DNS Recordmaster**](https://github.com/mxmehl/inwx-dns-recordmaster) which I will shortly present here.

View File

@@ -0,0 +1,51 @@
---
title: "The burden of knowledge: dealing with open-source risks"
date: 2025-03-10
categories:
- english
- article
tags:
- OSPO
- Community
- SupplyChain
- Security
headerimage:
src: /blog/file-cabinet.jpg
text: Neatly organise your records
article:
name: LWN.net
href: https://lwn.net/SubscriberLink/1013614/b3743b7875dc41ae/
---
I own and manage 30+ domains at [INWX](https://www.inwx.com/), a large and professional domain registrar. Although INWX has a somewhat decent web interface, it became a burden for me to keep an overview of each domain's sometimes dozens of records. Especially when e.g. changing an IP address for more than one domain, it caused multiple error-prone clicks and copy/pastes that couldn't be reverted in the worst case. This is why I created [**INWX DNS Recordmaster**](https://github.com/mxmehl/inwx-dns-recordmaster) which I will shortly present here.
If you are an INWX customer, you can use this tool to manage all your DNS records in YAML files. Ideally, you will store these files in a Git repository which you can use to track changes and roll back in case of a mistake. Having one file per domain provides you a number of further advantages:
* You can easily copy/paste records from other domains, e.g. for `SPF`, `DKIM` or `NS` records
* Overall search/replace of certain values becomes much easier, e.g. of IP addresses
* You can prepare larger changes offline and can synchronise once you feel it's done
INWX DNS Recordmaster takes care of making the required changes of the live records so that it matches the local state. This is done via the INWX API, ensuring that the amount of API calls is minimal.
This even allows you to set up a pipeline that takes care of the synchronisation[^1].
## Wait, there is more
As written above, I already had a large stack of domains that I previously managed via the web interface. This is why some additional convenience features found their way into the tool.
* You can convert all records of an existing and already configured domain at INWX into the file format. This made onboarding my 30+ domains a matter of a few minutes.
* On a global or per-domain level, you can ignore certain record types. For example, if you don't want to touch any `NS` records, you can configure that. By default, `SOA` records are ignored. You may even ignore all live records that don't exist in your local configuration.
* Of course, you can make a dry run to see which effects your configuration will have in practice.
Did I miss something to make it more productive for you? Let me know!
## Install, use, contribute
You are welcome to [install this tool](https://github.com/mxmehl/inwx-dns-recordmaster?tab=readme-ov-file#install), it's Free and Open Source Software after all. All you need is Python installed.
One of the tool's users is the [OpenRail Association](https://openrailassociation.org) which manages some of its domains with this program and [published its configuration](https://github.com/OpenRailAssociation/openrail-dns). This is a prime example of how organisation can make the management of records transparent and easy to change at least internally, if not even externally.
While the tool is not perfect, it already is a huge gain for efficiency and stability of my IT operations, and it already proves its capabilities for other users. To reach the remaining 20% to perfection (that will take 80% of the time, as always), you are most welcome to add issues with enhancement proposals, and if possible, also pull requests.
[^1]: For example, see the [workflow file of the OpenRail Association](https://github.com/OpenRailAssociation/openrail-dns/blob/main/.github/workflows/sync-records.yaml).

View File

@@ -0,0 +1,20 @@
---
title: "OpenRail Day 2025 Moderation"
date: 2025-12-17
categories:
- english
- presentation
tags:
- OpenRail
- OSPO
- Community
headerimage:
src: openrailday-stage.jpg
text: My amazing co-moderator Kira Correll and I on stage
video: https://clip.place/w/p/gZ1HFxLxHri8mDABzqpGHC
event:
name: OpenRail Day 2025 @ Paris
href: https://day.openrailassociation.org
---
I had the pleasure to moderate the OpenRail Day 2025 in Paris, organised by the [OpenRail Association](https://openrailassociation.org) to share knowledge and experiences about open source software in the railway industry. The event featured several talks and panel discussions with experts from different companies and organisations involved in open source projects related to railways.

Binary file not shown.

After

Width:  |  Height:  |  Size: 445 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 266 KiB

View File

@@ -0,0 +1,22 @@
---
title: "Software Supply Chain Strategy at Deutsche Bahn"
date: 2026-01-31
categories:
- english
- presentation
tags:
- OSPO
- SupplyChain
- Security
headerimage:
src: firstslide.jpg
video: https://video.fosdem.org/2026/ua2114/ZSWH3N-deutsche-bahn-supply-chain-cra-strategy.av1.webm
slides: https://fosdem.org/2026/events/attachments/ZSWH3N-deutsche-bahn-supply-chain-cra-strategy/slides/266949/2026-01-3_7kstxwl.pdf
event:
name: FOSDEM 2026
href: https://fosdem.org/2026/schedule/event/ZSWH3N-deutsche-bahn-supply-chain-cra-strategy/
---
Deutsche Bahn, with its 230,000 employees and hundreds of subsidiaries, is far from an average organization. Yet it faces the same challenges under the CRA as many others. In this session, I showed how we connected the concrete requirements of CRA compliance with our broader effort to bring transparency to our software supply chains. This forms the basis for security and license compliance processes, as well as for proactively shaping the ecosystems we depend on.
In the presentation, I outlined our strategy for addressing the expectations tied to the different roles we take on -- customer, manufacturer, and indirectly even steward -- from both organizational and technical angles. Given the diversity and scale of Deutsche Bahn, we rely on modular FOSS tools that offer the flexibility to adapt to varying stakeholder needs and evolving regulation. This flexibility is a core element of our approach. This session showed how we align strategy and technology to make this work.

3
content/blog/_index.md Normal file
View File

@@ -0,0 +1,3 @@
---
title: Blog
---

View File

@@ -169,6 +169,16 @@
# AUDIO/VIDEO # AUDIO/VIDEO
- desc: 'Moderation of the OpenRail Day Conference'
type: av
date: 2025-12
links:
- href: https://day.openrailassociation.org
text: OpenRail Day 2025 @ Paris
video: https://clip.place/w/p/gZ1HFxLxHri8mDABzqpGHC
lang: ["EN"]
tags: ["OpenRail", "OSPO", "Community"]
- desc: '"Burden of Knowledge - Dealing with Risks in Open Source"' - desc: '"Burden of Knowledge - Dealing with Risks in Open Source"'
type: av type: av
date: 2025-03 date: 2025-03

View File

@@ -199,6 +199,8 @@ html, body {
font-size: 18px; font-size: 18px;
.header-image { .header-image {
margin-bottom: 0.5em;
img { img {
width: 100%; width: 100%;
height: auto; height: auto;
@@ -210,9 +212,13 @@ html, body {
font-size: 0.8em; font-size: 0.8em;
text-align: center; text-align: center;
line-height: 1em; line-height: 1em;
margin-bottom: 1.5em; margin-bottom: 0;
} }
} }
.blog-links {
margin-bottom: 1em;
}
} }
/* Metadata */ /* Metadata */
@@ -336,6 +342,10 @@ pre code {
} }
} }
h4 span {
cursor: default;
}
h1, h1,
h4 a { h4 a {
color: var(--primary-color-dark); color: var(--primary-color-dark);

View File

@@ -20,20 +20,35 @@
<div class="metadata-page"> <div class="metadata-page">
<div class="row vertical-align"> <div class="row vertical-align">
<div class="col-xs-3 col-md-2 text-right"> <div class="col-xs-3 col-md-2 text-right">
<em>Languages:</em> <em>Type:</em>
</div> </div>
<div class="col-xs-9 col-md-10"> <div class="col-xs-9 col-md-10">
<a class="label label-success {{if not $selection}}active{{end}}" href="/blog">All</a> <a class="label label-success {{if not $selection}}active{{end}}" href="/blog">All</a>
{{ range $name, $taxonomy := .Site.Taxonomies.categories }} {{- range $name, $taxonomy := .Site.Taxonomies.categories }}
{{- if in (slice "english" "deutsch") $name }}{{ continue }}{{ end }}
<a class="label label-success {{if eq $name $.Title}}active{{end}}" href="{{ "/categories/" | relLangURL }}{{ $name | urlize }}"> <a class="label label-success {{if eq $name $.Title}}active{{end}}" href="{{ "/categories/" | relLangURL }}{{ $name | urlize }}">
{{- humanize $name -}} {{- humanize $name -}}
</a> </a>
{{- end -}} {{- end }}
</div> </div>
</div> </div>
<div class="row vertical-align"> <div class="row vertical-align">
<div class="col-xs-3 col-md-2 text-right"> <div class="col-xs-3 col-md-2 text-right">
<em>Tags:</em> <em>Language:</em>
</div>
<div class="col-xs-9 col-md-10">
<a class="label label-success {{if not $selection}}active{{end}}" href="/blog">All</a>
{{- range $name, $taxonomy := .Site.Taxonomies.categories }}
{{- if not (in (slice "english" "deutsch") $name) }}{{ continue }}{{ end }}
<a class="label label-success {{if eq $name $.Title}}active{{end}}" href="{{ "/categories/" | relLangURL }}{{ $name | urlize }}">
{{- humanize $name -}}
</a>
{{- end }}
</div>
</div>
<div class="row">
<div class="col-xs-3 col-md-2 text-right">
<em>Tag:</em>
</div> </div>
<div class="col-xs-9 col-md-10"> <div class="col-xs-9 col-md-10">
<a class="label label-success {{if not $selection}}active{{end}}" href="/blog">All</a> <a class="label label-success {{if not $selection}}active{{end}}" href="/blog">All</a>
@@ -62,8 +77,14 @@
<div class="blogpost"> <div class="blogpost">
{{ range .Paginator.Pages.ByPublishDate.Reverse }} {{ range .Paginator.Pages.ByPublishDate.Reverse }}
<div class="blog-summary"> <div class="blog-summary">
<h4><strong><a href="{{ .RelPermalink }}">{{ .Title | markdownify }}</a></strong></h4> <h4>
<div class="metadata-summary">Posted on {{ .Date.Format "2 January 2006" }} - Tagged with {{ range $i, $tag := .Params.tags }}{{ if $i }}, {{ end }}<a href="/tags/{{ lower $tag }}">{{ $tag }}</a>{{ end }}</div> {{ partial "blog/pre-headline.html" . -}}
<strong><a href="{{ .RelPermalink }}">{{ .Title | markdownify }}</a></strong>
</h4>
<div class="metadata-summary">
{{- partial "blog/verb.html" . }}
on {{ .Date.Format "2 January 2006" }} - Tagged with {{ range $i, $tag := .Params.tags }}{{ if $i }}, {{ end }}<a href="/tags/{{ lower $tag }}">{{ $tag }}</a>{{ end }}
</div>
{{ .Summary }} <a class="learn-more" href="{{ .RelPermalink }}"></a> {{ .Summary }} <a class="learn-more" href="{{ .RelPermalink }}"></a>
</div> </div>
{{ end }} {{ end }}

View File

@@ -17,14 +17,25 @@
{{ .Date.Format "2 January 2006" }} {{ .Date.Format "2 January 2006" }}
</div> </div>
</div> </div>
<div class="row vertical-align">
<div class="col-xs-3 col-md-2 text-right">
<em>Type:</em>
</div>
<div class="col-xs-9 col-md-10">
{{- range .Params.categories }}
{{- if in (slice "english" "deutsch") . }}{{ continue }}{{ end }}
<a class="label label-success" href="/categories/{{ lower . }}">{{ title . }}</a>
{{- end }}
</div>
</div>
<div class="row vertical-align"> <div class="row vertical-align">
<div class="col-xs-3 col-md-2 text-right"> <div class="col-xs-3 col-md-2 text-right">
<em>Tags:</em> <em>Tags:</em>
</div> </div>
<div class="col-xs-9 col-md-10"> <div class="col-xs-9 col-md-10">
{{ range .Params.tags }} {{- range .Params.tags }}
<a class="label label-success" href="/tags/{{ lower . }}">{{ . }}</a> <a class="label label-success" href="/tags/{{ lower . }}">{{ title . }}</a>
{{- end -}} {{- end }}
</div> </div>
</div> </div>
<div class="row vertical-align"> <div class="row vertical-align">
@@ -40,12 +51,8 @@
<div class="panel panel-default"> <div class="panel panel-default">
<div class="panel-body"> <div class="panel-body">
<div class="blogpost"> <div class="blogpost">
{{ if isset .Params "headerimage" }} {{- partial "blog/headerimage" . }}
<div class="header-image"> {{- partial "blog/links" . }}
<img src="/img/{{ .Params.headerImage }}" />
<p>{{ with .Params.headercredits }}{{ . | markdownify }}{{ end }}</p>
</div>
{{ end }}
{{ .Content }} {{ .Content }}
<!-- only show related posts if param is true, or if it's not a page --> <!-- only show related posts if param is true, or if it's not a page -->
{{ if or (eq .Params.related true) (ne .Params.page true) }} {{ if or (eq .Params.related true) (ne .Params.page true) }}

View File

@@ -0,0 +1,25 @@
{{- $page := . -}}
{{- $image := "" }}
{{- with $page.Params.headerimage }}
<div class="header-image">
{{- if eq $page.BundleType "leaf" }}
{{- with $page.Resources.GetMatch .src }}
{{- $image = . }}
{{- end }}
{{- else }}
{{- with resources.GetMatch (printf "**/%s" .src) }}
{{- $image = . }}
{{- end }}
{{- end }}
{{- $processes := .processes | default (slice "fill 1000x440 webp" )}}
{{- $filter := .filter }}
{{- if not $image }}
{{- warnf "Header image '%s' not found for page %s" .src $page.RelPermalink }}
{{- end }}
{{- with $image }}
{{- $image = partial "image-processing" (dict "image" $image "processes" $processes "filter" $filter) -}}
<img src="{{ .RelPermalink }}" />
{{- end }}
{{- with .text }}<p>{{ . | markdownify }}</p>{{ end }}
</div>
{{- end }}

View File

@@ -0,0 +1,27 @@
<div class="blog-links">
{{- with .Params.event }}
<a class="btn btn-default button-event" href="{{ .href }}" target="_blank" aria-label="Event Page" role="button">
<i class="fas fa-calendar-alt" aria-hidden="true"></i>&nbsp;&nbsp;{{ .name }}
</a>
{{- end }}
{{- with .Params.audio }}
<a class="btn btn-default button-audio" href="{{ . }}" target="_blank" aria-label="Audio Recording" role="button">
<i class="fas fa-microphone" aria-hidden="true"></i>&nbsp;&nbsp;Listen to Recording
</a>
{{- end }}
{{- with .Params.article }}
<a class="btn btn-default button-article" href="{{ .href }}" target="_blank" aria-label="Related Article" role="button">
<i class="fas fa-newspaper" aria-hidden="true"></i>&nbsp;&nbsp;Read {{ .name }} Article
</a>
{{- end }}
{{- with .Params.video }}
<a class="btn btn-default button-video" href="{{ . }}" target="_blank" aria-label="Video Recording" role="button">
<i class="fas fa-video" aria-hidden="true"></i>&nbsp;&nbsp;Watch Recording
</a>
{{- end }}
{{- with .Params.slides }}
<a class="btn btn-default button-slides" href="{{ . }}" target="_blank" aria-label="Slides" role="button">
<i class="fas fa-desktop" aria-hidden="true"></i>&nbsp;&nbsp;View Slides
</a>
{{- end }}
</div>

View File

@@ -0,0 +1,13 @@
{{- $cats := .Page.Params.categories }}
{{- $symbols := dict "article" "🗞️" "presentation" "🎤" "podcast" "🎧" }}
{{- $icon := "" }}
{{- $title := "" }}
{{- range $cat := $cats }}
{{- with index $symbols $cat }}
{{- $icon = . }}
{{- $title = $cat | humanize }}
{{- end }}
{{- end }}
{{- with $icon }}
<span title="{{ $title }}">{{ $icon }}&nbsp;&nbsp;</span>
{{- end -}}

View File

@@ -0,0 +1,12 @@
{{- $cats := .Page.Params.categories }}
{{- $symbols := dict "article" "Article published" "presentation" "Presentation given" "podcast" "Podcast released" }}
{{- $selection := "" }}
{{- range $cat := $cats }}
{{- with index $symbols $cat }}
{{- $selection = . }}
{{- end }}
{{- end }}
{{- if not $selection }}
{{- $selection = "Blogged" }}
{{- end }}
{{- return $selection }}

View File

@@ -12,8 +12,6 @@
{{- $title = print .Site.Title " | " .Title -}} {{- $title = print .Site.Title " | " .Title -}}
{{- end -}} {{- end -}}
{{- end -}} {{- end -}}
{{- $image := path.Join "/img" .Site.Params.avatar -}}
{{- if isset .Params "headerimage" }} {{ $image = print "img/" .Params.headerimage }} {{ end -}}
<meta charset="utf-8" /> <meta charset="utf-8" />
<meta http-equiv="X-UA-Compatible" content="IE=edge" /> <meta http-equiv="X-UA-Compatible" content="IE=edge" />
<meta name="viewport" content="width=device-width, initial-scale=1" /> <meta name="viewport" content="width=device-width, initial-scale=1" />
@@ -29,18 +27,32 @@
<!-- CSS and JS --> <!-- CSS and JS -->
{{- partialCached "head/css.html" . }} {{- partialCached "head/css.html" . }}
{{ "<!-- Open Graph meta-data (e.g. Facebook) -->" | safeHTML }} <!-- Get image for social media sharing -->
<meta property="og:title" content="{{ $title }}"/> {{- $image := "" -}}
<meta property="og:url" content="{{ .Permalink | absURL }}"/> {{- $imagesrc := (.Page.Params.headerimage.src | default .Site.Params.avatar) -}}
<meta property="og:image" content="{{ $image | absURL }}"/> {{- if eq .Page.BundleType "leaf" }}
<meta property="og:description" content="{{ .Summary | truncate 200 }}"/> {{- with .Page.Resources.GetMatch $imagesrc }}
{{- $image = . -}}
{{- end }}
{{- else }}
{{- with resources.GetMatch (printf "**/%s" $imagesrc) }}
{{- $image = . -}}
{{- end }}
{{- end }}
{{- if $image }}
{{- $image = $image.Fill "1200x630 jpg" -}}
{{- end }}
{{ "<!-- Twitter meta-data -->" | safeHTML }} <!-- Open Graph meta-data (e.g. Facebook) -->
<meta name="twitter:card" content="summary_large_image"/> <meta property="og:type" content="article"/>
<meta name="twitter:site" content="@{{ .Site.Params.social.twitter }}"/> <meta property="og:site_name" content="{{ .Site.Title }}"/>
<meta name="twitter:title" content="{{ $title }}"/> <meta property="og:title" content="{{ $title }}"/>
<meta name="twitter:description" content="{{ .Summary | truncate 200 }}"/> <meta property="og:url" content="{{ .Permalink }}"/>
<meta name="twitter:image" content="{{ $image | absURL }}"/> <meta property="og:description" content="{{ (.Summary | default .Site.Params.description) | truncate 200 }}"/>
<meta name="twitter:url" content="{{ .Permalink | absURL }}"/> {{- with $image }}
<meta name="twitter:creator" content="@{{ .Site.Params.social.twitter }}"/> <meta property="og:image" content="{{ .Permalink }}"/>
<meta property="og:image:type" content="{{ .MediaType }}">
<meta property="og:image:width" content="{{ .Width }}">
<meta property="og:image:height" content="{{ .Height }}">
{{- end }}
</head> </head>

View File

@@ -0,0 +1,32 @@
{{- /* Expects .image (resolved image resource), optionally .processes and .filter */}}
{{- $image := .image }}
{{- range .processes }}
{{- $image = $image.Process . }}
{{- end }}
{{- with .filter }}
{{- $filters := slice }}
{{- range . }}
{{- range $method, $args := . }}
{{/* No, this cannot be generalised, as strings cannot be converted to functions... */}}
{{- if eq $method "GaussianBlur" }}
{{- $filters = $filters | append (images.GaussianBlur $args) }}
{{- else if eq $method "Brightness" }}
{{- $filters = $filters | append (images.Brightness $args) }}
{{- else if eq $method "Opacity" }}
{{- $filters = $filters | append (images.Opacity $args) }}
{{- else if eq $method "Pixelate" }}
{{- $filters = $filters | append (images.Pixelate $args) }}
{{- else if eq $method "Saturation" }}
{{- $filters = $filters | append (images.Saturation $args) }}
{{- else if eq $method "Sepia" }}
{{- $filters = $filters | append (images.Sepia $args) }}
{{- else if eq $method "Grayscale" }}
{{- $filters = $filters | append images.Grayscale }}
{{- else }}
{{- warnf "Unsupported filter: %s" $method }}
{{- end }}
{{- end }}
{{- end }}
{{- $image = $image.Filter $filters }}
{{- end }}
{{- return $image }}