Published on

Initial Thoughts on FoundryVTT

Author

The long-lived TTRPG campaign I play in, The Spinach Inquisition, is an online group, so we've always used Roll20 to play. Most of my other various one-shots, short-lived campaigns, and even a couple in-person events have all used it too.

But, I've had a license for a self-hosted VTT since 2020: Foundry VTT. I used it pretty minimally -- until now! I'm setting up a whole campaign in there, and want to write down some of my thoughts as I get started.

This post will cover a range of items, from the techical to GMing.

Background

I would describe Roll20 as "the world's okayest product". It lets you move pieces around, it lets you roll dice, it remembers your character sheet. You can get more involved with it, but those are the core things a virtual tabletop needs to do.

My biggest complaint with Roll20 was the character sheets: they were ugly, clunky, performed pretty badly in some cases1, and didn't help you make characters -- leveling up still required you to go do all the maths, select feats from disparate source books and copy the information over, etc2.

When we started playing DnD 20143, instead of using the Roll20 sheets (that we assumed would be bad), we started using DnD Beyond and a browser extension called Beyond20. If you're able to invest in buying all your DnD books on DnDB and getting the GM subscription, this gave players an awesome experience: the character sheet was gorgeous, snappy, had all the rules/stats at your fingertips, required minimal boring data entry, and you could roll right from the sheet into Roll20.

Then we began a Pathfinder 2e campaign this year and lost out on the DnDB experience. That browser extension integrating DnDB with Roll20 was carrying so much load for us, and there's nothing like it in the PF2e world. Pathbuilder and Demiplane are OK, but there's no Roll20 integration with either, and the experience has suffered -- all the time those things save is lost, because you've gotta type it all back into your Roll20 sheet.

Campaign Selection

I decided I wanted to run a dungeon-delving campaign a couple weeks ago4. I had a FoundryVTT license because I'd backed their project on Patreon while it was still pre-1.0, and I had it running on one of my servers for an Essence20 game one of my friends is GMing. So I figured I would see how well PF2e works with it.

I'm still new to the Paizo world, so I took a look around and picked Abomination Vaults for two reasons: one, it's a dungeon dive near a cozy little town. And two, Paizo offered a FoundryVTT module for it, which I had inadvertently purchased in a Humble Bundle.

FoundryVTT Setup

I updated Foundry and installed the PF2e system, which was fairly easy.

FoundryVTT doesn't offer a first-party docker image, which is kind of annoying. I make due by having a server folder with a couple copies of the software, and a latest symlink that I move when I wanna update it. I can roll back to a previous version easily by moving the symlink:

nevans@babykiller:/opt/foundry-vtt$ pwd
/opt/foundry-vtt
nevans@babykiller$ ls -l server/
total 12
drwxr-xr-x 4 foundryvtt foundryvtt 4096 Jan 28 19:23 foundryvtt-11.315
drwxr-xr-x 4 foundryvtt foundryvtt 4096 Jun 28 00:02 foundryvtt-12.327
drwxr-xr-x 4 foundryvtt foundryvtt 4096 Jun 28 00:03 foundryvtt-12.328
lrwxrwxrwx 1 root       root         18 Jun 28 00:03 latest -> foundryvtt-12.328/

I'm not sure if I wrote this systemd unit file or if I got it from somewhere, but here's how I run the service on Debian:

[Unit]
Description=Foundry VTT
After=network.target

[Service]
Type=simple
Restart=always
User=foundryvtt
Group=foundryvtt
StandardOutput=append:/var/log/foundry-vtt.log
StandardError=inherit
WorkingDirectory=/opt/foundry-vtt/server/latest
ExecStart=nodejs resources/app/main.js --port=30000 --dataPath=/opt/foundry-vtt/foundrydata

[Install]
WantedBy=multi-user.target

I've got Apache in front of it to terminate the TLS connection and proxy it through, but I believe that was just stock configuration.

S3 for Data

Originally, I wanted to use an S3 bucket for all of the assets, since my Linode's disk was small and the needs of an entire campaign of artwork & sound is great.

It took some doing, but I did eventually figure out how to set this up with Linode's S3-compatible object store. In the foundrydata/Config.options.json, I added awsConfig: "aws.json", and in the same folder:

{
  "region": "us-east-1",
  "endpoint": "https://us-southeast-1.linodeobjects.com",
  "buckets": ["my-vtt-bucket"],
  "credentials": {
    "accessKeyId": "redacted",
    "secretAccessKey": "redacted"
  }
}

The region being the (fake, not-relevant-to-linode) us-east-1 was important, IIRC. The endpoint URL should be the regional endpoint, not the bucket-specific one. The bucket name goes in the buckets array. I guess if you have 2+, they need to be in the same region.

After getting this working, I was disappointed to find it was broken in FoundryVTT v12.

I think this is now fixed, but I was further disappointed to find S3 uploads are a second-class citizen in Foundry. Configuring a bucket does not replace your local storage, it just add another option when uploading stuff. There wasn't an option during the adventure module import to put everything in the S3 storage, so that all went to the local disk and I didn't get any benefit from having an S3 bucket configured.

However: upgrading to a bigger Linode gave me way more disk to work with. Running out of space isn't a concern now.

Campaign Setup

The adventure module is a FoundryVTT "premium" module. Paizo gave me a product key to enter on the Foundry site, and I guess my server uses its license code to figure out its entitlements. I could search it from the module browser and install it there, like anything else.

I ran into my first problem when I tried import the data into my adventure: Foundry would OOM and die. I was running on a 1GB Linode; FoundryVTT says the minimum required server specs are 4GB of RAM. 1GB was fine for small games, but I guess it's not cutting it here. I upgraded the VM and then I was able to load it up.

PF2e System in General

Testing out combat in Foundry blew my mind: tokens can target other tokens for their attack rolls, and Foundry will figure in the defender's AC or saves, any buffs on the attacker or defender that could impact the attack, and figures out if there is a flanking modifier based on the token positions.

My jaw hit the floor when I noticed it's applying the PF2e flanking rules automatically. That's so far beyond anything I can ever expect Roll20 to do. Like, wow, holy shit, FoundryVTT and the PF2e module devs have understood the assignment.

I mentioned it figures in the buffs too: Foundry lets you drag-n-drop conditions onto tokens. So I can drop effects like [Off-Guard] onto tokens, and when they're attacked, that's just figured in. It works for persistent damage too: when I dragged it on, it asked me to enter some info about the damage type/amount.

PF2e combat has a lot to track[^DND4e]. I was a bit anxious about GMing it properly -- what if I forget a modifier -- but the amount of automation Foundry is giving me releives a lot of that anxiety.

I'm running my first combat with real players this week. I'm excited to see how well Foundry does with it.

I have some outstanding questions that I'll probably not have answers to until they come up. For example, the PF2e Foundry system implements lightning/vision per the rulebook. If I drag some kind of temporary vision/sight bonus buff onto the player ... does that automagically work? I bet the answer is yes, but we'll see!

Abomination Vaults

With the adventure loaded, I started going through the scenes & journal entries for what it loaded, and holy shit, this thing is good.

They provided new artwork for the dungeon maps. I'm not sure who did them, but they're really well-done and similar to Cze and Peku's stuff.

The walls, doors, light sources, and per-room notes are all in place, like you'd expect. Beyond that, the module came with a soundtrack, with a couple playlists for different sections of each floor and boss battles. There are sound effects and lighting effects near certain locations too. It's extremely well-made.

There are a couple undocumented features too: out of the box, there are NPC sheets in the Actors folder for a couple of the Otari townsfolk, but not every single NPC described in the book. Their artwork is available in the journal enties, so I thought I'd just need to make tokens -- but no, this is not the case! There's a token folder and it has a token for everything they provided the artwork for.

I've prepped to run the first two floors, and in the course of going through them, I've only found one thing I needed to adjust: there's a skeleton on the walkway before Boss Skwrang. It's a statue, so you're not meant to fight it, but having the players go in and I describe this without revealing a token seems like giving away the puzzle. And there's potential for some of the underlings to run through here to escape the party. So I added a token for the big skeleton statue, to give the players pause.

The adventure itself doesn't provide a ton of support around Otari itself. This isn't a problem with the Foundry module; this is just how the adventure is written. The town is there, you've got some basic info about locations & NPCs, and an overall map. But it doesn't have battle maps for the locations.

So one of my projects has been building out a couple locations: Wrin's Wonders, the Crow's Casks, and the Farmer's Guild, so far. These are places the party will 100% visit, and I want them to be just as cool as going to the dungeon.

My go-to for a location is to try and adapt something from Cze and Peku. Their maps are beautiful5, and most of them have a FoundryVTT version with walls, doors, and lighting pre-configured. I linked to their site above, but the best way to get their content is to subscribe on Patreon: as soon as you sub, you have their whole archive. It's great value-for-money.

Harvest Compendium

I've always wanted to run an adventure where harvesting monster bits and crafting them into stuff was important. Dungeon Meshi gave me a push to start this campaign, so I'm bolting on a major story about setting up Magiloy from the Crow's Casks to run a fine-dining resturant, with ingredients sourced primarily from the dungeon.

My starting point for this was the third-party Harvest Compendium - Volume 1 book. This covers every non-humanoid from the Beastiary Core.

There is a Foundry module available for it, which loads in the rules for the harvest/crafting actions the book adds, the extra items, and a huge journal entry with all of the harvesting tables.

Since it only covers one beastiary book6, one of my GM prep steps for each floor is to go through and figure out which monster(s) are missing from the harvest tables. I'll either find similar monsters and use their drops, or I'll make up some brand-new items for them.

Since I was new to Foundry, I didn't initialize realize that I should import the journal entries for the harvest compendium. I was accessing them as "locked" entries -- which means they are read-only. So I had an addendum journal to check with my additions to the harvest tables. Using that would have been a little annoying: check the primary source, then check my additions. That's not the end of the world, but it does slow the game down slightly.

Once I realized I can import them to my game's journal and edit them, it became simpler: I just added the missing monsters to the one "authoritative" version of the journal. And I can set it so all the players can see the tables too. That's important for this game, because in-character, I intend to have Magiloy give them a copy of the harvest compendium as a reference guide when they're looking for delicious things.

I made some other adjustments to its rules too. It includes some drop tables for gear on humanoids, but it didn't want to deal with the moral issue of cutting out a town guard's liver to cook up.

This wasn't suitable for this campaign for two reasons:

  1. The very first combat encounter in the dungeon is with some gremlin-type fellas
  2. My players are, uh, not usually good-aligned7

I editied the rules to allow it, and made some generic humanoid tables. I did use separate items for humanoid meat/hide/etc that specifically say most merchants will be repulsed if you try to bring them this stuff. We'll see where this goes!

There's a lot of cool stuff in the Harvest Compendium. I'm going to have them track arrows and food/water to try and force them to enagge with it, since you can make lots of nifty types of ammo, poisons, or other buff items.

One area I wish the book did more with was meals. Most monsters drop [Raw Meat], and you can cure it into [Ration]s. I'm adding more recipes for the items so you can do something more interesting.

For example, you can get vials of [Vampiric Blood] on the first two floors. Mixing that, some intestines, and some filler, you can make a [Vampiric Blood Sausage], which has more RP flavour, and also gives them a [Fast healing] condition.

But, the book still gives me a ton of items to work with. I hope they do two more volumes!

Other Modules

The first other module I grabbed is another Paizo premium one: their beastiary tokens. The PF2e beastiaries (and stat blocks from APs/setting books) are open-license, but the artwork isn't. The system includes every monster Paizo has released, and this premium module plugs the official artwork in. You get the full-size monster portrait, and a token.

It doesn't cover every single stat block they've released though: just the ones from the beastiary books. Which is a lot! It's not strictly necessary either: the adventure came with art for all the monsters it includes. But I am assuming we're not gunna stick to the dungeon, so having the rest of the monsters ready-to-go is nice.

I watched a Rules Lawyer video about his FoundryVTT setup. Some of the plugins he suggests are not relevant anymore, but the ones I grabbed are:

  • Health Estimate
  • PF2e Modifiers Matter
  • Simple Calendar
  • Tokenizer
  • Forien's Quest Log

I've usually run games with the HP bars shown to everyone: it's annoying to have to ask/answer if it's bloodied. But that is how Paizo intends you to run the game ... so this plugin automates people having to ask. Instead of showing monster HP bars, you can hover the token and see if it's bloodied or what.

The modifiers matter one takes advantage of Foundry doing most of the in-combat math for you. If you've got a flanking bonus, and you would have missed without it, it will point this out. I think this'll help people feel like their positioning/buffs/debuffs are contributing, even if they personally aren't punching monsters in the face three times per round.

Simple Calendar is one whose value remains to be seen. I need to track the passage of time for some of the dungeon's mechanics, so this is a way for me to do that. We can track downtime or other significant things on there too. Maybe I'll end up putting in some holidays and if they do a ton of downtime, we'll have some recurring events?

Tokenizer is an amazing tool. This changes the upload screen for actors into a two-pane deal: on the left for uploading the portrait, and on the right is an editor to make that artwork into a token8. I have not had to do this as much as some other games I've run because Paizo gave me so many tokens already -- but normally, I have to do this a ton. Any artwork I bring to the game has to go through this process.

This is another area where I was shocked by how much better Foundry was over Roll20. Tokenizer should be built into every VTT as a day-one feature. It's a huge QoL improvement for the GM to have this right there.

The last one I added is Forien's Quest Log, which gives you a video-game-style UI to track quests. As the GM, I can set public or hidden objectives/rewards, provide flavour text, and track my own secret notes. It looks like players can add their own notes?

My intention is to use this heavily -- not just for the Abomination Vaults stuff -- but any time we have an idea or a sub-plot for a character, I can throw an entry in here and everyone will remember.

One caveat is this was just updated for Foundry v12. The update came out last week, and its so new that it's still in beta. If you need it, there are instructions on installing/upgrading available on GitHub. But it should come out via the Foundry module screen in the next week or two.

Other Thoughts

Anywhere you can enter text, Foundry lets you link things: journal pages, actors, buffs, items, anything. You can find it in the compendium browser and drop it into the editor, or highlight something in the text editor and it'll bring up matches for you to drag-n-drop in.

As a fan of hypertext, I absolutely love what they've done here. I've prepared some player resources, menus for the Crow's Casks, and notes for myself, all of which link to relevant things so everyone can easily find the rules. Or drag-n-drop the link for a homebrew action from the journal page into their character sheet to add it.


  1. Specifically: when I was playing Starfinder 2017-2019, I had a technomancer. At some point, I had a bunch of spells, and this caused the whole sheet to perform like absolute dogshit. Touching my spells would cause the JS to hang for a couple seconds. It's pretty bad to have everyone waiting on you to finish your turn, and you're helplessly waiting for your character sheet to respond to something you clicked five seconds ago. I don't know if it's fixed now, but it's what put me onto Foundry to start with. 

  2. Which I don't personally mind, but if you want new people to play your fun improv RPG, "here's a whole chapter on The Rules and Maths for filling out a form" is probably the opposite of what they signed up for? 

  3. You might remember this as "DnD 5e", but I guess we've retconned the last decade so Hasbro can avoid calling the new version of the rules 5.5e? 

  4. For reasons. I've always liked the idea of utilizing the monster bits. When I ran a short-lived Tale of Two Dragons campaign, I added in Hamund's Harvesting Handbook

  5. The scene being pretty is important. I want to run a game that looks like it has High Production Value (and where I've got full control of the lights). 

  6. Paizo has three, plus more monsters from individual adventures. 

  7. Which is technically not the appropriate thing for me to say, since alignments were deleted in the PF2e remaster! But, >50% of this group is from the main Spinach Inqusition party, and "terrorism" is really just a normal Tuesday for us. 

  8. Tokens are the portrait, but cropped and with a ring put around it. This makes it look nice (and prominent) on the map. Usually, I have to take the portrait, go over to Token Stamp, upload it, edit it, download it, then finally upload it into Roll20. This sucks when you need to do a bunch of them.