Welcome! :-)

This is both a wiki (a website editable by all) and a blog (an online diary about the stuff Alex Schroeder reads and does). If you’re a friend or relative, you might be interested in reading Life instead of this page. If you’ve come here from an RPG blog, you might want to head over to RPG. There are other similar categories to be found on the SiteMap.

Für Rollenspieler gibt es ebenfalls eine eigene RSP Kategorie.

2019-11-11 One Page Dungeon Generator

@Provinto recently linked a new generator by the person that did the fantasy city generator:

I just found out about watabou’s new itch.io generator: One Page Dungeon generator (which is maybe just a one-level dungeon generator). Very pretty maps, too.


Add Comment

2019-11-09 Upgrading Debian from Stretch to Buster

I did it! I upgrade the server. No restart required. I was a bit intimidated by the extensive documentation. But I was fine.

First, I improved my backup. I currently use the following:


# Using sudo rsync --archive to preserve ownership.
# Using --fake-super to avoid changes to groups and owners

echo Backing up Sibirocobombus
echo home directory
rsync --archive --fake-super --verbose --compress --delete --delete-excluded \
      --itemize-changes \
      --exclude '/home/alex/logs' \
      --exclude '/home/alex/alexschroeder.ch/share' \
      --exclude '/home/alex/planet/osr/' \
      --exclude '/home/alex/planet/indie/' \
      --exclude '.cpan/build' \
      --exclude '.cpan/sources' \
      --exclude '.cpanplus' \
      --exclude '.cpanm' \
      --exclude '.cache' \
      --exclude '.Trash' \
      --exclude '.local/share/Trash' \
      --exclude 'temp/' \
      --exclude 'pids/' \
      --exclude 'visitors.log' \
      --exclude 'referer/' \
      --exclude '.git/' \
      --rsh="ssh -p 882" \
      root@alexschroeder.ch:/home \

# https://www.debian.org/releases/buster/amd64/release-notes/ch-upgrading.en.html#data-backup
echo etc directory
rsync --archive --fake-super --verbose --compress --delete --delete-excluded \
      --itemize-changes \
      --rsh="ssh -p 882" \
      root@alexschroeder.ch:/etc \
      root@alexschroeder.ch:/var/lib/dpkg \
      root@alexschroeder.ch:/var/lib/apt/extended_states \
      root@alexschroeder.ch:/var/lib/dehydrated \
      root@alexschroeder.ch:/usr/lib/cgit/filters \

I also installed and ran apt-forktracer:

apt install apt-forktracer
apt-forktracer | sort > packages-not-from-debian

I also checked my system using dpkg --audit.

I ran everything inside script -t 2>~/upgrade-busterstep.time -a ~/upgrade-busterstep.script.

I was very afraid!

But eventually I just changed my /etc/apt/sources.list to the following:

deb http://deb.debian.org/debian buster main non-free contrib
deb http://security.debian.org/debian-security buster/updates main contrib non-free

# deb  http://ftp.debian.org/debian stretch main non-free contrib
# deb-src  http://ftp.debian.org/debian stretch main non-free contrib

# deb  http://ftp.debian.org/debian stretch-updates main non-free contrib
# deb-src  http://ftp.debian.org/debian stretch-updates main non-free contrib

# deb http://security.debian.org/ stretch/updates main non-free contrib
# deb-src http://security.debian.org/ stretch/updates main non-free contrib

I guess I should think about updates and security? Or perhaps they aren’t used anymore? I have no idea. I’ll look at this some other time.

Finally I ran the upgrade itself:

apt update
apt upgrade
apt dist-upgrade

I had two changes to system config files:

  1. in /etc/logrotate.conf I changed weeklydaily (keeping 4 days worth of logs instead of 4 weeks)
  2. in /etc/ssh/sshd_config I merged my changes with what upstream had provided

I am amazed to see that the server is still up. It didn’t even reboot. Let me sing the praise of Debian and all the things it includes and all the volunteers and maintainers and testers—thank you all. ❤️

I think I’m going to be fine. 😃

I noticed that I had to reinstall all my pip3 stuff.

For the Mastodon bots:

pip3 install Mastodon.py cairosvg html2text

For Epicyon:

pip3 install requests commentjson beautifulsoup4 pycryptodome

My monitoring also broke down.

Monit stopped monitoring a bunch of stuff because the checksums failed.

Munin isn’t running at all...

Well, time to look at this tomorrow!


Comments on 2019-11-09 Upgrading Debian from Stretch to Buster

Cleaning up non-default config files... I installed debsums and use debsums -ce to find config files that I have changed.

Then I use a little script I got from StackExchange to find the diff.


# Usage: debdiffconf.sh FILE
# Produce on stdout diff of FILE against the first installed Debian package
# found that provides it.
# Returns the exit code of diff if everything worked, 3 or 4 otherwise.

command -v apt-get >/dev/null 2>&1 || {
  echo "apt-get not found, this is probably not a Debian system. Aborting." >&2;
  exit 4; }
command -v apt-file >/dev/null 2>&1 || {
  echo "Please install apt-file: sudo apt-get install apt-file. Aborting." >&2;
  exit 4; }

FILE=$(readlink -f "$1")
while read PACKAGE
  # verify from first installed package
  if dpkg-query -W --showformat='${Status}\n' | grep installed > /dev/null
    DIR=$(mktemp -d)
    cd "$DIR"
    echo "Trying $PACKAGE..." >&2
    apt-get download "$PACKAGE" >&2
    # downloaded archive is the only file present...
    mkdir contents
    # extract entire archive
    dpkg-deb -x "$ARCHIVE" contents/ >&2
    if [ -f "contents$FILE" ]
      # package contained required file
      diff "contents$FILE" "$FILE"
      # cleanup
      rm -Rf "$DIR"
      # exit entire script as this is the main shell
      # with the return code from diff
      exit $RET
      # cleanup
      rm -Rf "$DIR"
done < <(apt-file -l search "$FILE")
# if we are here, it means we have found no suitable package
echo "Could not find original package for $FILE" >&2
exit 3

And if I think the changes I made could be reverted, I run patch --reverse $FILE on the file and paste the diff seen above to revert it.

– Alex Schroeder 2019-11-10 11:38 UTC

The problem I had seems to due to changes I made to the Apache configuration. Apparently I created a special account with password to allow access to Munin from remote systems. This makes sense since I’m running Munin on the server...

*** apache24.conf~	2019-05-16 01:21:08.000000000 +0200
--- apache24.conf	2019-11-10 12:47:00.533056622 +0100
*** 14,25 ****
  Alias /munin/static/ /var/cache/munin/www/static/
  <Directory /var/cache/munin/www>
!     Require local
      Options None
  <Directory /usr/lib/munin/cgi>
!     Require local
      <IfModule mod_fcgid.c>
          SetHandler fcgid-script
--- 14,36 ----
  Alias /munin/static/ /var/cache/munin/www/static/
  <Directory /var/cache/munin/www>
!     Order allow,deny
!     Allow from all
      Options None
+     AuthUserFile /etc/munin/munin-htpasswd
+     AuthName "Munin"
+     AuthType Basic
+     require valid-user
  <Directory /usr/lib/munin/cgi>
!     Order allow,deny
!     Allow from all
!     Options None
!     AuthUserFile /etc/munin/munin-htpasswd
!     AuthName "Munin"
!     AuthType Basic
!     require valid-user
      <IfModule mod_fcgid.c>
          SetHandler fcgid-script

– Alex Schroeder 2019-11-10 11:51 UTC

Add Comment

2019-11-09 Epicyon needs Python 3.6 which needs a Debian upgrade

I’ve tried to install Epicyon on my server but I’m running into a Python problem. I think I have everything set up correctly (my notes below) but I’m getting a syntax error in webfinger.py:

python3 webfinger.py 
  File "webfinger.py", line 81
    return f"data:application/magic-public-key,RSA.{mod}.{pubexp}"
SyntaxError: invalid syntax

I’m using Debian stable (9.11) on my server which means I have Python 3.5.3 installed. f-strings joined Python in 3.6, apparently.

So... Upgrade my server? Make Epicyon work with Python 3.5? Postpone the entire thing?

I don’t know...


I was more or less following the official installation instructions.

Some decisions:

  • I’m not using certbot because I am using dehydrated.
  • I don’t want to install in /etc/epicyon. Let me use /home/epicyon instead.

Install the code as root:

apt-get -y install tor python3-pip python3-socks imagemagick python3-numpy python3-setuptools python3-crypto python3-dateutil python3-pil.imagetk
pip3 install commentjson beautifulsoup4 pycryptodome
adduser --system --home=/home/epicyon --group epicyon
cd /home
git clone https://gitlab.com/bashrc2/epicyon
cd epicyon
./theme purple
chown -R epicyon:epicyon /home/epicyon

Create the demon by creating the file /etc/systemd/system/epicyon.service as follows:


ExecStart=/usr/bin/python3 /home/epicyon/epicyon.py --port 443 --proxy 7156 --domain fedi.alexschroeder.ch --registration open --debug


Activate the demon:

systemctl enable epicyon
systemctl start epicyon

Check how it is doing:

journalctl -u epicyon

On my first attempt I had forgotten to install the Python modules using pip3 and saw the error messages in the journal alerting me to the fact.

As for the website, I’m using Apache. I’m on my own, now. I edited /etc/apache2/sites-enabled/100-alexschroeder.ch.conf because that’s where my site is configured and added the following:

  • a redirect from HTTP on port 80 to HTTPS on port 443
  • the right server name
  • SSL files generated by dehydrated
  • proxying to port 7156

I’m basically trusting my remaining SSL and security settings.

Here’s what I added to the site configuration:

<VirtualHost *:80>
    ServerName fedi.alexschroeder.ch
    Redirect permanent / https://fedi.alexschroeder.ch/
<VirtualHost *:443>
    ServerName fedi.alexschroeder.ch
    SSLEngine on
    SSLCertificateFile      /var/lib/dehydrated/certs/alexschroeder.ch/cert.pem
    SSLCertificateKeyFile   /var/lib/dehydrated/certs/alexschroeder.ch/privkey.pem
    SSLCertificateChainFile /var/lib/dehydrated/certs/alexschroeder.ch/chain.pem
    SSLVerifyClient None
    ProxyPass /             http://alexschroeder.ch:7156/

Next I had to tell my domain name service provider (Gandi) about the new subdomain. In the DNS zone file, I had to add a line for IPv4 and IPv6:

fedi 10800 IN A
fedi 10800 IN AAAA 2a02:418:6a04:178:209:50:237:1

Then I had to tell dehydrated about the new subdomain by editing /etc/dehydrated/domains.txt and changing the line for my site to:

alexschroeder.ch www.alexschroeder.ch fedi.alexschroeder.ch

With that, I was ready to regenerate the certificates (still doing everything as root). The version of dehydrated in Debian isn’t working for me so I have to use a copy of the master branch I checked out.

/home/alex/src/dehydrated/dehydrated -c

And now I should be ready!

  • the domain name server points to the right machine
  • on that machine, the web server knows how to redirect from HTTP to HTTPS for this domain
  • the web server also knows how to proxy HTTPS to port 7156 locally
  • the application is running and listening on the port

Or is it? I’m getting an error! journalctl -u epicyon shows the following:

Nov 09 14:56:01 sibirocobombus python3[27300]: Traceback (most recent call last):
Nov 09 14:56:01 sibirocobombus python3[27300]:   File "/home/epicyon/epicyon.py", line 9, in <module>
Nov 09 14:56:01 sibirocobombus python3[27300]:     from person import createPerson
Nov 09 14:56:01 sibirocobombus python3[27300]:   File "/home/epicyon/person.py", line 19, in <module>
Nov 09 14:56:01 sibirocobombus python3[27300]:     from webfinger import createWebfingerEndpoint
Nov 09 14:56:01 sibirocobombus python3[27300]:   File "/home/epicyon/webfinger.py", line 81
Nov 09 14:56:01 sibirocobombus python3[27300]:     return f"data:application/magic-public-key,RSA.{mod}.{pubexp}"
Nov 09 14:56:01 sibirocobombus python3[27300]:                                                                  ^
Nov 09 14:56:01 sibirocobombus python3[27300]: SyntaxError: invalid syntax


Comments on 2019-11-09 Epicyon needs Python 3.6 which needs a Debian upgrade

I decided to stop Epicyon for now. It was basically using up all the CPU resources I had granted it via systemd. With no actual activity, I find that unacceptable.

Load goes up

Sometime between November 10 and 11 I managed to get it up and running and load goes up, and stays up.

– Alex Schroeder 2019-11-14 21:30 UTC

Add Comment

2019-11-08 Paint Monsters Challenge

I just read A Blogging Challenge: MSpaint Monster Manual by Tristan Tanner on The Bogeyman’s Cave. The challenge is to draw a monster (or more than one) using MSpaint, a very simple paint program for Windows but I’m guessing any tool would work. The important part to me is that this is not the result of years of training and a polished masterpiece but a simple thing that any of us could have done, like running a game or creating a character or writing a session report or drawing a map.


Add Comment

2019-11-08 Mastodon Introduction

Recently a big wave of Twitter users from India joined Mastodon. This page collects some of the posts I made, hoping to do my part in welcoming them to the Fediverse.

For some context: Twitter in India: Why was rival Mastodon trending? It all began with @sanjayuvacha getting suspended from Twitter because he posted the famous picture of August Landmesser.

This is how it started

Wow if you look at the profile of @Deepsealioness you can see the Indian influx as it unfolds. Welcome, welcome! 🥳


If you’re new to Mastodon, write a post and tag it #introduction. Add some more hashtags indicating your interest and post it. Then got to the context menu and pin it to your profile. Click on the hashtags and find other people, new people, welcome them and spread the news. In the beginning, hashtags are an important way of finding people to connect to.

User Interface Quirks

Here’s another Mastodon quick help toot because it took me a while to understand the user interface: if you click on a toot, you will see all the ancestors (the chain that leads to the one you are looking at) and all the descendants (all the replies and their replies in turn). But in order to see the whole conversation, you now need to scroll up to the top and click the first (!) toot of the conversation: you’ll see no new ancestors but ALL the replies.

Image 1 for 2017-01-05 Mermaid

“Verified” Accounts

If you want a cool emoji next to your name, just put it into the name field. You can be 💯☣️❤️⛺️🏔🥇🥋☀️🐥🦁 or whatever else you want. You can even be verified. ✅ But don’t put too many emoji in your name because screen readers will read every single one of them and that gets very annoying very fast, I presume. Mastodon also allows every admin of an instance to have custom emoji that can be seen on other instances. It’s pretty cool. Not all the apps support entering them, though. 😅


If you’re on Mastodon with a single persona, talking about some far out topics can feel odd. People solve this by creating accounts on other instances. I have an account for tabletop roleplaying games on the appropriately named instance tabletop.social. There are other special interest instances! Board games, free software, LGBTQI, and many more. Most Mastodon clients make it pretty easy to switch between instances. Thus, the tradition of alts continues on the Fediverse. See you elsewhere. 🐣


Mastodon Groups have been implemented by third parties using auto-boosting accounts. Here is one example: search for @india@gup.pe (you must type their username into the search box: at India at gup.pe!) and follow them. The gulp.pe server creates the account when you search for it. If you mention it, it will boost your message, and thus everybody else following them will get their message.

If you are interested in a much longer blog post, see 2019-09-26 Groups on Mastodon.

I guess now that I created the India account in gup.pe people no longer need to search for it, they can just follow the link? Even better!

Has it been well received? I don’t know. All I can say is that I haven’t seen much use of it. But it works for everybody, irrespective of clients, using standard activities like following and boosting. 😀

I know is that the Russian speaking community has a bot that does that for them and it seems very active: @rf.

See Also


Add Comment

2019-11-07 Epicyon

Today I stumbled upon Epicyon:

Epicyon is an AGPL licensed ActivityPub protocol compliant federated social network server suitable for hosting a small number of accounts on low power systems requiring minimal maintenance, such as single board computers. It’s the ActivityPub equivalent of an email server, storing posts as human readable JSON on file, rather than in a database. It also uses only a small amount of RAM.

This is right up my alley. No weird Ruby code like Mastodon. No new stuff like Elixir. No database! I work with databases all day long and that’s why my wiki also doesn’t use a database.

Yay! I might try this myself.


Comments on 2019-11-07 Epicyon

Now that I have it running, I noticed:

  • requests is a dependency (should fix docs)
  • using ö in the bio resulted in an encoding error
  • images can only be PNG files, perhaps?

– Alex Schroeder 2019-11-09 22:27 UTC

I edited /etc/systemd/system/epicyon.service to set --registration to closed and reloaded it all by running systemctl daemon-reload. I think the subsequent systemctl restart epicyon wasn’t necessary.

– Alex Schroeder 2019-11-10 12:34 UTC

Well, I’ve added some issues. And I’m still struggling with remote following.

– Alex Schroeder 2019-11-10 21:31 UTC

Another aspect I dislike is that basically whatever CPU Quota you give Epicyon, that’s what it takes. What’s it doing? Somehow I was expecting it to not do anything if other instances didn’t contact it.

– Alex Schroeder 2019-11-12 21:13 UTC

Add Comment

2019-11-02 Whirlwind Attacks

Jeff Rients wrote about all weapons doing d6 damage, saying that he didn’t use the rule. Well, I do. What’s it like, at the table?

I haven’t noticed any drawback at all to my game. Only two-handed weapons needed a change as in my game shields can be sacrificed to annul one hit (after the seeing the damage done), making them very valuable.


  • battle axes can be used to break through doors
  • pole-arms allow you to attack from the second rank
  • two-handed swords allow you to do “whirlwind” attacks: make one roll and everybody who is in melee with you gets attacked by the same roll

The Wikipedia article on the Zweihänder has the following fragment:

Frisian hero Pier Gerlofs Donia is reputed to have wielded a Zweihänder with such skill, strength and efficiency that he managed to behead several people with it in a single blow.

And this is the Battle of Kappel, showing soldiers wielding two-handed swords against pikemen. Yikes!

By Johannes Stumpf, Hans Asper - Chronik des Johannes Stumpf, 1548. Scanned from Schwabe & Co.: Geschichte der Schweiz und der Schweizer, Schwabe & Co 1986/2004. ISBN 3-796-52067-7., Public Domain


Comments on 2019-11-02 Whirlwind Attacks

I prefer this approach. I played Pathfinder Adventurer Card Game, where you are constantly trying to improve your inventory of weapons - it was fun, but too videogamey. I prefer the weapons to be thematic. “You have my sword... And you have my bow. ... And my axe.”

I did introduce an intelligent sword (charisma 16, gets in charisma contests when what it wants - the PC to take a leadership role - differs from the PC) and the players were disappointed it didn’t offer some unusual attack or damage. So there are drawbacks.

J. Alan Henning 2019-11-02 16:21 UTC

On the other hand, if all swords do 1d6 then a +2 or a +3 already sounds more impressive. 🙂

– Alex Schroeder 2019-11-02 16:41 UTC

Regarding the attacking pikemen with a 2-handed sword... I’d always understood that was the point of the Zweihänder. They didn’t attack the guys with the pikes but aimed to chop off the head of weapon and drive the long staff to the side so others could move in past the pokey parts. Must have been some brave fellows.

– Ruprecht 2019-11-05 15:21 UTC

Yeah. But they also got double pay. And as I understand it, they were not in the first rank. They waited in the second rank behind shield bearers and other pikemen for crush and then they moved forward. At least that’s what one Wikipedia page says even though the picture shows something else. I know nothing…

– Alex Schroeder 2019-11-05 17:33 UTC

Does seem like using the shield guys would be better than standing out in no mans land waiting for every pikeman to poke you.

– Ruprecht 2019-11-05 19:28 UTC

Add Comment

2019-11-01 How to choose an adventure

When you buy a thing, then you choose the thing. When you write a thing, then you use the thing. But when you have a generator like Hex Describe I find it really hard to just stop reloading the page, hoping to get an even better deal.

Here’s my thing: the party is in the mountains and has to travel two hexes to get to some dwarves in an underground cavern. Easy, right? Go to Hex Describe and click the no map link. Enter the following:

There is a dwarven forge called <em>[here dwarf forge]</em> up here. This is a legendary forge stronghold. [5d8x10] <strong>dwarves</strong> live and work here ([dwarf stats]) led by [dwarf with portrait] (level [1d4+8 as level]). They are divided into [3d6] families, each led by a clan elder (level [1d6+2]). [dwarven stronghold treasure]

The last part is based on mountain people and dwarves, picking the options that lead to the big city.

I look at the results and I just want to continue clicking!

Here’s a legendary dwarven forge:

There is a dwarven forge called Moon up here. This is a legendary forge stronghold. 220 dwarves live and work here (HD 1 AC 4 1d6 D1 MV 6 ML 8 XP 100) led by Bifskjald Stormbeards (level 9). They are divided into 9 families, each led by a clan elder (level 7). 「200000 gold. 100 platinum. 42 gems. 28 jewelry. 7 dwarven crossbows +2. 8 dwarven short swords +2. 8 dwarven plate armour +2. 6 dwarven shields +2. A potion of bellowing (deep pink, smelling like the sea, 1h, allows you to bellow so loud that your voice can be heard for many miles), a potion of flying (white, 1h), a potion of silver tongue (deep vanilla, 1h, everybody who hears your voice must save vs. spells or be charmed), a potion of cold resistance (dark celadon, 1h), a potion of silver tongue (deep vanilla, 1h, everybody who hears your voice must save vs. spells or be charmed) and a potion of jump (sparkling black, smelling like oranges, 20min, allows you to jump up to 60ft high and land safely). A stone of orientation that always points north. An amulet of shape changing, blessed by Loki (black cat, allows you to sneak). 6 dream land berries which transport the eater into a dream time where they can talk to an immortal hero for as long as they want or walk for as long as they want (if you decide to return, you return to the same moment in time but you will have aged appropriately and your place will have shifted in accordance with the distance you moved). A compass of hell, blessed by Hel (it has two pointers: one points to the nearest danger, the other to the nearest safe place).」

I want to know the names of their dwarven clans and of course there’s a rule to generate these, too! Up above we already go the Stormbeards, so we just need a few more:

  • Spiralspark
  • Goldhill
  • Newhold
  • Forgepeak
  • Thundertrickle
  • Stoutkeep
  • Gnarlhill
  • Proudhammer

And what about the mountains? Let’s check the mountain table, but this time with Markdown for easier copying and pasting?

At the end of this valley the mountains rise up like a wall and on that wall is a giant seven-headed snake made of living stone, as if melted and reshaped by the strongest spells. In each of the seven heads there burns a magic fire. This is Biaringan.

Down below, at the foot of the wall, there is a gate of snakes: a knot of two impossibly large stone snakes with a passage underneath illuminated by torches and guarded by 26 snake people (HD 2+1 AC 5 1d8 F2 MV 12 ML 7 XP 200; charm person 3×/day) led by Son of Set (HD 6, lightning bolt (6d6) 2×/day). 「A potion of cold resistance (tawny orange, 1h).」 The stables nearby hold 2 giant lizards (HD 4 AC 5 1d10 F3 MV 12 ML 7 XP 400). 「5000 silver coins. 3000 gold coins.」

Inside, the central temple contains four bronze snake statues oriented towards the cardinal directions. Large red candles at the base of each statute give a flickering and smoky light. Each statute has a different colored gem set in its forehead (500gp each). The north wall contains a giant mural of snakes and the floor is decorated with a mosaic of a star with eight outward pointing daggers.

Under the mural, a passage leads further north, past the quarters of 23 snake people (HD 2+1 AC 5 1d8 F2 MV 12 ML 7 XP 200; charm person 3×/day) led by Egg Mother (HD 6, lightning bolt (6d6) 2×/day). 「A compass of hell, blessed by Hel (it has two pointers: one points to the nearest danger, the other to the nearest safe place).」 The stable nearby holds a giant lizard (HD 4 AC 5 1d10 F3 MV 12 ML 7 XP 400). 「1000 silver coins. 3000 gold coins. 2 gems.」

At the end of the hallway, stairs lead upwards.

This is where the spirit naga Most Exalted Sorcerer of Lies guards the passages to Svartalfheim (HD 9 AC 7 1d8+poison F18 MV 6; fireball (7d6) 3×/day; charm person at will; only harmed by magic or magic weapons; 「a naga tongue is worth 1000gp to an alchemist」) and where pools of Earth Blood corrupt both the living and the dead. If you spend an hour here, your death warrant is sealed: slowly, you will die, or turn into an ettin, or a goblin, or some other dreadful creature.

Or something simple?

Steep cliffs make progress practically impossible without climbing gear. In the middle of a sheer cliff, where no bird dares to fly, there is an inscription on the rocks, each letter higher than three men standing on top of each other, proclaiming the power and glory of Queen Kali of Merlen, as well as the riches and treasures of Jasa the Strong.

Or something very cool again:

A ten-foot-tall black iron fence blocks the way here. Some of the spikes at the top of the fence are adorned with skulls of humans and other humanoids.

The gate is still humming with magical energies. Shimmering lines show penitentiaries humbly begging for entrance. If you knock on the gates with nothing but your clothes on, empty handed, no weapons, no armour, no metal, then it will slowly open for you and just for you. If anybody else tries to slip through, the doors will slam shut: save vs. death or be crushed.

Towering above the walls is a bulging tower with vertical slits serving as windows, like the visor of a fancy helmet.

This is the realm of 3 stone giants led by Shaper of the Cave, Still Stone (HD 9 AC 4 3d6 or 3d6 ranged F9 MV 12 ML 9 XP 900; stone shape and control weather at will). 「10000 silver coins.」 They are methodically moving cut stones the size of cattle, rebuilding the tower. They place a block, then move back and contemplate it’s position for an hour, then repeat.

The top of the tower is inaccessible from the interior. A circus of 6 young griffons (HD 4+1 AC 6 1d6/1d6/1d8 F4 MV 24 ML 10 XP 400) is roosting up there when they’re not trying to impress each other with fantastic displays of aerial stunts. 「The griffon egg is worth 5000gp to an alchemist」.

The necropolis itself is an endless graveyard, tombstone after tombstone, filling every slope in this valley, stone statues, inscriptions, pictures, headstones engraved with snakes or a bird man. At night the ghosts rise from their graves, lamenting the state of their graves and the lack of care, the sloth of their descendants, and they curse them and their world, not realising that their world has already faded and that they are the only ones left. Appropriate rites and sacrifices, a purification and a hallowing might bring them peace.

In the middle of all this is a platform made of stone, circular and about five feet high. On it a wooden structure rises up into the air and at the very top rests the sphinx Sigiburg (HD 5 AC 6 1d6/1d6 F10 MV 15 ML 9 XP 500; cure disease 3×/day, raise dead 1×/day, summon tengus (2d6) 1×/day: HD 5+1 AC 6 1d8 F10 MV 15 ML 8; flying). Tell her a good pun and she’ll be friendly. Answer her riddle to be granted a boon.

Tho’ good fellows we are,
We can’t hope to be sav’d;
From our very first day,
To our last we’re enslav’d,
Our office is hardest,
And food sure the worst,
Being cramm’d with raw flesh,
Till we’re ready to burst;
Tho’ low in our state,
Ev’n Kings we support;
And at balls have
The principal share of the sport.


I really cannot decide! And let’s not forget that there are different tables for mountains (notice the s at the end of the table name)

These mountains are called the 「Hungry Domes」. They are impossible to climb.

OK, that’s short. Hm.

But what about this?

These mountains are called the 「Dire Graves」. Fissures lead into the depth of the mountain and in the warm chambers below there sleeps the red dragon Fire Despair the Eternal (HD 10 AC -1 1d8/1d8/4d8 F10 MV 24 ML 10 XP 1000; fire (as much as the dragon has hp left, save vs. dragon breath for half)). 「10000 gold coins. 60 gems. 70 jewelry. A dwarven shield +2 with dwarven runes commemorating the slaying of the red dragon Hot Death of the Mountain.」

Or simpler?

These mountains are called the 「Hungry Peaks」. The passes need a local guide to cross. 4 winter wolves live up here (HD 5 AC 4 1d6 F5 MV 12 ML 9 XP 500; 2 in 6 chance that instead of biting, it breathes a cloud of ice (5d6); see invisible; 「winter wolf icicles growing inside them are worth 500gp to an alchemist」)

Or more dwarves?

These mountains are called the 「Desert Mounts」. The passes need a local guide to cross. There is a dwarven forge called Old Star up here. This is a small forge. 21 dwarves live and work here (HD 1 AC 4 1d6 D1 MV 6 ML 8 XP 100) led by Trísti Forgeshorn (level 3). Silver cutlery and beautiful wine glasses. 「40000 silver coins. 60000 gold coins. A scroll of fire ball (6d6, save vs. spells for half). An elven long sword +1 with elven runes naming its maker: Felaiel.」

I just want to keep reading!


Comments on 2019-11-01 How to choose an adventure


– Chris 2019-11-01 22:44 UTC

Add Comment

2019-10-28 VCS3

I recently bought the iVCS3 app for the iPad. It’s a weird sound generator from the seventies. If you want to know how it works, you’re encouraged to look at the manual of the original. It’s from 1970. 🙂

I decided to buy the app for about $15 because at a recent event (Zürich Modular Fest) I played around with a Syntrx. That one costs €2500…

Today I also discovered that there are a bunch of emulators: Free EMS VCS3 & Synthi AKS VST emulations.


Comments on 2019-10-28 VCS3

Some of the patches I made for the iVCS3:

  • Playing the Erhu from Garage Band while my patch produces some background noise [1]
  • Sound bubbles falling, like weird mechanical birds [2]
  • Playing the Erhu from Garage Band while my patch produces the noise of an old car engine [3]

– Alex Schroeder 2019-11-02 23:38 UTC

Add Comment

2019-10-26 Trying to add ActivityPub to Oddmuse

OK, so I want to add ActivityPub to my wiki. I started the endeavour by looking at the blog post How to implement a basic ActivityPub server as it uses static files to get started.

My goals:

  1. be able to search for my account ✔
  2. see all my blog posts on the profile page ✘

I’ve compared my responses to the responses from my Octodon Social account and can’t figure out what I’m doing wrong.

Let’s start at the beginning: We need WebFinger support. Compare the two:

curl https://octodon.social/.well-known/webfinger?resource=acct:kensanata@octodon.social
curl https://alexschroeder.ch/.well-known/webfinger?resource=acct:alex@alexschroeder.ch

Looking good!

Use the self URL from the result above and the application/json MIME type (if you don’t, you’ll get HTML) to get the actor:

curl -H Accept:application/json https://octodon.social/users/kensanata
curl -H Accept:application/json https://alexschroeder.ch/wiki?action=actor

Find the outbox in the result above and request it:

curl -H Accept:application/json https://octodon.social/users/kensanata/outbox
curl -H Accept:application/json https://alexschroeder.ch/wiki?action=outbox

This is where the good times end. I can search for the profile of @alex in my Mastodon client, and I can click on the profile, and it lists the number of items in my outbox (4.9K) – but it doesn’t actually list the items themselves. In order to do this, the Mastodon server would have to follow the link to the “first” page of items and my webserver logs show that it does not. 😟

As far as I can tell the only different is that my outbox doesn’t list a “last” property.

This is what we would be getting:

curl -H Accept:application/json https://octodon.social/users/kensanata/outbox?page=true
curl -H Accept:application/json "https://alexschroeder.ch/wiki?action=outbox&offset=0"

I’m not sure how to debug this, and since Mastodon aggressively caches responses, it’s also hard to retry things.


Add Comment



Please make sure you contribute only your own work, or work licensed under the GNU Free Documentation License. Note: in order to facilitate peer review and fight vandalism, we will store your IP number for a number of days. See Privacy Policy for more information. See Info for text formatting rules. You can edit the comment page if you need to fix typos. You can subscribe to new comments by email without leaving a comment.

To save this page you must answer this question:

Please say HELLO.

Referrers: Diary Alex Schroeder 🐝 (@kensanata@octodon.social) - Octodon Diary