Orkpiraten

Thinking and Playing and Testing

Ok, story time kids. Once upon a time, I decided I needed a blog. That time was 1996 or so, and I hosted it on whatever I could, posting whatever came through my mind. The whole thing moved from hand coded html to hand coded active server pages, to hand coded php to Serendipity and eventually to WordPress.

It stayed a WordPress site for maybe 10, 15 years?

At some point it got hacked, I cleaned it up, then it got hacked again, so I cleaned it up again and sometime near the end of last year it got so thoroughly fucked that I took everything offline and looked into static site generation.

Hugo, eleventy and others got evaluated and I hated all of it. Eventually I settled on Grav, but it lacked things like interaction and was finicky in other parts.

So, this is my attempt with Write Freely, mostly because it does offer ActivityPub federation.

But while Write Freely can import markdown files, it isn't really good at doing so as a migration functionality. Metadata gets lost, most importantly posting dates.

I griped about it a while and eventually realised that I could import things via SQL. So the task became clear:

  1. Export everything from my previous WordPress installation into a WordPress export XML file
  2. let te WordPress Export to markdown tool loose on that file to generate a bunch of markdown files and download all the images that are linked in there.
  3. ask Copilot to write a python script that converts those markdown files with frontmatter metadata into an SQL script
  4. tweak that script until it actually works and produces SQL that doesn't clash with the WriteFreely database constraints
  5. Then realise that a bunch of pictures are missing because the wordpress-to-markdown tool couldn't find them at their original path anymore. Hunt those down.
  6. Realise that Write Freely doesn't really do pictures. Hah.
  7. set up an extra web service on the NAS to serve those pictures.
  8. Do regex search&replace to fix picture URLs
  9. Import and test, repeat until everything works.
  10. ...
  11. Just kidding, there's no profit here!

If you're interested, here's the code I got from Copilot, slightly tweaked by me:

#!/usr/bin/env python3
import os
import re
import yaml
import logging
import unicodedata
import random
import string
from datetime import datetime
from tqdm import tqdm

# ---------- CONFIG ----------
ROOT_DIR = "./output"   # folder containing your markdown hierarchy
OUTPUT_SQL = "writefreely_import.sql"
OWNER_ID = 1
COLLECTION_ID = 1
# ----------------------------

# 🔥 MUST be here — global slug registry
slug_registry = {}

logging.basicConfig(
    filename="conversion.log",
    level=logging.INFO,
    format="%(asctime)s [%(levelname)s] %(message)s"
)

def generate_post_id():
    """Generate a WriteFreely-style 16-char base62 ID."""
    alphabet = string.ascii_letters + string.digits
    return ''.join(random.choice(alphabet) for _ in range(16))

def slugify_unique(title):
    """Generate a slug and ensure uniqueness by adding numeric suffixes."""
    # Base slug
    base = unicodedata.normalize("NFKD", title)
    base = base.encode("ascii", "ignore").decode("ascii")
    base = re.sub(r"[^a-zA-Z0-9]+", "-", base).strip("-").lower()[:20]

    if base == "":
        base = "post"

    # Check for duplicates
    if base not in slug_registry:
        slug_registry[base] = 1
        return base

    # Collision → append suffix
    slug_registry[base] += 1
    new_slug = f"{base}-{slug_registry[base]}"

    logging.warning(f"Duplicate slug detected: '{base}' → using '{new_slug}'")

    return new_slug


def detect_language(text):
    german_chars = "äöüÄÖÜß"
    german_count = sum(text.count(c) for c in german_chars)

    return "de" if german_count > 2 else "en"

def normalize_taxonomy(value):
    """Ensure taxonomy fields are always lists, even if quoted or single."""
    if value is None:
        return []
    if isinstance(value, list):
        return [str(v).strip('"') for v in value]
    if isinstance(value, str):
        return [value.strip('"')]
    return []

def parse_markdown(path):
    with open(path, "r", encoding="utf-8") as f:
        content = f.read()

    parts = content.split("---")
    if len(parts) < 3:
        raise ValueError(f"File {path} missing front matter")

    front_matter = yaml.safe_load(parts[1])
    body = "---".join(parts[2:]).strip()

    title = front_matter.get("title", "Untitled")
    date_raw = front_matter.get("date", "2000-01-01")

    # normalize date
    # dt = datetime.strptime(date_raw, "%Y-%M-%D")
    created = date_raw

    taxonomy = front_matter.get("taxonomy", {})
    categories = normalize_taxonomy(taxonomy.get("category"))
    tags = normalize_taxonomy(taxonomy.get("tag"))

    all_tags = list({t for t in categories + tags})

    language = detect_language(body)
    slug = slugify_unique(title)

    return {
        "title": title,
        "slug": slug,
        "created": created,
        "content": body,
        "language": language,
        "tags": all_tags
    }

def generate_sql(posts):
    sql_lines = []
    tag_lines = []

    for post in posts:
        post_id = generate_post_id()
        title_sql = post['title'].replace("'", "''")
        content_sql = post['content'].replace("'", "''")
        sql_lines.append(
            f"INSERT INTO posts "
            f"(id, slug, text_appearance, language, rtl,  view_count, privacy, owner_id, collection_id, "
            f"created, updated, title, content) VALUES ("
            f"'{post_id}', '{post['slug']}', 'norm', '{post['language']}', 0, 0, 0, "
            f"{OWNER_ID}, {COLLECTION_ID}, "
            f"'{post['created']}', '{post['created']}', "
            f"'{title_sql}', '{content_sql}');"
        )


        for tag in post["tags"]:
            tag_clean = tag.replace("'", "''")
            tag_lines.append(
                f"INSERT INTO post_tags (post_id, tag) VALUES ('{post_id}', '{tag_clean}');"
            )

    return "\n".join(sql_lines + tag_lines)

def main():
    posts = []
    md_files = []

    # Collect markdown files
    for root, dirs, files in os.walk(ROOT_DIR):
        for file in files:
            if file.endswith(".md"):
                md_files.append(os.path.join(root, file))

    logging.info(f"Found {len(md_files)} markdown files.")

    # Process with progress bar
    for path in tqdm(md_files, desc="Processing markdown files"):
        try:
            post = parse_markdown(path)
            posts.append(post)
            logging.info(f"Parsed: {path}")
        except Exception as e:
            logging.error(f"Error parsing {path}: {e}")

    sql = generate_sql(posts)

    with open(OUTPUT_SQL, "w", encoding="utf-8") as f:
        f.write(sql)

    logging.info(f"SQL written to {OUTPUT_SQL}")
    print(f"Done! SQL written to {OUTPUT_SQL}")

if __name__ == "__main__":
    main()

I also write about roleplaying games in english und auf Deutsch!

Let's talk about Cruise Ships. Due to a combination of my dads bucket list, my moms aversion to flying and the general wish of families to occasionally do things together, I've found myself on one of those, because the alternative was a very long road trip in a car, interspersed with a long ferry ride.

But the why isn't important, the experience of the Cruise itself is what I want to write about.

And while there is a lot of complaining in this post, I want to really drive home that the individuals we encountered are really pleasant and earned the hefty tips we gave them. We're having a great time all in all, but some things prevented us from having the best one, and they could have been easily avoided…

Cruise Ships are big hotels on the sea where they try to extract a lot of money from about 3000 people over two weeks. Some of these pay a lot up front and get a nice cabin with a view and perks, and some pay less money up front, get a dark hole in the bowels of the ship and less perks and pay for every extra.

I'm luckily in the former category right now. We have a “Suite”, a package deal that gets us most drinks and food free, extra ice cream and a butler. (Whose services we're not really using, because, uh, we don't need them?)

Still, there are a lot of small and big frustrations about the whole thing:

The ship is big

3000ish passengers, about a 1000 crew, 14 decks, 30ish lifts, corridors, shops, swimming pools, several restaurants, bars…

And it's a maze.

Not all decks allow you to get all the way from front to back of the ship, the corridors all look alike (although the artwork is very subtly of a different theme for each deck). There are of course no windows in the corridors, and there is no way to easily know if you're walking towards the front or the back, or on which side of the ship you are. It's mildly disorienting at best.

There is a constant uncertainty

Breakfast and dinner times vary. The information about what is and what isn't included in your package deal isn't clearly spelled out in one place. The website tells you to reserve a spot in the buffet restaurant even though the booked package allows you to go to the “premium” one whenever you want. You get a table assigned on your board card, but you can actually sit wherever you want.

You get day-to-day information that is hidden in marketing speak and when you ask for clarification, there are five different places you can ask for them, and only one of them actually knows the answer.

There is an app that you can use, but it only fully works when you're connected to the ship wifi, and not when you're out on an excursion on land. Also, the quality or precision of the available information varies quite a bit.

And did I mention that some of the restaurants and places have different names depending on time or occasion?

The Upsells

I understand that this ship is a money-extracting machine. And of course Spa treatments or fancy dinners or special drinks cost extra. But we're eating in the “fancy” restaurant, where you already get a variety of three course meals included in the package.

It feels pretty cheap when they then have someone walk around with an iPad showing a fancy lobster dinner that you can pre-book for the dinner in two days and ask at every table if they want to upgrade. And then come over with the expensive cocktail menu. Every. Fucking. Day.

On top of that there are lots of ship photographers who'll try to rope you in to staged and not so staged photography. The results you can buy on paper for a considerable sum for each photograph. In itself nice, but you still constantly find yourself saying no to people who get into your face.

That extends to the activities as well: They are opportunities to sell products.

The staged “experiences”

You know these bartenders that mix cocktails in a theatrical way, then serve them with a flourish? Or those dishes that get prepared to you at the table?

This cruise has a lot of that, except that the people doing it haven't come up with themselves. Instead, they are painstakingly, obviously, and painfully following a script given to them by someone from high up in the foodchain. And in the restaurant, there are even immediate supervisors who will actively take a hand in correcting or “helping” them.

Both of these things completely ruin the experience: The server is trying to do their job, having a smile on and trying to do the flourishes “just right”. And then the supervisor comes in and shows them how to cut the cheese.

Worse: You tell the server to please put the pork on a different plate of the group sampler, because food allergies, and then the supervisor swoops in and puts the salami right next to the falafel because “that's how it is supposed to look!”

People and the entertainment

I get it. Cruise ships are inherently for people-people. And especially for those who don't have a cabin with a view, entertainment on ship is a thing that is important to have. So there is. Except that all of it is loud and in your face.

Think Bingo nights, group dances, music in bars… all of that is aimed at extroverts and people who don't mind loud places.

We found one bar (thanks to the server in the Wine Bar, who recommended us to sample the Velvet Underground cocktail in the Sunset Bar) that was small, not too loud, and had interesting cocktails. She also made clear to us that this bar was also included in our particular package, despite what the app said. We had a drink, loved the place, and then head to leave again because our food was ready.

Next day, there was loud music and a person with a microphone cheering on and narrating in painful and scripted detail how one of the cocktails was mixed. Seriously, just turn the music down, and then the four people in the bar actually interested in that could hear the barkeep explain the thing by themselves. But no, corporate had decided that there was to be a script…

Dear cruise line, here's my recommendation

I'm absolutely aware that they aren't reading this blog. Maybe I'll send them a mail. But still, any cruise product manager, here's my suggestions based on what I experienced myself and have heard from others on this trip:

  • Keep in mind the Cruise Newbies That means that they won't know how to navigate the dozens of bars and restaurants, they won't know what to do about the safety drill, and when there is rougher than usual seas and the PA system talks about knots, they have no idea if they are in danger or not.

  • Have dedicated quiet areas. Yes, these cost valuable space, and can't be used for upsells. But you'll have more introvert customers. You know, those who pay money to be left alone, which is a pretty cheap thing to give to them.

  • Don't bury information in niceties. I know, you want to be friendly and all corporate in your communications, but for the important bits, keep to the what, when, where, and who. Best in a bullet list format.

  • Make port&starboard sides and stern&aft visually distinctive. Different carpet colours, different wallpaper, and so on. Make it easy to get a feel of a location. People shouldn't have to look for the next sign to have a feel of where they are. Especially in the interior corridors.

  • Make the upsells more subtle. Especially for those that already have paid more than €4k Euros per person to be on the ship. They can probably afford the upsells, but they don't want to be annoyed over them.

  • Make acting on information about food allergies a priority. This isn't directed at the individual staff people (who generally were good about that), but at the system that obviously isn't geared at keeping the information at hand. Especially when “stagecraft” trumps a servers discretion on how to best handle food for a table with known allergies.

  • Either upgrade your stagecraft, or ditch it. Most of the service crew were really friendly and competent, but got hampered by the theatrics forced on them. And the interactions with them became a lot more pleasant and also effective, if they weren't obviously following a script.

  • Work on your customer-facing website and app. It's a pain to log on, information is scattered all about and a lot of the questions my mom asked me weren't answered at all anywhere, or buried deep. (“Is there a hairdryer in the room” for example. “What exactly is included?” another.) And don't get me started on the fact that you cannot do certain things in the app if you aren't on board. And one day, I got logged out of the app, and when logging back in it informed me that my internal chat will be deleted, because the app was convinced I was on a new device…

  • Again: Clear communication instead of flowery corpo speak please! At one point, I got a note that I was invited to link my credit card to my onboard card (which opens the cabin can also be used to pay for stuff onboard). What the note actually meant was “there are port fees you need to pay”, which my partner explained to me when I was about to not just follow the invitation.

  • Get better at managing people flows. Generally, this was on point, but a lot of it was impromptu and haphazard. Fine in general, but very annoying if you mix self-confident assholes and polite people pleasers in the same line and expect them to sort things out by themselves. Not cool.

Conclusion

Again, this was all in all a very pleasant experience. But to be honest, my expectations weren't quite met. Of course it helped that we went to one of my favourite holiday destinations (Iceland), and, again, the staff we personally interacted with were pleasant, friendly and went to lengths trying to make our experience a nice one.

But as so often, systemic forces worked against that, and maybe someone will someday come up with a Cruise concept that will appeal to me :).


I also write about roleplaying games in english und auf Deutsch!

For a while now, I've been tinkering with my own roleplaying game, Raiders of Arismyth. One of the things I realised early on was that I need a good way lookup rules and other information quickly. Find the proper tables, skill descriptions and so on, and to be able to disseminate it to my players.

I briefly tried elventy, Hugo and similar frameworks, but found out that I'm not enough of a developer to actually enjoy doing that. But then, I've been using Obsidian for a while now to do random notetaking and to organize my campaign notes. Turns out, with the right plugins and other setup, this is pretty good!

So, what am I using, and how?

To start with, I've installed Obsidian, obviously. I'm storing the vault on my NAS, so I can access it via SMB share and webdav, regardless of where I am. I'm using the following plugins:

  • Core plugins
    (These are mostly enabled by default anyway)

    • Backlinks

    • Command palette

    • File Recovery (just in case)

    • Note composer

    • Files

    • Graph view

    • Page preview

    • Quick switcher

    • Templates

  • Community plugins

    • Dataview
      This enables queries to quickly add lists or tables composed from other notes, a godsend when it comes to compiling skill lists and such. The “News” section pseudo-blog is also compiled with this.

    • Dataview Serializer
      Dataview doesn't always play nice when exporting the whole vault to a website – the serializer plugin sorts that out by writing the result of the Dataview directly into the note.

    • Style Settings with the ITS Theme by SIRvb
      purely aesthetical, it makes the whole notebook look vaguely like a D&D book (I'm using WOTC/Beyond as TTRPG theme)

    • Virtual Linker / Glossary
      I find this super useful: I have a glossary folder, and whenever the plugin finds a glossary note title in any of the other notes, that becomes a link. And inside of Obsidian itself, the link even gets a hover-preview.

    • Webpage HTML Export
      This is what makes the site creation magic. The plugin grabs all notes and folders and files I tell it to grab, wraps them in some javascript and presto, you get something that can be uploaded to a webserver and provides a nice static site.

Whenever I want to update the site, I use the Command palette to trigger “Generate HTML Export using previous settings”. Obsidian itself doesn't upload the result, for that I use a WinSCP shortcut on my desktop. It is not the most streamlined or automated process, but easy enough. The downside is that I really need to have an installed Obsidian on a desktop device – I cannot edit the Vault from the web, nor can I trigger the website update that way.

On the upside, I don't need to worry overly about the website being hacked through unsafe PHP scripts, so there's that. :)


I also write about roleplaying games in english und auf Deutsch!

Was passiert?

Baba Yaga, die coolste Sau der KĂĽhnen Intrigierend Logistisch Lochmachenden Erwerbs Romantiker (K.I.L.L.E.R.) ist tot. Nun geht es um die Wurst: Wer wird Baba Yaga und kann diesen Shootout fĂĽr sich gewinnen?

Was Ihr braucht:

Nix. Wer allerdings im kompletten schwarzen Anzug inklusive Krawatte auftaucht, bekommt eine MĂĽnze mehr.

Sicherheit

  • Umstehende sind zu verschonen, und generell mit RĂĽcksicht zu behandeln!

  • Spielt fair und freundlich!

  • Rennt niemanden um, springt nicht ĂĽber Verkaufsstände etc.

  • Es darf nur auf die Brust geschossen werden. RĂĽcken, Kopf, Arme, Beine – all das zählt nicht.

  • Triffst Du doch einen Kopf, musst Du der getroffenen Person (egal ob KILLER oder Umstehende) eine Deiner MĂĽnzen geben.

  • Es dĂĽrfen nur ausgegebene bzw. vom Contin- err, von der Zombiecalypse mit MĂĽnzen erworbenen Blaster und Darts verwendet werden.

Allgemeines

  • Verschossene Darts dĂĽrfen aufgesammelt werden. Wenn Ihr sie wiederfindet…

  • Während der Jagd MUSS der MĂĽnzanstecker sichtbar an der Brust getragen werden

  • Gejagt wird Samstags, von 12 bis 20 Uhr, auf dem ganzen Congelände!

  • Das Continent- err, die Zombiecalypse, alle Toiletten, Rollenspiel- und Workshopräume, die Markthalle und die Mensa, sowie 3 Meter um die Eingänge zu diesen Orten sind Neutraler Boden. Dort darf niemand angegriffen werden. Wer vor solchen Orten als “Camper” erwischt wird, muss Blaster und alle MĂĽnzen abgeben.

Gegner erwischen

  • Wer auf die Brust getroffen wird, muss eine MĂĽnze an den SchĂĽtzen abgeben, und die MĂĽnzanstecker auf der Brust mit den Händen verdecken um zu signalisieren, dass man gerade aus dem Spiel ist, und entweder zur Zombiecalypse oder zur Mensa gehen.Von dort startet man mit den restlichen MĂĽnzen neu ins Spiel. Der SchĂĽtze darf nicht dahin folgen.

Check-In in der Signal-Gruppe

Es gibt eine Chatgruppe via der Signal App. Alle Teilnehmenden treten dieser bei und posten ein Selfie in die Gruppe. Das hilft, andere KILLER auf dem Con zu entdecken. Wer eine MĂĽnze ergattert hat, macht idealerweise ein Bild vom Opf- err, freundlichen Spender und sich selbst fĂĽr die Gruppe. Lasst uns wissen, wie Euer Punktestand ist!

Zusätzlich können Regelfragen, Herausforderungen, und sonstige Meldungen über diese Gruppe gehen. Und nicht vergessen: Es ist immer möglich, dass das Continental Sonderaufgaben oder Challenges stellt, bei denen noch mehr Münzen winken.

Die Gruppe findet sich hier: https://signal.group/#CjQKIPHd0jY433v54JGeNHr0NtY_kmgnHLr4kfRKv-6TLF3JEhC4Mp36fOhWVLpoebrvYl_w

Was ist das mit den MĂĽnzen?

  • Teilnehmende erhalten bei der Anmeldung drei MĂĽnzanstecker, 3 Darts, und einen Blaster.

  • Alle MĂĽnzanstecker, die man hat, mĂĽssen auf der Brust getragen werden.

  • Wer seine letzte MĂĽnze abgibt, scheidet aus dem Spiel aus. Kehrt zur Zombiecalypse zurĂĽck und gebt Euren Blaster in Austausch gegen einen Trostpreis ab.

  • Bei der Zombiecalypse kann man MĂĽnzen gegen zusätzliche Darts und ggfs. andere Goodies eintauschen.

  • Wer am Ende die meisten MĂĽnzen vorzeigen kann, gewinnt das Spiel

  • Ihr könnt mit den MĂĽnzen ansonsten machen, was immer Ihr wollt: Handeln, verschenken, verleihen, verkaufen...

Neueinsteigen leicht gemacht

Alle volle Stunde öffnet das Continental die Tore für neue KILLER – vorausgesetzt, es ist schon jemand ausgeschieden. Die Neulinge erhalten Blaster und Münzen und stellen sich in der Chatgruppe vor.

Was ist, wenn ich weg muss?

Wer das Spiel vorzeitig beenden will oder muss, meldet sich bitte beim Continental ab. Ihr gebt Münzen und Blaster ab und erhaltet eine kleine Auszeichnung fürs Überleben. Gewinnen könnt Ihr dann aber nicht mehr. Seid fair, und verlasst nicht mit einem Dutzend Münzen Vorsprung das Congelände!


I also write about roleplaying games in english und auf Deutsch!

I have a “Manual of Me” in my professional e-Mail signature for a while now. That describes when and how to reach me, and how I communicate or set tasks.

What it doesn't do in depth or any detail is describing what I'm really good at or what I'm bad at.

And that is something that no team should ever ask from its members. Forcing people to write down or reveal what they are good and bad at is… bad. For multiple reasons:

One reason is that a lot of times, people don't really know what their relevant weaknesses are. Or they don't like to face them. Or they know them, face them internally, but won't ever admit to them to their boss or coworkers. Because, let's face it, there is a real risk that this will be used against them.

In those cases, you'll end up with weaknesses as “too driven”, “too detail oriented”, “not taking breaks enough”, with the hopes that they'll look good.

The other thing is that what I might perceive as a big weakness might actually be insignificant in the team dynamic. Who cares if I can't do math in my head at the speed of thought, I have a calculator app and a spreadsheet available at all times anyway!

So instead, I recommend thinking and talking at length within a team about how one communicates, decides, and documents things. There are lots of differences on how this can happen, especially if you cross cultural borders by having a diverse multinational team. (see https://erinmeyer.com/books/the-culture-map/)

Putting those differences and preferences out into the open is really useful.

Things that are good to explain about oneself

Get your folks to explain themselves in these terms:

  • what are their productive/waking hours? Are they night owls, early birds, or something in between?

  • Do they prefer face-to-face, synchronous, asynchronous or just written communication?

  • How do they like to separate documentation and decision-making?

  • What is their instinct when it comes to looking for information? Which systems do they use, who do they ask (if they ask someone at all)?

  • What are their notification etiquette? Are there times where you shouldn't try to call them, or is that something you don't need to worry about?

  • How do they want to get tasks assigned and reviewed, how do they do this themselves?

  • What are their preferred ways of addressing them? Honorific, nicknames, full names, pronouns, the works.

A tangent on leadership

I strongly advise that the team lead or most senior person of the group leads by example here. Don't put the onus on the others to find out what is appropriate to share or tell, don't let them guess what is necessary information. This is absolutely a managerial responsibility, to set the tone and expectations in a way that doesn't discourage people, or makes them write in supplicant answers, in the hope to not look bad.

Communication can and should be trained, but it needs to start honest and open. If your team thinks they cannot be that way, you won't get anywhere with them.

And power imbalances, even if you're the most approachable manager of all, are still a thing. Subordinates will always have the next firing/hiring/promotion round in the back of their minds. Individual members of your team might thus not only worry about how they are perceived by you, but also by their peers, who could gleefully exploit any (perceived) weaknesses of others in order to get that promotion for themselves, or to prevent being axed when the inevitable downsizing comes.

Back to self descriptions

Self descriptions are useful. They make unspoken assumptions visible and clear, they highlight the differences between individuals in a way that makes them useful instead of a source of conflicts.

And they provide the basis on which to improve communication and collaboration within a group of people.

These self descriptions are not an end to themselves, they are a tool to figure out future collaboration and communication. Ideally, you encourage everyone to revisit their and other people manuals every now and then too.


I also write about roleplaying games in english und auf Deutsch!

Danger Zone und dnalorsblog schrieben vor einiger Zeit ĂĽber das FĂĽr und Wider bezĂĽglich der Orks, in Reflektion auf einen der Essays in Roll Inclusive. Und auch der Deutschlandfunk spricht ĂĽber das Thema. Im Endeffekt gibt es folgendes Spannungsfeld:

  • Othering ist Mist, macht Empathie kaputt und sollte eigentlich nie eingeĂĽbt werden.

  • Monster verkloppen ist ein integraler Bestandteil des Fantasy-Rollenspiels, und sollte ohne echtwelt-moralische Bedenken möglich sein.

Um “moralisch unbedenklich” Spaß an der Monsterklopperei haben zu dürfen, müssen diese Monster leider eben doch ge-“othered” sein. Denn wie dnalorsblog schildert, kann man nicht mehr nach Herzenslust Goblins weghauen, wenn diese eine Kultur und Daseinsberechtigung bekommen haben. Wenn eine Welt ihre eigene Monster Ecology hat, dann haben eben auch Orks und Goblins ihre Daseinsberechtigung, und sind keine gesichtslosen Monster mehr.

Jetzt schreibe ich ja gerade selbst an einem Monsterklopper-Rollenspiel, Raiders of Arismyth. Das Thema ist also für mich daher brennend interessant. Die Leute sollen Spaß mit Kämpfen in dem Spiel haben, und daher brauchen Sie Monster mit denen sie kämpfen können. Manchmal sollen sie dabei auch darüber nachdenken, mit wem sie warum kämpfen.

Aber eben auch nicht immer. Manchmal soll einfach der interessante Kampf und das Gekloppe im Vordergrund stehen, und die Moral nicht das zu beackernde Problem sein. Und damit kommen wir zu den Orks.

Die meisten Gegner in meinen Spielrunden haben eigene Motivation die mehr ist als nur “ich bin böse!” ist. Sie sind hungrig, versuchen Geld zu verdienen, jemanden beschützen, und so weiter. Manchmal kann man so Kämpfe umgehen, und manchmal sind die Dinge, die die Gegner wollen absolut konträr zu denen der Gruppe.

Orks bei mir sind anders. Sie sind wortwörtlich nicht von dieser Welt. Kein Ork, dem man in meiner Spielwelt begegnet ist einfach nur da. Es gibt keine Orkdörfer mit Orkbabies, keine unschuldigen “ich bin nur Farmer” Orks. Zumindest nicht in der Spielwelt. Wahrscheinlich gibt es all das auf der Herkunftswelt der Orks, aber die ist... woanders.

Orks, denen man auf meiner Spielwelt begegnet sind die selbstgewählte Speerspitze einer Invasion, mit sinistren Zielen. Die Details dazu wollen noch im Spiel herausgefunden werden, aber eines wissen alle am Tisch: Die Orks sind Monster, und sie sind es nicht qua Geburt, sondern weil sie es so wollten.

Alle anderen Gegner sind vielschichtig, die Gruppe ist sich nie wirklich sicher, welcher Gruppe sie nun wirklich feindlich gegenĂĽber stehen sollen. Aber Orks? Orks sind zum wegkloppen da.


I also write about roleplaying games in english und auf Deutsch!

3D printing things is one of my hobbies. And while I am reasonably happy with the printer I currently have,there's always a new and shinier resin 3D printer around the corner.

But they rarely manage to really excite me in the way that I actually want to swap.

So, this is the laundry list of things that I want to see in one machine:

  • A heated vat or chamber. I print with an open window, and that means the room can get cool or even cold. 3D printer resin has a certain optimal working temperature, usually between 25 and 30 degrees celsius. That means a bit of heating.

  • A bed pressure sensor. That is pretty useful for two things: It tells the printer when there is something stuck on the bottom of the resin tank, and whether the print is releasing fine from the film. I haven't yet had a printer with such a sensor, but I hear brilliant things about them.

  • A tilting resin vat. Again, not something that I had so far, but the Prusa MSLA printer and the new Elegoo Saturn do feature this, and apparently it makes for cleaner and faster prints.

  • A decent build volume. 20x30x30 would be ideal, but 20x25x25 is fine too.

  • A decent resolution of pixels per cubic inch. Although, to be fair, all current printers have that. This is not where technology needs to advance.

  • Fill lines in the vat. Really, how hard is that?

  • A slide in locking mechanism for the vat. I have it on my GKTwo, and it is brilliant.

  • Same for the lever locking mechanism for the build plate. Again, brilliant.

  • Magnetic flexible steel sheets that attach to the build plate that aren't after market installs. All the FFF 3D printers have these by now, why not the resin ones? It's super useful.

  • Flip up lids, or doors. With a handle. None of this “lifting a shroud and then looking for a place to put it” nonsense.

  • An easy way to add an external ventilation hose. Generally, good air management, to keep the resin fumes controlled.

  • A good way to filter the air coming out of the printer.

  • An easy-but-sturdy levelling system. Although again, the GKTwo one works fine for me.

  • A vat with a proper non-drip spout for emptying leftover resin.

  • A non-flimsy vat cover. Sealing the vat firmly, instead of just loosely sitting on it. I want to be able to shake the whole vat full of resin with the cover on!

  • A sensor to pause the print when resin runs out.

  • Feet on the vat, so you don't scratch the FEP when setting it down somewhere

  • Easy to swap screens with a good screen protector by default.

  • A built-in way to cure the whole vat for capture leftover floating resin bits.

  • A built-in way for exposure testing multiple settings in one go, to speed up dialing in any given resin.

  • Any USB or memory card slots and buttons in the front of the device.

  • Surfaces with as little nooks and crannies as possible, to make cleaning the device easier.

The above are basically things I see as must haves in order to make me want to switch. The following are nice to have features:

  • Make the vat high enough to hold a whole litre of resin.

  • Wifi connectivity is nice, but not really that vital for me. IF there is some, I'll mostly use it to monitor the print status and being able to cancel the print in case something went wrong. Starting a print is.. eh, not really a thing I'd do remotely.

  • But managing the sliced files on the printer over wifi, adding and removing them would be nifty.

I see printers that have some of these features, but not one yet that has all of them. Any takers? :)


I also write about roleplaying games in english und auf Deutsch!

...I unironically like the old Warhammer 40K universe depictions and canon. You know, the Rick Priestley, John Blanche era. Where everything was bad, grimy, gloomy and evil.

This is peak Leman Russ, as he should be:

A black and white pencil portrait of "Marine Commander Leman Russ", taken from the first edition Rogue Trader book - his face is warped from scars and cybernetic implants, everything looks distorted and gloomy

Not this:

A colour illustration of a very heroic looking Leman Russ with flowing blonde hair, taken from https://warhammer40k.fandom.com/wiki/Leman_Russ

Warhammer 40,000, as depicted and conceived in the 80ies absolutely was a satire and reaction to Thatcherism in the UK, quite in line with comics like Judge Dredd and other things from the 2000 AD magazine. Space Marines were fucked up purposefully mutated humans that were fighting fucked up accidentally mutated humans.

And in that take of the universe, I think it is fine to have uber-macho all-male Space Marines, to have a devoted cult of the emperor, to have the humans shout “death to all xenos”. Because it is clear from the artwork alone that this is a fucked up world, full of fucked up decisions. No one in there looks or stands in for anyone in our real world, which is a neat thing to have when the game is about wholesale slaughter. (Of course, a lot of the “human factions” take on decorations and themes from armies from our real-world past. But they are so exaggerated, that I don't really think a matching and identification is possible.)

So, yes, I actually like this take. It brings me back to the 80ies, to crusty Punks and Hair Metal, to counterculture and rebellion.

But today, as the artwork starts to become squeaky clean and actually heroic. Games Workshop is clearly trying to focus on about how cool the Space Marines are. Nothing on the surface tells you that they would be fucked up, and the lore keeps telling you that they have to be the way they are, that the xenos threat is real.

And with that, the satire looses its teeth. Games Workshop of course knows this, so they end up having to make the good guys, you know, actually good. These toy soldiers cannot be doing warcrimes left and right anymore, they become more good-looking, and (and that is where the sad puppies start howling at the moon) you start making figures that your whole audience can identify with.

And that means including people of colour, a variety of gender being represented outside of Slaaneesh cults, and so on. Because the factions aren't all villains anymore.

This change is the natural consequence of the slow-but-sure transition of the Space Marines from “crazed fanatics willing to die for the cult of a dead Emperor rotting on his golden throne” to “somehow heroic, noble and virtuous. As good guys.” (quotes from freethoughtblogs.com/pharyngul)

So, if you want the Space Marines and the Empire of Man to be “the good guys”, you have to embrace the good sides of humanity too. And that means including ALL of humanity, in all its multi-gendered, multi-skin-hues, multi-anything glory.Sorry to the sad puppies, I don't make the rules, I'm just telling you how it is.


I also write about roleplaying games in english und auf Deutsch!

Slightly more than a decade ago, I moved from one of the more out there parts of Hamburg back into a more central part. And I loved it. I gained about one to two hours of free time thanks to a shorter commute, I had all the shops and places to eat I wanted in walking distance, things felt more lively overall.

Back then, I vowed I would never go back to that awful place at the periphery.

Two years ago, I moved back to that part, and I love it. What has changed?

Well, for starters, I work from home full time now. That means that awful commute has completely disappeared.

The other reason is that I moved not into the same house as before, but to a place that has all the necessary daily needs within walking distance: Supermarket, bakery, hairdresser, doctors, pharmacy, public transit connection. It is all there and can be reached by less than 5 minutes of walking. Most of them actually under a minute.

At the “awful place”, I had to take a bus (that would leave right from my doorstep admittedly) to the city, but there was no direct connection, and it didn't leave as often as one would love to.

The new place has a bus and a train, and it is a more direct connection too.

But the cincher really is the fact that all the important bits of infrastructure are right here. That is what people need – not more car lanes into the city, but infrastructure for daily life in walking distance. Really, learn this lesson, dear city planners!


I also write about roleplaying games in english und auf Deutsch!

One of the cool things of federated social media is that each instance can have their own rules and conventions.

One of the bad things of federated social media is that each instance has their own rules and conventions.

What do I mean? I started out on octodon.social and felt pretty good there. Then I realized that a lot of people I followed initially went silent. Turns out that they were on infosec.social, and for $reasons (reasons I understand, but don't necessarily need to adopt myself) , the admin of octodon.social blocked that instance. So I eventually and very reluctantly moved to hachyderm.io. Turns out, the same thing is happening there too, just with different servers.

Fediverse moderation has several levels:

  • end user self-defense: “This person did something bad and I prevent them from interacting with me.”

  • moderating local content on a personal basis: “This person on the same server as me did something bad, so here are the consequences for them”

  • moderating external content on a personal basis: “This person on a different server as me did something bad, so I limit how they can interact with people on my server”

  • moderate external content on an instance basis: “I find this whole other instance suspect, so I limit how everyone on that whole instance can interact with people on my server”

If my personal sensibilities and those of the people who moderate my insteance differ (and they will absolutely differ to some degree!), you will at best just miss out on a bit of content but at worst will suddenly be cut off from people you interacted a lot.

This is compounded by the fact that there is no documented consensus for moderation across instances. (Like darcy.is would have provided, btw :) ) You won't know what'll happen until it actually does.

So, for me, the problem is this:

A venn diagramm with four circles.
<div></div>
Three circles are arranged so they do not overlap and are labeled A, B, C.
<div></div>
The fourth circle is in the middle and overlaps each of the other three a bit and is labeled "me"

Yep, that is me, in the middle of a few non-overlapping communities. (There are also a lot of communities that do overlap, but let's ignore those for now) So, when I join a server in community A, and A suddenly decides to defederate from C, I lose that chunk of people. When I join B instead, and they already hate A, I lose out a different chunk.

Finding that elusive instance Z that plays nice with everyone else is gonna be... hard.

And now that folks like Meta and others are opening ActivityPub servers lines are drawn in the sand: “If you federate with Meta, I will block that instance!” Or “if you don't protect the children, I will protect them from you!”. Or “We're sex positive, if you block the furries, I'll defederate from you!”

And here am I, just wanting to talk to my friends and see cat pictures. So, I opt out of the drama and have my own single-person instance now: @jollyorc@social.5f9.de No, don't ask me if you can join it, I don't want that kind of responsibility. Take 9 Euros per month and go to fedi.monster, they'll help you out.


I also write about roleplaying games in english und auf Deutsch!