Tools for playing D&D 5e online

My groups have used the following tools for playing D&D 5e, AD&D 2e and Maze Rats online.

Owlbear

This is it! If we had known about Owlbear in April 2020, our early attempts at playing online would’ve been a lot smoother. This is the perfect virtual tabletop for us. It works really well and does what we need (about 80% of all its features), and its free. It doesn’t embed any RPG systems or character management (unlike Roll20, see below), and this helps a lot in keeping it light and focused on the virtual table. All the improvements they made since we started using it were welcome and useful, and didn’t disturb anything we gotten used to.

To give you an idea how Owlbear works for the game master, I’ll show an example from one of my Maze Rats sessions. For that session I planned a scene with the player characters visiting a shady tavern. I sketched that tavern in Excalidraw (a bit more on that tool at the end):

From Excalidraw I exported the sketch as a PNG file and uploaded that as a map in Owlbear. There I adjusted the Columns and Rows and Grid Scale to roughly match the desired scale of this building. This affects how large the tokens will be shown by default (more on tokens below).

I did that for two other maps as well, one a map of the Dock District, another for a warehouse that the player characters had to explore.

For the tavern, I wanted to initially hide the back room, so I used Owlbear’s fog tool (the cloud icon) to draw a rectangular fog over the whole room. For players joining the session, they’d only see the main room, with a black rectangle hiding the rest. So other characters (as tokens) could hide back there. I didn’t really use it for this session, but its great when exploring dungeons, where you can use the eraser during the session to gradually reveal the full map.

To turn this from a static map into a virtual tabletop, add some tokens and name them:

Here I placed some of the default tokens that Owlbear provides. Players should create a custom token for their characters and upload them. As a game master, important non-player characters (NPCs) also deserve their own token.

To create custom tokens, Token Stamp is a neat little tool. My usual workflow there looks like this: Click on “Choose Image” to upload an image; scale it up and move it so that the person’s face is well visible in the preview on the right, then click on “Download” and save the token as “[name]_token.png”. Then upload that token in Owlbear: First the “plus” icon at the bottom right (disable fullscreen if this is hidden), then the “Import tokens” plus icon in the “Edit or import a token” modal.

With custom maps and custom tokens you’re ready to play your custom campaign. Which brings us to the last important feature of Owlbear: Rolling dice! For that, Owlbear provides a dice tray via the tiny icon at the top left, next to the party list. The palette icon let’s you choose from different style of dice. The next group of buttons are all for rolling dice. For example, to roll 2d6, click twice on the [6]. The rolls are somewhat physical, so sometimes you’ll end up with a perfect throw that turns to a failure in the last millisecond, as the dice topples over. Adding more dice to the tray might even change the result of dice that you threw earlier.

The last two buttons allow you to increase the size of the tray and to share your dice throws with the rest of the party (the globe icon). This last setting should be on for all players! For game masters, it depends if you prefer to hide (and fudge) your rolls or not.

There’s a few more features worth exploring, but these I consider the essentials.

Before Owlbear, we tried Roll20, but that didn’t really work for us. It has a loooooot of features and the virtual tabletop isn’t nearly as polished and accessible as in Owlbear. It might still be interesting if you prefer an integrated setup with the game system (like D&D 5e) and the virtual tabletop in one tool.

A battle scene in Roll20 from a past D&D 5e campaign

Zoom Pro

For the video call we use Zoom, with a paid account since our sessions are longer than the free plan’s 40 minute limit.

We’ve tried out various options like Discord, Jitsi and Google Meet. Zoom has the most consistent and reliable performance across operating systems, with the lowest processor load. In contrast, when we tried it, Discord’s performance on macOS was horrible, generating 100% CPU load non-stop, with crashes and freezes in every session for one participant.

Zoom generally works with “meetings” that you schedule or start ad-hoc. When playing with a fixed group, it can be useful to set up a permanent “room” instead.

Here’s how (at least in December 2021 this works, Zoom is likely changing their UI again in the future): Schedule a new meeting, give it a Topic, then set it to “Recurring meeting” with “No Fixed Time”. Use a Generated ID and Passcode, both should be set by default. Finally under Options (expand first) enable “Allow participants to join anytime”, that way you (as host) don’t have to be there before the others. The screenshots should help find each UI element:

Then Save that new meeting and share the meeting URL with your group. As long as the URL contains the Passcode, they don’t need to enter it.

We also use Zoom to share audio, usually atmospheric background music. I’ve never done that myself, but in this case Zoom has a decent explanation.

If Zoom isn’t an option, I recommend testing Discord. By creating your own server, you also get text chat rooms and you can have multiple video rooms (e.g. to have quick private chat between GM and a player). With the Dice Maiden bot you can also throw dice, especially useful for dice-based character creation or generating dungeons for Maze Rats (for which you need unsorted rolls, like !roll ul 6 2d6). Discord also used to have a nice audio sharing option via the Rythmbot, but that got shut down in September 2021.

D&D Beyond

Specifically for playing Dungeons and Dragons 5th edition (D&D 5e), D&D Beyond is great. Creating a character can be pretty quick, but will still take a lot of time if you pay for extra source books with access to all kinds of extra races, classes, backgrounds and whatnot. Here’s a Human Fighter character I created:

If D&D Beyond isn’t an option, an alternative editable character sheet for D&D 5e could be this Google Docs spreadsheet. You’ll have to copy it, then fill it out with your character. Its more fragile than D&D Beyond and won’t help you with character creation. But once created, it works well for leveling up and maintaining your inventory. Here’s my level 5 Barbarian from a past campaign:

Bonus: Artbreeder

Custom avatars as Owlbear tokens or on character sheets are pretty nice, but sometimes its hard to find the right image. When you need a custom picture, but suck at drawing, Artbreeder might be an option. You can upload a (limited) number of images, then change “genes” or “breed” multiple images to create something new. That’s how “Finn” was born:

There’s also an angry Finn:

And a happy Finn:

Changing one setting often heavily influences others, like angry Finn’s hair, beard and jawline changing a lot. Its still pretty impressive what you can create.

What else?

I’ve mentioned Excalidraw above for sketching custom maps. Before our groups started using Owlbear, we also used Excalidraw for shared scribbles, using their “Live collaboration” feature. We’d then draw maps, notes or memes together – something like this:

I have to mention DriveThruRPG here. That’s where I bought Maze Rats and Knave, as well as The Alchemist’s Repose and The Waking of Willowby Hall (yes, I’m into OSR this year). I’d go back there anytime if I need maps for a campaign.

Perchance is a great tool to create text-based random generators for anything. I’ve used this to create generators for Maze Rats magic items and NPCs. With some custom HTML and CSS, generators can also look much better, like this Maze Rats Spell Generator.

Another tool worth mentioning, but never actively used in our campaigns: Miro. This could work as a virtual tabletop where you can also look at pages from PDF rulebooks together. I’ve only used it at work – it works great as a virtual whiteboard for remote retrospectives.

From when we tried out Miro as an alternative to Excalidraw

Credits

Special thanks to Marcus, who did most of the research and testing for these tools. Lars was running a D&D 5e campaign since April 2020 for 18 months, where we had to and got to experiment a lot. Hermann introduced us to the invaluable Owlbear.

Maintenance Intervals

I’ve been using “Remember the Milk” as a Todo App for a really long time. At some point years ago I started using it to track repeating tasks, usually for things happening rarely enough that its important for the app to remind me. Gradually I’ve set up more reminders with shorter intervals, both for maintaining our apartment, and myself. While this is just my personal preference of organizing parts of my life, I figured it might be interesting for others, too.

A sketch of what my Todo app looks like on a given day, with a mix of recurring and one-off tasks, ordered by priority

At the time of writing, these are all the maintenance intervals I currently have in the app:

  • Daily: Back, shoulder and wrists exercises
  • Every two days: Workout
  • Every other two days: practice and play guitar
  • Weekly, Sunday: Clean cat water fountain
  • Weekly, Wednesday: Change water in cat water fountain
  • Every 3 weeks: Change bed sheets on all 3 beds and the cover on the changing table; if its the first time in a quarter, also turn the mattresses around
  • Monthly, on Sunday: Change the cat water fountain filter
  • Monthly: Check and fix tire pressure on our bicycles
  • Monthly: change the water filter (Brita) filter and put everything in the dishwasher
  • Monthly, first day of each month: Turn all 3 calendars in the apartment
  • Every 2 months: Clean the grease trap of the kitchen exhaust hood (Fettfilter der Dunstabzugshaube)
  • Every 2 months: Clean the cleaning robot and check if a part needs to be replaced 
  • Every 3 months: Review monthly costs+budget spreadsheet
  • Every 3 months: Clean the fridge
  • Every 3 months: Clean the shower curtain in the washing machine
  • Every 4 months: Clean dishwasher and washing machine
  • Every 6 months: Clean microwave
  • Every 6 months: Perform manual backups of files on PC (Dropbox, photos, music) and laptops (via Time Machine)
  • Every 8 months: Change the kitchen exhaust hood coal filter (Geruchsfilter der Dunstabzugshaube)
  • Every year: Export Telegram data (via Telegram Desktop)
  • Every year: Check ETFs, rebalance if necessary
  • Every year: Order special “urinary” cat food in bulk

I didn’t even realize how many of these I have until I wrote this list down. Its not exhaustive – there’s more maintenance we do, but some tasks have their own reminder (like the oven showing “PYR” when its time to burn some dirt), others their own processes (the dish washer is full) or habits.

Some of these intervals I have fine-tuned several times, some I still adjust every now and then. For example, when we discovered how dirty the microwave actually is, we’ve cleaned it once properly, then set up a reminder to clean it every month. At the same time, we also paid more attention to covering food we put inside, so the need for cleaning got a lot less. That’s how we ended up with the current interval of 6 months.

The two newest intervals are the two day interleaved workout and practice guitar tasks. Doing these every day is just too much, but every two days works pretty well for me. I started the regular workouts in September and have been pretty consistent since then. I focused on something you might call calisthenics for a while, then spend some time with elastic bands and heavier dumbbells. In the last few weeks, its been mostly Ring Fit on the Switch.

I bought an electric guitar early October, and tried practicing every two days since then. With 10+ years playing bass I had a good head start, though chords are still a big challenge (for my big fingers). I’ve played much more Rocksmith 2014 than I did with the bass – by itself its rather limited for learning, but it provides a lot of options and is very well-balanced gamified, similar to Ring Fit.

My daily, roughly 5 minutes back, shoulder and wrists exercises I’ve been doing for some months now, too. Along with the workouts, I haven’t had any issues with shoulders or neck, after some weeks of pain in the spring and last year. Maybe optimizing my desk setup (external monitor with camera on top) has also helped keeping those issues away.

I wonder which of these reminders I’ll keep in the next years, and which I add on top. I’m also interested to hear how you’ve approached these.

Three of a Perfect Pair

This post is about three approaches for remote pair programming that I recently learned to value a lot. They’re not perfect, but I like the King Crimson reference.

Come Prepared

Do all set up, check out, scaffolding or other basics, before you start pairing. If you’re debugging a complicated issue that needs a standalone reproduction, build that first, than use your pairing time to debug. If you’re continuing work on a feature, check out the existing or new branch first, start your development server, open the relevant files, start your unit test watcher, open the app, log in, or whatever else might be needed. Everything that is boring, where your pairing partner likely has nothing to contribute, should be done before hand. If you’re starting something from scratch, create the project (from a template first), initialize git and so on. Unless the point of the pairing session is to pick a framework or library, make sure that the new dependency is already installed and imported.

Use a Collaborative Editor

Use an editor experience where you can edit code at the same time. Something online like Glitch or repl.it, or some desktop setup like VS Code with Live Share. Use this to quickly change driver/co-pilot or suggesting single lines, not so much to work on different parts of the code in parallel. If you end up working in parallel, there’s a good risk you both make mistakes that are harder to find later, ruining the benefit of pairing.

Don’t be like me a week ago, thinking that Live Share doesn’t work for web development without a shared browser. Instead use the shared server feature and do (exploratory) testing in parallel.

When you’re exploring solutions to a problem you don’t yet understand well, consider using other collaborative tools, outside of code editors. With Excalidraw, Google Drawing or Miro you can sketch or scribble together (probably all more effective than sketching on paper and holding that in front of the camera).

Keep an ‘Improv’ Mindset

In improv (as in, improvisational, live theater/comedy), the “Yes, and…” rule encourages a positive attitude, accepting suggestions from others and building on top of them. When your pairing partner suggests something that sounds wrong, refrain from pointing out the mistake and try to roll with it. If it really is a mistake, they should realize that quickly enough. If its costly to try out, probe gently instead. There’s also a good chance that the suggestion is great, and you just didn’t quite understand it, yet.

In a recent pairing session, we were working on an image sampling task, trying to detect overexposure in video frames. At one point my pairing partner suggested to split the image into sectors and run the detection in each sector individually. At first I didn’t understand the point of that suggestion, but managed to refrain from rejecting it. After a bit more exploration we realized that these sectors would also provide much better feedback to the user – instead of saying “this frame is overexposed”, we could instead point to a specific sector. This improved the solution greatly, with very little code and runtime overhead.

A Bird Story

When the alarm rang in her truck’s sleeping cabin, Emily sat up and noticed the latest issue of the Bird Watching magazine sliding off her chest. She must’ve fallen asleep while still reading. Putting the magazine aside, she turned on the water cooker for some instant coffee, got dressed and checked out the leftovers from her last meal, a sandwich whose salad had turned into a brown goo. “Will have to do,” she muttered to herself while removing the expired salad. “How nice it would be to start the morning with some fried eggs.” She briefly turned on the CB radio to see if something useful made the rounds, but it was just the usual wankers. She had zero interest talking to those.

A little while later, she was back on the road, almost on schedule to make it to this day’s depot. It would still take some time to unload all those boxes that her 40 ton 18 wheeler was hauling. Traffic seemed fine, with only two construction sites on the next segment, promising an easy day.

Four hours later, it was time for the scheduled break. She briefly considered messing with the black box again to fake the break, keep going and for once get home a bit early, but her bladder suggested to play it by the book. When she got off the highway to turn into a small parking area, covered by trees on both sides, she wondered why there were no other trucks. At this time of day and place there should’ve been at least another four. Instead, there was just a station wagon with the trunk packed up to the roof. The dad, she assumed, was walking from the woods towards the car with a crying child in tow. By the time Emily turned the engine off, the station wagon was gone.

After prepping another cup’o’black, she found the magazine again and tried to remember where she left off. But before she could find her page, a quiet, deep hum distracted her. She checked the mirrors to see if it was coming from another truck or car coming into the parking area, but there was no one. Yet the hum only got louder, until it seemed to come from above. As she was leaning to the left window, she noticed a bunch of leaves flying away from the truck. “What’s making that wind?” she wondered aloud, as she pulled down the window and stuck her head out. Above her was a swarm, not of birds, but seemingly of mechanical devices, with lots of propellers. Like those toy drones at the store, except that there were so many at once. At least that explained the noise and wind. Emily was fascinated with their seemingly random formation. The swarm moved, but each member kept just enough distance to the others to not crash into them, like flocks of migrating geese. After watching them for a while, she noticed two long lines hovering below the swarm, the top one being a bit inside the shape of the swarm, the bottom one somewhat smaller. Just when she was starting to replace her fascination with anxiety, she heard loud clangs, like metal attaching to metal, from all around the truck. “Shit shit shit, what the hell,” as she scrambled for her phone. No signal. She turned on the CB radio, but all she got was static. “Are you jamming me?” Emily asked in the direction of the swarm above, trying to suppress her oncoming panic. “For what?” An answer came in the form of a sudden pull upwards. The whole truck was lifted off the ground, slowly, but steadily, turned, and then started moving to the woods. It kept rising until it was just above the top of the trees. Emily felt like she had to do something, but all she could think of was “Don’t panic!”. It was too late to get out and she couldn’t contact anyone. She kept her eyes on the ground ahead, which seemed to drop off slowly into a valley. She remembered that place – it had been a big lake, a reservoir, until the dam burst and nature reclaimed the valley that used to be inhabited a long time ago. “Where are you taking me? There’s nothing here!”. As they moved into the valley and her view of the horizon stayed the same, the ground below seemed to fall away further and further. Through a moment of calm, Emily remembered something she had read last night in the magazine, about birds of prey dropping their victim from some height, like a crow opening walnuts or a bald eagle cracking a turtle. As she felt the panic make a comeback, she put her seat belt on and stowed everything in reach. Just in time as she felt the truck tilting forward, giving her a look at the ground below. In the midday sun she saw twisted metal shimmering in a huge pile of tires, colorful containers and boxes. Something snapped loudly around her, and she could feel the seat belt cut into her chest and neck as the truck dropped away below her. At least the deep hum finally went quiet.

When Emily regained consciousness, she felt strangely calm, even though she couldn’t see anything. Her right arm didn’t seem to respond, but her left arm was okay and after a little struggle, she managed to wipe her eyes enough to see something. By the smell it seemed like blood, likely her own. As she slowly observed her surroundings, she realized that she was hanging down in her seat belt, the front window mostly crushed on the ground before her. There was plenty of light coming from the left window, which she had opened not that long ago. The hum had now turned into a much more irregular buzzing. She could see individual devices flying away into the distance, with small colorful packages underneath them. “Like birds returning to their nest, feeding their young,” Emily marveled to herself, “with batteries and solar panels.” She kept watching them, mostly going alone, but some transporting bigger boxes in groups. As the last few went on their way, she started feeling her right arm again, and as she was screaming in pain, she almost missed the crackle of the radio.

“Hello? Got your ears on? This is Scooter. Beep.” said the other voice, in a slightly wavering, but pleasant baritone. Emily still had no idea what was wrong with her right arm, but it hurt like hell, as it was hanging limb down towards the broken window, so she had to bend over to reach the receiver with her left arm. That took some time and some pain, but at least “Scooter” couldn’t hear her, yet. Eventually she managed to press the send button and tried to speak up, “hello?”. At first nothing happened, then she remembered that she had to let go to receive an answer.
“Hey driver, you’re breaking up, can you repeat? I only got ‘hello’. Beep” said the other voice, including the ‘Beep’.
“Err, sure, hi Scooter. Why are you saying beep?” Emily had talked to truckers who’s radio beeped when the other party stopped sending, but this was the first time someone actually said ‘beep’.
“Dunno what you’re talking about. What’s your handle? I’m Scooter, I’m stuck in the reefer, or what’s left of it. I only stopped at the pickle park to throw in some high speed chicken feed, and then all those spies in the sky, or so I thought, showed up, and suddenly I found myself in this situation, shiny side down and motion lotion all over the place. Sorry, I’m probably walking all over you. Beep.”
At least all that blabbering distracted Emily for a moment from her dangling arm. She also regretted a bit that she avoided the radio, or she would’ve picked up some more of the slang. “My handle is, I mean, I don’t have a handle, the name’s Emily. I’m hurt pretty bad and I’m not sure if I can make it out of the truck. I didn’t get all the other things you said.”
“10-4! I mean, copy. Well, I got that, Emily. Sounds like we’re in the same fucked up situation. Though I’m out of those pills that are keeping me awake. I tried plenty other channels and could not reach anyone. Phone’s dead. You? Beep.”
Emily looked for her phone and remembered stuffing it in the door on her left. Keeping the receiver hanging on her seat belt, she went for the phone. Still working, still no signal. “Shit, must be the valley. No tower in a lake.” To the radio: “My phone is still working, but I got no signal. I do have one idea though.” She hesitated. “It was supposed to be a gift.” It took some stretching to reach the package, still wrapped in orange and teal. Sticking it between her thighs, she managed to rip the paper off and open one side. “Oh man, this is going to be really hard.”
“Whatever it ish, I preeshaydit if you can shomehow get ush out of hee. Ah shing my pillsh are wearin’ off and ah won’ be ‘wake much lon”

Considering that Emily knew Scooter barely more than a few minutes, and only by his voice, the gradual slowdown, cut off at the end and especially the lack of the ‘beep’ hit her much harder than she would’ve expected. Like losing a good friend she barely knew she had. “Scooter, you’re still there? Please copy.” But there was no reply. She waited another moment and tried again, but still got nothing. So she got back to work. She wanted to rush, but knew that dropping any pieces could be catastrophic, so she went about as carefully as she could. She got the remote out and managed to insert the batteries. Next she got the drone itself, inserted its battery and placed it on top of the package that she carefully put between the door and steering wheel. She remembered the sequence the slightly condescending guy in the store had explained to her and followed it step by step. And the drone really came to life, with the display on the remote showing her a different perspective of the world outside. The first thing she noticed was another truck, mostly in pieces, but she could identify it as having a refrigerated trailer. “Maybe that’s the ‘reefer’ Scooter was talking about?” She very very carefully tried to launch the drone, focusing on what the drone could see, show on the screen in front of her, instead of her direct line of sight to the drone itself. The opening in the window was rather smaller, now that the top had been crushed, but still big enough for the drone to go through. Going very slowly, she flew the drone through the window. Outside, she had the drone fly up a little and turned it slowly clockwise. From here, the place looked so much worse than what she had seen from above. A graveyard of trucks, some with the remains of shipping containers, but mostly solid walled trailers like hers, or that of Scooter. She didn’t spot any covered with tarps. “Maybe they have other means of attacking those?” Emily could feel her curiosity about the swarm coming back and decided to focus on that, and not her miserable situation. “If you pretend to be birds, do you also build a nest?” She looked away from the screen for a moment, outside the window, and focused on the few things she could recognize from her position. Back on the PoV view, she turned again until she found those things again. Some wreckage, some trees in the far distance. She changed the drone’s altitude until she could see it roughly at the height where the other drones had flown away. “Off we go!” she said to herself, as the already light hum of the drone faded away. On the screen she could spot what might’ve been a village once, razed to the ground before the dam was built and the area flooded. Beyond that, in a small valley, were the leftovers of some fishing boats. Beyond that, just when a range warning started flashing, she spotted the nest.

After a moment of stunned silence, she reached for her phone, found the voice recorder and started it. “If anyone ever listens to this, I found the nest. I really want to call it a hive, since it looks much more like something ants might build, than a bird’s nest. It’s incredible. It seems completely chaotic, yet also well structured. There’s little ramps everywhere, apparently used to get bits and pieces to lower levels. There’s something resembling a lift, but working more like a catapult. They don’t open the packages like they opened the trucks, so they must be clever enough to understand that the packages are much more brittle. I spotted a repair station, where broken propellers get replaced. There’s charging stations on the ground levels – I guess on low batteries it’s easier to land there than on the top levels. There’s wires all over the place. I think they use lots of batteries to store the solar energy overnight. The top of the hive is all solar and it looks like it might rotate with the sun. I can’t be sure, since my drone’s battery is starting to run out. Gotta get it back to replace the battery and scout again.”

She stopped the recording there and focused on the drone again. After a little while the range warning turned off, but the battery warning got more intense. Just when she thought the drone wouldn’t make it back, she could hear the hum of the drone again. Quiet at first, then louder. She even spotted her own truck on the display and carefully aimed for the little window. The hum got louder as the drone got closer. She almost missed the opening, then bumped into the steering wheel. “Good enough!” Emily exclaimed as she turned the motor off. But as she was enjoying that the drone made it back, she noticed that the hum hadn’t stopped when she turned off the drone. It had only gotten louder. And massive. And heading directly towards her.